def _test_compute_1(self): """compute()""" """ Test without blow up patterns """ hyfa = JHybridFA() parser = pcre_parser() hyfa.set_parser(parser) hyfa.load_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_compute_1.re") hyfa.compute() # self.get_compute() has to be True self.assertTrue(hyfa.get_compute()) parser = pcre_parser() parser.load_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_compute_1.re") dfa = b_dfa() dfa.create_by_parser(parser) dfa.compute() a = hyfa.dfa.get_automaton(False) b = dfa.get_automaton(False) # Test without blow up patterns self.assertEqual(a.states.keys(), b.states.keys()) self.assertEqual(a.alphabet, b.alphabet) self.assertEqual(a.start, b.start) self.assertEqual(a.final, b.final) self.assertEqual(a.transitions, b.transitions) self.assertTrue(a.Flags['Hybrid FA - DFA part']) self.assertTrue(a.Flags['Deterministic']) self.assertEqual(len(hyfa.nfas), 0) self.assertEqual(hyfa.tran_aut, {})
def _test_search_4(self): """search()""" """ Test with many regular expression where computed automaton has many NFA parts. Compares results of searching in computed Hybrid FA with regular NFA automaton searching. """ parser = pcre_parser() parser.load_file(aux_func.getPatternMatchDir() + "/rules/Moduly/web-cgi.rules.pcre") nfa_aut = b_nfa() nfa_aut.create_by_parser(parser) nfa_aut.compute() parser = pcre_parser() hyfa = JHybridFA() hyfa.set_parser(parser) hyfa.load_file(aux_func.getPatternMatchDir() + "/rules/Moduly/web-cgi.rules.pcre") hyfa.compute() input_data = "/awstats.pl?---configdir=| /calendar-admin.pl /db4web_c.exe/aaaa: /itemid=123f /ShellExample.cgi?*" self.assertEqual(nfa_aut.search(input_data), hyfa.search(input_data))
def _test_search_3(self): """search()""" """ Test with many regular expression where computed automaton has many NFA parts. Compares results of searching in computed Hybrid FA with regular NFA automaton searching. """ parser = pcre_parser() parser.load_file(aux_func.getPatternMatchDir() + "/rules/Snort/web-cgi.rules.pcre") nfa_aut = b_nfa() nfa_aut.create_by_parser(parser) nfa_aut.compute() parser = pcre_parser() parser.load_file(aux_func.getPatternMatchDir() + "/rules/Snort/web-cgi.rules.pcre") hyfa = hybrid_fa() hyfa.create_by_parser(parser) hyfa.set_special_min_depth(2) hyfa.set_max_head_size(0) hyfa.set_max_tx(0) hyfa.compute() input_data = "/awstats.pl?---configdir=| /calendar-admin.pl /db4web_c.exe/aaaa: /itemid=123f /ShellExample.cgi?aaaaa*" self.assertEqual(nfa_aut.search(input_data), hyfa.search(input_data))
def _test_compute_4(self): """compute()""" """ Test with more regular expressions, where computed automaton has has some NFA tails """ hyfa = hybrid_fa() parser = pcre_parser() parser.load_file(aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_compute_4_pattern.re") hyfa.create_by_parser(parser) hyfa.set_special_min_depth(2) hyfa.set_max_head_size(-1) hyfa.set_max_tx(-1) hyfa.compute() # self.get_compute() has to be True self.assertTrue(hyfa.get_compute()) hd = hyfa.dfa.get_automaton() hn0 = hyfa.nfas[0].get_automaton() hn1 = hyfa.nfas[1].get_automaton() d = nfa_data().load_from_file(aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_compute_4_dfa.nfa_data") n0 = nfa_data().load_from_file(aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_compute_4_nfa0.nfa_data") n1 = nfa_data().load_from_file(aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_compute_4_nfa1.nfa_data") # test of DFA part self.assertEqual(hd.states.keys(), d.states.keys()) self.assertEqual(hd.alphabet, d.alphabet) self.assertEqual(hd.start, d.start) self.assertTrue(len(hd.final) == 0) self.assertEqual(hd.transitions, d.transitions) self.assertTrue(hd.Flags['Hybrid FA - DFA part']) self.assertTrue(hd.Flags['Deterministic']) # two NFA tails self.assertEqual(len(hyfa.nfas), 2) self.assertEqual(hyfa.tran_aut, {0:4, 1:5}) # test of NFA part #0 self.assertEqual(hn0.states.keys(), n0.states.keys()) self.assertEqual(hn0.alphabet, n0.alphabet) self.assertEqual(hn0.start, n0.start) self.assertEqual(hn0.final, n0.final) self.assertEqual(hn0.transitions, n0.transitions) self.assertTrue(hn0.Flags['Hybrid FA - one NFA part']) # test of NFA part #1 self.assertEqual(hn1.states.keys(), n1.states.keys()) self.assertEqual(hn1.alphabet, n1.alphabet) self.assertEqual(hn1.start, n1.start) self.assertEqual(hn1.final, n1.final) self.assertEqual(hn1.transitions, n1.transitions) self.assertTrue(hn1.Flags['Hybrid FA - one NFA part'])
def _test_compute_5(self): """compute()""" """ Test where are more blow up REs """ hyfa = JHybridFA() parser = pcre_parser() hyfa.set_parser(parser) hyfa.load_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_compute_5.re") hyfa.compute() # self.get_compute() has to be True self.assertTrue(hyfa.get_compute()) # self.get_compute() has to be True self.assertTrue(hyfa.get_compute()) hd = hyfa.dfa.get_automaton(False) hn0 = hyfa.nfas[0].get_automaton(False) hn1 = hyfa.nfas[1].get_automaton(False) d = nfa_data().load_from_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_compute_5_dfa.nfa_data") n0 = nfa_data().load_from_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_compute_5_nfa0.nfa_data") n1 = nfa_data().load_from_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_compute_5_nfa1.nfa_data") # test where are more blow up REs # test of DFA part self.assertEqual(hd.states.keys(), d.states.keys()) self.assertEqual(hd.alphabet, d.alphabet) self.assertEqual(hd.start, d.start) self.assertEqual(len(hd.final), 3) self.assertEqual(hd.transitions, d.transitions) self.assertTrue(hd.Flags['Hybrid FA - DFA part']) self.assertTrue(hd.Flags['Deterministic']) self.assertEqual(len(hyfa.nfas), 2) self.assertEqual({0:0, 1: 10}, hyfa.tran_aut) # test of NFA part #0 self.assertEqual(hn0.states.keys(), n0.states.keys()) self.assertEqual(hn0.alphabet, n0.alphabet) self.assertEqual(hn0.start, n0.start) self.assertEqual(hn0.final, n0.final) self.assertEqual(hn0.transitions, n0.transitions) self.assertTrue(hn0.Flags['Hybrid FA - one NFA part']) # test of NFA part #1 self.assertEqual(hn1.states.keys(), n1.states.keys()) self.assertEqual(hn1.alphabet, n1.alphabet) self.assertEqual(hn1.start, n1.start) self.assertEqual(hn1.final, n1.final) self.assertEqual(hn1.transitions, n1.transitions) self.assertTrue(hn1.Flags['Hybrid FA - one NFA part'])
def _test_compute_4(self): """compute()""" """ Test with more patterns where some are blow up """ hyfa = JHybridFA() parser = pcre_parser() hyfa.set_parser(parser) hyfa.load_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_compute_4.re") hyfa.compute() # self.get_compute() has to be True self.assertTrue(hyfa.get_compute()) # self.get_compute() has to be True self.assertTrue(hyfa.get_compute()) hd = hyfa.dfa.get_automaton(False) hn0 = hyfa.nfas[0].get_automaton(False) d = nfa_data().load_from_file( aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_compute_4_dfa.nfa_data") n = nfa_data().load_from_file( aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_compute_4_nfa0.nfa_data") # Test with more patterns where some are blow up # test of DFA part self.assertEqual(hd.states.keys(), d.states.keys()) self.assertEqual(hd.alphabet, d.alphabet) self.assertEqual(hd.start, d.start) self.assertEqual(len(hd.final), 2) self.assertEqual(hd.transitions, d.transitions) self.assertTrue(hd.Flags['Hybrid FA - DFA part']) self.assertTrue(hd.Flags['Deterministic']) self.assertEqual(len(hyfa.nfas), 1) self.assertEqual({0: 0}, hyfa.tran_aut) # test of NFA part #0 self.assertEqual(hn0.states.keys(), n.states.keys()) self.assertEqual(hn0.alphabet, n.alphabet) self.assertEqual(hn0.start, n.start) self.assertEqual(hn0.final, n.final) self.assertEqual(hn0.transitions, n.transitions) self.assertTrue(hn0.Flags['Hybrid FA - one NFA part'])
def test_report_memory_naive(self): """report_memory_naive()""" his_fa = history_fa() his_fa.compute(aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/his_fa_1.RE") self.assertTrue(his_fa.report_memory_naive() == 40)
def _test_search_2(self): """search()""" """ Test with more regular expression where computed automaton has some NFA parts. """ parser = pcre_parser() parser.load_file( aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_search_1_pattern.re") hyfa = hybrid_fa() hyfa.create_by_parser(parser) hyfa.set_special_min_depth(2) hyfa.set_max_head_size(-1) hyfa.set_max_tx(-1) hyfa.compute() self.assertTrue(hyfa.get_compute()) ret = hyfa.search("abcd") self.assertEqual(ret, [1, 0]) ret = hyfa.search("bce") self.assertEqual(ret, [0, 1]) ret = hyfa.search("cdefgh") self.assertEqual(ret, [0, 0])
def _test_search_1(self): """search()""" """ Test with more regular expression where computed automaton has some NFA parts. """ parser = pcre_parser() hyfa = JHybridFA() hyfa.load_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_search_1.re") hyfa.set_parser(parser) hyfa.compute() self.assertTrue(hyfa.get_compute()) ret = hyfa.search("0123 uvwx") self.assertEqual(ret, [1,0,1,0]) ret = hyfa.search("abcd abgggcd") self.assertEqual(ret, [0,1,0,1]) ret = hyfa.search("aaaaa") self.assertEqual(ret, [0,0,0,0])
def _test_search_2(self): """search()""" """ Test with more regular expression where are not blow up REs. """ parser = pcre_parser() hyfa = JHybridFA() hyfa.load_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_search_2.re") hyfa.set_parser(parser) hyfa.compute() self.assertTrue(hyfa.get_compute()) ret = hyfa.search("0123") self.assertEqual(ret, [1,0,0,0]) ret = hyfa.search("uvwx") self.assertEqual(ret, [0,0,1,0]) ret = hyfa.search("abcd uvwx") self.assertEqual(ret, [0,1,1,0]) ret = hyfa.search("cdefgh") self.assertEqual(ret, [0,0,0,0])
def _test_search_3(self): """search()""" """ Test with more REs where some have blow up patterns on his starts. """ parser = pcre_parser() hyfa = JHybridFA() hyfa.load_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_search_3.re") hyfa.set_parser(parser) hyfa.compute() self.assertTrue(hyfa.get_compute()) ret = hyfa.search("0123") self.assertEqual(ret, [1,0,0,0]) ret = hyfa.search("uvwx") self.assertEqual(ret, [0,0,1,0]) ret = hyfa.search("abcd uvwx") self.assertEqual(ret, [0,1,1,1]) ret = hyfa.search("abcd agcd") self.assertEqual(ret, [0,1,0,1]) ret = hyfa.search("cdefgh") self.assertEqual(ret, [0,0,0,0])
def _test_search_3(self): """search()""" """ Test with more REs where some have blow up patterns on his starts. """ parser = pcre_parser() hyfa = JHybridFA() hyfa.load_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_search_3.re") hyfa.set_parser(parser) hyfa.compute() self.assertTrue(hyfa.get_compute()) ret = hyfa.search("0123") self.assertEqual(ret, [1, 0, 0, 0]) ret = hyfa.search("uvwx") self.assertEqual(ret, [0, 0, 1, 0]) ret = hyfa.search("abcd uvwx") self.assertEqual(ret, [0, 1, 1, 1]) ret = hyfa.search("abcd agcd") self.assertEqual(ret, [0, 1, 0, 1]) ret = hyfa.search("cdefgh") self.assertEqual(ret, [0, 0, 0, 0])
def _test_search_2(self): """search()""" """ Test with more regular expression where are not blow up REs. """ parser = pcre_parser() hyfa = JHybridFA() hyfa.load_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_search_2.re") hyfa.set_parser(parser) hyfa.compute() self.assertTrue(hyfa.get_compute()) ret = hyfa.search("0123") self.assertEqual(ret, [1, 0, 0, 0]) ret = hyfa.search("uvwx") self.assertEqual(ret, [0, 0, 1, 0]) ret = hyfa.search("abcd uvwx") self.assertEqual(ret, [0, 1, 1, 0]) ret = hyfa.search("cdefgh") self.assertEqual(ret, [0, 0, 0, 0])
def _test_search_1(self): """search()""" """ Test with more regular expression where computed automaton has some NFA parts. """ parser = pcre_parser() hyfa = JHybridFA() hyfa.load_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_search_1.re") hyfa.set_parser(parser) hyfa.compute() self.assertTrue(hyfa.get_compute()) ret = hyfa.search("0123 uvwx") self.assertEqual(ret, [1, 0, 1, 0]) ret = hyfa.search("abcd abgggcd") self.assertEqual(ret, [0, 1, 0, 1]) ret = hyfa.search("aaaaa") self.assertEqual(ret, [0, 0, 0, 0])
def _test_search_2(self): """search()""" """ Test with more regular expression where computed automaton has some NFA parts. """ parser = pcre_parser() parser.load_file(aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_search_1_pattern.re") hyfa = hybrid_fa() hyfa.create_by_parser(parser) hyfa.set_special_min_depth(2) hyfa.set_max_head_size(-1) hyfa.set_max_tx(-1) hyfa.compute() self.assertTrue(hyfa.get_compute()) ret = hyfa.search("abcd") self.assertEqual(ret, [1,0]) ret = hyfa.search("bce") self.assertEqual(ret, [0,1]) ret = hyfa.search("cdefgh") self.assertEqual(ret, [0,0])
def test__replace_length_restriction_with_a_closure(self): """_replace_length_restriction_with_a_closure(NFA)""" # /ab.{4}cd /; test with an expression that contains .{4} par = pcre_parser(create_cnt_constr=True) par.set_text("/ab.{4}cd/") history = HistoryCountingFA() history.create_by_parser(par) history.remove_epsilons() NFA = history.get_automaton(True) NFA_without_cnt = history._replace_length_restriction_with_a_closure( NFA) copy = NFA_without_cnt result = nfa_data().load_from_file( aux_func.getPatternMatchDir() + "/algorithms/history_counting_fa/test_data/test_data_1.nfa_data") self.assertTrue(history.flags_cnt == {4: "4"}) self.assertTrue( sorted(copy.states.keys()) == sorted(result.states.keys())) self.assertTrue(copy.alphabet == result.alphabet) self.assertTrue(copy.start == result.start) self.assertTrue(copy.final == result.final) self.assertTrue(copy.transitions == result.transitions) self.assertTrue(copy.Flags == result.Flags)
def _test_compute_3(self): """compute()""" """ Test with more regular expressions, where computed automaton has only DFA part without any NFA tails """ parser = pcre_parser() parser.load_file( aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_compute_3_pattern.re") hyfa = hybrid_fa() hyfa.create_by_parser(parser) hyfa.set_special_min_depth(10) hyfa.set_max_head_size(-1) hyfa.set_max_tx(-1) hyfa.compute() # self.get_compute() has to be True self.assertTrue(hyfa.get_compute()) parser = pcre_parser() parser.load_file( aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_compute_3_pattern.re") dfa = b_dfa() dfa.create_by_parser(parser) dfa.determinise() hd = hyfa.dfa.get_automaton() d = dfa.get_automaton() # test of DFA part self.assertEqual(hd.states.keys(), d.states.keys()) self.assertEqual(hd.alphabet, d.alphabet) self.assertEqual(hd.start, d.start) self.assertEqual(hd.final, d.final) self.assertEqual(hd.transitions, d.transitions) self.assertTrue(hd.Flags['Hybrid FA - DFA part']) self.assertTrue(hd.Flags['Deterministic']) # without NFA tails self.assertEqual(len(hyfa.nfas), 0) self.assertEqual(hyfa.tran_aut, {})
def test_report_memory_naive(self): """report_memory_naive()""" his_fa = history_fa() his_fa.compute(aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/his_fa_1.RE") self.assertTrue(his_fa.report_memory_naive() == 40)
def _test_compute_3(self): """compute()""" """ Test with more patterns and one with blow up on start on RE """ hyfa = JHybridFA() parser = pcre_parser() hyfa.set_parser(parser) hyfa.load_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_compute_3.re") hyfa.compute() # self.get_compute() has to be True self.assertTrue(hyfa.get_compute()) # self.get_compute() has to be True self.assertTrue(hyfa.get_compute()) hd = hyfa.dfa.get_automaton(False) hn0 = hyfa.nfas[0].get_automaton(False) d = nfa_data().load_from_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_compute_3_dfa.nfa_data") n = nfa_data().load_from_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_compute_3_nfa0.nfa_data") # Test with more patterns and one with blow up on start on RE # test of DFA part self.assertEqual(hd.states.keys().sort(), d.states.keys().sort()) self.assertEqual(hd.alphabet, d.alphabet) self.assertEqual(hd.start, d.start) self.assertEqual(len(hd.final), 3) self.assertEqual(hd.transitions, d.transitions) self.assertTrue(hd.Flags['Hybrid FA - DFA part']) self.assertTrue(hd.Flags['Deterministic']) self.assertEqual(len(hyfa.nfas), 1) self.assertEqual(hyfa.tran_aut, {0: 8}) # test of NFA part #0 self.assertEqual(hn0.states.keys().sort(), n.states.keys().sort()) self.assertEqual(hn0.alphabet, n.alphabet) self.assertEqual(hn0.start, n.start) self.assertEqual(hn0.final, n.final) self.assertEqual(hn0.transitions, n.transitions) self.assertTrue(hn0.Flags['Hybrid FA - one NFA part'])
def _test_compute_3(self): """compute()""" """ Test with more regular expressions, where computed automaton has only DFA part without any NFA tails """ parser = pcre_parser() parser.load_file(aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_compute_3_pattern.re") hyfa = hybrid_fa() hyfa.create_by_parser(parser) hyfa.set_special_min_depth(10) hyfa.set_max_head_size(-1) hyfa.set_max_tx(-1) hyfa.compute() # self.get_compute() has to be True self.assertTrue(hyfa.get_compute()) parser = pcre_parser() parser.load_file(aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_compute_3_pattern.re") dfa = b_dfa() dfa.create_by_parser(parser) dfa.determinise() hd = hyfa.dfa.get_automaton() d = dfa.get_automaton() # test of DFA part self.assertEqual(hd.states.keys(), d.states.keys()) self.assertEqual(hd.alphabet, d.alphabet) self.assertEqual(hd.start, d.start) self.assertEqual(hd.final, d.final) self.assertEqual(hd.transitions, d.transitions) self.assertTrue(hd.Flags['Hybrid FA - DFA part']) self.assertTrue(hd.Flags['Deterministic']) # without NFA tails self.assertEqual(len(hyfa.nfas), 0) self.assertEqual(hyfa.tran_aut, {})
def _test_compute_2(self): """compute()""" """ Test with one regular expression, where computed automaton has one NFA tail """ hyfa = hybrid_fa() parser = pcre_parser() parser.set_text("/abcd/") hyfa.create_by_parser(parser) hyfa.set_special_min_depth(2) hyfa.set_max_head_size(-1) hyfa.set_max_tx(-1) hyfa.compute() # self.get_compute() has to be True self.assertTrue(hyfa.get_compute()) parser_dfa = pcre_parser() parser_dfa.set_text("/ab/") dfa = b_dfa() dfa.create_by_parser(parser_dfa) dfa.determinise() hd = hyfa.dfa.get_automaton() hn0 = hyfa.nfas[0].get_automaton() d = dfa.get_automaton() n = nfa_data().load_from_file( aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_compute_2_nfa0.nfa_data") # test on automaton where is one NFA tail # test of DFA part self.assertEqual(hd.states.keys(), d.states.keys()) self.assertEqual(hd.alphabet, d.alphabet) self.assertEqual(hd.start, d.start) self.assertEqual(len(hd.final), 0) self.assertEqual(hd.transitions, d.transitions) self.assertTrue(hd.Flags['Hybrid FA - DFA part']) self.assertTrue(hd.Flags['Deterministic']) self.assertEqual(len(hyfa.nfas), 1) self.assertEqual(hyfa.tran_aut, {0: 2}) # test of NFA part #0 self.assertEqual(hn0.states.keys(), n.states.keys()) self.assertEqual(hn0.alphabet, n.alphabet) self.assertEqual(hn0.start, n.start) self.assertEqual(hn0.final, n.final) self.assertEqual(hn0.transitions, n.transitions) self.assertTrue(hn0.Flags['Hybrid FA - one NFA part'])
def __init__(self, canonical = True, stride = 1, use_bram = False): """ Class constructor. """ nfa_reductions.nfa_reductions.__init__(self) # Set specific setting for strided automaton if stride > 1: self.width = stride * 8 self.template = aux_func.getPatternMatchDir() + "/algorithms/clark_nfa/vhdl/clark_strided_nfa.vhd" # Set specific setting for clasic automaton else: self.width = 8 self.template = aux_func.getPatternMatchDir() + "/algorithms/clark_nfa/vhdl/clark_nfa.vhd" # Set stride independent values self._statistic = dict() self._useBram = use_bram self._LUTInputs = 6 self._luts = 0 self.canonical = canonical self.stride = stride
def _test_compute_2(self): """compute()""" """ Test with one regular expression, where computed automaton has one NFA tail """ hyfa = hybrid_fa() parser = pcre_parser() parser.set_text("/abcd/") hyfa.create_by_parser(parser) hyfa.set_special_min_depth(2) hyfa.set_max_head_size(-1) hyfa.set_max_tx(-1) hyfa.compute() # self.get_compute() has to be True self.assertTrue(hyfa.get_compute()) parser_dfa = pcre_parser() parser_dfa.set_text("/ab/") dfa = b_dfa() dfa.create_by_parser(parser_dfa) dfa.determinise() hd = hyfa.dfa.get_automaton() hn0 = hyfa.nfas[0].get_automaton() d = dfa.get_automaton() n = nfa_data().load_from_file(aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_compute_2_nfa0.nfa_data") # test on automaton where is one NFA tail # test of DFA part self.assertEqual(hd.states.keys(), d.states.keys()) self.assertEqual(hd.alphabet, d.alphabet) self.assertEqual(hd.start, d.start) self.assertEqual(len(hd.final), 0) self.assertEqual(hd.transitions, d.transitions) self.assertTrue(hd.Flags['Hybrid FA - DFA part']) self.assertTrue(hd.Flags['Deterministic']) self.assertEqual(len(hyfa.nfas), 1) self.assertEqual(hyfa.tran_aut, {0: 2}) # test of NFA part #0 self.assertEqual(hn0.states.keys(), n.states.keys()) self.assertEqual(hn0.alphabet, n.alphabet) self.assertEqual(hn0.start, n.start) self.assertEqual(hn0.final, n.final) self.assertEqual(hn0.transitions, n.transitions) self.assertTrue(hn0.Flags['Hybrid FA - one NFA part'])
def test_save_to_file(self): """save_to_file()""" his_fa = history_fa() his_fa.compute(aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/his_fa_1.RE") his_fa.save_to_file(aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/save.dat") self.assertTrue( os.path.exists(aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/save.dat") == True) f = open( aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/save.tmpl", "r") tmpl_content = f.read() f.close() f = open( aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/save.dat", "r") save_content = f.read() f.close() self.assertTrue(tmpl_content == save_content) aux_func.getstatusoutput( "rm -f " + aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/save.dat", None)
def __init__(self, canonical=True, stride=1, use_bram=False): """ Class constructor. """ nfa_reductions.nfa_reductions.__init__(self) # Set specific setting for strided automaton if stride > 1: self.width = stride * 8 self.template = aux_func.getPatternMatchDir( ) + "/algorithms/clark_nfa/vhdl/clark_strided_nfa.vhd" # Set specific setting for clasic automaton else: self.width = 8 self.template = aux_func.getPatternMatchDir( ) + "/algorithms/clark_nfa/vhdl/clark_nfa.vhd" # Set stride independent values self._statistic = dict() self._useBram = use_bram self._LUTInputs = 6 self._luts = 0 self.canonical = canonical self.stride = stride
def test_compute(self): """compute()""" # Method compute(input_file_name): # Check the correctness of the logical machine output over # self.assertTrue on individual automaton items + focus on the # properties of H-FA (transitions, flags, counters) # 1) /abcd/ ; test with an expression that does not use properties # of History FA his_fa = history_fa() his_fa.compute(aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/his_fa_1.RE") copy = his_fa.get_automaton(False) result = nfa_data().load_from_file( aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/his_fa_1.nfa_data") self.assertTrue( sorted(copy.states.keys()) == sorted(result.states.keys())) self.assertTrue(copy.alphabet == result.alphabet) self.assertTrue(copy.start == result.start) self.assertTrue(copy.final == result.final) self.assertTrue(copy.transitions == result.transitions) self.assertTrue(copy.Flags == result.Flags) # 2) /ab.*cd/ ; test with an expression that contain .* his_fa = history_fa() his_fa.compute(aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/his_fa_2.RE") copy = his_fa.get_automaton(False) result = nfa_data().load_from_file( aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/his_fa_2.nfa_data") self.assertTrue( sorted(copy.states.keys()) == sorted(result.states.keys())) self.assertTrue(copy.alphabet == result.alphabet) self.assertTrue(copy.start == result.start) self.assertTrue(copy.final == result.final) self.assertTrue(copy.transitions == result.transitions) self.assertTrue(copy.Flags == result.Flags) # 3) /ab[^1234]*cd|efg/; test with an expression containing one # alternation [^1234]*, the second is not his_fa = history_fa() his_fa.compute(aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/his_fa_3.RE") copy = his_fa.get_automaton(False) result = nfa_data().load_from_file( aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/his_fa_3.nfa_data") self.assertTrue( sorted(copy.states.keys()) == sorted(result.states.keys())) self.assertTrue(copy.alphabet == result.alphabet) self.assertTrue(copy.start == result.start) self.assertTrue(copy.final == result.final) self.assertTrue(copy.transitions == result.transitions) self.assertTrue(copy.Flags == result.Flags)
def _test_compute_1(self): """compute()""" """ Test without blow up patterns """ hyfa = JHybridFA() parser = pcre_parser() hyfa.set_parser(parser) hyfa.load_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_compute_1.re") hyfa.compute() # self.get_compute() has to be True self.assertTrue(hyfa.get_compute()) parser = pcre_parser() parser.load_file( aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_compute_1.re") dfa = b_dfa() dfa.create_by_parser(parser) dfa.compute() a = hyfa.dfa.get_automaton(False) b = dfa.get_automaton(False) # Test without blow up patterns self.assertEqual(a.states.keys(), b.states.keys()) self.assertEqual(a.alphabet, b.alphabet) self.assertEqual(a.start, b.start) self.assertEqual(a.final, b.final) self.assertEqual(a.transitions, b.transitions) self.assertTrue(a.Flags['Hybrid FA - DFA part']) self.assertTrue(a.Flags['Deterministic']) self.assertEqual(len(hyfa.nfas), 0) self.assertEqual(hyfa.tran_aut, {})
def _test_report_memory_naive_2(self): """report_memory_naive()""" """ Test with more regular expression where computed automaton has some NFA parts. """ hyfa = JHybridFA() parser = pcre_parser() hyfa.set_parser(parser) hyfa.load_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_get_xxx_num_2.re") hyfa.compute() self.assertEqual(hyfa.report_memory_naive(), 390)
def _test_get_trans_num_1(self): """get_state_num()""" """ Test with more regular expression where computed automaton has only DFA part. """ hyfa = JHybridFA() parser = pcre_parser() hyfa.set_parser(parser) hyfa.load_file(aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_get_xxx_num_1.re") hyfa.compute() self.assertEqual(hyfa.get_trans_num(), 102)
def _test_compute3(self): # Get test directory tdir = aux_func.getPatternMatchDir() + "/algorithms/delay_dfa/" delay_dfa = DELAY_DFA() nfaData = nfa_data().load_from_file(tdir + "test_data/text_ddfa.nfa_data") delay_dfa.create_from_nfa_data(nfaData) delay_dfa.determinise() delay_dfa.compute(False) self.assertTrue(delay_dfa.get_compute()) a = delay_dfa.get_automaton() b = nfa_data() b.add_symbols(b_Sym_char("a", "a", 0)) b.add_symbols(b_Sym_char("b", "b", 1)) b.add_symbols(b_Sym_char("c", "c", 2)) b.add_symbols(b_Sym_char("d", "d", 3)) b.add_symbols(DEF_SYMBOLS("default", 4)) b.add_states(b_State(0, set())) b.add_states(b_State(1, set([0]))) b.add_states(b_State(2, set())) b.add_states(b_State(3, set([0]))) b.add_states(b_State(4, set([0]))) b.start = 0 b.final = set([1, 3, 4]) b.add_transitions((0, 2, 0)) b.add_transitions((0, 0, 1)) b.add_transitions((0, 1, 2)) b.add_transitions((0, 3, 3)) b.add_transitions((1, 4, 0)) b.add_transitions((2, 2, 4)) b.add_transitions((2, 4, 0)) b.add_transitions((3, 4, 0)) b.add_transitions((4, 4, 0)) self.assertEqual(a.states.keys(), b.states.keys()) self.assertEqual(a.start, b.start) self.assertEqual(a.final, b.final) self.assertEqual(a.alphabet, b.alphabet) self.assertEqual(a.transitions, b.transitions) self.assertTrue(a.Flags["Delay DFA"])
def _test_get_trans_num_1(self): """get_state_num()""" """ Test with more regular expression where computed automaton has only DFA part. """ hyfa = JHybridFA() parser = pcre_parser() hyfa.set_parser(parser) hyfa.load_file( aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_get_xxx_num_1.re") hyfa.compute() self.assertEqual(hyfa.get_trans_num(), 102)
def _test_report_memory_naive_2(self): """report_memory_naive()""" """ Test with more regular expression where computed automaton has some NFA parts. """ hyfa = JHybridFA() parser = pcre_parser() hyfa.set_parser(parser) hyfa.load_file( aux_func.getPatternMatchDir() + "/algorithms/j_hybrid_fa/tests_data/test_get_xxx_num_2.re") hyfa.compute() self.assertEqual(hyfa.report_memory_naive(), 390)
def _test_compute3(self): # Get test directory tdir = aux_func.getPatternMatchDir() + "/algorithms/delay_dfa/" delay_dfa = DELAY_DFA() nfaData = nfa_data().load_from_file(tdir + "test_data/text_ddfa.nfa_data") delay_dfa.create_from_nfa_data(nfaData) delay_dfa.determinise() delay_dfa.compute(False) self.assertTrue(delay_dfa.get_compute()) a = delay_dfa.get_automaton() b = nfa_data() b.add_symbols(b_Sym_char("a","a",0)) b.add_symbols(b_Sym_char("b","b",1)) b.add_symbols(b_Sym_char("c","c",2)) b.add_symbols(b_Sym_char("d","d",3)) b.add_symbols(DEF_SYMBOLS("default", 4)) b.add_states(b_State(0,set())) b.add_states(b_State(1,set([0]))) b.add_states(b_State(2,set())) b.add_states(b_State(3,set([0]))) b.add_states(b_State(4,set([0]))) b.start = 0 b.final = set([1,3,4]) b.add_transitions( (0,2,0) ) b.add_transitions( (0,0,1) ) b.add_transitions( (0,1,2) ) b.add_transitions( (0,3,3) ) b.add_transitions( (1,4,0) ) b.add_transitions( (2,2,4) ) b.add_transitions( (2,4,0) ) b.add_transitions( (3,4,0) ) b.add_transitions( (4,4,0) ) self.assertEqual(a.states.keys(), b.states.keys()) self.assertEqual(a.start, b.start) self.assertEqual(a.final, b.final) self.assertEqual(a.alphabet, b.alphabet) self.assertEqual(a.transitions, b.transitions) self.assertTrue(a.Flags["Delay DFA"])
def test_compute(self): """compute()""" # Method compute(input_file_name): # Check the correctness of the logical machine output over # self.assertTrue on individual automaton items + focus on the # properties of H-FA (transitions, flags, counters) # 1) /abcd/ ; test with an expression that does not use properties # of History FA his_fa = history_fa() his_fa.compute(aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/his_fa_1.RE") copy = his_fa.get_automaton(False) result = nfa_data().load_from_file( aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/his_fa_1.nfa_data") self.assertTrue(sorted(copy.states.keys()) == sorted(result.states.keys())) self.assertTrue(copy.alphabet == result.alphabet) self.assertTrue(copy.start == result.start) self.assertTrue(copy.final == result.final) self.assertTrue(copy.transitions == result.transitions) self.assertTrue(copy.Flags == result.Flags) # 2) /ab.*cd/ ; test with an expression that contain .* his_fa = history_fa() his_fa.compute(aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/his_fa_2.RE") copy = his_fa.get_automaton(False) result = nfa_data().load_from_file( aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/his_fa_2.nfa_data") self.assertTrue(sorted(copy.states.keys()) == sorted(result.states.keys())) self.assertTrue(copy.alphabet == result.alphabet) self.assertTrue(copy.start == result.start) self.assertTrue(copy.final == result.final) self.assertTrue(copy.transitions == result.transitions) self.assertTrue(copy.Flags == result.Flags) # 3) /ab[^1234]*cd|efg/; test with an expression containing one # alternation [^1234]*, the second is not his_fa = history_fa() his_fa.compute(aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/his_fa_3.RE") copy = his_fa.get_automaton(False) result = nfa_data().load_from_file( aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/his_fa_3.nfa_data") self.assertTrue(sorted(copy.states.keys()) == sorted(result.states.keys())) self.assertTrue(copy.alphabet == result.alphabet) self.assertTrue(copy.start == result.start) self.assertTrue(copy.final == result.final) self.assertTrue(copy.transitions == result.transitions) self.assertTrue(copy.Flags == result.Flags)
def _test_report_memory_naive_2(self): """report_memory_naive()""" """ Test with more regular expression where computed automaton has some NFA parts. """ hyfa = hybrid_fa() parser = pcre_parser() parser.load_file(aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_get_state_num_2.re") hyfa.create_by_parser(parser) hyfa.set_special_min_depth(2) hyfa.set_max_head_size(-1) hyfa.set_max_tx(-1) hyfa.compute() self.assertEqual(hyfa.report_memory_naive(), 58)
def test_save_to_file(self): """save_to_file()""" his_fa = history_fa() his_fa.compute(aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/his_fa_1.RE") his_fa.save_to_file(aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/save.dat") self.assertTrue(os.path.exists(aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/save.dat") == True) f = open(aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/save.tmpl","r"); tmpl_content = f.read() f.close() f = open(aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/save.dat","r"); save_content = f.read() f.close() self.assertTrue(tmpl_content == save_content) aux_func.getstatusoutput("rm -f " + aux_func.getPatternMatchDir() + "/algorithms/j_history_fa/test_data/save.dat", None)
def _test_report_memory_naive_2(self): """report_memory_naive()""" """ Test with more regular expression where computed automaton has some NFA parts. """ hyfa = hybrid_fa() parser = pcre_parser() parser.load_file( aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_get_state_num_2.re") hyfa.create_by_parser(parser) hyfa.set_special_min_depth(2) hyfa.set_max_head_size(-1) hyfa.set_max_tx(-1) hyfa.compute() self.assertEqual(hyfa.report_memory_naive(), 58)
def __init__(self, stride = 1): """ Class constructor. Experimantal extension for strided symbols added. :param stride: Number of characters accepted in one clock cycle. \ Defaults to 1 char per CLK. Only powers of 2 are \ supported. :type stride: int """ nfa_reductions.nfa_reductions.__init__(self) # Set stride specific value self.width = 8 * stride # Set stride independent values self.template = aux_func.getPatternMatchDir() + "/algorithms/sindhu_prasana_nfa/vhdl/sindhu_prasana_nfa.vhd" self._statistic = dict() self._useBram = False self._LUTInputs = 6 self._luts = 0 self.stride = stride
def test_get_default_trans_num(self): """get_default_trans_num""" #Tests with regular expressions from test_compute delay_dfa1 = DELAY_DFA() parser = pcre_parser() parser.set_text("/^abcd/") delay_dfa1.create_by_parser(parser) delay_dfa1.compute() self.assertTrue(delay_dfa1.get_compute()) delay_dfa2 = DELAY_DFA() parser = pcre_parser() parser.set_text("/^(a|b)+/") delay_dfa2.create_by_parser(parser) delay_dfa2.compute() self.assertTrue(delay_dfa2.get_compute()) delay_dfa3 = DELAY_DFA() # Get test directory tdir = aux_func.getPatternMatchDir() + "/algorithms/delay_dfa/" nfaData = nfa_data().load_from_file(tdir + "test_data/text_ddfa.nfa_data") delay_dfa3.create_from_nfa_data(nfaData) delay_dfa3.determinise() delay_dfa3.compute(False) self.assertTrue(delay_dfa3.get_compute()) self.assertEqual(delay_dfa1.get_default_trans_num(), 0) self.assertEqual(delay_dfa2.get_default_trans_num(), 1) self.assertEqual(delay_dfa3.get_default_trans_num(), 4)
def test_sb(self): """ Tests the Sordis-Bispo algorithm. """ # Create sourdis_bispo_nfa object cn = sourdis_bispo_nfa.sourdis_bispo_nfa() # Preprocess the REs preprocessed = cn.find_pcre_repetitions( aux_func.getPatternMatchDir() + "/algorithms/sourdis_bispo_nfa/test/tests/test.pcre") # Create parser - use default parser Test0 = parser.parser("pcre_parser") # Load REs Test0.set_text(preprocessed) # Parse RE and create NFA cn.create_by_parser(Test0) # Call the compute method cn.compute() # Create the simulation create_simulation(cn) # run the simulation run_simulation(self)
def __init__(self, stride=1): """ Class constructor. Experimantal extension for strided symbols added. :param stride: Number of characters accepted in one clock cycle. \ Defaults to 1 char per CLK. Only powers of 2 are \ supported. :type stride: int """ nfa_reductions.nfa_reductions.__init__(self) # Set stride specific value self.width = 8 * stride # Set stride independent values self.template = aux_func.getPatternMatchDir( ) + "/algorithms/sindhu_prasana_nfa/vhdl/sindhu_prasana_nfa.vhd" self._statistic = dict() self._useBram = False self._LUTInputs = 6 self._luts = 0 self.stride = stride
def test_get_default_trans_num(self): """get_default_trans_num""" #Tests with regular expressions from test_compute delay_dfa1 = DELAY_DFA() parser = pcre_parser() parser.set_text("/^abcd/") delay_dfa1.create_by_parser(parser) delay_dfa1.compute() self.assertTrue(delay_dfa1.get_compute()) delay_dfa2 = DELAY_DFA() parser = pcre_parser() parser.set_text("/^(a|b)+/") delay_dfa2.create_by_parser(parser) delay_dfa2.compute() self.assertTrue(delay_dfa2.get_compute()) delay_dfa3 = DELAY_DFA() # Get test directory tdir = aux_func.getPatternMatchDir() + "/algorithms/delay_dfa/" nfaData = nfa_data().load_from_file(tdir + "test_data/text_ddfa.nfa_data") delay_dfa3.create_from_nfa_data(nfaData) delay_dfa3.determinise() delay_dfa3.compute(False) self.assertTrue(delay_dfa3.get_compute()) self.assertEqual(delay_dfa1.get_default_trans_num(),0) self.assertEqual(delay_dfa2.get_default_trans_num(),1) self.assertEqual(delay_dfa3.get_default_trans_num(),4)
def test__replace_length_restriction_with_a_closure(self): """_replace_length_restriction_with_a_closure(NFA)""" # /ab.{4}cd /; test with an expression that contains .{4} par = pcre_parser(create_cnt_constr = True) par.set_text("/ab.{4}cd/") history = HistoryCountingFA() history.create_by_parser(par) history.remove_epsilons() NFA = history.get_automaton(True) NFA_without_cnt = history._replace_length_restriction_with_a_closure(NFA) copy = NFA_without_cnt result = nfa_data().load_from_file(aux_func.getPatternMatchDir() + "/algorithms/history_counting_fa/test_data/test_data_1.nfa_data") self.assertTrue(history.flags_cnt == {4: "4"}) self.assertTrue(sorted(copy.states.keys()) == sorted(result.states.keys())) self.assertTrue(copy.alphabet == result.alphabet) self.assertTrue(copy.start == result.start) self.assertTrue(copy.final == result.final) self.assertTrue(copy.transitions == result.transitions) self.assertTrue(copy.Flags == result.Flags)
def _test_compute_4(self): """compute()""" """ Test with more regular expressions, where computed automaton has has some NFA tails """ hyfa = hybrid_fa() parser = pcre_parser() parser.load_file( aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_compute_4_pattern.re") hyfa.create_by_parser(parser) hyfa.set_special_min_depth(2) hyfa.set_max_head_size(-1) hyfa.set_max_tx(-1) hyfa.compute() # self.get_compute() has to be True self.assertTrue(hyfa.get_compute()) hd = hyfa.dfa.get_automaton() hn0 = hyfa.nfas[0].get_automaton() hn1 = hyfa.nfas[1].get_automaton() d = nfa_data().load_from_file( aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_compute_4_dfa.nfa_data") n0 = nfa_data().load_from_file( aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_compute_4_nfa0.nfa_data") n1 = nfa_data().load_from_file( aux_func.getPatternMatchDir() + "/algorithms/hybrid_fa/tests_data/test_compute_4_nfa1.nfa_data") # test of DFA part self.assertEqual(hd.states.keys(), d.states.keys()) self.assertEqual(hd.alphabet, d.alphabet) self.assertEqual(hd.start, d.start) self.assertTrue(len(hd.final) == 0) self.assertEqual(hd.transitions, d.transitions) self.assertTrue(hd.Flags['Hybrid FA - DFA part']) self.assertTrue(hd.Flags['Deterministic']) # two NFA tails self.assertEqual(len(hyfa.nfas), 2) self.assertEqual(hyfa.tran_aut, {0: 4, 1: 5}) # test of NFA part #0 self.assertEqual(hn0.states.keys(), n0.states.keys()) self.assertEqual(hn0.alphabet, n0.alphabet) self.assertEqual(hn0.start, n0.start) self.assertEqual(hn0.final, n0.final) self.assertEqual(hn0.transitions, n0.transitions) self.assertTrue(hn0.Flags['Hybrid FA - one NFA part']) # test of NFA part #1 self.assertEqual(hn1.states.keys(), n1.states.keys()) self.assertEqual(hn1.alphabet, n1.alphabet) self.assertEqual(hn1.start, n1.start) self.assertEqual(hn1.final, n1.final) self.assertEqual(hn1.transitions, n1.transitions) self.assertTrue(hn1.Flags['Hybrid FA - one NFA part'])
def test_compute(self): """compute()""" # Check the correctness of the logical machine output over # self.assertTrue on individual items + focus on the properties # of HistoryCountingFA (transitions, flags, counters) # /abcd/; test with an expression that does not use properties # of HistoryCountingFA par = pcre_parser(create_cnt_constr=True) par.set_text("/abcd/") history = HistoryCountingFA() history.create_by_parser(par) history.remove_epsilons() NFA = history.get_automaton(True) history.determinise(create_table=True) history.compute(NFA) copy = history.get_automaton() result = nfa_data().load_from_file( aux_func.getPatternMatchDir() + "/algorithms/history_counting_fa/test_data/test_data_2.nfa_data") self.assertTrue( sorted(copy.states.keys()) == sorted(result.states.keys())) self.assertTrue(copy.alphabet == result.alphabet) self.assertTrue(copy.start == result.start) self.assertTrue(copy.final == result.final) self.assertTrue(copy.transitions == result.transitions) # /ab.{3}cd /; test with an expression that contains .{X} par = pcre_parser(create_cnt_constr=True) par.set_text("/ab.{3}cd/") history = HistoryCountingFA() history.create_by_parser(par) history.remove_epsilons() NFA = history.get_automaton(True) NFA_without_cnt = \ history._replace_length_restriction_with_a_closure(NFA) NFA = history.get_automaton(True) history._automaton = NFA_without_cnt history.determinise(create_table=True) history.compute(NFA) copy = history.get_automaton() result = nfa_data().load_from_file( aux_func.getPatternMatchDir() + "/algorithms/history_counting_fa/test_data/test_data_3.nfa_data") self.assertTrue( sorted(copy.states.keys()) == sorted(result.states.keys())) self.assertTrue(copy.alphabet == result.alphabet) self.assertTrue(copy.start == result.start) self.assertTrue(copy.final == result.final) self.assertTrue(copy.transitions == result.transitions) # /ab[^1234]{3}cd|efg/; test with an expression containing one # alternation [^1234]{3}, the second is not par = pcre_parser(create_cnt_constr=True) par.set_text("/ab[^1234]{3}cd|efg/") history = HistoryCountingFA() history.create_by_parser(par) history.remove_epsilons() NFA = history.get_automaton(True) NFA_without_cnt = \ history._replace_length_restriction_with_a_closure(NFA) NFA = history.get_automaton(True) history._automaton = NFA_without_cnt history.determinise(create_table=True) history.compute(NFA) copy = history.get_automaton() result = nfa_data().load_from_file( aux_func.getPatternMatchDir() + "/algorithms/history_counting_fa/test_data/test_data_4.nfa_data") self.assertTrue( sorted(copy.states.keys()) == sorted(result.states.keys())) self.assertTrue(copy.alphabet == result.alphabet) self.assertTrue(copy.start == result.start) self.assertTrue(copy.final == result.final) self.assertTrue(copy.transitions == result.transitions)
def test_compute(self): """compute()""" # Check the correctness of the logical machine output over # self.assertTrue on individual items + focus on the properties # of HistoryCountingFA (transitions, flags, counters) # /abcd/; test with an expression that does not use properties # of HistoryCountingFA par = pcre_parser(create_cnt_constr = True) par.set_text("/abcd/") history = HistoryCountingFA() history.create_by_parser(par) history.remove_epsilons() NFA = history.get_automaton(True) history.determinise(create_table = True) history.compute(NFA) copy = history.get_automaton() result = nfa_data().load_from_file(aux_func.getPatternMatchDir() + "/algorithms/history_counting_fa/test_data/test_data_2.nfa_data") self.assertTrue(sorted(copy.states.keys()) == sorted(result.states.keys())) self.assertTrue(copy.alphabet == result.alphabet) self.assertTrue(copy.start == result.start) self.assertTrue(copy.final == result.final) self.assertTrue(copy.transitions == result.transitions) # /ab.{3}cd /; test with an expression that contains .{X} par = pcre_parser(create_cnt_constr = True) par.set_text("/ab.{3}cd/") history = HistoryCountingFA() history.create_by_parser(par) history.remove_epsilons() NFA = history.get_automaton(True) NFA_without_cnt = \ history._replace_length_restriction_with_a_closure(NFA) NFA = history.get_automaton(True) history._automaton = NFA_without_cnt history.determinise(create_table = True) history.compute(NFA) copy = history.get_automaton() result = nfa_data().load_from_file(aux_func.getPatternMatchDir() + "/algorithms/history_counting_fa/test_data/test_data_3.nfa_data") self.assertTrue(sorted(copy.states.keys()) == sorted(result.states.keys())) self.assertTrue(copy.alphabet == result.alphabet) self.assertTrue(copy.start == result.start) self.assertTrue(copy.final == result.final) self.assertTrue(copy.transitions == result.transitions) # /ab[^1234]{3}cd|efg/; test with an expression containing one # alternation [^1234]{3}, the second is not par = pcre_parser(create_cnt_constr = True) par.set_text("/ab[^1234]{3}cd|efg/") history = HistoryCountingFA() history.create_by_parser(par) history.remove_epsilons() NFA = history.get_automaton(True) NFA_without_cnt = \ history._replace_length_restriction_with_a_closure(NFA) NFA = history.get_automaton(True) history._automaton = NFA_without_cnt history.determinise(create_table = True) history.compute(NFA) copy = history.get_automaton() result = nfa_data().load_from_file(aux_func.getPatternMatchDir() + "/algorithms/history_counting_fa/test_data/test_data_4.nfa_data") self.assertTrue(sorted(copy.states.keys()) == sorted(result.states.keys())) self.assertTrue(copy.alphabet == result.alphabet) self.assertTrue(copy.start == result.start) self.assertTrue(copy.final == result.final) self.assertTrue(copy.transitions == result.transitions)