blob: 18026fff2d59d452d42218da2925f37497f8d299 [file] [log] [blame]
# ============LICENSE_START=======================================================
# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved.
# ================================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ============LICENSE_END=========================================================
#
"""test of the policy_utils"""
import json
import re
from policyhandler.utils import RegexCoarser, Utils
_LOGGER = Utils.get_logger(__file__)
def check_coarse_regex(test_name, patterns, matching_strings=None, expected_subpatterns=None):
"""generic test"""
regex_coarser = RegexCoarser(patterns)
coarse_patterns = regex_coarser.get_coarse_regex_patterns(max_length=20)
_LOGGER.info("check_coarse_regex %s (%s) for [%s]",
test_name, coarse_patterns, json.dumps(regex_coarser.patterns))
coarse_regexes = [re.compile(coarse_pattern) for coarse_pattern in coarse_patterns]
coarse_patterns_str = json.dumps(coarse_patterns)
if matching_strings:
for test_str in matching_strings:
_LOGGER.info(" match '%s' to %s (%s)", test_str, test_name, coarse_patterns_str)
assert bool(list(filter(None, [
coarse_regex.match(test_str) for coarse_regex in coarse_regexes
])))
if expected_subpatterns:
for subpattern in expected_subpatterns:
_LOGGER.info(" subpattern '%s' in %s", subpattern, coarse_patterns_str)
assert subpattern in coarse_patterns_str
def check_combined_regex(test_name, patterns, matching_strings=None, unmatching_strings=None):
"""generic test"""
regex_coarser = RegexCoarser(patterns)
combined_pattern = regex_coarser.get_combined_regex_pattern()
_LOGGER.info("check_combined_regex %s (%s) for [%s]",
test_name, combined_pattern, json.dumps(regex_coarser.patterns))
coarse_regex = re.compile(combined_pattern)
if matching_strings:
for test_str in matching_strings:
_LOGGER.info(" match '%s' to %s (%s)", test_str, test_name, combined_pattern)
assert coarse_regex.match(test_str)
if unmatching_strings:
for test_str in unmatching_strings:
_LOGGER.info(" not match '%s' to %s (%s)", test_str, test_name, combined_pattern)
assert not coarse_regex.match(test_str)
def test_regex_coarser():
"""test variety of regex combinations"""
test_data = [
(
"simple",
[
"plain text", "plain pick",
"aaa (((a|b)|c)|d)",
"aaa (((a|b)|c)|d zzz",
"nested (expr[aeiou]ss(ions)?)",
"nested (expr[aeiou]ss(?:ions|ion)?)",
"^ (any expr|more|less|some|who cares)",
" (any expr|more|less|some|who cares)",
"(any expr|more|less|some|who cares)"
],
[
'plain text',
'nested exprussions',
'nested expross',
'aaa c',
'aaa d',
'who cares',
' who cares'
],
None,
[
"nested .*",
"plain .*",
"aaa .*",
"(any expr|more|less|some|who cares)",
"^ (any expr|more|less|some|who cares)",
" (any expr|more|less|some|who cares)"]
),
(
"combination",
[
"plain text",
"^with* modifiers?",
"cha[ra][ra]cter classes",
"^with (groups)",
"^with (groups|more groups)",
r"^with (mod+ifiers\s*|in groups{2,3}\s*)+",
"sub",
"substrings",
"su.*bstrings",
"char count{1,3}s",
"nested (expr[aeiou]ss(ions)?)",
r"escaped (\)) chars",
r"escaped ([\)\]]) chars",
r"escaped ([\)\]]){3} chars"
],
[
'plain text',
'withhh modifier',
'character classes',
'with groups',
'with more groups',
'with modddifiers in groupss modifiers in groupsss',
'sub',
'substrings',
'char counttts',
'nested exprassions',
'nested express',
'escaped ) chars',
'escaped ] chars',
'escaped ]]] chars'
],
[
'plain',
'text',
'something with modifiers',
'su',
'char counttttts',
'escaped ]] chars'
],
[
"nested .*",
"escaped .*",
"^wit.*",
"plain text",
"cha.*",
"su.*"
]
),
(
"combined",
[
'foo+',
'food',
'football',
"ba[rh]",
"bard"
],
[
'foo',
'fooooo',
'football',
'food',
'bar',
'bah',
'bard'
],
[
'fo',
'bat'
],
[
"fo.*",
"ba.*"
]
)
]
for (test_name, patterns,
matching_strings, unmatching_strings, expected_subpatterns) in test_data:
check_combined_regex(test_name, patterns, matching_strings, unmatching_strings)
check_coarse_regex(test_name, patterns, matching_strings, expected_subpatterns)