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