1#!/usr/bin/python -u
2import libxml2
3import sys
4
5ARG = 'test string'
6
7class ErrorHandler:
8
9    def __init__(self):
10        self.errors = []
11
12    def handler(self, msg, data):
13        if data != ARG:
14            raise Exception, "Error handler did not receive correct argument"
15        self.errors.append(msg)
16
17# Memory debug specific
18libxml2.debugMemory(1)
19
20schema="""<?xml version="1.0" encoding="iso-8859-1"?>
21<schema xmlns = "http://www.w3.org/2001/XMLSchema">
22	<element name = "Customer">
23		<complexType>
24			<sequence>
25				<element name = "FirstName" type = "string" />
26				<element name = "MiddleInitial" type = "string" />
27				<element name = "LastName" type = "string" />
28			</sequence>
29			<attribute name = "customerID" type = "integer" />
30		</complexType>
31	</element>
32</schema>"""
33
34valid="""<?xml version="1.0" encoding="iso-8859-1"?>
35<Customer customerID = "24332">
36	<FirstName>Raymond</FirstName>
37	<MiddleInitial>G</MiddleInitial>
38	<LastName>Bayliss</LastName>
39</Customer>
40"""
41
42invalid="""<?xml version="1.0" encoding="iso-8859-1"?>
43<Customer customerID = "24332">
44	<MiddleInitial>G</MiddleInitial>
45	<LastName>Bayliss</LastName>
46</Customer>
47"""
48
49e = ErrorHandler()
50ctxt_parser = libxml2.schemaNewMemParserCtxt(schema, len(schema))
51ctxt_schema = ctxt_parser.schemaParse()
52ctxt_valid  = ctxt_schema.schemaNewValidCtxt()
53ctxt_valid.setValidityErrorHandler(e.handler, e.handler, ARG)
54
55# Test valid document
56doc = libxml2.parseDoc(valid)
57ret = doc.schemaValidateDoc(ctxt_valid)
58if ret != 0 or e.errors:
59    print "error doing schema validation"
60    sys.exit(1)
61doc.freeDoc()
62
63# Test invalid document
64doc = libxml2.parseDoc(invalid)
65ret = doc.schemaValidateDoc(ctxt_valid)
66if ret == 0 or not e.errors:
67    print "Error: document supposer to be schema invalid"
68    sys.exit(1)
69doc.freeDoc()
70
71del ctxt_parser
72del ctxt_schema
73del ctxt_valid
74libxml2.schemaCleanupTypes()
75
76# Memory debug specific
77libxml2.cleanupParser()
78if libxml2.debugMemory(1) == 0:
79    print "OK"
80else:
81    print "Memory leak %d bytes" % (libxml2.debugMemory(1))
82    libxml2.dumpMemory()
83
84