1*7c568831SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*7c568831SAndroid Build Coastguard Workerimport sys 3*7c568831SAndroid Build Coastguard Workerimport setup_test 4*7c568831SAndroid Build Coastguard Workerimport libxml2 5*7c568831SAndroid Build Coastguard Worker 6*7c568831SAndroid Build Coastguard Worker# Memory debug specific 7*7c568831SAndroid Build Coastguard Workerlibxml2.debugMemory(1) 8*7c568831SAndroid Build Coastguard Worker 9*7c568831SAndroid Build Coastguard Worker# 10*7c568831SAndroid Build Coastguard Worker# Testing XML document serialization 11*7c568831SAndroid Build Coastguard Worker# 12*7c568831SAndroid Build Coastguard Workersource = libxml2.parseDoc("""<?xml version="1.0"?> 13*7c568831SAndroid Build Coastguard Worker<root xmlns:foo="http://example.org/foo" 14*7c568831SAndroid Build Coastguard Worker xmlns:bar="http://example.org/bar"> 15*7c568831SAndroid Build Coastguard Worker<include xmlns="http://example.org/include"> 16*7c568831SAndroid Build Coastguard Worker<fragment><foo:elem bar="tricky"/></fragment> 17*7c568831SAndroid Build Coastguard Worker</include> 18*7c568831SAndroid Build Coastguard Worker</root> 19*7c568831SAndroid Build Coastguard Worker""") 20*7c568831SAndroid Build Coastguard Worker 21*7c568831SAndroid Build Coastguard Workertarget = libxml2.parseDoc("""<?xml version="1.0"?> 22*7c568831SAndroid Build Coastguard Worker<root xmlns:foobar="http://example.org/bar"/>""") 23*7c568831SAndroid Build Coastguard Worker 24*7c568831SAndroid Build Coastguard Workerfragment = source.xpathEval("//*[name()='fragment']")[0] 25*7c568831SAndroid Build Coastguard Workerdest = target.getRootElement() 26*7c568831SAndroid Build Coastguard Worker 27*7c568831SAndroid Build Coastguard Worker# do a cut and paste operation 28*7c568831SAndroid Build Coastguard Workerfragment.unlinkNode() 29*7c568831SAndroid Build Coastguard Workerdest.addChild(fragment) 30*7c568831SAndroid Build Coastguard Worker# do the namespace fixup 31*7c568831SAndroid Build Coastguard Workerdest.reconciliateNs(target) 32*7c568831SAndroid Build Coastguard Worker 33*7c568831SAndroid Build Coastguard Worker# The source tree can be freed at that point 34*7c568831SAndroid Build Coastguard Workersource.freeDoc() 35*7c568831SAndroid Build Coastguard Worker 36*7c568831SAndroid Build Coastguard Worker# check the resulting tree 37*7c568831SAndroid Build Coastguard Workerstr = dest.serialize() 38*7c568831SAndroid Build Coastguard Workerif str != """<root xmlns:foobar="http://example.org/bar" xmlns:default="http://example.org/include" xmlns:foo="http://example.org/foo"><default:fragment><foo:elem bar="tricky"/></default:fragment></root>""": 39*7c568831SAndroid Build Coastguard Worker print("reconciliateNs() failed") 40*7c568831SAndroid Build Coastguard Worker sys.exit(1) 41*7c568831SAndroid Build Coastguard Workertarget.freeDoc() 42*7c568831SAndroid Build Coastguard Worker 43*7c568831SAndroid Build Coastguard Worker# Memory debug specific 44*7c568831SAndroid Build Coastguard Workerlibxml2.cleanupParser() 45*7c568831SAndroid Build Coastguard Workerif libxml2.debugMemory(1) == 0: 46*7c568831SAndroid Build Coastguard Worker print("OK") 47*7c568831SAndroid Build Coastguard Workerelse: 48*7c568831SAndroid Build Coastguard Worker print("Memory leak %d bytes" % (libxml2.debugMemory(1))) 49