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><s6</bar6> 693671190b546760a9e10d2e683257c3a86c680816Daniel Veillard <bar7>chars7</bar7> 703671190b546760a9e10d2e683257c3a86c680816Daniel Veillard <bar8>&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><s6</bar6> 953671190b546760a9e10d2e683257c3a86c680816Daniel Veillard <bar7>chars7</bar7> 963671190b546760a9e10d2e683257c3a86c680816Daniel Veillard <bar8>&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