source: icGREP/icgrep-devel/QA/greptest.py @ 4096

Last change on this file since 4096 was 4096, checked in by linmengl, 4 years ago

generate llvm.uadd.with.overflow. add 'make check' target to run greptest.py.

File size: 3.9 KB
Line 
1#
2# greptest.py - Functional correctness testing for grep implementations.
3# Robert D. Cameron, Dec. 28, 2013
4# Licensed under Academic Free License 3.0
5#
6# Uses an XML test suite with the following format.
7# <greptest>
8# <datafile id="simple1">
9# A few lines of input
10# in this simple test file
11# provide fodder for some simple
12# regexp tests.
13# </datafile>
14#
15# <grepcase regexp="in" datafile="simple1" grepcount="2"/>
16# <grepcase regexp="[A-Z]" datafile="simple1" grepcount="1"/>
17#
18# </greptest>
19
20
21import sys, subprocess, os, optparse, re
22import xml.parsers.expat
23
24in_datafile = False
25
26def start_element_open_file(name, attrs):
27        global outf
28        global in_datafile
29        if name == 'datafile':
30                idFound = False
31                for a in attrs:
32                        if a == 'id':
33                                filename = attrs[a]
34                                idFound = True
35                if not idFound:
36                        print "Expecting id attribute for datafile, but none found."
37                        exit(-1)
38                outf = open(os.path.join(options.datafile_dir, filename), 'w')
39                in_datafile = True
40
41def char_data_write_contents(data):
42        if in_datafile:
43                outf.write(data)
44
45def end_element_close_file(name):
46        global outf
47        global in_datafile
48        if name == 'datafile':
49                outf.close()
50                in_datafile = False
51
52def make_data_files(greptest_xml):
53        p = xml.parsers.expat.ParserCreate()
54        p.StartElementHandler = start_element_open_file
55        p.CharacterDataHandler = char_data_write_contents
56        p.EndElementHandler = end_element_close_file
57        p.Parse(greptest_xml, 1)
58
59def escape_quotes(e):  return e.replace("'", "'\\''")
60
61def start_element_do_test(name, attrs):
62        if name == 'grepcase':
63                regexp = None
64                datafile = None
65                expected_count = None
66                for a in attrs:
67                        if a == 'regexp':
68                                regexp = attrs[a]
69                        elif a == 'datafile':
70                                datafile = attrs[a]
71                        elif a == 'grepcount':
72                                expected_count = attrs[a]
73                if regexp == None or datafile == None or expected_count == None:
74                        print("Bad grepcase: missing regexp and/or datafile attributes.")
75                        return
76                #execute grep test
77                grep_cmd = "%s -c '%s' %s" % (grep_program_under_test, escape_quotes(regexp), os.path.join(options.datafile_dir, datafile))
78                grep_out = subprocess.check_output(grep_cmd, cwd=options.exec_dir, shell=True)
79                if grep_out[-1] == '\n': grep_out = grep_out[:-1]
80                m = re.search('[0-9]+', grep_out)
81                if m == None or m.group(0) != expected_count:
82                        print("Test failure: regexp {%s} on datafile {%s} expecting {%s} got {%s}" % (regexp, datafile, expected_count, grep_out))
83                        exit(1)
84                else:
85                        if options.verbose:
86                                print("Test success: regexp {%s} on datafile {%s} expecting {%s} got {%s}" % (regexp, datafile, expected_count, grep_out))
87
88def run_tests(greptest_xml):
89        p = xml.parsers.expat.ParserCreate()
90        p.StartElementHandler = start_element_do_test
91        p.Parse(greptest_xml, 1)
92
93
94if __name__ == '__main__':
95        QA_dir = os.path.dirname(sys.argv[0])
96        option_parser = optparse.OptionParser(usage='python %prog [options] <grep_executable>', version='1.0')
97        option_parser.add_option('-d', '--datafile_dir',
98                          dest = 'datafile_dir', type='string', default='/tmp',
99                          help = 'directory for test files.')
100        option_parser.add_option('-t', '--testcases',
101                          dest = 'testcases', type='string', default='greptest.xml',
102                          help = 'grep test case file (XML format).')
103        option_parser.add_option('-e', '--exec_dir',
104                          dest = 'exec_dir', type='string', default='.',
105                          help = 'executable directory')
106        option_parser.add_option('-v', '--verbose',
107                          dest = 'verbose', action='store_true', default=False,
108                          help = 'verbose output: show successful tests')
109        options, args = option_parser.parse_args(sys.argv[1:])
110        if len(args) != 1:
111                option_parser.print_usage()
112                sys.exit()
113        grep_program_under_test = args[0]
114        grep_test_file = open(os.path.join(QA_dir,options.testcases), 'r')
115        grep_test_spec = grep_test_file.read()
116        grep_test_file.close()
117        make_data_files(grep_test_spec)
118        run_tests(grep_test_spec)
119
120
Note: See TracBrowser for help on using the repository browser.