10e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard#!/usr/bin/python -u 20e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardimport libxml2 30e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardimport sys 40e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 50e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel VeillardARG = 'test string' 60e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 70e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardclass ErrorHandler: 80e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 90e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard def __init__(self): 100e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard self.errors = [] 110e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 120e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard def handler(self, msg, data): 130e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard if data != ARG: 142cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard raise Exception("Error handler did not receive correct argument") 150e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard self.errors.append(msg) 160e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 170e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard# Memory debug specific 180e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardlibxml2.debugMemory(1) 190e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 200e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardschema="""<?xml version="1.0"?> 210e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard<element name="foo" 220e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard xmlns="http://relaxng.org/ns/structure/1.0" 230e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard xmlns:a="http://relaxng.org/ns/annotation/1.0" 240e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard xmlns:ex1="http://www.example.com/n1" 250e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard xmlns:ex2="http://www.example.com/n2"> 260e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard <a:documentation>A foo element.</a:documentation> 270e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard <element name="ex1:bar1"> 280e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard <empty/> 290e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard </element> 300e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard <element name="ex2:bar2"> 310e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard <empty/> 320e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard </element> 330e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard</element> 340e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard""" 350e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 360e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardvalid="""<?xml version="1.0"?> 370e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard<foo><pre1:bar1 xmlns:pre1="http://www.example.com/n1"/><pre2:bar2 xmlns:pre2="http://www.example.com/n2"/></foo>""" 380e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 390e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardinvalid="""<?xml version="1.0"?> 400e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard<foo><pre1:bar1 xmlns:pre1="http://www.example.com/n1">bad</pre1:bar1><pre2:bar2 xmlns:pre2="http://www.example.com/n2"/></foo>""" 410e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 420e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardrngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema)) 430e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardrngs = rngp.relaxNGParse() 440e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardctxt = rngs.relaxNGNewValidCtxt() 450e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillarde = ErrorHandler() 460e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardctxt.setValidityErrorHandler(e.handler, e.handler, ARG) 470e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 480e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard# Test valid document 490e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillarddoc = libxml2.parseDoc(valid) 500e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardret = doc.relaxNGValidateDoc(ctxt) 510e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardif ret != 0 or e.errors: 522cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard print("error doing RelaxNG validation") 530e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard sys.exit(1) 540e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillarddoc.freeDoc() 550e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 560e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard# Test invalid document 570e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillarddoc = libxml2.parseDoc(invalid) 580e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardret = doc.relaxNGValidateDoc(ctxt) 590e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardif ret == 0 or not e.errors: 602cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard print("Error: document supposed to be RelaxNG invalid") 610e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard sys.exit(1) 620e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillarddoc.freeDoc() 630e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 640e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillarddel rngp 650e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillarddel rngs 660e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillarddel ctxt 670e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardlibxml2.relaxNGCleanupTypes() 680e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 690e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard# Memory debug specific 700e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardlibxml2.cleanupParser() 710e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardif libxml2.debugMemory(1) == 0: 722cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard print("OK") 730e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardelse: 742cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard print("Memory leak %d bytes" % (libxml2.debugMemory(1))) 750e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard libxml2.dumpMemory() 760e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 77