xref: /aosp_15_r20/external/cronet/third_party/libxml/src/check-relaxng-test-suite2.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 Workertry:
6*6777b538SAndroid Build Coastguard Worker    # Python 2
7*6777b538SAndroid Build Coastguard Worker    from StringIO import StringIO
8*6777b538SAndroid Build Coastguard Workerexcept ImportError:
9*6777b538SAndroid Build Coastguard Worker    # Python 3
10*6777b538SAndroid Build Coastguard Worker    from io import StringIO
11*6777b538SAndroid Build Coastguard Workersys.path.insert(0, "python")
12*6777b538SAndroid Build Coastguard Workerimport libxml2
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker# Memory debug specific
15*6777b538SAndroid Build Coastguard Workerlibxml2.debugMemory(1)
16*6777b538SAndroid Build Coastguard Workerdebug = 0
17*6777b538SAndroid Build Coastguard Workerquiet = 1
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Worker#
20*6777b538SAndroid Build Coastguard Worker# the testsuite description
21*6777b538SAndroid Build Coastguard Worker#
22*6777b538SAndroid Build Coastguard WorkerCONF=os.path.join(os.path.dirname(__file__), "test/relaxng/testsuite.xml")
23*6777b538SAndroid Build Coastguard WorkerLOG="check-relaxng-test-suite2.log"
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Workerlog = open(LOG, "w")
26*6777b538SAndroid Build Coastguard Workernb_schemas_tests = 0
27*6777b538SAndroid Build Coastguard Workernb_schemas_success = 0
28*6777b538SAndroid Build Coastguard Workernb_schemas_failed = 0
29*6777b538SAndroid Build Coastguard Workernb_instances_tests = 0
30*6777b538SAndroid Build Coastguard Workernb_instances_success = 0
31*6777b538SAndroid Build Coastguard Workernb_instances_failed = 0
32*6777b538SAndroid Build Coastguard Worker
33*6777b538SAndroid Build Coastguard Workerlibxml2.lineNumbersDefault(1)
34*6777b538SAndroid Build Coastguard Worker#
35*6777b538SAndroid Build Coastguard Worker# Resolver callback
36*6777b538SAndroid Build Coastguard Worker#
37*6777b538SAndroid Build Coastguard Workerresources = {}
38*6777b538SAndroid Build Coastguard Workerdef resolver(URL, ID, ctxt):
39*6777b538SAndroid Build Coastguard Worker    global resources
40*6777b538SAndroid Build Coastguard Worker
41*6777b538SAndroid Build Coastguard Worker    if URL in resources:
42*6777b538SAndroid Build Coastguard Worker        return(StringIO(resources[URL]))
43*6777b538SAndroid Build Coastguard Worker    log.write("Resolver failure: asked %s\n" % (URL))
44*6777b538SAndroid Build Coastguard Worker    log.write("resources: %s\n" % (resources))
45*6777b538SAndroid Build Coastguard Worker    return None
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Worker#
48*6777b538SAndroid Build Coastguard Worker# Load the previous results
49*6777b538SAndroid Build Coastguard Worker#
50*6777b538SAndroid Build Coastguard Worker#results = {}
51*6777b538SAndroid Build Coastguard Worker#previous = {}
52*6777b538SAndroid Build Coastguard Worker#
53*6777b538SAndroid Build Coastguard Worker#try:
54*6777b538SAndroid Build Coastguard Worker#    res = libxml2.parseFile(RES)
55*6777b538SAndroid Build Coastguard Worker#except:
56*6777b538SAndroid Build Coastguard Worker#    log.write("Could not parse %s" % (RES))
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker#
59*6777b538SAndroid Build Coastguard Worker# handle a valid instance
60*6777b538SAndroid Build Coastguard Worker#
61*6777b538SAndroid Build Coastguard Workerdef handle_valid(node, schema):
62*6777b538SAndroid Build Coastguard Worker    global log
63*6777b538SAndroid Build Coastguard Worker    global nb_instances_success
64*6777b538SAndroid Build Coastguard Worker    global nb_instances_failed
65*6777b538SAndroid Build Coastguard Worker
66*6777b538SAndroid Build Coastguard Worker    instance = node.prop("dtd")
67*6777b538SAndroid Build Coastguard Worker    if instance is None:
68*6777b538SAndroid Build Coastguard Worker        instance = ""
69*6777b538SAndroid Build Coastguard Worker    child = node.children
70*6777b538SAndroid Build Coastguard Worker    while child != None:
71*6777b538SAndroid Build Coastguard Worker        if child.type != 'text':
72*6777b538SAndroid Build Coastguard Worker            instance = instance + child.serialize()
73*6777b538SAndroid Build Coastguard Worker        child = child.next
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard Worker#    mem = libxml2.debugMemory(1);
76*6777b538SAndroid Build Coastguard Worker    try:
77*6777b538SAndroid Build Coastguard Worker        doc = libxml2.parseDoc(instance)
78*6777b538SAndroid Build Coastguard Worker    except:
79*6777b538SAndroid Build Coastguard Worker        doc = None
80*6777b538SAndroid Build Coastguard Worker
81*6777b538SAndroid Build Coastguard Worker    if doc is None:
82*6777b538SAndroid Build Coastguard Worker        log.write("\nFailed to parse correct instance:\n-----\n")
83*6777b538SAndroid Build Coastguard Worker        log.write(instance)
84*6777b538SAndroid Build Coastguard Worker        log.write("\n-----\n")
85*6777b538SAndroid Build Coastguard Worker        nb_instances_failed = nb_instances_failed + 1
86*6777b538SAndroid Build Coastguard Worker        return
87*6777b538SAndroid Build Coastguard Worker
88*6777b538SAndroid Build Coastguard Worker    if debug:
89*6777b538SAndroid Build Coastguard Worker        print("instance line %d" % (node.lineNo()))
90*6777b538SAndroid Build Coastguard Worker
91*6777b538SAndroid Build Coastguard Worker    try:
92*6777b538SAndroid Build Coastguard Worker        ctxt = schema.relaxNGNewValidCtxt()
93*6777b538SAndroid Build Coastguard Worker        ret = doc.relaxNGValidateDoc(ctxt)
94*6777b538SAndroid Build Coastguard Worker        del ctxt
95*6777b538SAndroid Build Coastguard Worker    except:
96*6777b538SAndroid Build Coastguard Worker        ret = -1
97*6777b538SAndroid Build Coastguard Worker
98*6777b538SAndroid Build Coastguard Worker    doc.freeDoc()
99*6777b538SAndroid Build Coastguard Worker#    if mem != libxml2.debugMemory(1):
100*6777b538SAndroid Build Coastguard Worker#        print("validating instance %d line %d leaks" % (
101*6777b538SAndroid Build Coastguard Worker#                  nb_instances_tests, node.lineNo()))
102*6777b538SAndroid Build Coastguard Worker
103*6777b538SAndroid Build Coastguard Worker    if ret != 0:
104*6777b538SAndroid Build Coastguard Worker        log.write("\nFailed to validate correct instance:\n-----\n")
105*6777b538SAndroid Build Coastguard Worker        log.write(instance)
106*6777b538SAndroid Build Coastguard Worker        log.write("\n-----\n")
107*6777b538SAndroid Build Coastguard Worker        nb_instances_failed = nb_instances_failed + 1
108*6777b538SAndroid Build Coastguard Worker    else:
109*6777b538SAndroid Build Coastguard Worker        nb_instances_success = nb_instances_success + 1
110*6777b538SAndroid Build Coastguard Worker
111*6777b538SAndroid Build Coastguard Worker#
112*6777b538SAndroid Build Coastguard Worker# handle an invalid instance
113*6777b538SAndroid Build Coastguard Worker#
114*6777b538SAndroid Build Coastguard Workerdef handle_invalid(node, schema):
115*6777b538SAndroid Build Coastguard Worker    global log
116*6777b538SAndroid Build Coastguard Worker    global nb_instances_success
117*6777b538SAndroid Build Coastguard Worker    global nb_instances_failed
118*6777b538SAndroid Build Coastguard Worker
119*6777b538SAndroid Build Coastguard Worker    instance = node.prop("dtd")
120*6777b538SAndroid Build Coastguard Worker    if instance is None:
121*6777b538SAndroid Build Coastguard Worker        instance = ""
122*6777b538SAndroid Build Coastguard Worker    child = node.children
123*6777b538SAndroid Build Coastguard Worker    while child != None:
124*6777b538SAndroid Build Coastguard Worker        if child.type != 'text':
125*6777b538SAndroid Build Coastguard Worker            instance = instance + child.serialize()
126*6777b538SAndroid Build Coastguard Worker        child = child.next
127*6777b538SAndroid Build Coastguard Worker
128*6777b538SAndroid Build Coastguard Worker#    mem = libxml2.debugMemory(1);
129*6777b538SAndroid Build Coastguard Worker
130*6777b538SAndroid Build Coastguard Worker    try:
131*6777b538SAndroid Build Coastguard Worker        doc = libxml2.parseDoc(instance)
132*6777b538SAndroid Build Coastguard Worker    except:
133*6777b538SAndroid Build Coastguard Worker        doc = None
134*6777b538SAndroid Build Coastguard Worker
135*6777b538SAndroid Build Coastguard Worker    if doc is None:
136*6777b538SAndroid Build Coastguard Worker        log.write("\nStrange: failed to parse incorrect instance:\n-----\n")
137*6777b538SAndroid Build Coastguard Worker        log.write(instance)
138*6777b538SAndroid Build Coastguard Worker        log.write("\n-----\n")
139*6777b538SAndroid Build Coastguard Worker        return
140*6777b538SAndroid Build Coastguard Worker
141*6777b538SAndroid Build Coastguard Worker    if debug:
142*6777b538SAndroid Build Coastguard Worker        print("instance line %d" % (node.lineNo()))
143*6777b538SAndroid Build Coastguard Worker
144*6777b538SAndroid Build Coastguard Worker    try:
145*6777b538SAndroid Build Coastguard Worker        ctxt = schema.relaxNGNewValidCtxt()
146*6777b538SAndroid Build Coastguard Worker        ret = doc.relaxNGValidateDoc(ctxt)
147*6777b538SAndroid Build Coastguard Worker        del ctxt
148*6777b538SAndroid Build Coastguard Worker
149*6777b538SAndroid Build Coastguard Worker    except:
150*6777b538SAndroid Build Coastguard Worker        ret = -1
151*6777b538SAndroid Build Coastguard Worker
152*6777b538SAndroid Build Coastguard Worker    doc.freeDoc()
153*6777b538SAndroid Build Coastguard Worker#    mem2 = libxml2.debugMemory(1)
154*6777b538SAndroid Build Coastguard Worker#    if mem != mem2:
155*6777b538SAndroid Build Coastguard Worker#        print("validating instance %d line %d leaks %d bytes" % (
156*6777b538SAndroid Build Coastguard Worker#                  nb_instances_tests, node.lineNo(), mem2 - mem))
157*6777b538SAndroid Build Coastguard Worker
158*6777b538SAndroid Build Coastguard Worker    if ret == 0:
159*6777b538SAndroid Build Coastguard Worker        log.write("\nFailed to detect validation problem in instance:\n-----\n")
160*6777b538SAndroid Build Coastguard Worker        log.write(instance)
161*6777b538SAndroid Build Coastguard Worker        log.write("\n-----\n")
162*6777b538SAndroid Build Coastguard Worker        nb_instances_failed = nb_instances_failed + 1
163*6777b538SAndroid Build Coastguard Worker    else:
164*6777b538SAndroid Build Coastguard Worker        nb_instances_success = nb_instances_success + 1
165*6777b538SAndroid Build Coastguard Worker
166*6777b538SAndroid Build Coastguard Worker#
167*6777b538SAndroid Build Coastguard Worker# handle an incorrect test
168*6777b538SAndroid Build Coastguard Worker#
169*6777b538SAndroid Build Coastguard Workerdef handle_correct(node):
170*6777b538SAndroid Build Coastguard Worker    global log
171*6777b538SAndroid Build Coastguard Worker    global nb_schemas_success
172*6777b538SAndroid Build Coastguard Worker    global nb_schemas_failed
173*6777b538SAndroid Build Coastguard Worker
174*6777b538SAndroid Build Coastguard Worker    schema = ""
175*6777b538SAndroid Build Coastguard Worker    child = node.children
176*6777b538SAndroid Build Coastguard Worker    while child != None:
177*6777b538SAndroid Build Coastguard Worker        if child.type != 'text':
178*6777b538SAndroid Build Coastguard Worker            schema = schema + child.serialize()
179*6777b538SAndroid Build Coastguard Worker        child = child.next
180*6777b538SAndroid Build Coastguard Worker
181*6777b538SAndroid Build Coastguard Worker    try:
182*6777b538SAndroid Build Coastguard Worker        rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
183*6777b538SAndroid Build Coastguard Worker        rngs = rngp.relaxNGParse()
184*6777b538SAndroid Build Coastguard Worker    except:
185*6777b538SAndroid Build Coastguard Worker        rngs = None
186*6777b538SAndroid Build Coastguard Worker    if rngs is None:
187*6777b538SAndroid Build Coastguard Worker        log.write("\nFailed to compile correct schema:\n-----\n")
188*6777b538SAndroid Build Coastguard Worker        log.write(schema)
189*6777b538SAndroid Build Coastguard Worker        log.write("\n-----\n")
190*6777b538SAndroid Build Coastguard Worker        nb_schemas_failed = nb_schemas_failed + 1
191*6777b538SAndroid Build Coastguard Worker    else:
192*6777b538SAndroid Build Coastguard Worker        nb_schemas_success = nb_schemas_success + 1
193*6777b538SAndroid Build Coastguard Worker    return rngs
194*6777b538SAndroid Build Coastguard Worker
195*6777b538SAndroid Build Coastguard Workerdef handle_incorrect(node):
196*6777b538SAndroid Build Coastguard Worker    global log
197*6777b538SAndroid Build Coastguard Worker    global nb_schemas_success
198*6777b538SAndroid Build Coastguard Worker    global nb_schemas_failed
199*6777b538SAndroid Build Coastguard Worker
200*6777b538SAndroid Build Coastguard Worker    schema = ""
201*6777b538SAndroid Build Coastguard Worker    child = node.children
202*6777b538SAndroid Build Coastguard Worker    while child != None:
203*6777b538SAndroid Build Coastguard Worker        if child.type != 'text':
204*6777b538SAndroid Build Coastguard Worker            schema = schema + child.serialize()
205*6777b538SAndroid Build Coastguard Worker        child = child.next
206*6777b538SAndroid Build Coastguard Worker
207*6777b538SAndroid Build Coastguard Worker    try:
208*6777b538SAndroid Build Coastguard Worker        rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
209*6777b538SAndroid Build Coastguard Worker        rngs = rngp.relaxNGParse()
210*6777b538SAndroid Build Coastguard Worker    except:
211*6777b538SAndroid Build Coastguard Worker        rngs = None
212*6777b538SAndroid Build Coastguard Worker    if rngs != None:
213*6777b538SAndroid Build Coastguard Worker        log.write("\nFailed to detect schema error in:\n-----\n")
214*6777b538SAndroid Build Coastguard Worker        log.write(schema)
215*6777b538SAndroid Build Coastguard Worker        log.write("\n-----\n")
216*6777b538SAndroid Build Coastguard Worker        nb_schemas_failed = nb_schemas_failed + 1
217*6777b538SAndroid Build Coastguard Worker    else:
218*6777b538SAndroid Build Coastguard Worker#        log.write("\nSuccess detecting schema error in:\n-----\n")
219*6777b538SAndroid Build Coastguard Worker#        log.write(schema)
220*6777b538SAndroid Build Coastguard Worker#        log.write("\n-----\n")
221*6777b538SAndroid Build Coastguard Worker        nb_schemas_success = nb_schemas_success + 1
222*6777b538SAndroid Build Coastguard Worker    return None
223*6777b538SAndroid Build Coastguard Worker
224*6777b538SAndroid Build Coastguard Worker#
225*6777b538SAndroid Build Coastguard Worker# resource handling: keep a dictionary of URL->string mappings
226*6777b538SAndroid Build Coastguard Worker#
227*6777b538SAndroid Build Coastguard Workerdef handle_resource(node, dir):
228*6777b538SAndroid Build Coastguard Worker    global resources
229*6777b538SAndroid Build Coastguard Worker
230*6777b538SAndroid Build Coastguard Worker    try:
231*6777b538SAndroid Build Coastguard Worker        name = node.prop('name')
232*6777b538SAndroid Build Coastguard Worker    except:
233*6777b538SAndroid Build Coastguard Worker        name = None
234*6777b538SAndroid Build Coastguard Worker
235*6777b538SAndroid Build Coastguard Worker    if name is None or name == '':
236*6777b538SAndroid Build Coastguard Worker        log.write("resource has no name")
237*6777b538SAndroid Build Coastguard Worker        return;
238*6777b538SAndroid Build Coastguard Worker
239*6777b538SAndroid Build Coastguard Worker    if dir != None:
240*6777b538SAndroid Build Coastguard Worker#        name = libxml2.buildURI(name, dir)
241*6777b538SAndroid Build Coastguard Worker        name = dir + '/' + name
242*6777b538SAndroid Build Coastguard Worker
243*6777b538SAndroid Build Coastguard Worker    res = ""
244*6777b538SAndroid Build Coastguard Worker    child = node.children
245*6777b538SAndroid Build Coastguard Worker    while child != None:
246*6777b538SAndroid Build Coastguard Worker        if child.type != 'text':
247*6777b538SAndroid Build Coastguard Worker            res = res + child.serialize()
248*6777b538SAndroid Build Coastguard Worker        child = child.next
249*6777b538SAndroid Build Coastguard Worker    resources[name] = res
250*6777b538SAndroid Build Coastguard Worker
251*6777b538SAndroid Build Coastguard Worker#
252*6777b538SAndroid Build Coastguard Worker# dir handling: pseudo directory resources
253*6777b538SAndroid Build Coastguard Worker#
254*6777b538SAndroid Build Coastguard Workerdef handle_dir(node, dir):
255*6777b538SAndroid Build Coastguard Worker    try:
256*6777b538SAndroid Build Coastguard Worker        name = node.prop('name')
257*6777b538SAndroid Build Coastguard Worker    except:
258*6777b538SAndroid Build Coastguard Worker        name = None
259*6777b538SAndroid Build Coastguard Worker
260*6777b538SAndroid Build Coastguard Worker    if name is None or name == '':
261*6777b538SAndroid Build Coastguard Worker        log.write("resource has no name")
262*6777b538SAndroid Build Coastguard Worker        return;
263*6777b538SAndroid Build Coastguard Worker
264*6777b538SAndroid Build Coastguard Worker    if dir != None:
265*6777b538SAndroid Build Coastguard Worker#        name = libxml2.buildURI(name, dir)
266*6777b538SAndroid Build Coastguard Worker        name = dir + '/' + name
267*6777b538SAndroid Build Coastguard Worker
268*6777b538SAndroid Build Coastguard Worker    dirs = node.xpathEval('dir')
269*6777b538SAndroid Build Coastguard Worker    for dir in dirs:
270*6777b538SAndroid Build Coastguard Worker        handle_dir(dir, name)
271*6777b538SAndroid Build Coastguard Worker    res = node.xpathEval('resource')
272*6777b538SAndroid Build Coastguard Worker    for r in res:
273*6777b538SAndroid Build Coastguard Worker        handle_resource(r, name)
274*6777b538SAndroid Build Coastguard Worker
275*6777b538SAndroid Build Coastguard Worker#
276*6777b538SAndroid Build Coastguard Worker# handle a testCase element
277*6777b538SAndroid Build Coastguard Worker#
278*6777b538SAndroid Build Coastguard Workerdef handle_testCase(node):
279*6777b538SAndroid Build Coastguard Worker    global nb_schemas_tests
280*6777b538SAndroid Build Coastguard Worker    global nb_instances_tests
281*6777b538SAndroid Build Coastguard Worker    global resources
282*6777b538SAndroid Build Coastguard Worker
283*6777b538SAndroid Build Coastguard Worker    sections = node.xpathEval('string(section)')
284*6777b538SAndroid Build Coastguard Worker    log.write("\n    ======== test %d line %d section %s ==========\n" % (
285*6777b538SAndroid Build Coastguard Worker
286*6777b538SAndroid Build Coastguard Worker              nb_schemas_tests, node.lineNo(), sections))
287*6777b538SAndroid Build Coastguard Worker    resources = {}
288*6777b538SAndroid Build Coastguard Worker    if debug:
289*6777b538SAndroid Build Coastguard Worker        print("test %d line %d" % (nb_schemas_tests, node.lineNo()))
290*6777b538SAndroid Build Coastguard Worker
291*6777b538SAndroid Build Coastguard Worker    dirs = node.xpathEval('dir')
292*6777b538SAndroid Build Coastguard Worker    for dir in dirs:
293*6777b538SAndroid Build Coastguard Worker        handle_dir(dir, None)
294*6777b538SAndroid Build Coastguard Worker    res = node.xpathEval('resource')
295*6777b538SAndroid Build Coastguard Worker    for r in res:
296*6777b538SAndroid Build Coastguard Worker        handle_resource(r, None)
297*6777b538SAndroid Build Coastguard Worker
298*6777b538SAndroid Build Coastguard Worker    tsts = node.xpathEval('incorrect')
299*6777b538SAndroid Build Coastguard Worker    if tsts != []:
300*6777b538SAndroid Build Coastguard Worker        if len(tsts) != 1:
301*6777b538SAndroid Build Coastguard Worker            print("warning test line %d has more than one <incorrect> example" %(node.lineNo()))
302*6777b538SAndroid Build Coastguard Worker        schema = handle_incorrect(tsts[0])
303*6777b538SAndroid Build Coastguard Worker    else:
304*6777b538SAndroid Build Coastguard Worker        tsts = node.xpathEval('correct')
305*6777b538SAndroid Build Coastguard Worker        if tsts != []:
306*6777b538SAndroid Build Coastguard Worker            if len(tsts) != 1:
307*6777b538SAndroid Build Coastguard Worker                print("warning test line %d has more than one <correct> example"% (node.lineNo()))
308*6777b538SAndroid Build Coastguard Worker            schema = handle_correct(tsts[0])
309*6777b538SAndroid Build Coastguard Worker        else:
310*6777b538SAndroid Build Coastguard Worker            print("warning <testCase> line %d has no <correct> nor <incorrect> child" % (node.lineNo()))
311*6777b538SAndroid Build Coastguard Worker
312*6777b538SAndroid Build Coastguard Worker    nb_schemas_tests = nb_schemas_tests + 1;
313*6777b538SAndroid Build Coastguard Worker
314*6777b538SAndroid Build Coastguard Worker    valids = node.xpathEval('valid')
315*6777b538SAndroid Build Coastguard Worker    invalids = node.xpathEval('invalid')
316*6777b538SAndroid Build Coastguard Worker    nb_instances_tests = nb_instances_tests + len(valids) + len(invalids)
317*6777b538SAndroid Build Coastguard Worker    if schema != None:
318*6777b538SAndroid Build Coastguard Worker        for valid in valids:
319*6777b538SAndroid Build Coastguard Worker            handle_valid(valid, schema)
320*6777b538SAndroid Build Coastguard Worker        for invalid in invalids:
321*6777b538SAndroid Build Coastguard Worker            handle_invalid(invalid, schema)
322*6777b538SAndroid Build Coastguard Worker
323*6777b538SAndroid Build Coastguard Worker
324*6777b538SAndroid Build Coastguard Worker#
325*6777b538SAndroid Build Coastguard Worker# handle a testSuite element
326*6777b538SAndroid Build Coastguard Worker#
327*6777b538SAndroid Build Coastguard Workerdef handle_testSuite(node, level = 0):
328*6777b538SAndroid Build Coastguard Worker    global nb_schemas_tests, nb_schemas_success, nb_schemas_failed
329*6777b538SAndroid Build Coastguard Worker    global nb_instances_tests, nb_instances_success, nb_instances_failed
330*6777b538SAndroid Build Coastguard Worker    if level >= 1:
331*6777b538SAndroid Build Coastguard Worker        old_schemas_tests = nb_schemas_tests
332*6777b538SAndroid Build Coastguard Worker        old_schemas_success = nb_schemas_success
333*6777b538SAndroid Build Coastguard Worker        old_schemas_failed = nb_schemas_failed
334*6777b538SAndroid Build Coastguard Worker        old_instances_tests = nb_instances_tests
335*6777b538SAndroid Build Coastguard Worker        old_instances_success = nb_instances_success
336*6777b538SAndroid Build Coastguard Worker        old_instances_failed = nb_instances_failed
337*6777b538SAndroid Build Coastguard Worker
338*6777b538SAndroid Build Coastguard Worker    docs = node.xpathEval('documentation')
339*6777b538SAndroid Build Coastguard Worker    authors = node.xpathEval('author')
340*6777b538SAndroid Build Coastguard Worker    if docs != []:
341*6777b538SAndroid Build Coastguard Worker        msg = ""
342*6777b538SAndroid Build Coastguard Worker        for doc in docs:
343*6777b538SAndroid Build Coastguard Worker            msg = msg + doc.content + " "
344*6777b538SAndroid Build Coastguard Worker        if authors != []:
345*6777b538SAndroid Build Coastguard Worker            msg = msg + "written by "
346*6777b538SAndroid Build Coastguard Worker            for author in authors:
347*6777b538SAndroid Build Coastguard Worker                msg = msg + author.content + " "
348*6777b538SAndroid Build Coastguard Worker        if quiet == 0:
349*6777b538SAndroid Build Coastguard Worker            print(msg)
350*6777b538SAndroid Build Coastguard Worker    sections = node.xpathEval('section')
351*6777b538SAndroid Build Coastguard Worker    if sections != [] and level <= 0:
352*6777b538SAndroid Build Coastguard Worker        msg = ""
353*6777b538SAndroid Build Coastguard Worker        for section in sections:
354*6777b538SAndroid Build Coastguard Worker            msg = msg + section.content + " "
355*6777b538SAndroid Build Coastguard Worker        if quiet == 0:
356*6777b538SAndroid Build Coastguard Worker            print("Tests for section %s" % (msg))
357*6777b538SAndroid Build Coastguard Worker    for test in node.xpathEval('testCase'):
358*6777b538SAndroid Build Coastguard Worker        handle_testCase(test)
359*6777b538SAndroid Build Coastguard Worker    for test in node.xpathEval('testSuite'):
360*6777b538SAndroid Build Coastguard Worker        handle_testSuite(test, level + 1)
361*6777b538SAndroid Build Coastguard Worker
362*6777b538SAndroid Build Coastguard Worker
363*6777b538SAndroid Build Coastguard Worker    if level >= 1 and sections != []:
364*6777b538SAndroid Build Coastguard Worker        msg = ""
365*6777b538SAndroid Build Coastguard Worker        for section in sections:
366*6777b538SAndroid Build Coastguard Worker            msg = msg + section.content + " "
367*6777b538SAndroid Build Coastguard Worker        print("Result of tests for section %s" % (msg))
368*6777b538SAndroid Build Coastguard Worker        if nb_schemas_tests != old_schemas_tests:
369*6777b538SAndroid Build Coastguard Worker            print("found %d test schemas: %d success %d failures" % (
370*6777b538SAndroid Build Coastguard Worker                  nb_schemas_tests - old_schemas_tests,
371*6777b538SAndroid Build Coastguard Worker                  nb_schemas_success - old_schemas_success,
372*6777b538SAndroid Build Coastguard Worker                  nb_schemas_failed - old_schemas_failed))
373*6777b538SAndroid Build Coastguard Worker        if nb_instances_tests != old_instances_tests:
374*6777b538SAndroid Build Coastguard Worker            print("found %d test instances: %d success %d failures" % (
375*6777b538SAndroid Build Coastguard Worker                  nb_instances_tests - old_instances_tests,
376*6777b538SAndroid Build Coastguard Worker                  nb_instances_success - old_instances_success,
377*6777b538SAndroid Build Coastguard Worker                  nb_instances_failed - old_instances_failed))
378*6777b538SAndroid Build Coastguard Worker#
379*6777b538SAndroid Build Coastguard Worker# Parse the conf file
380*6777b538SAndroid Build Coastguard Worker#
381*6777b538SAndroid Build Coastguard Workerlibxml2.substituteEntitiesDefault(1);
382*6777b538SAndroid Build Coastguard Workertestsuite = libxml2.parseFile(CONF)
383*6777b538SAndroid Build Coastguard Worker
384*6777b538SAndroid Build Coastguard Worker#
385*6777b538SAndroid Build Coastguard Worker# Error and warnng callbacks
386*6777b538SAndroid Build Coastguard Worker#
387*6777b538SAndroid Build Coastguard Workerdef callback(ctx, str):
388*6777b538SAndroid Build Coastguard Worker    global log
389*6777b538SAndroid Build Coastguard Worker    log.write("%s%s" % (ctx, str))
390*6777b538SAndroid Build Coastguard Worker
391*6777b538SAndroid Build Coastguard Workerlibxml2.registerErrorHandler(callback, "")
392*6777b538SAndroid Build Coastguard Worker
393*6777b538SAndroid Build Coastguard Workerlibxml2.setEntityLoader(resolver)
394*6777b538SAndroid Build Coastguard Workerroot = testsuite.getRootElement()
395*6777b538SAndroid Build Coastguard Workerif root.name != 'testSuite':
396*6777b538SAndroid Build Coastguard Worker    print("%s doesn't start with a testSuite element, aborting" % (CONF))
397*6777b538SAndroid Build Coastguard Worker    sys.exit(1)
398*6777b538SAndroid Build Coastguard Workerif quiet == 0:
399*6777b538SAndroid Build Coastguard Worker    print("Running Relax NG testsuite")
400*6777b538SAndroid Build Coastguard Workerhandle_testSuite(root)
401*6777b538SAndroid Build Coastguard Worker
402*6777b538SAndroid Build Coastguard Workerif quiet == 0:
403*6777b538SAndroid Build Coastguard Worker    print("\nTOTAL:\n")
404*6777b538SAndroid Build Coastguard Workerif quiet == 0 or nb_schemas_failed != 0:
405*6777b538SAndroid Build Coastguard Worker    print("found %d test schemas: %d success %d failures" % (
406*6777b538SAndroid Build Coastguard Worker      nb_schemas_tests, nb_schemas_success, nb_schemas_failed))
407*6777b538SAndroid Build Coastguard Workerif quiet == 0 or nb_instances_failed != 0:
408*6777b538SAndroid Build Coastguard Worker    print("found %d test instances: %d success %d failures" % (
409*6777b538SAndroid Build Coastguard Worker      nb_instances_tests, nb_instances_success, nb_instances_failed))
410*6777b538SAndroid Build Coastguard Worker
411*6777b538SAndroid Build Coastguard Workerlog.close()
412*6777b538SAndroid Build Coastguard Workertestsuite.freeDoc()
413*6777b538SAndroid Build Coastguard Worker
414*6777b538SAndroid Build Coastguard Worker# Memory debug specific
415*6777b538SAndroid Build Coastguard Workerlibxml2.relaxNGCleanupTypes()
416*6777b538SAndroid Build Coastguard Workerlibxml2.cleanupParser()
417*6777b538SAndroid Build Coastguard Workerif libxml2.debugMemory(1) == 0:
418*6777b538SAndroid Build Coastguard Worker    if quiet == 0:
419*6777b538SAndroid Build Coastguard Worker        print("OK")
420*6777b538SAndroid Build Coastguard Workerelse:
421*6777b538SAndroid Build Coastguard Worker    print("Memory leak %d bytes" % (libxml2.debugMemory(1)))
422