1*7c568831SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*7c568831SAndroid Build Coastguard Workerimport setup_test 3*7c568831SAndroid Build Coastguard Workerimport libxml2 4*7c568831SAndroid Build Coastguard Workerimport sys 5*7c568831SAndroid Build Coastguard Worker 6*7c568831SAndroid Build Coastguard WorkerARG = 'test string' 7*7c568831SAndroid Build Coastguard Worker 8*7c568831SAndroid Build Coastguard Workerclass ErrorHandler: 9*7c568831SAndroid Build Coastguard Worker 10*7c568831SAndroid Build Coastguard Worker def __init__(self): 11*7c568831SAndroid Build Coastguard Worker self.errors = [] 12*7c568831SAndroid Build Coastguard Worker 13*7c568831SAndroid Build Coastguard Worker def handler(self, msg, data): 14*7c568831SAndroid Build Coastguard Worker if data != ARG: 15*7c568831SAndroid Build Coastguard Worker raise Exception("Error handler did not receive correct argument") 16*7c568831SAndroid Build Coastguard Worker self.errors.append(msg) 17*7c568831SAndroid Build Coastguard Worker 18*7c568831SAndroid Build Coastguard Worker# Memory debug specific 19*7c568831SAndroid Build Coastguard Workerlibxml2.debugMemory(1) 20*7c568831SAndroid Build Coastguard Worker 21*7c568831SAndroid Build Coastguard Workerschema="""<?xml version="1.0"?> 22*7c568831SAndroid Build Coastguard Worker<element name="foo" 23*7c568831SAndroid Build Coastguard Worker xmlns="http://relaxng.org/ns/structure/1.0" 24*7c568831SAndroid Build Coastguard Worker xmlns:a="http://relaxng.org/ns/annotation/1.0" 25*7c568831SAndroid Build Coastguard Worker xmlns:ex1="http://www.example.com/n1" 26*7c568831SAndroid Build Coastguard Worker xmlns:ex2="http://www.example.com/n2"> 27*7c568831SAndroid Build Coastguard Worker <a:documentation>A foo element.</a:documentation> 28*7c568831SAndroid Build Coastguard Worker <element name="ex1:bar1"> 29*7c568831SAndroid Build Coastguard Worker <empty/> 30*7c568831SAndroid Build Coastguard Worker </element> 31*7c568831SAndroid Build Coastguard Worker <element name="ex2:bar2"> 32*7c568831SAndroid Build Coastguard Worker <empty/> 33*7c568831SAndroid Build Coastguard Worker </element> 34*7c568831SAndroid Build Coastguard Worker</element> 35*7c568831SAndroid Build Coastguard Worker""" 36*7c568831SAndroid Build Coastguard Worker 37*7c568831SAndroid Build Coastguard Workervalid="""<?xml version="1.0"?> 38*7c568831SAndroid Build Coastguard Worker<foo><pre1:bar1 xmlns:pre1="http://www.example.com/n1"/><pre2:bar2 xmlns:pre2="http://www.example.com/n2"/></foo>""" 39*7c568831SAndroid Build Coastguard Worker 40*7c568831SAndroid Build Coastguard Workerinvalid="""<?xml version="1.0"?> 41*7c568831SAndroid Build Coastguard Worker<foo><pre1:bar1 xmlns:pre1="http://www.example.com/n1">bad</pre1:bar1><pre2:bar2 xmlns:pre2="http://www.example.com/n2"/></foo>""" 42*7c568831SAndroid Build Coastguard Worker 43*7c568831SAndroid Build Coastguard Workerrngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema)) 44*7c568831SAndroid Build Coastguard Workerrngs = rngp.relaxNGParse() 45*7c568831SAndroid Build Coastguard Workerctxt = rngs.relaxNGNewValidCtxt() 46*7c568831SAndroid Build Coastguard Workere = ErrorHandler() 47*7c568831SAndroid Build Coastguard Workerctxt.setValidityErrorHandler(e.handler, e.handler, ARG) 48*7c568831SAndroid Build Coastguard Worker 49*7c568831SAndroid Build Coastguard Worker# Test valid document 50*7c568831SAndroid Build Coastguard Workerdoc = libxml2.parseDoc(valid) 51*7c568831SAndroid Build Coastguard Workerret = doc.relaxNGValidateDoc(ctxt) 52*7c568831SAndroid Build Coastguard Workerif ret != 0 or e.errors: 53*7c568831SAndroid Build Coastguard Worker print("error doing RelaxNG validation") 54*7c568831SAndroid Build Coastguard Worker sys.exit(1) 55*7c568831SAndroid Build Coastguard Workerdoc.freeDoc() 56*7c568831SAndroid Build Coastguard Worker 57*7c568831SAndroid Build Coastguard Worker# Test invalid document 58*7c568831SAndroid Build Coastguard Workerdoc = libxml2.parseDoc(invalid) 59*7c568831SAndroid Build Coastguard Workerret = doc.relaxNGValidateDoc(ctxt) 60*7c568831SAndroid Build Coastguard Workerif ret == 0 or not e.errors: 61*7c568831SAndroid Build Coastguard Worker print("Error: document supposed to be RelaxNG invalid") 62*7c568831SAndroid Build Coastguard Worker sys.exit(1) 63*7c568831SAndroid Build Coastguard Workerdoc.freeDoc() 64*7c568831SAndroid Build Coastguard Worker 65*7c568831SAndroid Build Coastguard Workerdel rngp 66*7c568831SAndroid Build Coastguard Workerdel rngs 67*7c568831SAndroid Build Coastguard Workerdel ctxt 68*7c568831SAndroid Build Coastguard Workerlibxml2.relaxNGCleanupTypes() 69*7c568831SAndroid Build Coastguard Worker 70*7c568831SAndroid Build Coastguard Worker# Memory debug specific 71*7c568831SAndroid Build Coastguard Workerlibxml2.cleanupParser() 72*7c568831SAndroid Build Coastguard Workerif libxml2.debugMemory(1) == 0: 73*7c568831SAndroid Build Coastguard Worker print("OK") 74*7c568831SAndroid Build Coastguard Workerelse: 75*7c568831SAndroid Build Coastguard Worker print("Memory leak %d bytes" % (libxml2.debugMemory(1))) 76*7c568831SAndroid Build Coastguard Worker 77