upload tizen1.0 source
[external/libxml2.git] / check-xinclude-test-suite.py
1 #!/usr/bin/python
2 import sys
3 import time
4 import os
5 import string
6 sys.path.insert(0, "python")
7 import libxml2
8
9 #
10 # the testsuite description
11 #
12 DIR="xinclude-test-suite"
13 CONF="testdescr.xml"
14 LOG="check-xinclude-test-suite.log"
15
16 log = open(LOG, "w")
17
18 os.chdir(DIR)
19
20 test_nr = 0
21 test_succeed = 0
22 test_failed = 0
23 test_error = 0
24 #
25 # Error and warning handlers
26 #
27 error_nr = 0
28 error_msg = ''
29
30 def errorHandler(ctx, str):
31     global error_nr
32     global error_msg
33
34     if string.find(str, "error:") >= 0:
35         error_nr = error_nr + 1
36     if len(error_msg) < 300:
37         if len(error_msg) == 0 or error_msg[-1] == '\n':
38             error_msg = error_msg + "   >>" + str
39         else:
40             error_msg = error_msg + str
41
42 libxml2.registerErrorHandler(errorHandler, None)
43
44 def testXInclude(filename, id):
45     global error_nr
46     global error_msg
47     global log
48
49     error_nr = 0
50     error_msg = ''
51
52     print "testXInclude(%s, %s)" % (filename, id)
53     return 1
54
55 def runTest(test, basedir):
56     global test_nr
57     global test_failed
58     global test_error
59     global test_succeed
60     global error_msg
61     global log
62
63     fatal_error = 0
64     uri = test.prop('href')
65     id = test.prop('id')
66     type = test.prop('type')
67     if uri == None:
68         print "Test without ID:", uri
69         return -1
70     if id == None:
71         print "Test without URI:", id
72         return -1
73     if type == None:
74         print "Test without URI:", id
75         return -1
76     if basedir != None:
77         URI = basedir + "/" + uri
78     else:
79         URI = uri
80     if os.access(URI, os.R_OK) == 0:
81         print "Test %s missing: base %s uri %s" % (URI, basedir, uri)
82         return -1
83
84     expected = None
85     outputfile = None
86     diff = None
87     if type != 'error':
88         output = test.xpathEval('string(output)')
89         if output == 'No output file.':
90             output = None
91         if output == '':
92             output = None
93         if output != None:
94             if basedir != None:
95                 output = basedir + "/" + output
96             if os.access(output, os.R_OK) == 0:
97                 print "Result for %s missing: %s" % (id, output)
98                 output = None
99             else:
100                 try:
101                     f = open(output)
102                     expected = f.read()
103                     outputfile = output
104                 except:
105                     print "Result for %s unreadable: %s" % (id, output)
106
107     try:
108         # print "testing %s" % (URI)
109         doc = libxml2.parseFile(URI)
110     except:
111         doc = None
112     if doc != None:
113         res = doc.xincludeProcess()
114         if res >= 0 and expected != None:
115             result = doc.serialize()
116             if result != expected:
117                 print "Result for %s differs" % (id)
118                 open("xinclude.res", "w").write(result)
119                 diff = os.popen("diff %s xinclude.res" % outputfile).read()
120
121         doc.freeDoc()
122     else:
123         print "Failed to parse %s" % (URI)
124         res = -1
125
126     
127
128     test_nr = test_nr + 1
129     if type == 'success':
130         if res > 0:
131             test_succeed = test_succeed + 1
132         elif res == 0:
133             test_failed = test_failed + 1
134             print "Test %s: no substitution done ???" % (id)
135         elif res < 0:
136             test_error = test_error + 1
137             print "Test %s: failed valid XInclude processing" % (id)
138     elif type == 'error':
139         if res > 0:
140             test_error = test_error + 1
141             print "Test %s: failed to detect invalid XInclude processing" % (id)
142         elif res == 0:
143             test_failed = test_failed + 1
144             print "Test %s: Invalid but no substitution done" % (id)
145         elif res < 0:
146             test_succeed = test_succeed + 1
147     elif type == 'optional':
148         if res > 0:
149             test_succeed = test_succeed + 1
150         else:
151             print "Test %s: failed optional test" % (id)
152
153     # Log the ontext
154     if res != 1:
155         log.write("Test ID %s\n" % (id))
156         log.write("   File: %s\n" % (URI))
157         content = string.strip(test.content)
158         while content[-1] == '\n':
159             content = content[0:-1]
160         log.write("   %s:%s\n\n" % (type, content))
161         if error_msg != '':
162             log.write("   ----\n%s   ----\n" % (error_msg))
163             error_msg = ''
164         log.write("\n")
165     if diff != None:
166         log.write("diff from test %s:\n" %(id))
167         log.write("   -----------\n%s\n   -----------\n" % (diff));
168
169     return 0
170             
171
172 def runTestCases(case):
173     creator = case.prop('creator')
174     if creator != None:
175         print "=>", creator
176     base = case.getBase(None)
177     basedir = case.prop('basedir')
178     if basedir != None:
179         base = libxml2.buildURI(basedir, base)
180     test = case.children
181     while test != None:
182         if test.name == 'testcase':
183             runTest(test, base)
184         if test.name == 'testcases':
185             runTestCases(test)
186         test = test.next
187         
188 conf = libxml2.parseFile(CONF)
189 if conf == None:
190     print "Unable to load %s" % CONF
191     sys.exit(1)
192
193 testsuite = conf.getRootElement()
194 if testsuite.name != 'testsuite':
195     print "Expecting TESTSUITE root element: aborting"
196     sys.exit(1)
197
198 profile = testsuite.prop('PROFILE')
199 if profile != None:
200     print profile
201
202 start = time.time()
203
204 case = testsuite.children
205 while case != None:
206     if case.name == 'testcases':
207         old_test_nr = test_nr
208         old_test_succeed = test_succeed
209         old_test_failed = test_failed
210         old_test_error = test_error
211         runTestCases(case)
212         print "   Ran %d tests: %d suceeded, %d failed and %d generated an error" % (
213                test_nr - old_test_nr, test_succeed - old_test_succeed,
214                test_failed - old_test_failed, test_error - old_test_error)
215     case = case.next
216
217 conf.freeDoc()
218 log.close()
219
220 print "Ran %d tests: %d suceeded, %d failed and %d generated an error in %.2f s." % (
221       test_nr, test_succeed, test_failed, test_error, time.time() - start)