aboutsummaryrefslogtreecommitdiffstats
path: root/tests/utils/test_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/utils/test_utils.py')
-rw-r--r--tests/utils/test_utils.py181
1 files changed, 181 insertions, 0 deletions
diff --git a/tests/utils/test_utils.py b/tests/utils/test_utils.py
new file mode 100644
index 0000000..18026ff
--- /dev/null
+++ b/tests/utils/test_utils.py
@@ -0,0 +1,181 @@
+# ============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)