source: trunk/QA/xmlconf.py @ 4277

Last change on this file since 4277 was 1546, checked in by lindanl, 8 years ago

New Testsuite Script

File size: 5.6 KB
Line 
1import libxml2
2from subprocess import *
3import os
4import shutil
5import fnmatch                 
6import xml.parsers.expat
7from string import *
8from random import *
9import sys
10
11
12root = "/home/linda/workspace/"
13xerces_home = root+"svn/Xerces/installdir/bin"
14xmlconf_home = root+"svn/trunk/QA/xmlconf"
15newxmlconf_home = root+"svn/trunk/QA/newxmlconf"
16temp_messages_home = root+"svn/trunk/QA/TempMessages"
17expected_messages_home = root+"svn/trunk/QA/ExpectedMessages"
18output_messages_home = root+"svn/trunk/QA/OutputMessages"
19org_program = "SAXCount"
20new_program = "SAXCount"
21testcases = []
22subdir_prefix = ''
23ENCODING=False
24DTD=False
25NEWTEST = False
26NEWEXPECTEDMSG = False
27
28
29def load(filename):
30    xml_conf = libxml2.createFileParserCtxt(filename)
31    xml_conf.replaceEntities(1)
32    xml_conf.parseDocument()
33    doc = xml_conf.doc()
34    return doc
35
36def start_element(name, attrs):
37        global subdir_prefix
38        if name == 'TESTCASES':
39                for a in attrs:
40                        if a == 'xml:base':
41                                subdir_prefix = '/'+attrs[a]           
42        elif name == 'TEST':
43                for a in attrs:
44                        if a == 'RECOMMENDATION':
45                          if attrs[a] == 'XML1.1':
46                            return
47                for a in attrs:                     
48                        if a == 'URI':
49                                addr = attrs[a].split('/')
50                                filename = addr[len(addr)-1]
51                                subdir = attrs[a][:attrs[a].find(filename)]
52                                do_file(subdir, filename)
53
54def parser(xml_file):
55        p = xml.parsers.expat.ParserCreate()
56        p.StartElementHandler = start_element
57        p.Parse(xml_file, 1)
58               
59def do_file(subdir,filename):
60        global testcases
61        global ENCODING
62        global DTD
63        fulldir = subdir_prefix + subdir
64        exe_f = open(xmlconf_home + fulldir + filename, 'r')
65        filedata = exe_f.read()
66        if ENCODING==True and DTD==True:
67          testcases.append((fulldir,filename))
68        elif ENCODING==True:
69          if filedata.find('DOCTYPE')==-1:
70            testcases.append((fulldir,filename))
71        elif DTD==True:
72          encoding = filedata[:2].encode("hex")
73          if encoding != '0000' and encoding != 'feff' and encoding != 'fffe' and encoding != '003c' and encoding != '3c00' and encoding != '4c6f':
74            testcases.append((fulldir,filename))
75        else:
76          if filedata.find('DOCTYPE')==-1:
77            encoding = filedata[:2].encode("hex")
78            if encoding != '0000' and encoding != 'feff' and encoding != 'fffe' and encoding != '003c' and encoding != '3c00' and encoding != '4c6f':
79              testcases.append((fulldir,filename))
80           
81def run_test(testsuite,messages_home,program):
82    for testcase in testcases: 
83        #print testcase[0] + testcase[1]
84        messagedir = messages_home + testcase[0]
85        if os.path.exists(messagedir)==False:
86                os.makedirs(messagedir)
87        mes_f = open(messagedir + testcase[1], 'w')
88        call([xerces_home + '/' + program, testsuite + testcase[0] + testcase[1]], stderr=mes_f, cwd = testsuite + testcase[0])
89        mes_f.close()
90
91def parse_err_message(data,f):
92  n = data.split(',')
93  line = int(n[0][4:])
94  col = int(n[1][6:])
95  pos = 0
96  for i in range(line):
97    pos = pos + len(f.readline())
98  pos = pos + col
99  return pos   
100
101def gen_test():
102  if os.path.exists(newxmlconf_home):
103    shutil.rmtree(newxmlconf_home)
104  os.mkdir(newxmlconf_home)
105  for testcase in testcases:
106    messagedir = temp_messages_home + testcase[0]
107    newconfdir = newxmlconf_home  + testcase[0]
108    if os.path.exists(newconfdir)==False:
109      os.makedirs(newconfdir)
110    mes_f = open(messagedir + testcase[1], 'r')
111    data = mes_f.read()   
112    if data=='':
113      call(['cp', xmlconf_home + testcase[0] + testcase[1],newconfdir + testcase[1]])
114      new_f.close()
115      mes_f.close()
116      continue
117    else:
118      old_f = open(xmlconf_home + testcase[0] + testcase[1], 'r')
119      pos = parse_err_message(data,old_f)
120      length = 128-pos+128*randint(0,40)-randint(5,11)
121      newdata = '<!--' + length*'a' + '-->\n'
122      newdata = newdata+old_f.read()
123      new_f = open(newconfdir + testcase[1], 'w')
124      new_f.write(newdata)
125      new_f.close()
126      mes_f.close()
127      old_f.close()
128
129def compare():
130    same=True
131    for testcase in testcases:
132      expected_mes_f = open(expected_messages_home + testcase[0] + testcase[1], 'r')
133      output_mes_f = open(output_messages_home + testcase[0] + testcase[1], 'r')
134      expected_mes = expected_mes_f.read()
135      output_mes = output_mes_f.read()
136      if expected_mes!=output_mes:
137        print 'Expected message is: ' + expected_mes
138        print 'Your message is: ' + output_mes
139        same = False
140    return same
141   
142options=['-e','-d','-t', '-m','--help']
143
144if __name__ == "__main__":
145               
146        if (len(sys.argv) > 1):
147          for i in range(len(sys.argv)):
148            if sys.argv[i]==options[0]:
149              ENCODING = True
150            if sys.argv[i]==options[1]:
151              DTD = True
152            if sys.argv[i]==options[2]:
153              NEWTEST = True
154            if sys.argv[i]==options[3]:
155              NEWEXPECTEDMSG = True
156            if sys.argv[i]==options[4]:
157              print 'Options:\n -e: Enable Different Encodings\n -d: Enable DTD Parsing\n -t: Generate New Testsuite\n -m: Generate New Expected Messages'
158              sys.exit(0)
159         
160        doc = load(xmlconf_home+'/xmlconf.xml')
161        parser(str(doc))
162         
163        if NEWTEST == True:
164          os.mkdir(temp_messages_home)
165          run_test(xmlconf_home,temp_messages_home,org_program)
166          gen_test()
167          shutil.rmtree(temp_messages_home)
168          print 'Generated '+str(len(testcases))+' new testcases.'
169         
170        if NEWEXPECTEDMSG == True:
171          if os.path.exists(expected_messages_home):
172                  shutil.rmtree(expected_messages_home)
173          os.mkdir(expected_messages_home)
174          run_test(newxmlconf_home,expected_messages_home,org_program)
175          print 'Expected output messages are regenerated.'
176       
177        if os.path.exists(output_messages_home):
178                shutil.rmtree(output_messages_home)
179        os.mkdir(output_messages_home)
180        run_test(newxmlconf_home,output_messages_home,new_program)
181       
182        if compare()==True:
183          print 'Test ouputs match expected outputs.'
184       
185       
186       
187       
188       
189       
190       
191       
192       
193       
194       
195       
196       
197       
198       
Note: See TracBrowser for help on using the repository browser.