1*7c568831SAndroid Build Coastguard Worker /*
2*7c568831SAndroid Build Coastguard Worker * testparser.c: Additional parser tests
3*7c568831SAndroid Build Coastguard Worker *
4*7c568831SAndroid Build Coastguard Worker * See Copyright for the status of this software.
5*7c568831SAndroid Build Coastguard Worker */
6*7c568831SAndroid Build Coastguard Worker
7*7c568831SAndroid Build Coastguard Worker #define XML_DEPRECATED
8*7c568831SAndroid Build Coastguard Worker
9*7c568831SAndroid Build Coastguard Worker #include "libxml.h"
10*7c568831SAndroid Build Coastguard Worker #include <libxml/parser.h>
11*7c568831SAndroid Build Coastguard Worker #include <libxml/parserInternals.h>
12*7c568831SAndroid Build Coastguard Worker #include <libxml/uri.h>
13*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlreader.h>
14*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlsave.h>
15*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlwriter.h>
16*7c568831SAndroid Build Coastguard Worker #include <libxml/HTMLparser.h>
17*7c568831SAndroid Build Coastguard Worker
18*7c568831SAndroid Build Coastguard Worker #include <string.h>
19*7c568831SAndroid Build Coastguard Worker
20*7c568831SAndroid Build Coastguard Worker static int
testNewDocNode(void)21*7c568831SAndroid Build Coastguard Worker testNewDocNode(void) {
22*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
23*7c568831SAndroid Build Coastguard Worker int err = 0;
24*7c568831SAndroid Build Coastguard Worker
25*7c568831SAndroid Build Coastguard Worker node = xmlNewDocNode(NULL, NULL, BAD_CAST "c", BAD_CAST "");
26*7c568831SAndroid Build Coastguard Worker if (node->children != NULL) {
27*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "empty node has children\n");
28*7c568831SAndroid Build Coastguard Worker err = 1;
29*7c568831SAndroid Build Coastguard Worker }
30*7c568831SAndroid Build Coastguard Worker xmlFreeNode(node);
31*7c568831SAndroid Build Coastguard Worker
32*7c568831SAndroid Build Coastguard Worker return err;
33*7c568831SAndroid Build Coastguard Worker }
34*7c568831SAndroid Build Coastguard Worker
35*7c568831SAndroid Build Coastguard Worker static int
testStandaloneWithEncoding(void)36*7c568831SAndroid Build Coastguard Worker testStandaloneWithEncoding(void) {
37*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
38*7c568831SAndroid Build Coastguard Worker const char *str =
39*7c568831SAndroid Build Coastguard Worker "<?xml version=\"1.0\" standalone=\"yes\"?>\n"
40*7c568831SAndroid Build Coastguard Worker "<doc></doc>\n";
41*7c568831SAndroid Build Coastguard Worker int err = 0;
42*7c568831SAndroid Build Coastguard Worker
43*7c568831SAndroid Build Coastguard Worker xmlResetLastError();
44*7c568831SAndroid Build Coastguard Worker
45*7c568831SAndroid Build Coastguard Worker doc = xmlReadDoc(BAD_CAST str, NULL, "UTF-8", 0);
46*7c568831SAndroid Build Coastguard Worker if (doc == NULL) {
47*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "xmlReadDoc failed\n");
48*7c568831SAndroid Build Coastguard Worker err = 1;
49*7c568831SAndroid Build Coastguard Worker }
50*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(doc);
51*7c568831SAndroid Build Coastguard Worker
52*7c568831SAndroid Build Coastguard Worker return err;
53*7c568831SAndroid Build Coastguard Worker }
54*7c568831SAndroid Build Coastguard Worker
55*7c568831SAndroid Build Coastguard Worker static int
testUnsupportedEncoding(void)56*7c568831SAndroid Build Coastguard Worker testUnsupportedEncoding(void) {
57*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
58*7c568831SAndroid Build Coastguard Worker const xmlError *error;
59*7c568831SAndroid Build Coastguard Worker int err = 0;
60*7c568831SAndroid Build Coastguard Worker
61*7c568831SAndroid Build Coastguard Worker xmlResetLastError();
62*7c568831SAndroid Build Coastguard Worker
63*7c568831SAndroid Build Coastguard Worker doc = xmlReadDoc(BAD_CAST "<doc/>", NULL, "#unsupported",
64*7c568831SAndroid Build Coastguard Worker XML_PARSE_NOWARNING);
65*7c568831SAndroid Build Coastguard Worker if (doc == NULL) {
66*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "xmlReadDoc failed with unsupported encoding\n");
67*7c568831SAndroid Build Coastguard Worker err = 1;
68*7c568831SAndroid Build Coastguard Worker }
69*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(doc);
70*7c568831SAndroid Build Coastguard Worker
71*7c568831SAndroid Build Coastguard Worker error = xmlGetLastError();
72*7c568831SAndroid Build Coastguard Worker if (error == NULL ||
73*7c568831SAndroid Build Coastguard Worker error->code != XML_ERR_UNSUPPORTED_ENCODING ||
74*7c568831SAndroid Build Coastguard Worker error->level != XML_ERR_WARNING ||
75*7c568831SAndroid Build Coastguard Worker strcmp(error->message, "Unsupported encoding: #unsupported\n") != 0)
76*7c568831SAndroid Build Coastguard Worker {
77*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "xmlReadDoc failed to raise correct error\n");
78*7c568831SAndroid Build Coastguard Worker err = 1;
79*7c568831SAndroid Build Coastguard Worker }
80*7c568831SAndroid Build Coastguard Worker
81*7c568831SAndroid Build Coastguard Worker return err;
82*7c568831SAndroid Build Coastguard Worker }
83*7c568831SAndroid Build Coastguard Worker
84*7c568831SAndroid Build Coastguard Worker static int
testNodeGetContent(void)85*7c568831SAndroid Build Coastguard Worker testNodeGetContent(void) {
86*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
87*7c568831SAndroid Build Coastguard Worker xmlChar *content;
88*7c568831SAndroid Build Coastguard Worker int err = 0;
89*7c568831SAndroid Build Coastguard Worker
90*7c568831SAndroid Build Coastguard Worker doc = xmlReadDoc(BAD_CAST "<doc/>", NULL, NULL, 0);
91*7c568831SAndroid Build Coastguard Worker xmlAddChild(doc->children, xmlNewReference(doc, BAD_CAST "lt"));
92*7c568831SAndroid Build Coastguard Worker content = xmlNodeGetContent((xmlNodePtr) doc);
93*7c568831SAndroid Build Coastguard Worker if (strcmp((char *) content, "<") != 0) {
94*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "xmlNodeGetContent failed\n");
95*7c568831SAndroid Build Coastguard Worker err = 1;
96*7c568831SAndroid Build Coastguard Worker }
97*7c568831SAndroid Build Coastguard Worker xmlFree(content);
98*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(doc);
99*7c568831SAndroid Build Coastguard Worker
100*7c568831SAndroid Build Coastguard Worker return err;
101*7c568831SAndroid Build Coastguard Worker }
102*7c568831SAndroid Build Coastguard Worker
103*7c568831SAndroid Build Coastguard Worker static int
testCFileIO(void)104*7c568831SAndroid Build Coastguard Worker testCFileIO(void) {
105*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
106*7c568831SAndroid Build Coastguard Worker int err = 0;
107*7c568831SAndroid Build Coastguard Worker
108*7c568831SAndroid Build Coastguard Worker /* Deprecated FILE-based API */
109*7c568831SAndroid Build Coastguard Worker xmlRegisterInputCallbacks(xmlFileMatch, xmlFileOpen, xmlFileRead,
110*7c568831SAndroid Build Coastguard Worker xmlFileClose);
111*7c568831SAndroid Build Coastguard Worker doc = xmlReadFile("test/ent1", NULL, 0);
112*7c568831SAndroid Build Coastguard Worker
113*7c568831SAndroid Build Coastguard Worker if (doc == NULL) {
114*7c568831SAndroid Build Coastguard Worker err = 1;
115*7c568831SAndroid Build Coastguard Worker } else {
116*7c568831SAndroid Build Coastguard Worker xmlNodePtr root = xmlDocGetRootElement(doc);
117*7c568831SAndroid Build Coastguard Worker
118*7c568831SAndroid Build Coastguard Worker if (root == NULL || !xmlStrEqual(root->name, BAD_CAST "EXAMPLE"))
119*7c568831SAndroid Build Coastguard Worker err = 1;
120*7c568831SAndroid Build Coastguard Worker }
121*7c568831SAndroid Build Coastguard Worker
122*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(doc);
123*7c568831SAndroid Build Coastguard Worker xmlPopInputCallbacks();
124*7c568831SAndroid Build Coastguard Worker
125*7c568831SAndroid Build Coastguard Worker if (err)
126*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "xmlReadFile failed with FILE input callbacks\n");
127*7c568831SAndroid Build Coastguard Worker
128*7c568831SAndroid Build Coastguard Worker return err;
129*7c568831SAndroid Build Coastguard Worker }
130*7c568831SAndroid Build Coastguard Worker
131*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
132*7c568831SAndroid Build Coastguard Worker static xmlChar *
dumpNodeList(xmlNodePtr list)133*7c568831SAndroid Build Coastguard Worker dumpNodeList(xmlNodePtr list) {
134*7c568831SAndroid Build Coastguard Worker xmlBufferPtr buffer;
135*7c568831SAndroid Build Coastguard Worker xmlSaveCtxtPtr save;
136*7c568831SAndroid Build Coastguard Worker xmlNodePtr cur;
137*7c568831SAndroid Build Coastguard Worker xmlChar *ret;
138*7c568831SAndroid Build Coastguard Worker
139*7c568831SAndroid Build Coastguard Worker buffer = xmlBufferCreate();
140*7c568831SAndroid Build Coastguard Worker save = xmlSaveToBuffer(buffer, "UTF-8", 0);
141*7c568831SAndroid Build Coastguard Worker for (cur = list; cur != NULL; cur = cur->next)
142*7c568831SAndroid Build Coastguard Worker xmlSaveTree(save, cur);
143*7c568831SAndroid Build Coastguard Worker xmlSaveClose(save);
144*7c568831SAndroid Build Coastguard Worker
145*7c568831SAndroid Build Coastguard Worker ret = xmlBufferDetach(buffer);
146*7c568831SAndroid Build Coastguard Worker xmlBufferFree(buffer);
147*7c568831SAndroid Build Coastguard Worker return ret;
148*7c568831SAndroid Build Coastguard Worker }
149*7c568831SAndroid Build Coastguard Worker
150*7c568831SAndroid Build Coastguard Worker static int
testCtxtParseContent(void)151*7c568831SAndroid Build Coastguard Worker testCtxtParseContent(void) {
152*7c568831SAndroid Build Coastguard Worker xmlParserCtxtPtr ctxt;
153*7c568831SAndroid Build Coastguard Worker xmlParserInputPtr input;
154*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
155*7c568831SAndroid Build Coastguard Worker xmlNodePtr node, list;
156*7c568831SAndroid Build Coastguard Worker const char *content;
157*7c568831SAndroid Build Coastguard Worker xmlChar *output;
158*7c568831SAndroid Build Coastguard Worker int i, j;
159*7c568831SAndroid Build Coastguard Worker int err = 0;
160*7c568831SAndroid Build Coastguard Worker
161*7c568831SAndroid Build Coastguard Worker static const char *const tests[] = {
162*7c568831SAndroid Build Coastguard Worker "<!-- c -->\xF0\x9F\x98\x84<a/><b/>end",
163*7c568831SAndroid Build Coastguard Worker "text<a:foo><b:foo/></a:foo>text<!-- c -->"
164*7c568831SAndroid Build Coastguard Worker };
165*7c568831SAndroid Build Coastguard Worker
166*7c568831SAndroid Build Coastguard Worker doc = xmlReadDoc(BAD_CAST "<doc xmlns:a='a'><elem xmlns:b='b'/></doc>",
167*7c568831SAndroid Build Coastguard Worker NULL, NULL, 0);
168*7c568831SAndroid Build Coastguard Worker node = doc->children->children;
169*7c568831SAndroid Build Coastguard Worker
170*7c568831SAndroid Build Coastguard Worker ctxt = xmlNewParserCtxt();
171*7c568831SAndroid Build Coastguard Worker
172*7c568831SAndroid Build Coastguard Worker for (i = 0; (size_t) i < sizeof(tests) / sizeof(tests[0]); i++) {
173*7c568831SAndroid Build Coastguard Worker content = tests[i];
174*7c568831SAndroid Build Coastguard Worker
175*7c568831SAndroid Build Coastguard Worker for (j = 0; j < 2; j++) {
176*7c568831SAndroid Build Coastguard Worker if (j == 0) {
177*7c568831SAndroid Build Coastguard Worker input = xmlNewInputFromString(NULL, content,
178*7c568831SAndroid Build Coastguard Worker XML_INPUT_BUF_STATIC);
179*7c568831SAndroid Build Coastguard Worker list = xmlCtxtParseContent(ctxt, input, node, 0);
180*7c568831SAndroid Build Coastguard Worker } else {
181*7c568831SAndroid Build Coastguard Worker xmlParseInNodeContext(node, content, strlen(content), 0,
182*7c568831SAndroid Build Coastguard Worker &list);
183*7c568831SAndroid Build Coastguard Worker }
184*7c568831SAndroid Build Coastguard Worker
185*7c568831SAndroid Build Coastguard Worker output = dumpNodeList(list);
186*7c568831SAndroid Build Coastguard Worker
187*7c568831SAndroid Build Coastguard Worker if ((j == 0 && ctxt->nsWellFormed == 0) ||
188*7c568831SAndroid Build Coastguard Worker strcmp((char *) output, content) != 0) {
189*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "%s failed test %d, got:\n%s\n",
190*7c568831SAndroid Build Coastguard Worker j == 0 ?
191*7c568831SAndroid Build Coastguard Worker "xmlCtxtParseContent" :
192*7c568831SAndroid Build Coastguard Worker "xmlParseInNodeContext",
193*7c568831SAndroid Build Coastguard Worker i, output);
194*7c568831SAndroid Build Coastguard Worker err = 1;
195*7c568831SAndroid Build Coastguard Worker }
196*7c568831SAndroid Build Coastguard Worker
197*7c568831SAndroid Build Coastguard Worker xmlFree(output);
198*7c568831SAndroid Build Coastguard Worker xmlFreeNodeList(list);
199*7c568831SAndroid Build Coastguard Worker }
200*7c568831SAndroid Build Coastguard Worker }
201*7c568831SAndroid Build Coastguard Worker
202*7c568831SAndroid Build Coastguard Worker xmlFreeParserCtxt(ctxt);
203*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(doc);
204*7c568831SAndroid Build Coastguard Worker
205*7c568831SAndroid Build Coastguard Worker return err;
206*7c568831SAndroid Build Coastguard Worker }
207*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
208*7c568831SAndroid Build Coastguard Worker
209*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_SAX1_ENABLED
210*7c568831SAndroid Build Coastguard Worker static int
testBalancedChunk(void)211*7c568831SAndroid Build Coastguard Worker testBalancedChunk(void) {
212*7c568831SAndroid Build Coastguard Worker xmlNodePtr list;
213*7c568831SAndroid Build Coastguard Worker xmlNodePtr elem;
214*7c568831SAndroid Build Coastguard Worker int ret;
215*7c568831SAndroid Build Coastguard Worker int err = 0;
216*7c568831SAndroid Build Coastguard Worker
217*7c568831SAndroid Build Coastguard Worker ret = xmlParseBalancedChunkMemory(NULL, NULL, NULL, 0,
218*7c568831SAndroid Build Coastguard Worker BAD_CAST "start <node xml:lang='en'>abc</node> end", &list);
219*7c568831SAndroid Build Coastguard Worker
220*7c568831SAndroid Build Coastguard Worker if ((ret != XML_ERR_OK) ||
221*7c568831SAndroid Build Coastguard Worker (list == NULL) ||
222*7c568831SAndroid Build Coastguard Worker ((elem = list->next) == NULL) ||
223*7c568831SAndroid Build Coastguard Worker (elem->type != XML_ELEMENT_NODE) ||
224*7c568831SAndroid Build Coastguard Worker (elem->nsDef == NULL) ||
225*7c568831SAndroid Build Coastguard Worker (!xmlStrEqual(elem->nsDef->href, XML_XML_NAMESPACE))) {
226*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "xmlParseBalancedChunkMemory failed\n");
227*7c568831SAndroid Build Coastguard Worker err = 1;
228*7c568831SAndroid Build Coastguard Worker }
229*7c568831SAndroid Build Coastguard Worker
230*7c568831SAndroid Build Coastguard Worker xmlFreeNodeList(list);
231*7c568831SAndroid Build Coastguard Worker
232*7c568831SAndroid Build Coastguard Worker return(err);
233*7c568831SAndroid Build Coastguard Worker }
234*7c568831SAndroid Build Coastguard Worker #endif
235*7c568831SAndroid Build Coastguard Worker
236*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_PUSH_ENABLED
237*7c568831SAndroid Build Coastguard Worker static int
testHugePush(void)238*7c568831SAndroid Build Coastguard Worker testHugePush(void) {
239*7c568831SAndroid Build Coastguard Worker xmlParserCtxtPtr ctxt;
240*7c568831SAndroid Build Coastguard Worker int err, i;
241*7c568831SAndroid Build Coastguard Worker
242*7c568831SAndroid Build Coastguard Worker ctxt = xmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL);
243*7c568831SAndroid Build Coastguard Worker
244*7c568831SAndroid Build Coastguard Worker /*
245*7c568831SAndroid Build Coastguard Worker * Push parse a document larger than XML_MAX_LOOKUP_LIMIT
246*7c568831SAndroid Build Coastguard Worker * (10,000,000 bytes). This mainly tests whether shrinking the
247*7c568831SAndroid Build Coastguard Worker * buffer works when push parsing.
248*7c568831SAndroid Build Coastguard Worker */
249*7c568831SAndroid Build Coastguard Worker xmlParseChunk(ctxt, "<doc>", 5, 0);
250*7c568831SAndroid Build Coastguard Worker for (i = 0; i < 1000000; i++)
251*7c568831SAndroid Build Coastguard Worker xmlParseChunk(ctxt, "<elem>text</elem>", 17, 0);
252*7c568831SAndroid Build Coastguard Worker xmlParseChunk(ctxt, "</doc>", 6, 1);
253*7c568831SAndroid Build Coastguard Worker
254*7c568831SAndroid Build Coastguard Worker err = ctxt->wellFormed ? 0 : 1;
255*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(ctxt->myDoc);
256*7c568831SAndroid Build Coastguard Worker xmlFreeParserCtxt(ctxt);
257*7c568831SAndroid Build Coastguard Worker
258*7c568831SAndroid Build Coastguard Worker return err;
259*7c568831SAndroid Build Coastguard Worker }
260*7c568831SAndroid Build Coastguard Worker
261*7c568831SAndroid Build Coastguard Worker static int
testHugeEncodedChunk(void)262*7c568831SAndroid Build Coastguard Worker testHugeEncodedChunk(void) {
263*7c568831SAndroid Build Coastguard Worker xmlBufferPtr buf;
264*7c568831SAndroid Build Coastguard Worker xmlChar *chunk;
265*7c568831SAndroid Build Coastguard Worker xmlParserCtxtPtr ctxt;
266*7c568831SAndroid Build Coastguard Worker int err, i;
267*7c568831SAndroid Build Coastguard Worker
268*7c568831SAndroid Build Coastguard Worker /*
269*7c568831SAndroid Build Coastguard Worker * Test the push parser with a built-in encoding handler like ISO-8859-1
270*7c568831SAndroid Build Coastguard Worker * and a chunk larger than the initial decoded buffer (currently 4 KB).
271*7c568831SAndroid Build Coastguard Worker */
272*7c568831SAndroid Build Coastguard Worker buf = xmlBufferCreate();
273*7c568831SAndroid Build Coastguard Worker xmlBufferCat(buf,
274*7c568831SAndroid Build Coastguard Worker BAD_CAST "<?xml version='1.0' encoding='ISO-8859-1'?>\n");
275*7c568831SAndroid Build Coastguard Worker xmlBufferCat(buf, BAD_CAST "<doc><!-- ");
276*7c568831SAndroid Build Coastguard Worker for (i = 0; i < 2000; i++)
277*7c568831SAndroid Build Coastguard Worker xmlBufferCat(buf, BAD_CAST "0123456789");
278*7c568831SAndroid Build Coastguard Worker xmlBufferCat(buf, BAD_CAST " --></doc>");
279*7c568831SAndroid Build Coastguard Worker chunk = xmlBufferDetach(buf);
280*7c568831SAndroid Build Coastguard Worker xmlBufferFree(buf);
281*7c568831SAndroid Build Coastguard Worker
282*7c568831SAndroid Build Coastguard Worker ctxt = xmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL);
283*7c568831SAndroid Build Coastguard Worker
284*7c568831SAndroid Build Coastguard Worker xmlParseChunk(ctxt, (char *) chunk, xmlStrlen(chunk), 0);
285*7c568831SAndroid Build Coastguard Worker xmlParseChunk(ctxt, NULL, 0, 1);
286*7c568831SAndroid Build Coastguard Worker
287*7c568831SAndroid Build Coastguard Worker err = ctxt->wellFormed ? 0 : 1;
288*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(ctxt->myDoc);
289*7c568831SAndroid Build Coastguard Worker xmlFreeParserCtxt(ctxt);
290*7c568831SAndroid Build Coastguard Worker xmlFree(chunk);
291*7c568831SAndroid Build Coastguard Worker
292*7c568831SAndroid Build Coastguard Worker return err;
293*7c568831SAndroid Build Coastguard Worker }
294*7c568831SAndroid Build Coastguard Worker #endif
295*7c568831SAndroid Build Coastguard Worker
296*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
297*7c568831SAndroid Build Coastguard Worker static int
testHtmlIds(void)298*7c568831SAndroid Build Coastguard Worker testHtmlIds(void) {
299*7c568831SAndroid Build Coastguard Worker const char *htmlContent =
300*7c568831SAndroid Build Coastguard Worker "<html><body><div id='myId'>Hello, World!</div></body></html>";
301*7c568831SAndroid Build Coastguard Worker htmlDocPtr doc;
302*7c568831SAndroid Build Coastguard Worker xmlAttrPtr node;
303*7c568831SAndroid Build Coastguard Worker
304*7c568831SAndroid Build Coastguard Worker doc = htmlReadDoc(BAD_CAST htmlContent, NULL, NULL, 0);
305*7c568831SAndroid Build Coastguard Worker if (doc == NULL) {
306*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "could not parse HTML content\n");
307*7c568831SAndroid Build Coastguard Worker return 1;
308*7c568831SAndroid Build Coastguard Worker }
309*7c568831SAndroid Build Coastguard Worker
310*7c568831SAndroid Build Coastguard Worker node = xmlGetID(doc, BAD_CAST "myId");
311*7c568831SAndroid Build Coastguard Worker if (node == NULL) {
312*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "xmlGetID doesn't work on HTML\n");
313*7c568831SAndroid Build Coastguard Worker return 1;
314*7c568831SAndroid Build Coastguard Worker }
315*7c568831SAndroid Build Coastguard Worker
316*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(doc);
317*7c568831SAndroid Build Coastguard Worker return 0;
318*7c568831SAndroid Build Coastguard Worker }
319*7c568831SAndroid Build Coastguard Worker
320*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_PUSH_ENABLED
321*7c568831SAndroid Build Coastguard Worker static int
testHtmlPushWithEncoding(void)322*7c568831SAndroid Build Coastguard Worker testHtmlPushWithEncoding(void) {
323*7c568831SAndroid Build Coastguard Worker htmlParserCtxtPtr ctxt;
324*7c568831SAndroid Build Coastguard Worker htmlDocPtr doc;
325*7c568831SAndroid Build Coastguard Worker htmlNodePtr node;
326*7c568831SAndroid Build Coastguard Worker int err = 0;
327*7c568831SAndroid Build Coastguard Worker
328*7c568831SAndroid Build Coastguard Worker ctxt = htmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL,
329*7c568831SAndroid Build Coastguard Worker XML_CHAR_ENCODING_UTF8);
330*7c568831SAndroid Build Coastguard Worker htmlParseChunk(ctxt, "-\xC3\xA4-", 4, 1);
331*7c568831SAndroid Build Coastguard Worker
332*7c568831SAndroid Build Coastguard Worker doc = ctxt->myDoc;
333*7c568831SAndroid Build Coastguard Worker if (!xmlStrEqual(doc->encoding, BAD_CAST "UTF-8")) {
334*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "testHtmlPushWithEncoding failed\n");
335*7c568831SAndroid Build Coastguard Worker err = 1;
336*7c568831SAndroid Build Coastguard Worker }
337*7c568831SAndroid Build Coastguard Worker
338*7c568831SAndroid Build Coastguard Worker node = xmlDocGetRootElement(doc)->children->children->children;
339*7c568831SAndroid Build Coastguard Worker if (!xmlStrEqual(node->content, BAD_CAST "-\xC3\xA4-")) {
340*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "testHtmlPushWithEncoding failed\n");
341*7c568831SAndroid Build Coastguard Worker err = 1;
342*7c568831SAndroid Build Coastguard Worker }
343*7c568831SAndroid Build Coastguard Worker
344*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(doc);
345*7c568831SAndroid Build Coastguard Worker htmlFreeParserCtxt(ctxt);
346*7c568831SAndroid Build Coastguard Worker return err;
347*7c568831SAndroid Build Coastguard Worker }
348*7c568831SAndroid Build Coastguard Worker #endif
349*7c568831SAndroid Build Coastguard Worker #endif
350*7c568831SAndroid Build Coastguard Worker
351*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
352*7c568831SAndroid Build Coastguard Worker static int
testReaderEncoding(void)353*7c568831SAndroid Build Coastguard Worker testReaderEncoding(void) {
354*7c568831SAndroid Build Coastguard Worker xmlBuffer *buf;
355*7c568831SAndroid Build Coastguard Worker xmlTextReader *reader;
356*7c568831SAndroid Build Coastguard Worker xmlChar *xml;
357*7c568831SAndroid Build Coastguard Worker const xmlChar *encoding;
358*7c568831SAndroid Build Coastguard Worker int err = 0;
359*7c568831SAndroid Build Coastguard Worker int i;
360*7c568831SAndroid Build Coastguard Worker
361*7c568831SAndroid Build Coastguard Worker buf = xmlBufferCreate();
362*7c568831SAndroid Build Coastguard Worker xmlBufferCCat(buf, "<?xml version='1.0' encoding='ISO-8859-1'?>\n");
363*7c568831SAndroid Build Coastguard Worker xmlBufferCCat(buf, "<doc>");
364*7c568831SAndroid Build Coastguard Worker for (i = 0; i < 8192; i++)
365*7c568831SAndroid Build Coastguard Worker xmlBufferCCat(buf, "x");
366*7c568831SAndroid Build Coastguard Worker xmlBufferCCat(buf, "</doc>");
367*7c568831SAndroid Build Coastguard Worker xml = xmlBufferDetach(buf);
368*7c568831SAndroid Build Coastguard Worker xmlBufferFree(buf);
369*7c568831SAndroid Build Coastguard Worker
370*7c568831SAndroid Build Coastguard Worker reader = xmlReaderForDoc(BAD_CAST xml, NULL, NULL, 0);
371*7c568831SAndroid Build Coastguard Worker xmlTextReaderRead(reader);
372*7c568831SAndroid Build Coastguard Worker encoding = xmlTextReaderConstEncoding(reader);
373*7c568831SAndroid Build Coastguard Worker
374*7c568831SAndroid Build Coastguard Worker if (!xmlStrEqual(encoding, BAD_CAST "ISO-8859-1")) {
375*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "testReaderEncoding failed\n");
376*7c568831SAndroid Build Coastguard Worker err = 1;
377*7c568831SAndroid Build Coastguard Worker }
378*7c568831SAndroid Build Coastguard Worker
379*7c568831SAndroid Build Coastguard Worker xmlFreeTextReader(reader);
380*7c568831SAndroid Build Coastguard Worker xmlFree(xml);
381*7c568831SAndroid Build Coastguard Worker return err;
382*7c568831SAndroid Build Coastguard Worker }
383*7c568831SAndroid Build Coastguard Worker
384*7c568831SAndroid Build Coastguard Worker static int
testReaderContent(void)385*7c568831SAndroid Build Coastguard Worker testReaderContent(void) {
386*7c568831SAndroid Build Coastguard Worker xmlTextReader *reader;
387*7c568831SAndroid Build Coastguard Worker const xmlChar *xml = BAD_CAST "<d>x<e>y</e><f>z</f></d>";
388*7c568831SAndroid Build Coastguard Worker xmlChar *string;
389*7c568831SAndroid Build Coastguard Worker int err = 0;
390*7c568831SAndroid Build Coastguard Worker
391*7c568831SAndroid Build Coastguard Worker reader = xmlReaderForDoc(xml, NULL, NULL, 0);
392*7c568831SAndroid Build Coastguard Worker xmlTextReaderRead(reader);
393*7c568831SAndroid Build Coastguard Worker
394*7c568831SAndroid Build Coastguard Worker string = xmlTextReaderReadOuterXml(reader);
395*7c568831SAndroid Build Coastguard Worker if (!xmlStrEqual(string, xml)) {
396*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "xmlTextReaderReadOuterXml failed\n");
397*7c568831SAndroid Build Coastguard Worker err = 1;
398*7c568831SAndroid Build Coastguard Worker }
399*7c568831SAndroid Build Coastguard Worker xmlFree(string);
400*7c568831SAndroid Build Coastguard Worker
401*7c568831SAndroid Build Coastguard Worker string = xmlTextReaderReadInnerXml(reader);
402*7c568831SAndroid Build Coastguard Worker if (!xmlStrEqual(string, BAD_CAST "x<e>y</e><f>z</f>")) {
403*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "xmlTextReaderReadInnerXml failed\n");
404*7c568831SAndroid Build Coastguard Worker err = 1;
405*7c568831SAndroid Build Coastguard Worker }
406*7c568831SAndroid Build Coastguard Worker xmlFree(string);
407*7c568831SAndroid Build Coastguard Worker
408*7c568831SAndroid Build Coastguard Worker string = xmlTextReaderReadString(reader);
409*7c568831SAndroid Build Coastguard Worker if (!xmlStrEqual(string, BAD_CAST "xyz")) {
410*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "xmlTextReaderReadString failed\n");
411*7c568831SAndroid Build Coastguard Worker err = 1;
412*7c568831SAndroid Build Coastguard Worker }
413*7c568831SAndroid Build Coastguard Worker xmlFree(string);
414*7c568831SAndroid Build Coastguard Worker
415*7c568831SAndroid Build Coastguard Worker xmlFreeTextReader(reader);
416*7c568831SAndroid Build Coastguard Worker return err;
417*7c568831SAndroid Build Coastguard Worker }
418*7c568831SAndroid Build Coastguard Worker
419*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_XINCLUDE_ENABLED
420*7c568831SAndroid Build Coastguard Worker typedef struct {
421*7c568831SAndroid Build Coastguard Worker char *message;
422*7c568831SAndroid Build Coastguard Worker int code;
423*7c568831SAndroid Build Coastguard Worker } testReaderErrorCtxt;
424*7c568831SAndroid Build Coastguard Worker
425*7c568831SAndroid Build Coastguard Worker static void
testReaderError(void * arg,const char * msg,xmlParserSeverities severity ATTRIBUTE_UNUSED,xmlTextReaderLocatorPtr locator ATTRIBUTE_UNUSED)426*7c568831SAndroid Build Coastguard Worker testReaderError(void *arg, const char *msg,
427*7c568831SAndroid Build Coastguard Worker xmlParserSeverities severity ATTRIBUTE_UNUSED,
428*7c568831SAndroid Build Coastguard Worker xmlTextReaderLocatorPtr locator ATTRIBUTE_UNUSED) {
429*7c568831SAndroid Build Coastguard Worker testReaderErrorCtxt *ctxt = arg;
430*7c568831SAndroid Build Coastguard Worker
431*7c568831SAndroid Build Coastguard Worker if (ctxt->message != NULL)
432*7c568831SAndroid Build Coastguard Worker xmlFree(ctxt->message);
433*7c568831SAndroid Build Coastguard Worker ctxt->message = xmlMemStrdup(msg);
434*7c568831SAndroid Build Coastguard Worker }
435*7c568831SAndroid Build Coastguard Worker
436*7c568831SAndroid Build Coastguard Worker static void
testStructuredReaderError(void * arg,const xmlError * error)437*7c568831SAndroid Build Coastguard Worker testStructuredReaderError(void *arg, const xmlError *error) {
438*7c568831SAndroid Build Coastguard Worker testReaderErrorCtxt *ctxt = arg;
439*7c568831SAndroid Build Coastguard Worker
440*7c568831SAndroid Build Coastguard Worker if (ctxt->message != NULL)
441*7c568831SAndroid Build Coastguard Worker xmlFree(ctxt->message);
442*7c568831SAndroid Build Coastguard Worker ctxt->message = xmlMemStrdup(error->message);
443*7c568831SAndroid Build Coastguard Worker ctxt->code = error->code;
444*7c568831SAndroid Build Coastguard Worker }
445*7c568831SAndroid Build Coastguard Worker
446*7c568831SAndroid Build Coastguard Worker static int
testReaderXIncludeError(void)447*7c568831SAndroid Build Coastguard Worker testReaderXIncludeError(void) {
448*7c568831SAndroid Build Coastguard Worker /*
449*7c568831SAndroid Build Coastguard Worker * Test whether XInclude errors are reported to the custom error
450*7c568831SAndroid Build Coastguard Worker * handler of a reader.
451*7c568831SAndroid Build Coastguard Worker */
452*7c568831SAndroid Build Coastguard Worker const char *doc =
453*7c568831SAndroid Build Coastguard Worker "<doc xmlns:xi='http://www.w3.org/2001/XInclude'>\n"
454*7c568831SAndroid Build Coastguard Worker " <xi:include/>\n"
455*7c568831SAndroid Build Coastguard Worker "</doc>\n";
456*7c568831SAndroid Build Coastguard Worker xmlTextReader *reader;
457*7c568831SAndroid Build Coastguard Worker testReaderErrorCtxt errorCtxt;
458*7c568831SAndroid Build Coastguard Worker int err = 0;
459*7c568831SAndroid Build Coastguard Worker
460*7c568831SAndroid Build Coastguard Worker reader = xmlReaderForDoc(BAD_CAST doc, NULL, NULL, XML_PARSE_XINCLUDE);
461*7c568831SAndroid Build Coastguard Worker xmlTextReaderSetErrorHandler(reader, testReaderError, &errorCtxt);
462*7c568831SAndroid Build Coastguard Worker errorCtxt.message = NULL;
463*7c568831SAndroid Build Coastguard Worker errorCtxt.code = 0;
464*7c568831SAndroid Build Coastguard Worker while (xmlTextReaderRead(reader) > 0)
465*7c568831SAndroid Build Coastguard Worker ;
466*7c568831SAndroid Build Coastguard Worker
467*7c568831SAndroid Build Coastguard Worker if (errorCtxt.message == NULL ||
468*7c568831SAndroid Build Coastguard Worker strstr(errorCtxt.message, "href or xpointer") == NULL) {
469*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "xmlTextReaderSetErrorHandler failed\n");
470*7c568831SAndroid Build Coastguard Worker err = 1;
471*7c568831SAndroid Build Coastguard Worker }
472*7c568831SAndroid Build Coastguard Worker
473*7c568831SAndroid Build Coastguard Worker xmlFree(errorCtxt.message);
474*7c568831SAndroid Build Coastguard Worker xmlFreeTextReader(reader);
475*7c568831SAndroid Build Coastguard Worker
476*7c568831SAndroid Build Coastguard Worker reader = xmlReaderForDoc(BAD_CAST doc, NULL, NULL, XML_PARSE_XINCLUDE);
477*7c568831SAndroid Build Coastguard Worker xmlTextReaderSetStructuredErrorHandler(reader, testStructuredReaderError,
478*7c568831SAndroid Build Coastguard Worker &errorCtxt);
479*7c568831SAndroid Build Coastguard Worker errorCtxt.message = NULL;
480*7c568831SAndroid Build Coastguard Worker errorCtxt.code = 0;
481*7c568831SAndroid Build Coastguard Worker while (xmlTextReaderRead(reader) > 0)
482*7c568831SAndroid Build Coastguard Worker ;
483*7c568831SAndroid Build Coastguard Worker
484*7c568831SAndroid Build Coastguard Worker if (errorCtxt.code != XML_XINCLUDE_NO_HREF ||
485*7c568831SAndroid Build Coastguard Worker errorCtxt.message == NULL ||
486*7c568831SAndroid Build Coastguard Worker strstr(errorCtxt.message, "href or xpointer") == NULL) {
487*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "xmlTextReaderSetStructuredErrorHandler failed\n");
488*7c568831SAndroid Build Coastguard Worker err = 1;
489*7c568831SAndroid Build Coastguard Worker }
490*7c568831SAndroid Build Coastguard Worker
491*7c568831SAndroid Build Coastguard Worker xmlFree(errorCtxt.message);
492*7c568831SAndroid Build Coastguard Worker xmlFreeTextReader(reader);
493*7c568831SAndroid Build Coastguard Worker
494*7c568831SAndroid Build Coastguard Worker return err;
495*7c568831SAndroid Build Coastguard Worker }
496*7c568831SAndroid Build Coastguard Worker #endif
497*7c568831SAndroid Build Coastguard Worker #endif
498*7c568831SAndroid Build Coastguard Worker
499*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_WRITER_ENABLED
500*7c568831SAndroid Build Coastguard Worker static int
testWriterIOWrite(void * ctxt,const char * data,int len)501*7c568831SAndroid Build Coastguard Worker testWriterIOWrite(void *ctxt, const char *data, int len) {
502*7c568831SAndroid Build Coastguard Worker (void) ctxt;
503*7c568831SAndroid Build Coastguard Worker (void) data;
504*7c568831SAndroid Build Coastguard Worker
505*7c568831SAndroid Build Coastguard Worker return len;
506*7c568831SAndroid Build Coastguard Worker }
507*7c568831SAndroid Build Coastguard Worker
508*7c568831SAndroid Build Coastguard Worker static int
testWriterIOClose(void * ctxt)509*7c568831SAndroid Build Coastguard Worker testWriterIOClose(void *ctxt) {
510*7c568831SAndroid Build Coastguard Worker (void) ctxt;
511*7c568831SAndroid Build Coastguard Worker
512*7c568831SAndroid Build Coastguard Worker return XML_IO_ENAMETOOLONG;
513*7c568831SAndroid Build Coastguard Worker }
514*7c568831SAndroid Build Coastguard Worker
515*7c568831SAndroid Build Coastguard Worker static int
testWriterClose(void)516*7c568831SAndroid Build Coastguard Worker testWriterClose(void){
517*7c568831SAndroid Build Coastguard Worker xmlOutputBufferPtr out;
518*7c568831SAndroid Build Coastguard Worker xmlTextWriterPtr writer;
519*7c568831SAndroid Build Coastguard Worker int err = 0;
520*7c568831SAndroid Build Coastguard Worker int result;
521*7c568831SAndroid Build Coastguard Worker
522*7c568831SAndroid Build Coastguard Worker out = xmlOutputBufferCreateIO(testWriterIOWrite, testWriterIOClose,
523*7c568831SAndroid Build Coastguard Worker NULL, NULL);
524*7c568831SAndroid Build Coastguard Worker writer = xmlNewTextWriter(out);
525*7c568831SAndroid Build Coastguard Worker xmlTextWriterStartDocument(writer, "1.0", "UTF-8", NULL);
526*7c568831SAndroid Build Coastguard Worker xmlTextWriterStartElement(writer, BAD_CAST "elem");
527*7c568831SAndroid Build Coastguard Worker xmlTextWriterEndElement(writer);
528*7c568831SAndroid Build Coastguard Worker xmlTextWriterEndDocument(writer);
529*7c568831SAndroid Build Coastguard Worker result = xmlTextWriterClose(writer);
530*7c568831SAndroid Build Coastguard Worker
531*7c568831SAndroid Build Coastguard Worker if (result != XML_IO_ENAMETOOLONG) {
532*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "xmlTextWriterClose reported wrong error %d\n",
533*7c568831SAndroid Build Coastguard Worker result);
534*7c568831SAndroid Build Coastguard Worker err = 1;
535*7c568831SAndroid Build Coastguard Worker }
536*7c568831SAndroid Build Coastguard Worker
537*7c568831SAndroid Build Coastguard Worker xmlFreeTextWriter(writer);
538*7c568831SAndroid Build Coastguard Worker return err;
539*7c568831SAndroid Build Coastguard Worker }
540*7c568831SAndroid Build Coastguard Worker #endif
541*7c568831SAndroid Build Coastguard Worker
542*7c568831SAndroid Build Coastguard Worker typedef struct {
543*7c568831SAndroid Build Coastguard Worker const char *uri;
544*7c568831SAndroid Build Coastguard Worker const char *base;
545*7c568831SAndroid Build Coastguard Worker const char *result;
546*7c568831SAndroid Build Coastguard Worker } xmlRelativeUriTest;
547*7c568831SAndroid Build Coastguard Worker
548*7c568831SAndroid Build Coastguard Worker static int
testBuildRelativeUri(void)549*7c568831SAndroid Build Coastguard Worker testBuildRelativeUri(void) {
550*7c568831SAndroid Build Coastguard Worker xmlChar *res;
551*7c568831SAndroid Build Coastguard Worker int err = 0;
552*7c568831SAndroid Build Coastguard Worker int i;
553*7c568831SAndroid Build Coastguard Worker
554*7c568831SAndroid Build Coastguard Worker static const xmlRelativeUriTest tests[] = {
555*7c568831SAndroid Build Coastguard Worker {
556*7c568831SAndroid Build Coastguard Worker "/a/b1/c1",
557*7c568831SAndroid Build Coastguard Worker "/a/b2/c2",
558*7c568831SAndroid Build Coastguard Worker "../b1/c1"
559*7c568831SAndroid Build Coastguard Worker }, {
560*7c568831SAndroid Build Coastguard Worker "a/b1/c1",
561*7c568831SAndroid Build Coastguard Worker "a/b2/c2",
562*7c568831SAndroid Build Coastguard Worker "../b1/c1"
563*7c568831SAndroid Build Coastguard Worker }, {
564*7c568831SAndroid Build Coastguard Worker "a/././b1/x/y/../z/../.././c1",
565*7c568831SAndroid Build Coastguard Worker "./a/./b2/././b2",
566*7c568831SAndroid Build Coastguard Worker "../b1/c1"
567*7c568831SAndroid Build Coastguard Worker }, {
568*7c568831SAndroid Build Coastguard Worker "file:///a/b1/c1",
569*7c568831SAndroid Build Coastguard Worker "/a/b2/c2",
570*7c568831SAndroid Build Coastguard Worker NULL
571*7c568831SAndroid Build Coastguard Worker }, {
572*7c568831SAndroid Build Coastguard Worker "/a/b1/c1",
573*7c568831SAndroid Build Coastguard Worker "file:///a/b2/c2",
574*7c568831SAndroid Build Coastguard Worker NULL
575*7c568831SAndroid Build Coastguard Worker }, {
576*7c568831SAndroid Build Coastguard Worker "a/b1/c1",
577*7c568831SAndroid Build Coastguard Worker "/a/b2/c2",
578*7c568831SAndroid Build Coastguard Worker NULL
579*7c568831SAndroid Build Coastguard Worker }, {
580*7c568831SAndroid Build Coastguard Worker "/a/b1/c1",
581*7c568831SAndroid Build Coastguard Worker "a/b2/c2",
582*7c568831SAndroid Build Coastguard Worker NULL
583*7c568831SAndroid Build Coastguard Worker }, {
584*7c568831SAndroid Build Coastguard Worker "http://example.org/a/b1/c1",
585*7c568831SAndroid Build Coastguard Worker "http://example.org/a/b2/c2",
586*7c568831SAndroid Build Coastguard Worker "../b1/c1"
587*7c568831SAndroid Build Coastguard Worker }, {
588*7c568831SAndroid Build Coastguard Worker "http://example.org/a/b1/c1",
589*7c568831SAndroid Build Coastguard Worker "https://example.org/a/b2/c2",
590*7c568831SAndroid Build Coastguard Worker NULL
591*7c568831SAndroid Build Coastguard Worker }, {
592*7c568831SAndroid Build Coastguard Worker "http://example.org/a/b1/c1",
593*7c568831SAndroid Build Coastguard Worker "http://localhost/a/b2/c2",
594*7c568831SAndroid Build Coastguard Worker NULL
595*7c568831SAndroid Build Coastguard Worker }, {
596*7c568831SAndroid Build Coastguard Worker "with space/x x/y y",
597*7c568831SAndroid Build Coastguard Worker "with space/b2/c2",
598*7c568831SAndroid Build Coastguard Worker "../x%20x/y%20y"
599*7c568831SAndroid Build Coastguard Worker }, {
600*7c568831SAndroid Build Coastguard Worker "with space/x x/y y",
601*7c568831SAndroid Build Coastguard Worker "/b2/c2",
602*7c568831SAndroid Build Coastguard Worker "with%20space/x%20x/y%20y"
603*7c568831SAndroid Build Coastguard Worker }
604*7c568831SAndroid Build Coastguard Worker #if defined(_WIN32) || defined(__CYGWIN__)
605*7c568831SAndroid Build Coastguard Worker , {
606*7c568831SAndroid Build Coastguard Worker "\\a\\b1\\c1",
607*7c568831SAndroid Build Coastguard Worker "\\a\\b2\\c2",
608*7c568831SAndroid Build Coastguard Worker "../b1/c1"
609*7c568831SAndroid Build Coastguard Worker }, {
610*7c568831SAndroid Build Coastguard Worker "\\a\\b1\\c1",
611*7c568831SAndroid Build Coastguard Worker "/a/b2/c2",
612*7c568831SAndroid Build Coastguard Worker "../b1/c1"
613*7c568831SAndroid Build Coastguard Worker }, {
614*7c568831SAndroid Build Coastguard Worker "a\\b1\\c1",
615*7c568831SAndroid Build Coastguard Worker "a/b2/c2",
616*7c568831SAndroid Build Coastguard Worker "../b1/c1"
617*7c568831SAndroid Build Coastguard Worker }, {
618*7c568831SAndroid Build Coastguard Worker "file://server/a/b1/c1",
619*7c568831SAndroid Build Coastguard Worker "\\\\?\\UNC\\server\\a\\b2\\c2",
620*7c568831SAndroid Build Coastguard Worker "../b1/c1"
621*7c568831SAndroid Build Coastguard Worker }, {
622*7c568831SAndroid Build Coastguard Worker "file://server/a/b1/c1",
623*7c568831SAndroid Build Coastguard Worker "\\\\server\\a\\b2\\c2",
624*7c568831SAndroid Build Coastguard Worker "../b1/c1"
625*7c568831SAndroid Build Coastguard Worker }, {
626*7c568831SAndroid Build Coastguard Worker "file:///x:/a/b1/c1",
627*7c568831SAndroid Build Coastguard Worker "x:\\a\\b2\\c2",
628*7c568831SAndroid Build Coastguard Worker "../b1/c1"
629*7c568831SAndroid Build Coastguard Worker }, {
630*7c568831SAndroid Build Coastguard Worker "file:///x:/a/b1/c1",
631*7c568831SAndroid Build Coastguard Worker "\\\\?\\x:\\a\\b2\\c2",
632*7c568831SAndroid Build Coastguard Worker "../b1/c1"
633*7c568831SAndroid Build Coastguard Worker }, {
634*7c568831SAndroid Build Coastguard Worker "file:///x:/a/b1/c1",
635*7c568831SAndroid Build Coastguard Worker "file:///y:/a/b2/c2",
636*7c568831SAndroid Build Coastguard Worker NULL
637*7c568831SAndroid Build Coastguard Worker }, {
638*7c568831SAndroid Build Coastguard Worker "x:/a/b1/c1",
639*7c568831SAndroid Build Coastguard Worker "y:/a/b2/c2",
640*7c568831SAndroid Build Coastguard Worker "file:///x:/a/b1/c1"
641*7c568831SAndroid Build Coastguard Worker }, {
642*7c568831SAndroid Build Coastguard Worker "/a/b1/c1",
643*7c568831SAndroid Build Coastguard Worker "y:/a/b2/c2",
644*7c568831SAndroid Build Coastguard Worker NULL
645*7c568831SAndroid Build Coastguard Worker }, {
646*7c568831SAndroid Build Coastguard Worker "\\\\server\\a\\b1\\c1",
647*7c568831SAndroid Build Coastguard Worker "a/b2/c2",
648*7c568831SAndroid Build Coastguard Worker "file://server/a/b1/c1"
649*7c568831SAndroid Build Coastguard Worker }
650*7c568831SAndroid Build Coastguard Worker #endif
651*7c568831SAndroid Build Coastguard Worker };
652*7c568831SAndroid Build Coastguard Worker
653*7c568831SAndroid Build Coastguard Worker for (i = 0; (size_t) i < sizeof(tests) / sizeof(tests[0]); i++) {
654*7c568831SAndroid Build Coastguard Worker const xmlRelativeUriTest *test = tests + i;
655*7c568831SAndroid Build Coastguard Worker const char *expect;
656*7c568831SAndroid Build Coastguard Worker
657*7c568831SAndroid Build Coastguard Worker res = xmlBuildRelativeURI(BAD_CAST test->uri, BAD_CAST test->base);
658*7c568831SAndroid Build Coastguard Worker expect = test->result ? test->result : test->uri;
659*7c568831SAndroid Build Coastguard Worker if (!xmlStrEqual(res, BAD_CAST expect)) {
660*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "xmlBuildRelativeURI failed uri=%s base=%s "
661*7c568831SAndroid Build Coastguard Worker "result=%s expected=%s\n", test->uri, test->base,
662*7c568831SAndroid Build Coastguard Worker res, expect);
663*7c568831SAndroid Build Coastguard Worker err = 1;
664*7c568831SAndroid Build Coastguard Worker }
665*7c568831SAndroid Build Coastguard Worker xmlFree(res);
666*7c568831SAndroid Build Coastguard Worker }
667*7c568831SAndroid Build Coastguard Worker
668*7c568831SAndroid Build Coastguard Worker return err;
669*7c568831SAndroid Build Coastguard Worker }
670*7c568831SAndroid Build Coastguard Worker
671*7c568831SAndroid Build Coastguard Worker static int charEncConvImplError;
672*7c568831SAndroid Build Coastguard Worker
673*7c568831SAndroid Build Coastguard Worker static int
rot13Convert(unsigned char * out,int * outlen,const unsigned char * in,int * inlen,void * vctxt)674*7c568831SAndroid Build Coastguard Worker rot13Convert(unsigned char *out, int *outlen,
675*7c568831SAndroid Build Coastguard Worker const unsigned char *in, int *inlen, void *vctxt) {
676*7c568831SAndroid Build Coastguard Worker int *ctxt = vctxt;
677*7c568831SAndroid Build Coastguard Worker int inSize = *inlen;
678*7c568831SAndroid Build Coastguard Worker int outSize = *outlen;
679*7c568831SAndroid Build Coastguard Worker int rot, i;
680*7c568831SAndroid Build Coastguard Worker
681*7c568831SAndroid Build Coastguard Worker rot = *ctxt;
682*7c568831SAndroid Build Coastguard Worker
683*7c568831SAndroid Build Coastguard Worker for (i = 0; i < inSize && i < outSize; i++) {
684*7c568831SAndroid Build Coastguard Worker int c = in[i];
685*7c568831SAndroid Build Coastguard Worker
686*7c568831SAndroid Build Coastguard Worker if (c >= 'A' && c <= 'Z')
687*7c568831SAndroid Build Coastguard Worker c = 'A' + (c - 'A' + rot) % 26;
688*7c568831SAndroid Build Coastguard Worker else if (c >= 'a' && c <= 'z')
689*7c568831SAndroid Build Coastguard Worker c = 'a' + (c - 'a' + rot) % 26;
690*7c568831SAndroid Build Coastguard Worker
691*7c568831SAndroid Build Coastguard Worker out[i] = c;
692*7c568831SAndroid Build Coastguard Worker }
693*7c568831SAndroid Build Coastguard Worker
694*7c568831SAndroid Build Coastguard Worker *inlen = i;
695*7c568831SAndroid Build Coastguard Worker *outlen = i;
696*7c568831SAndroid Build Coastguard Worker
697*7c568831SAndroid Build Coastguard Worker return XML_ENC_ERR_SUCCESS;
698*7c568831SAndroid Build Coastguard Worker }
699*7c568831SAndroid Build Coastguard Worker
700*7c568831SAndroid Build Coastguard Worker static void
rot13ConvCtxtDtor(void * vctxt)701*7c568831SAndroid Build Coastguard Worker rot13ConvCtxtDtor(void *vctxt) {
702*7c568831SAndroid Build Coastguard Worker xmlFree(vctxt);
703*7c568831SAndroid Build Coastguard Worker }
704*7c568831SAndroid Build Coastguard Worker
705*7c568831SAndroid Build Coastguard Worker static int
rot13ConvImpl(void * vctxt ATTRIBUTE_UNUSED,const char * name,xmlCharEncConverter * conv)706*7c568831SAndroid Build Coastguard Worker rot13ConvImpl(void *vctxt ATTRIBUTE_UNUSED, const char *name,
707*7c568831SAndroid Build Coastguard Worker xmlCharEncConverter *conv) {
708*7c568831SAndroid Build Coastguard Worker int *inputCtxt;
709*7c568831SAndroid Build Coastguard Worker
710*7c568831SAndroid Build Coastguard Worker if (strcmp(name, "rot13") != 0) {
711*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "rot13ConvImpl received wrong name\n");
712*7c568831SAndroid Build Coastguard Worker charEncConvImplError = 1;
713*7c568831SAndroid Build Coastguard Worker
714*7c568831SAndroid Build Coastguard Worker return XML_ERR_UNSUPPORTED_ENCODING;
715*7c568831SAndroid Build Coastguard Worker }
716*7c568831SAndroid Build Coastguard Worker
717*7c568831SAndroid Build Coastguard Worker conv->input = rot13Convert;
718*7c568831SAndroid Build Coastguard Worker conv->output = rot13Convert;
719*7c568831SAndroid Build Coastguard Worker conv->ctxtDtor = rot13ConvCtxtDtor;
720*7c568831SAndroid Build Coastguard Worker
721*7c568831SAndroid Build Coastguard Worker inputCtxt = xmlMalloc(sizeof(*inputCtxt));
722*7c568831SAndroid Build Coastguard Worker *inputCtxt = 13;
723*7c568831SAndroid Build Coastguard Worker conv->inputCtxt = inputCtxt;
724*7c568831SAndroid Build Coastguard Worker
725*7c568831SAndroid Build Coastguard Worker return XML_ERR_OK;
726*7c568831SAndroid Build Coastguard Worker }
727*7c568831SAndroid Build Coastguard Worker
728*7c568831SAndroid Build Coastguard Worker static int
testCharEncConvImpl(void)729*7c568831SAndroid Build Coastguard Worker testCharEncConvImpl(void) {
730*7c568831SAndroid Build Coastguard Worker xmlParserCtxtPtr ctxt;
731*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
732*7c568831SAndroid Build Coastguard Worker xmlNodePtr root;
733*7c568831SAndroid Build Coastguard Worker int err = 0;
734*7c568831SAndroid Build Coastguard Worker
735*7c568831SAndroid Build Coastguard Worker ctxt = xmlNewParserCtxt();
736*7c568831SAndroid Build Coastguard Worker xmlCtxtSetCharEncConvImpl(ctxt, rot13ConvImpl, NULL);
737*7c568831SAndroid Build Coastguard Worker charEncConvImplError = 0;
738*7c568831SAndroid Build Coastguard Worker doc = xmlCtxtReadDoc(ctxt, BAD_CAST "<?kzy irefvba='1.0'?><qbp/>", NULL,
739*7c568831SAndroid Build Coastguard Worker "rot13", 0);
740*7c568831SAndroid Build Coastguard Worker if (charEncConvImplError)
741*7c568831SAndroid Build Coastguard Worker err = 1;
742*7c568831SAndroid Build Coastguard Worker xmlFreeParserCtxt(ctxt);
743*7c568831SAndroid Build Coastguard Worker
744*7c568831SAndroid Build Coastguard Worker root = xmlDocGetRootElement(doc);
745*7c568831SAndroid Build Coastguard Worker if (root == NULL || strcmp((char *) root->name, "doc") != 0) {
746*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "testCharEncConvImpl failed\n");
747*7c568831SAndroid Build Coastguard Worker err = 1;
748*7c568831SAndroid Build Coastguard Worker }
749*7c568831SAndroid Build Coastguard Worker
750*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(doc);
751*7c568831SAndroid Build Coastguard Worker
752*7c568831SAndroid Build Coastguard Worker return err;
753*7c568831SAndroid Build Coastguard Worker }
754*7c568831SAndroid Build Coastguard Worker
755*7c568831SAndroid Build Coastguard Worker int
main(void)756*7c568831SAndroid Build Coastguard Worker main(void) {
757*7c568831SAndroid Build Coastguard Worker int err = 0;
758*7c568831SAndroid Build Coastguard Worker
759*7c568831SAndroid Build Coastguard Worker err |= testNewDocNode();
760*7c568831SAndroid Build Coastguard Worker err |= testStandaloneWithEncoding();
761*7c568831SAndroid Build Coastguard Worker err |= testUnsupportedEncoding();
762*7c568831SAndroid Build Coastguard Worker err |= testNodeGetContent();
763*7c568831SAndroid Build Coastguard Worker err |= testCFileIO();
764*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
765*7c568831SAndroid Build Coastguard Worker err |= testCtxtParseContent();
766*7c568831SAndroid Build Coastguard Worker #endif
767*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_SAX1_ENABLED
768*7c568831SAndroid Build Coastguard Worker err |= testBalancedChunk();
769*7c568831SAndroid Build Coastguard Worker #endif
770*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_PUSH_ENABLED
771*7c568831SAndroid Build Coastguard Worker err |= testHugePush();
772*7c568831SAndroid Build Coastguard Worker err |= testHugeEncodedChunk();
773*7c568831SAndroid Build Coastguard Worker #endif
774*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
775*7c568831SAndroid Build Coastguard Worker err |= testHtmlIds();
776*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_PUSH_ENABLED
777*7c568831SAndroid Build Coastguard Worker err |= testHtmlPushWithEncoding();
778*7c568831SAndroid Build Coastguard Worker #endif
779*7c568831SAndroid Build Coastguard Worker #endif
780*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
781*7c568831SAndroid Build Coastguard Worker err |= testReaderEncoding();
782*7c568831SAndroid Build Coastguard Worker err |= testReaderContent();
783*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_XINCLUDE_ENABLED
784*7c568831SAndroid Build Coastguard Worker err |= testReaderXIncludeError();
785*7c568831SAndroid Build Coastguard Worker #endif
786*7c568831SAndroid Build Coastguard Worker #endif
787*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_WRITER_ENABLED
788*7c568831SAndroid Build Coastguard Worker err |= testWriterClose();
789*7c568831SAndroid Build Coastguard Worker #endif
790*7c568831SAndroid Build Coastguard Worker err |= testBuildRelativeUri();
791*7c568831SAndroid Build Coastguard Worker err |= testCharEncConvImpl();
792*7c568831SAndroid Build Coastguard Worker
793*7c568831SAndroid Build Coastguard Worker return err;
794*7c568831SAndroid Build Coastguard Worker }
795*7c568831SAndroid Build Coastguard Worker
796