xref: /aosp_15_r20/external/cronet/third_party/libxml/src/check-xml-test-suite.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*6777b538SAndroid Build Coastguard Workerimport sys
3*6777b538SAndroid Build Coastguard Workerimport time
4*6777b538SAndroid Build Coastguard Workerimport os
5*6777b538SAndroid Build Coastguard Workersys.path.insert(0, "python")
6*6777b538SAndroid Build Coastguard Workerimport libxml2
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Workertest_nr = 0
9*6777b538SAndroid Build Coastguard Workertest_succeed = 0
10*6777b538SAndroid Build Coastguard Workertest_failed = 0
11*6777b538SAndroid Build Coastguard Workertest_error = 0
12*6777b538SAndroid Build Coastguard Worker
13*6777b538SAndroid Build Coastguard Worker#
14*6777b538SAndroid Build Coastguard Worker# the testsuite description
15*6777b538SAndroid Build Coastguard Worker#
16*6777b538SAndroid Build Coastguard WorkerCONF="xml-test-suite/xmlconf/xmlconf.xml"
17*6777b538SAndroid Build Coastguard WorkerLOG="check-xml-test-suite.log"
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Workerlog = open(LOG, "w")
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker#
22*6777b538SAndroid Build Coastguard Worker# Error and warning handlers
23*6777b538SAndroid Build Coastguard Worker#
24*6777b538SAndroid Build Coastguard Workererror_nr = 0
25*6777b538SAndroid Build Coastguard Workererror_msg = ''
26*6777b538SAndroid Build Coastguard Workerdef errorHandler(ctx, str):
27*6777b538SAndroid Build Coastguard Worker    global error_nr
28*6777b538SAndroid Build Coastguard Worker    global error_msg
29*6777b538SAndroid Build Coastguard Worker
30*6777b538SAndroid Build Coastguard Worker    error_nr = error_nr + 1
31*6777b538SAndroid Build Coastguard Worker    if len(error_msg) < 300:
32*6777b538SAndroid Build Coastguard Worker        if len(error_msg) == 0 or error_msg[-1] == '\n':
33*6777b538SAndroid Build Coastguard Worker            error_msg = error_msg + "   >>" + str
34*6777b538SAndroid Build Coastguard Worker        else:
35*6777b538SAndroid Build Coastguard Worker            error_msg = error_msg + str
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Workerlibxml2.registerErrorHandler(errorHandler, None)
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard Worker#warning_nr = 0
40*6777b538SAndroid Build Coastguard Worker#warning = ''
41*6777b538SAndroid Build Coastguard Worker#def warningHandler(ctx, str):
42*6777b538SAndroid Build Coastguard Worker#    global warning_nr
43*6777b538SAndroid Build Coastguard Worker#    global warning
44*6777b538SAndroid Build Coastguard Worker#
45*6777b538SAndroid Build Coastguard Worker#    warning_nr = warning_nr + 1
46*6777b538SAndroid Build Coastguard Worker#    warning = warning + str
47*6777b538SAndroid Build Coastguard Worker#
48*6777b538SAndroid Build Coastguard Worker#libxml2.registerWarningHandler(warningHandler, None)
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker#
51*6777b538SAndroid Build Coastguard Worker# Used to load the XML testsuite description
52*6777b538SAndroid Build Coastguard Worker#
53*6777b538SAndroid Build Coastguard Workerdef loadNoentDoc(filename):
54*6777b538SAndroid Build Coastguard Worker    ctxt = libxml2.createFileParserCtxt(filename)
55*6777b538SAndroid Build Coastguard Worker    if ctxt is None:
56*6777b538SAndroid Build Coastguard Worker        return None
57*6777b538SAndroid Build Coastguard Worker    ctxt.replaceEntities(1)
58*6777b538SAndroid Build Coastguard Worker    ctxt.parseDocument()
59*6777b538SAndroid Build Coastguard Worker    try:
60*6777b538SAndroid Build Coastguard Worker        doc = ctxt.doc()
61*6777b538SAndroid Build Coastguard Worker    except:
62*6777b538SAndroid Build Coastguard Worker        doc = None
63*6777b538SAndroid Build Coastguard Worker    if ctxt.wellFormed() != 1:
64*6777b538SAndroid Build Coastguard Worker        doc.freeDoc()
65*6777b538SAndroid Build Coastguard Worker        return None
66*6777b538SAndroid Build Coastguard Worker    return doc
67*6777b538SAndroid Build Coastguard Worker
68*6777b538SAndroid Build Coastguard Worker#
69*6777b538SAndroid Build Coastguard Worker# The conformance testing routines
70*6777b538SAndroid Build Coastguard Worker#
71*6777b538SAndroid Build Coastguard Worker
72*6777b538SAndroid Build Coastguard Workerdef testNotWf(filename, id):
73*6777b538SAndroid Build Coastguard Worker    global error_nr
74*6777b538SAndroid Build Coastguard Worker    global error_msg
75*6777b538SAndroid Build Coastguard Worker    global log
76*6777b538SAndroid Build Coastguard Worker
77*6777b538SAndroid Build Coastguard Worker    error_nr = 0
78*6777b538SAndroid Build Coastguard Worker    error_msg = ''
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Worker    ctxt = libxml2.createFileParserCtxt(filename)
81*6777b538SAndroid Build Coastguard Worker    if ctxt is None:
82*6777b538SAndroid Build Coastguard Worker        return -1
83*6777b538SAndroid Build Coastguard Worker    ret = ctxt.parseDocument()
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Worker    try:
86*6777b538SAndroid Build Coastguard Worker        doc = ctxt.doc()
87*6777b538SAndroid Build Coastguard Worker    except:
88*6777b538SAndroid Build Coastguard Worker        doc = None
89*6777b538SAndroid Build Coastguard Worker    if doc != None:
90*6777b538SAndroid Build Coastguard Worker        doc.freeDoc()
91*6777b538SAndroid Build Coastguard Worker    if ret == 0 or ctxt.wellFormed() != 0:
92*6777b538SAndroid Build Coastguard Worker        print("%s: error: Well Formedness error not detected" % (id))
93*6777b538SAndroid Build Coastguard Worker        log.write("%s: error: Well Formedness error not detected\n" % (id))
94*6777b538SAndroid Build Coastguard Worker        return 0
95*6777b538SAndroid Build Coastguard Worker    return 1
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard Workerdef testNotWfEnt(filename, id):
98*6777b538SAndroid Build Coastguard Worker    global error_nr
99*6777b538SAndroid Build Coastguard Worker    global error_msg
100*6777b538SAndroid Build Coastguard Worker    global log
101*6777b538SAndroid Build Coastguard Worker
102*6777b538SAndroid Build Coastguard Worker    error_nr = 0
103*6777b538SAndroid Build Coastguard Worker    error_msg = ''
104*6777b538SAndroid Build Coastguard Worker
105*6777b538SAndroid Build Coastguard Worker    ctxt = libxml2.createFileParserCtxt(filename)
106*6777b538SAndroid Build Coastguard Worker    if ctxt is None:
107*6777b538SAndroid Build Coastguard Worker        return -1
108*6777b538SAndroid Build Coastguard Worker    ctxt.replaceEntities(1)
109*6777b538SAndroid Build Coastguard Worker    ret = ctxt.parseDocument()
110*6777b538SAndroid Build Coastguard Worker
111*6777b538SAndroid Build Coastguard Worker    try:
112*6777b538SAndroid Build Coastguard Worker        doc = ctxt.doc()
113*6777b538SAndroid Build Coastguard Worker    except:
114*6777b538SAndroid Build Coastguard Worker        doc = None
115*6777b538SAndroid Build Coastguard Worker    if doc != None:
116*6777b538SAndroid Build Coastguard Worker        doc.freeDoc()
117*6777b538SAndroid Build Coastguard Worker    if ret == 0 or ctxt.wellFormed() != 0:
118*6777b538SAndroid Build Coastguard Worker        print("%s: error: Well Formedness error not detected" % (id))
119*6777b538SAndroid Build Coastguard Worker        log.write("%s: error: Well Formedness error not detected\n" % (id))
120*6777b538SAndroid Build Coastguard Worker        return 0
121*6777b538SAndroid Build Coastguard Worker    return 1
122*6777b538SAndroid Build Coastguard Worker
123*6777b538SAndroid Build Coastguard Workerdef testNotWfEntDtd(filename, id):
124*6777b538SAndroid Build Coastguard Worker    global error_nr
125*6777b538SAndroid Build Coastguard Worker    global error_msg
126*6777b538SAndroid Build Coastguard Worker    global log
127*6777b538SAndroid Build Coastguard Worker
128*6777b538SAndroid Build Coastguard Worker    error_nr = 0
129*6777b538SAndroid Build Coastguard Worker    error_msg = ''
130*6777b538SAndroid Build Coastguard Worker
131*6777b538SAndroid Build Coastguard Worker    ctxt = libxml2.createFileParserCtxt(filename)
132*6777b538SAndroid Build Coastguard Worker    if ctxt is None:
133*6777b538SAndroid Build Coastguard Worker        return -1
134*6777b538SAndroid Build Coastguard Worker    ctxt.replaceEntities(1)
135*6777b538SAndroid Build Coastguard Worker    ctxt.loadSubset(1)
136*6777b538SAndroid Build Coastguard Worker    ret = ctxt.parseDocument()
137*6777b538SAndroid Build Coastguard Worker
138*6777b538SAndroid Build Coastguard Worker    try:
139*6777b538SAndroid Build Coastguard Worker        doc = ctxt.doc()
140*6777b538SAndroid Build Coastguard Worker    except:
141*6777b538SAndroid Build Coastguard Worker        doc = None
142*6777b538SAndroid Build Coastguard Worker    if doc != None:
143*6777b538SAndroid Build Coastguard Worker        doc.freeDoc()
144*6777b538SAndroid Build Coastguard Worker    if ret == 0 or ctxt.wellFormed() != 0:
145*6777b538SAndroid Build Coastguard Worker        print("%s: error: Well Formedness error not detected" % (id))
146*6777b538SAndroid Build Coastguard Worker        log.write("%s: error: Well Formedness error not detected\n" % (id))
147*6777b538SAndroid Build Coastguard Worker        return 0
148*6777b538SAndroid Build Coastguard Worker    return 1
149*6777b538SAndroid Build Coastguard Worker
150*6777b538SAndroid Build Coastguard Workerdef testWfEntDtd(filename, id):
151*6777b538SAndroid Build Coastguard Worker    global error_nr
152*6777b538SAndroid Build Coastguard Worker    global error_msg
153*6777b538SAndroid Build Coastguard Worker    global log
154*6777b538SAndroid Build Coastguard Worker
155*6777b538SAndroid Build Coastguard Worker    error_nr = 0
156*6777b538SAndroid Build Coastguard Worker    error_msg = ''
157*6777b538SAndroid Build Coastguard Worker
158*6777b538SAndroid Build Coastguard Worker    ctxt = libxml2.createFileParserCtxt(filename)
159*6777b538SAndroid Build Coastguard Worker    if ctxt is None:
160*6777b538SAndroid Build Coastguard Worker        return -1
161*6777b538SAndroid Build Coastguard Worker    ctxt.replaceEntities(1)
162*6777b538SAndroid Build Coastguard Worker    ctxt.loadSubset(1)
163*6777b538SAndroid Build Coastguard Worker    ret = ctxt.parseDocument()
164*6777b538SAndroid Build Coastguard Worker
165*6777b538SAndroid Build Coastguard Worker    try:
166*6777b538SAndroid Build Coastguard Worker        doc = ctxt.doc()
167*6777b538SAndroid Build Coastguard Worker    except:
168*6777b538SAndroid Build Coastguard Worker        doc = None
169*6777b538SAndroid Build Coastguard Worker    if doc is None or ret != 0 or ctxt.wellFormed() == 0:
170*6777b538SAndroid Build Coastguard Worker        print("%s: error: wrongly failed to parse the document" % (id))
171*6777b538SAndroid Build Coastguard Worker        log.write("%s: error: wrongly failed to parse the document\n" % (id))
172*6777b538SAndroid Build Coastguard Worker        if doc != None:
173*6777b538SAndroid Build Coastguard Worker            doc.freeDoc()
174*6777b538SAndroid Build Coastguard Worker        return 0
175*6777b538SAndroid Build Coastguard Worker    if error_nr != 0:
176*6777b538SAndroid Build Coastguard Worker        print("%s: warning: WF document generated an error msg" % (id))
177*6777b538SAndroid Build Coastguard Worker        log.write("%s: error: WF document generated an error msg\n" % (id))
178*6777b538SAndroid Build Coastguard Worker        doc.freeDoc()
179*6777b538SAndroid Build Coastguard Worker        return 2
180*6777b538SAndroid Build Coastguard Worker    doc.freeDoc()
181*6777b538SAndroid Build Coastguard Worker    return 1
182*6777b538SAndroid Build Coastguard Worker
183*6777b538SAndroid Build Coastguard Workerdef testError(filename, id):
184*6777b538SAndroid Build Coastguard Worker    global error_nr
185*6777b538SAndroid Build Coastguard Worker    global error_msg
186*6777b538SAndroid Build Coastguard Worker    global log
187*6777b538SAndroid Build Coastguard Worker
188*6777b538SAndroid Build Coastguard Worker    error_nr = 0
189*6777b538SAndroid Build Coastguard Worker    error_msg = ''
190*6777b538SAndroid Build Coastguard Worker
191*6777b538SAndroid Build Coastguard Worker    ctxt = libxml2.createFileParserCtxt(filename)
192*6777b538SAndroid Build Coastguard Worker    if ctxt is None:
193*6777b538SAndroid Build Coastguard Worker        return -1
194*6777b538SAndroid Build Coastguard Worker    ctxt.replaceEntities(1)
195*6777b538SAndroid Build Coastguard Worker    ctxt.loadSubset(1)
196*6777b538SAndroid Build Coastguard Worker    ret = ctxt.parseDocument()
197*6777b538SAndroid Build Coastguard Worker
198*6777b538SAndroid Build Coastguard Worker    try:
199*6777b538SAndroid Build Coastguard Worker        doc = ctxt.doc()
200*6777b538SAndroid Build Coastguard Worker    except:
201*6777b538SAndroid Build Coastguard Worker        doc = None
202*6777b538SAndroid Build Coastguard Worker    if doc != None:
203*6777b538SAndroid Build Coastguard Worker        doc.freeDoc()
204*6777b538SAndroid Build Coastguard Worker    if ctxt.wellFormed() == 0:
205*6777b538SAndroid Build Coastguard Worker        print("%s: warning: failed to parse the document but accepted" % (id))
206*6777b538SAndroid Build Coastguard Worker        log.write("%s: warning: failed to parse the document but accepte\n" % (id))
207*6777b538SAndroid Build Coastguard Worker        return 2
208*6777b538SAndroid Build Coastguard Worker    if error_nr != 0:
209*6777b538SAndroid Build Coastguard Worker        print("%s: warning: WF document generated an error msg" % (id))
210*6777b538SAndroid Build Coastguard Worker        log.write("%s: error: WF document generated an error msg\n" % (id))
211*6777b538SAndroid Build Coastguard Worker        return 2
212*6777b538SAndroid Build Coastguard Worker    return 1
213*6777b538SAndroid Build Coastguard Worker
214*6777b538SAndroid Build Coastguard Workerdef testInvalid(filename, id):
215*6777b538SAndroid Build Coastguard Worker    global error_nr
216*6777b538SAndroid Build Coastguard Worker    global error_msg
217*6777b538SAndroid Build Coastguard Worker    global log
218*6777b538SAndroid Build Coastguard Worker
219*6777b538SAndroid Build Coastguard Worker    error_nr = 0
220*6777b538SAndroid Build Coastguard Worker    error_msg = ''
221*6777b538SAndroid Build Coastguard Worker
222*6777b538SAndroid Build Coastguard Worker    ctxt = libxml2.createFileParserCtxt(filename)
223*6777b538SAndroid Build Coastguard Worker    if ctxt is None:
224*6777b538SAndroid Build Coastguard Worker        return -1
225*6777b538SAndroid Build Coastguard Worker    ctxt.validate(1)
226*6777b538SAndroid Build Coastguard Worker    ret = ctxt.parseDocument()
227*6777b538SAndroid Build Coastguard Worker
228*6777b538SAndroid Build Coastguard Worker    try:
229*6777b538SAndroid Build Coastguard Worker        doc = ctxt.doc()
230*6777b538SAndroid Build Coastguard Worker    except:
231*6777b538SAndroid Build Coastguard Worker        doc = None
232*6777b538SAndroid Build Coastguard Worker    valid = ctxt.isValid()
233*6777b538SAndroid Build Coastguard Worker    if doc is None:
234*6777b538SAndroid Build Coastguard Worker        print("%s: error: wrongly failed to parse the document" % (id))
235*6777b538SAndroid Build Coastguard Worker        log.write("%s: error: wrongly failed to parse the document\n" % (id))
236*6777b538SAndroid Build Coastguard Worker        return 0
237*6777b538SAndroid Build Coastguard Worker    if valid == 1:
238*6777b538SAndroid Build Coastguard Worker        print("%s: error: Validity error not detected" % (id))
239*6777b538SAndroid Build Coastguard Worker        log.write("%s: error: Validity error not detected\n" % (id))
240*6777b538SAndroid Build Coastguard Worker        doc.freeDoc()
241*6777b538SAndroid Build Coastguard Worker        return 0
242*6777b538SAndroid Build Coastguard Worker    if error_nr == 0:
243*6777b538SAndroid Build Coastguard Worker        print("%s: warning: Validity error not reported" % (id))
244*6777b538SAndroid Build Coastguard Worker        log.write("%s: warning: Validity error not reported\n" % (id))
245*6777b538SAndroid Build Coastguard Worker        doc.freeDoc()
246*6777b538SAndroid Build Coastguard Worker        return 2
247*6777b538SAndroid Build Coastguard Worker
248*6777b538SAndroid Build Coastguard Worker    doc.freeDoc()
249*6777b538SAndroid Build Coastguard Worker    return 1
250*6777b538SAndroid Build Coastguard Worker
251*6777b538SAndroid Build Coastguard Workerdef testValid(filename, id):
252*6777b538SAndroid Build Coastguard Worker    global error_nr
253*6777b538SAndroid Build Coastguard Worker    global error_msg
254*6777b538SAndroid Build Coastguard Worker
255*6777b538SAndroid Build Coastguard Worker    error_nr = 0
256*6777b538SAndroid Build Coastguard Worker    error_msg = ''
257*6777b538SAndroid Build Coastguard Worker
258*6777b538SAndroid Build Coastguard Worker    ctxt = libxml2.createFileParserCtxt(filename)
259*6777b538SAndroid Build Coastguard Worker    if ctxt is None:
260*6777b538SAndroid Build Coastguard Worker        return -1
261*6777b538SAndroid Build Coastguard Worker    ctxt.validate(1)
262*6777b538SAndroid Build Coastguard Worker    ctxt.parseDocument()
263*6777b538SAndroid Build Coastguard Worker
264*6777b538SAndroid Build Coastguard Worker    try:
265*6777b538SAndroid Build Coastguard Worker        doc = ctxt.doc()
266*6777b538SAndroid Build Coastguard Worker    except:
267*6777b538SAndroid Build Coastguard Worker        doc = None
268*6777b538SAndroid Build Coastguard Worker    valid = ctxt.isValid()
269*6777b538SAndroid Build Coastguard Worker    if doc is None:
270*6777b538SAndroid Build Coastguard Worker        print("%s: error: wrongly failed to parse the document" % (id))
271*6777b538SAndroid Build Coastguard Worker        log.write("%s: error: wrongly failed to parse the document\n" % (id))
272*6777b538SAndroid Build Coastguard Worker        return 0
273*6777b538SAndroid Build Coastguard Worker    if valid != 1:
274*6777b538SAndroid Build Coastguard Worker        print("%s: error: Validity check failed" % (id))
275*6777b538SAndroid Build Coastguard Worker        log.write("%s: error: Validity check failed\n" % (id))
276*6777b538SAndroid Build Coastguard Worker        doc.freeDoc()
277*6777b538SAndroid Build Coastguard Worker        return 0
278*6777b538SAndroid Build Coastguard Worker    if error_nr != 0 or valid != 1:
279*6777b538SAndroid Build Coastguard Worker        print("%s: warning: valid document reported an error" % (id))
280*6777b538SAndroid Build Coastguard Worker        log.write("%s: warning: valid document reported an error\n" % (id))
281*6777b538SAndroid Build Coastguard Worker        doc.freeDoc()
282*6777b538SAndroid Build Coastguard Worker        return 2
283*6777b538SAndroid Build Coastguard Worker    doc.freeDoc()
284*6777b538SAndroid Build Coastguard Worker    return 1
285*6777b538SAndroid Build Coastguard Worker
286*6777b538SAndroid Build Coastguard Workerdef runTest(test):
287*6777b538SAndroid Build Coastguard Worker    global test_nr
288*6777b538SAndroid Build Coastguard Worker    global test_succeed
289*6777b538SAndroid Build Coastguard Worker    global test_failed
290*6777b538SAndroid Build Coastguard Worker    global error_msg
291*6777b538SAndroid Build Coastguard Worker    global log
292*6777b538SAndroid Build Coastguard Worker
293*6777b538SAndroid Build Coastguard Worker    uri = test.prop('URI')
294*6777b538SAndroid Build Coastguard Worker    id = test.prop('ID')
295*6777b538SAndroid Build Coastguard Worker    if uri is None:
296*6777b538SAndroid Build Coastguard Worker        print("Test without ID:", uri)
297*6777b538SAndroid Build Coastguard Worker        return -1
298*6777b538SAndroid Build Coastguard Worker    if id is None:
299*6777b538SAndroid Build Coastguard Worker        print("Test without URI:", id)
300*6777b538SAndroid Build Coastguard Worker        return -1
301*6777b538SAndroid Build Coastguard Worker    base = test.getBase(None)
302*6777b538SAndroid Build Coastguard Worker    URI = libxml2.buildURI(uri, base)
303*6777b538SAndroid Build Coastguard Worker    if os.access(URI, os.R_OK) == 0:
304*6777b538SAndroid Build Coastguard Worker        print("Test %s missing: base %s uri %s" % (URI, base, uri))
305*6777b538SAndroid Build Coastguard Worker        return -1
306*6777b538SAndroid Build Coastguard Worker    type = test.prop('TYPE')
307*6777b538SAndroid Build Coastguard Worker    if type is None:
308*6777b538SAndroid Build Coastguard Worker        print("Test %s missing TYPE" % (id))
309*6777b538SAndroid Build Coastguard Worker        return -1
310*6777b538SAndroid Build Coastguard Worker
311*6777b538SAndroid Build Coastguard Worker    extra = None
312*6777b538SAndroid Build Coastguard Worker    if type == "invalid":
313*6777b538SAndroid Build Coastguard Worker        res = testInvalid(URI, id)
314*6777b538SAndroid Build Coastguard Worker    elif type == "valid":
315*6777b538SAndroid Build Coastguard Worker        res = testValid(URI, id)
316*6777b538SAndroid Build Coastguard Worker    elif type == "not-wf":
317*6777b538SAndroid Build Coastguard Worker        extra =  test.prop('ENTITIES')
318*6777b538SAndroid Build Coastguard Worker        # print(URI)
319*6777b538SAndroid Build Coastguard Worker        #if extra is None:
320*6777b538SAndroid Build Coastguard Worker        #    res = testNotWfEntDtd(URI, id)
321*6777b538SAndroid Build Coastguard Worker         #elif extra == 'none':
322*6777b538SAndroid Build Coastguard Worker        #    res = testNotWf(URI, id)
323*6777b538SAndroid Build Coastguard Worker        #elif extra == 'general':
324*6777b538SAndroid Build Coastguard Worker        #    res = testNotWfEnt(URI, id)
325*6777b538SAndroid Build Coastguard Worker        #elif extra == 'both' or extra == 'parameter':
326*6777b538SAndroid Build Coastguard Worker        res = testNotWfEntDtd(URI, id)
327*6777b538SAndroid Build Coastguard Worker        #else:
328*6777b538SAndroid Build Coastguard Worker        #    print("Unknown value %s for an ENTITIES test value" % (extra))
329*6777b538SAndroid Build Coastguard Worker        #    return -1
330*6777b538SAndroid Build Coastguard Worker    elif type == "error":
331*6777b538SAndroid Build Coastguard Worker        res = testError(URI, id)
332*6777b538SAndroid Build Coastguard Worker    else:
333*6777b538SAndroid Build Coastguard Worker        # TODO skipped for now
334*6777b538SAndroid Build Coastguard Worker        return -1
335*6777b538SAndroid Build Coastguard Worker
336*6777b538SAndroid Build Coastguard Worker    test_nr = test_nr + 1
337*6777b538SAndroid Build Coastguard Worker    if res > 0:
338*6777b538SAndroid Build Coastguard Worker        test_succeed = test_succeed + 1
339*6777b538SAndroid Build Coastguard Worker    elif res == 0:
340*6777b538SAndroid Build Coastguard Worker        test_failed = test_failed + 1
341*6777b538SAndroid Build Coastguard Worker    elif res < 0:
342*6777b538SAndroid Build Coastguard Worker        test_error = test_error + 1
343*6777b538SAndroid Build Coastguard Worker
344*6777b538SAndroid Build Coastguard Worker    # Log the ontext
345*6777b538SAndroid Build Coastguard Worker    if res != 1:
346*6777b538SAndroid Build Coastguard Worker        log.write("   File: %s\n" % (URI))
347*6777b538SAndroid Build Coastguard Worker        content = test.content.strip()
348*6777b538SAndroid Build Coastguard Worker        while content[-1] == '\n':
349*6777b538SAndroid Build Coastguard Worker            content = content[0:-1]
350*6777b538SAndroid Build Coastguard Worker        if extra != None:
351*6777b538SAndroid Build Coastguard Worker            log.write("   %s:%s:%s\n" % (type, extra, content))
352*6777b538SAndroid Build Coastguard Worker        else:
353*6777b538SAndroid Build Coastguard Worker            log.write("   %s:%s\n\n" % (type, content))
354*6777b538SAndroid Build Coastguard Worker        if error_msg != '':
355*6777b538SAndroid Build Coastguard Worker            log.write("   ----\n%s   ----\n" % (error_msg))
356*6777b538SAndroid Build Coastguard Worker            error_msg = ''
357*6777b538SAndroid Build Coastguard Worker        log.write("\n")
358*6777b538SAndroid Build Coastguard Worker
359*6777b538SAndroid Build Coastguard Worker    return 0
360*6777b538SAndroid Build Coastguard Worker
361*6777b538SAndroid Build Coastguard Worker
362*6777b538SAndroid Build Coastguard Workerdef runTestCases(case):
363*6777b538SAndroid Build Coastguard Worker    profile = case.prop('PROFILE')
364*6777b538SAndroid Build Coastguard Worker    if profile != None and \
365*6777b538SAndroid Build Coastguard Worker       profile.find("IBM XML Conformance Test Suite - Production") < 0:
366*6777b538SAndroid Build Coastguard Worker        print("=>", profile)
367*6777b538SAndroid Build Coastguard Worker    test = case.children
368*6777b538SAndroid Build Coastguard Worker    while test != None:
369*6777b538SAndroid Build Coastguard Worker        if test.name == 'TEST':
370*6777b538SAndroid Build Coastguard Worker            runTest(test)
371*6777b538SAndroid Build Coastguard Worker        if test.name == 'TESTCASES':
372*6777b538SAndroid Build Coastguard Worker            runTestCases(test)
373*6777b538SAndroid Build Coastguard Worker        test = test.next
374*6777b538SAndroid Build Coastguard Worker
375*6777b538SAndroid Build Coastguard Workerconf = loadNoentDoc(CONF)
376*6777b538SAndroid Build Coastguard Workerif conf is None:
377*6777b538SAndroid Build Coastguard Worker    print("Unable to load %s" % CONF)
378*6777b538SAndroid Build Coastguard Worker    sys.exit(1)
379*6777b538SAndroid Build Coastguard Worker
380*6777b538SAndroid Build Coastguard Workertestsuite = conf.getRootElement()
381*6777b538SAndroid Build Coastguard Workerif testsuite.name != 'TESTSUITE':
382*6777b538SAndroid Build Coastguard Worker    print("Expecting TESTSUITE root element: aborting")
383*6777b538SAndroid Build Coastguard Worker    sys.exit(1)
384*6777b538SAndroid Build Coastguard Worker
385*6777b538SAndroid Build Coastguard Workerprofile = testsuite.prop('PROFILE')
386*6777b538SAndroid Build Coastguard Workerif profile != None:
387*6777b538SAndroid Build Coastguard Worker    print(profile)
388*6777b538SAndroid Build Coastguard Worker
389*6777b538SAndroid Build Coastguard Workerstart = time.time()
390*6777b538SAndroid Build Coastguard Worker
391*6777b538SAndroid Build Coastguard Workercase = testsuite.children
392*6777b538SAndroid Build Coastguard Workerwhile case != None:
393*6777b538SAndroid Build Coastguard Worker    if case.name == 'TESTCASES':
394*6777b538SAndroid Build Coastguard Worker        old_test_nr = test_nr
395*6777b538SAndroid Build Coastguard Worker        old_test_succeed = test_succeed
396*6777b538SAndroid Build Coastguard Worker        old_test_failed = test_failed
397*6777b538SAndroid Build Coastguard Worker        old_test_error = test_error
398*6777b538SAndroid Build Coastguard Worker        runTestCases(case)
399*6777b538SAndroid Build Coastguard Worker        print("   Ran %d tests: %d succeeded, %d failed and %d generated an error" % (
400*6777b538SAndroid Build Coastguard Worker               test_nr - old_test_nr, test_succeed - old_test_succeed,
401*6777b538SAndroid Build Coastguard Worker               test_failed - old_test_failed, test_error - old_test_error))
402*6777b538SAndroid Build Coastguard Worker    case = case.next
403*6777b538SAndroid Build Coastguard Worker
404*6777b538SAndroid Build Coastguard Workerconf.freeDoc()
405*6777b538SAndroid Build Coastguard Workerlog.close()
406*6777b538SAndroid Build Coastguard Worker
407*6777b538SAndroid Build Coastguard Workerprint("Ran %d tests: %d succeeded, %d failed and %d generated an error in %.2f s." % (
408*6777b538SAndroid Build Coastguard Worker      test_nr, test_succeed, test_failed, test_error, time.time() - start))
409