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

Last change on this file since 5045 was 5045, checked in by xuedongx, 3 years ago

Support over UTF-16 representation of Unicode

File size: 5.2 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, codecs, stat
22import xml.parsers.expat
23import sys
24import codecs
25
26sys.stdout = codecs.getwriter('utf8')(sys.stdout)
27sys.stderr = codecs.getwriter('utf8')(sys.stderr)
28
29in_datafile = False
30
31def start_element_open_file(name, attrs):
32        global outf
33        global outfpath
34        global in_datafile
35        if name == 'datafile':
36                idFound = False
37                for a in attrs:
38                        if a == 'id':
39                                filename = attrs[a]
40                                idFound = True
41                if not idFound:
42                        print "Expecting id attribute for datafile, but none found."
43                        exit(-1)
44                outfpath = os.path.join(options.datafile_dir, filename)
45                if options.utf16: outf = codecs.open(outfpath, encoding='utf-16BE', mode='w')
46                else: outf = codecs.open(outfpath, encoding='utf-8', mode='w')
47                in_datafile = True
48
49def char_data_write_contents(data):
50        if in_datafile:
51                outf.write(data)
52
53def end_element_close_file(name):
54        global outf
55        global outfpath
56        global in_datafile
57        if name == 'datafile':
58                outf.close()
59                os.chmod(outfpath, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IWGRP | stat.S_IROTH | stat.S_IWOTH)
60                in_datafile = False
61
62def make_data_files(greptest_xml):
63        p = xml.parsers.expat.ParserCreate()
64        p.StartElementHandler = start_element_open_file
65        p.CharacterDataHandler = char_data_write_contents
66        p.EndElementHandler = end_element_close_file
67        p.Parse(greptest_xml, 1)
68
69def escape_quotes(e):  return e.replace("'", "'\\''")
70
71
72failure_count = 0
73
74def start_element_do_test(name, attrs):
75        global failure_count
76        if name == 'grepcase':
77                regexp = None
78                datafile = None
79                expected_count = None
80                for a in attrs:
81                        if a == 'regexp':
82                                regexp = attrs[a]
83                        elif a == 'datafile':
84                                datafile = attrs[a]
85                        elif a == 'grepcount':
86                                expected_count = attrs[a]
87                if regexp == None or datafile == None or expected_count == None:
88                        print("Bad grepcase: missing regexp and/or datafile attributes.")
89                        return
90                #execute grep test
91                grep_cmd = "%s -c '%s' %s" % (grep_program_under_test, escape_quotes(regexp), os.path.join(options.datafile_dir, datafile))
92                if options.verbose:
93                    print "Doing: " + grep_cmd
94                try:
95                    grep_out = subprocess.check_output(grep_cmd.encode('utf-8'), cwd=options.exec_dir, shell=True)
96                except subprocess.CalledProcessError, e:
97                    grep_out = e.output
98                if len(grep_out) > 0 and grep_out[-1] == '\n': grep_out = grep_out[:-1]
99                m = re.search('[0-9]+', grep_out)
100                if m == None or m.group(0) != expected_count:
101                        print("Test failure: regexp {%s} on datafile {%s} expecting {%s} got {%s}" % (regexp, datafile, expected_count, grep_out))
102                        failure_count += 1
103                else:
104                        if options.verbose:
105                                print("Test success: regexp {%s} on datafile {%s} expecting {%s} got {%s}" % (regexp, datafile, expected_count, grep_out))
106
107def run_tests(greptest_xml):
108        global failure_count
109        p = xml.parsers.expat.ParserCreate()
110        p.StartElementHandler = start_element_do_test
111        p.Parse(greptest_xml, 1)
112        if failure_count > 0: exit(1)
113
114if __name__ == '__main__':
115        QA_dir = os.path.dirname(sys.argv[0])
116        option_parser = optparse.OptionParser(usage='python %prog [options] <grep_executable>', version='1.0')
117        option_parser.add_option('-d', '--datafile_dir',
118                          dest = 'datafile_dir', type='string', default='testfiles',
119                          help = 'directory for test files.')
120        option_parser.add_option('-t', '--testcases',
121                          dest = 'testcases', type='string', default='greptest.xml',
122                          help = 'grep test case file (XML format).')
123        option_parser.add_option('-e', '--exec_dir',
124                          dest = 'exec_dir', type='string', default='.',
125                          help = 'executable directory')
126        option_parser.add_option('-v', '--verbose',
127                          dest = 'verbose', action='store_true', default=False,
128                          help = 'verbose output: show successful tests')
129        option_parser.add_option('-U', '--UTF-16',
130                          dest = 'utf16', action='store_true', default=False,
131                          help = 'test UTF-16 processing')
132        options, args = option_parser.parse_args(sys.argv[1:])
133        if len(args) != 1:
134                option_parser.print_usage()
135                sys.exit(1)
136
137        if not os.path.exists(options.datafile_dir):
138            os.mkdir(options.datafile_dir)
139        if not os.path.isdir(options.datafile_dir):
140            print "Cannot use %s as working test file directory.\n" % options.datafile_dir
141            sys.exit(1) 
142        grep_program_under_test = args[0]
143        grep_test_file = open(os.path.join(QA_dir,options.testcases), 'r')
144        grep_test_spec = grep_test_file.read()
145        grep_test_file.close()
146
147        make_data_files(grep_test_spec)
148        run_tests(grep_test_spec)
149
150
Note: See TracBrowser for help on using the repository browser.