133caa0b8307eccf22010400747830b1967edb292Daniel Veillard#!/usr/bin/python -u
233caa0b8307eccf22010400747830b1967edb292Daniel Veillardimport sys
333caa0b8307eccf22010400747830b1967edb292Daniel Veillardimport libxml2
433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
533caa0b8307eccf22010400747830b1967edb292Daniel Veillard# Memory debug specific
633caa0b8307eccf22010400747830b1967edb292Daniel Veillardlibxml2.debugMemory(1)
733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
833caa0b8307eccf22010400747830b1967edb292Daniel Veillardlog = ""
933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1033caa0b8307eccf22010400747830b1967edb292Daniel Veillardclass callback:
1133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    def startDocument(self):
1233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        global log
1333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        log = log + "startDocument:"
1433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    def endDocument(self):
1633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        global log
1733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        log = log + "endDocument:"
1833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    def startElement(self, tag, attrs):
2033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        global log
2133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        log = log + "startElement %s %s:" % (tag, attrs)
2233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
2333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    def endElement(self, tag):
2433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        global log
2533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        log = log + "endElement %s:" % (tag)
2633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
2733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    def characters(self, data):
2833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        global log
2933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        log = log + "characters: %s:" % (data)
3033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
3133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    def warning(self, msg):
3233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        global log
3333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        log = log + "warning: %s:" % (msg)
3433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
3533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    def error(self, msg):
3633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        global log
3733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        log = log + "error: %s:" % (msg)
3833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
3933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    def fatalError(self, msg):
4033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        global log
4133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        log = log + "fatalError: %s:" % (msg)
4233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
4333caa0b8307eccf22010400747830b1967edb292Daniel Veillardhandler = callback()
4433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
4533caa0b8307eccf22010400747830b1967edb292Daniel Veillardctxt = libxml2.createPushParser(handler, "<foo", 4, "test.xml")
4633caa0b8307eccf22010400747830b1967edb292Daniel Veillardchunk = " url='tst'>b"
4733caa0b8307eccf22010400747830b1967edb292Daniel Veillardctxt.parseChunk(chunk, len(chunk), 0)
4833caa0b8307eccf22010400747830b1967edb292Daniel Veillardchunk = "ar</foo>"
4933caa0b8307eccf22010400747830b1967edb292Daniel Veillardctxt.parseChunk(chunk, len(chunk), 1)
5033caa0b8307eccf22010400747830b1967edb292Daniel Veillardctxt=None
5133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
5233caa0b8307eccf22010400747830b1967edb292Daniel Veillardreference = "startDocument:startElement foo {'url': 'tst'}:characters: bar:endElement foo:endDocument:"
5333caa0b8307eccf22010400747830b1967edb292Daniel Veillardif log != reference:
542cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard    print("Error got: %s" % log)
552cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard    print("Exprected: %s" % reference)
5633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    sys.exit(1)
5733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
5833caa0b8307eccf22010400747830b1967edb292Daniel Veillard# Memory debug specific
5933caa0b8307eccf22010400747830b1967edb292Daniel Veillardlibxml2.cleanupParser()
6033caa0b8307eccf22010400747830b1967edb292Daniel Veillardif libxml2.debugMemory(1) == 0:
612cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard    print("OK")
6233caa0b8307eccf22010400747830b1967edb292Daniel Veillardelse:
632cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard    print("Memory leak %d bytes" % (libxml2.debugMemory(1)))
6433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    libxml2.dumpMemory()
65