| # ============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) |