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