xref: /aosp_15_r20/external/libxml2/testparser.c (revision 7c5688314b92172186c154356a6374bf7684c3ca)
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