13671190b546760a9e10d2e683257c3a86c680816Daniel Veillard#!/usr/bin/python -u
2a9a1b10514d13d34c81a1e3be5b0a1323cf8645fDaniel Veillard# -*- coding: ISO-8859-1 -*-
33671190b546760a9e10d2e683257c3a86c680816Daniel Veillardimport sys
43671190b546760a9e10d2e683257c3a86c680816Daniel Veillardimport libxml2
53671190b546760a9e10d2e683257c3a86c680816Daniel Veillard
63671190b546760a9e10d2e683257c3a86c680816Daniel Veillard# Memory debug specific
73671190b546760a9e10d2e683257c3a86c680816Daniel Veillardlibxml2.debugMemory(1)
83671190b546760a9e10d2e683257c3a86c680816Daniel Veillard
93671190b546760a9e10d2e683257c3a86c680816Daniel Veillardctxt = None
103671190b546760a9e10d2e683257c3a86c680816Daniel Veillard
113671190b546760a9e10d2e683257c3a86c680816Daniel Veillardclass callback:
123671190b546760a9e10d2e683257c3a86c680816Daniel Veillard    def __init__(self, startd, starte, ende, delta, endd):
133671190b546760a9e10d2e683257c3a86c680816Daniel Veillard        self.startd = startd
143671190b546760a9e10d2e683257c3a86c680816Daniel Veillard        self.starte = starte
153671190b546760a9e10d2e683257c3a86c680816Daniel Veillard        self.ende = ende
163671190b546760a9e10d2e683257c3a86c680816Daniel Veillard        self.endd = endd
1709b792ba3056eddb7ed5cc9c759b6510b3ef7743Daniel Veillard        self.delta = delta
1809b792ba3056eddb7ed5cc9c759b6510b3ef7743Daniel Veillard        self.count = 0
193671190b546760a9e10d2e683257c3a86c680816Daniel Veillard
203671190b546760a9e10d2e683257c3a86c680816Daniel Veillard    def startDocument(self):
213671190b546760a9e10d2e683257c3a86c680816Daniel Veillard        global ctxt
2209b792ba3056eddb7ed5cc9c759b6510b3ef7743Daniel Veillard        if ctxt.byteConsumed() != self.startd:
232cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard            print("document start at wrong index: %d expecting %d\n" % (
242cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard                  ctxt.byteConsumed(), self.startd))
253671190b546760a9e10d2e683257c3a86c680816Daniel Veillard            sys.exit(1)
263671190b546760a9e10d2e683257c3a86c680816Daniel Veillard
273671190b546760a9e10d2e683257c3a86c680816Daniel Veillard    def endDocument(self):
283671190b546760a9e10d2e683257c3a86c680816Daniel Veillard        global ctxt
2909b792ba3056eddb7ed5cc9c759b6510b3ef7743Daniel Veillard        expect = self.ende + self.delta * (self.count - 1) + self.endd
3009b792ba3056eddb7ed5cc9c759b6510b3ef7743Daniel Veillard        if ctxt.byteConsumed() != expect:
312cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard            print("document end at wrong index: %d expecting %d\n" % (
322cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard                  ctxt.byteConsumed(), expect))
333671190b546760a9e10d2e683257c3a86c680816Daniel Veillard            sys.exit(1)
343671190b546760a9e10d2e683257c3a86c680816Daniel Veillard
353671190b546760a9e10d2e683257c3a86c680816Daniel Veillard    def startElement(self, tag, attrs):
363671190b546760a9e10d2e683257c3a86c680816Daniel Veillard        global ctxt
3709b792ba3056eddb7ed5cc9c759b6510b3ef7743Daniel Veillard        if tag == "bar1":
3809b792ba3056eddb7ed5cc9c759b6510b3ef7743Daniel Veillard            expect = self.starte + self.delta * self.count
3909b792ba3056eddb7ed5cc9c759b6510b3ef7743Daniel Veillard            if ctxt.byteConsumed() != expect:
402cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard                print("element start at wrong index: %d expecting %d\n" % (
412cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard                   ctxt.byteConsumed(), expect))
4209b792ba3056eddb7ed5cc9c759b6510b3ef7743Daniel Veillard                sys.exit(1)
4309b792ba3056eddb7ed5cc9c759b6510b3ef7743Daniel Veillard
443671190b546760a9e10d2e683257c3a86c680816Daniel Veillard
453671190b546760a9e10d2e683257c3a86c680816Daniel Veillard    def endElement(self, tag):
463671190b546760a9e10d2e683257c3a86c680816Daniel Veillard        global ctxt
4709b792ba3056eddb7ed5cc9c759b6510b3ef7743Daniel Veillard        if tag == "bar1":
4809b792ba3056eddb7ed5cc9c759b6510b3ef7743Daniel Veillard            expect = self.ende + self.delta * self.count
4909b792ba3056eddb7ed5cc9c759b6510b3ef7743Daniel Veillard            if ctxt.byteConsumed() != expect:
502cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard                print("element end at wrong index: %d expecting %d\n" % (
512cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard                      ctxt.byteConsumed(), expect))
5209b792ba3056eddb7ed5cc9c759b6510b3ef7743Daniel Veillard                sys.exit(1)
5309b792ba3056eddb7ed5cc9c759b6510b3ef7743Daniel Veillard            self.count = self.count + 1
543671190b546760a9e10d2e683257c3a86c680816Daniel Veillard
553671190b546760a9e10d2e683257c3a86c680816Daniel Veillard    def characters(self, data):
563671190b546760a9e10d2e683257c3a86c680816Daniel Veillard        pass
573671190b546760a9e10d2e683257c3a86c680816Daniel Veillard
583671190b546760a9e10d2e683257c3a86c680816Daniel Veillard#
593671190b546760a9e10d2e683257c3a86c680816Daniel Veillard# First run a pure UTF-8 test
603671190b546760a9e10d2e683257c3a86c680816Daniel Veillard#
613671190b546760a9e10d2e683257c3a86c680816Daniel Veillardhandler = callback(0, 13, 27, 198, 183)
623671190b546760a9e10d2e683257c3a86c680816Daniel Veillardctxt = libxml2.createPushParser(handler, "<foo>\n", 6, "test.xml")
633671190b546760a9e10d2e683257c3a86c680816Daniel Veillardchunk = """  <bar1>chars1</bar1>
643671190b546760a9e10d2e683257c3a86c680816Daniel Veillard  <bar2>chars2</bar2>
653671190b546760a9e10d2e683257c3a86c680816Daniel Veillard  <bar3>chars3</bar3>
663671190b546760a9e10d2e683257c3a86c680816Daniel Veillard  <bar4>chars4</bar4>
673671190b546760a9e10d2e683257c3a86c680816Daniel Veillard  <bar5>chars5</bar5>
683671190b546760a9e10d2e683257c3a86c680816Daniel Veillard  <bar6>&lt;s6</bar6>
693671190b546760a9e10d2e683257c3a86c680816Daniel Veillard  <bar7>chars7</bar7>
703671190b546760a9e10d2e683257c3a86c680816Daniel Veillard  <bar8>&#38;8</bar8>
713671190b546760a9e10d2e683257c3a86c680816Daniel Veillard  <bar9>chars9</bar9>
723671190b546760a9e10d2e683257c3a86c680816Daniel Veillard"""
733671190b546760a9e10d2e683257c3a86c680816Daniel Veillardi = 0
743671190b546760a9e10d2e683257c3a86c680816Daniel Veillardwhile i < 10000:
753671190b546760a9e10d2e683257c3a86c680816Daniel Veillard    ctxt.parseChunk(chunk, len(chunk), 0)
763671190b546760a9e10d2e683257c3a86c680816Daniel Veillard    i = i + 1
773671190b546760a9e10d2e683257c3a86c680816Daniel Veillardchunk = "</foo>"
783671190b546760a9e10d2e683257c3a86c680816Daniel Veillardctxt.parseChunk(chunk, len(chunk), 1)
793671190b546760a9e10d2e683257c3a86c680816Daniel Veillardctxt=None
803671190b546760a9e10d2e683257c3a86c680816Daniel Veillard
813671190b546760a9e10d2e683257c3a86c680816Daniel Veillard#
823671190b546760a9e10d2e683257c3a86c680816Daniel Veillard# Then run a test relying on ISO-Latin-1
833671190b546760a9e10d2e683257c3a86c680816Daniel Veillard#
843671190b546760a9e10d2e683257c3a86c680816Daniel Veillardhandler = callback(43, 57, 71, 198, 183)
853671190b546760a9e10d2e683257c3a86c680816Daniel Veillardchunk="""<?xml version="1.0" encoding="ISO-8859-1"?>
863671190b546760a9e10d2e683257c3a86c680816Daniel Veillard<foo>
873671190b546760a9e10d2e683257c3a86c680816Daniel Veillard"""
883671190b546760a9e10d2e683257c3a86c680816Daniel Veillardctxt = libxml2.createPushParser(handler, chunk, len(chunk), "test.xml")
893671190b546760a9e10d2e683257c3a86c680816Daniel Veillardchunk = """  <bar1>chars1</bar1>
903671190b546760a9e10d2e683257c3a86c680816Daniel Veillard  <bar2>chars2</bar2>
913671190b546760a9e10d2e683257c3a86c680816Daniel Veillard  <bar3>chars3</bar3>
923671190b546760a9e10d2e683257c3a86c680816Daniel Veillard  <bar4>ch�rs4</bar4>
933671190b546760a9e10d2e683257c3a86c680816Daniel Veillard  <bar5>chars5</bar5>
943671190b546760a9e10d2e683257c3a86c680816Daniel Veillard  <bar6>&lt;s6</bar6>
953671190b546760a9e10d2e683257c3a86c680816Daniel Veillard  <bar7>chars7</bar7>
963671190b546760a9e10d2e683257c3a86c680816Daniel Veillard  <bar8>&#38;8</bar8>
973671190b546760a9e10d2e683257c3a86c680816Daniel Veillard  <bar9>tr�s 9</bar9>
983671190b546760a9e10d2e683257c3a86c680816Daniel Veillard"""
993671190b546760a9e10d2e683257c3a86c680816Daniel Veillardi = 0
1003671190b546760a9e10d2e683257c3a86c680816Daniel Veillardwhile i < 10000:
1013671190b546760a9e10d2e683257c3a86c680816Daniel Veillard    ctxt.parseChunk(chunk, len(chunk), 0)
1023671190b546760a9e10d2e683257c3a86c680816Daniel Veillard    i = i + 1
1033671190b546760a9e10d2e683257c3a86c680816Daniel Veillardchunk = "</foo>"
1043671190b546760a9e10d2e683257c3a86c680816Daniel Veillardctxt.parseChunk(chunk, len(chunk), 1)
1053671190b546760a9e10d2e683257c3a86c680816Daniel Veillardctxt=None
1063671190b546760a9e10d2e683257c3a86c680816Daniel Veillard
1073671190b546760a9e10d2e683257c3a86c680816Daniel Veillard# Memory debug specific
1083671190b546760a9e10d2e683257c3a86c680816Daniel Veillardlibxml2.cleanupParser()
1093671190b546760a9e10d2e683257c3a86c680816Daniel Veillardif libxml2.debugMemory(1) == 0:
1102cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard    print("OK")
1113671190b546760a9e10d2e683257c3a86c680816Daniel Veillardelse:
1122cb6bf8eb019cc88578093abee3e37a78e7b3020Daniel Veillard    print("Memory leak %d bytes" % (libxml2.debugMemory(1)))
1133671190b546760a9e10d2e683257c3a86c680816Daniel Veillard    libxml2.dumpMemory()
114