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