xref: /aosp_15_r20/external/libxml2/runsuite.c (revision 7c5688314b92172186c154356a6374bf7684c3ca)
1*7c568831SAndroid Build Coastguard Worker /*
2*7c568831SAndroid Build Coastguard Worker  * runsuite.c: C program to run libxml2 against published testsuites
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  * [email protected]
7*7c568831SAndroid Build Coastguard Worker  */
8*7c568831SAndroid Build Coastguard Worker 
9*7c568831SAndroid Build Coastguard Worker #include "libxml.h"
10*7c568831SAndroid Build Coastguard Worker #include <stdio.h>
11*7c568831SAndroid Build Coastguard Worker #include <stdlib.h>
12*7c568831SAndroid Build Coastguard Worker #include <string.h>
13*7c568831SAndroid Build Coastguard Worker #include <sys/stat.h>
14*7c568831SAndroid Build Coastguard Worker 
15*7c568831SAndroid Build Coastguard Worker #include <libxml/catalog.h>
16*7c568831SAndroid Build Coastguard Worker #include <libxml/parser.h>
17*7c568831SAndroid Build Coastguard Worker #include <libxml/parserInternals.h>
18*7c568831SAndroid Build Coastguard Worker #include <libxml/tree.h>
19*7c568831SAndroid Build Coastguard Worker #include <libxml/uri.h>
20*7c568831SAndroid Build Coastguard Worker #if defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_XPATH_ENABLED)
21*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlreader.h>
22*7c568831SAndroid Build Coastguard Worker 
23*7c568831SAndroid Build Coastguard Worker #include <libxml/xpath.h>
24*7c568831SAndroid Build Coastguard Worker #include <libxml/xpathInternals.h>
25*7c568831SAndroid Build Coastguard Worker 
26*7c568831SAndroid Build Coastguard Worker #include <libxml/relaxng.h>
27*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlschemas.h>
28*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlschemastypes.h>
29*7c568831SAndroid Build Coastguard Worker 
30*7c568831SAndroid Build Coastguard Worker #define LOGFILE "runsuite.log"
31*7c568831SAndroid Build Coastguard Worker static FILE *logfile = NULL;
32*7c568831SAndroid Build Coastguard Worker static int verbose = 0;
33*7c568831SAndroid Build Coastguard Worker 
34*7c568831SAndroid Build Coastguard Worker 
35*7c568831SAndroid Build Coastguard Worker /************************************************************************
36*7c568831SAndroid Build Coastguard Worker  *									*
37*7c568831SAndroid Build Coastguard Worker  *		File name and path utilities				*
38*7c568831SAndroid Build Coastguard Worker  *									*
39*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
40*7c568831SAndroid Build Coastguard Worker 
checkTestFile(const char * filename)41*7c568831SAndroid Build Coastguard Worker static int checkTestFile(const char *filename) {
42*7c568831SAndroid Build Coastguard Worker     struct stat buf;
43*7c568831SAndroid Build Coastguard Worker 
44*7c568831SAndroid Build Coastguard Worker     if (stat(filename, &buf) == -1)
45*7c568831SAndroid Build Coastguard Worker         return(0);
46*7c568831SAndroid Build Coastguard Worker 
47*7c568831SAndroid Build Coastguard Worker #if defined(_WIN32)
48*7c568831SAndroid Build Coastguard Worker     if (!(buf.st_mode & _S_IFREG))
49*7c568831SAndroid Build Coastguard Worker         return(0);
50*7c568831SAndroid Build Coastguard Worker #else
51*7c568831SAndroid Build Coastguard Worker     if (!S_ISREG(buf.st_mode))
52*7c568831SAndroid Build Coastguard Worker         return(0);
53*7c568831SAndroid Build Coastguard Worker #endif
54*7c568831SAndroid Build Coastguard Worker 
55*7c568831SAndroid Build Coastguard Worker     return(1);
56*7c568831SAndroid Build Coastguard Worker }
57*7c568831SAndroid Build Coastguard Worker 
composeDir(const xmlChar * dir,const xmlChar * path)58*7c568831SAndroid Build Coastguard Worker static xmlChar *composeDir(const xmlChar *dir, const xmlChar *path) {
59*7c568831SAndroid Build Coastguard Worker     char buf[500];
60*7c568831SAndroid Build Coastguard Worker 
61*7c568831SAndroid Build Coastguard Worker     if (dir == NULL) return(xmlStrdup(path));
62*7c568831SAndroid Build Coastguard Worker     if (path == NULL) return(NULL);
63*7c568831SAndroid Build Coastguard Worker 
64*7c568831SAndroid Build Coastguard Worker     snprintf(buf, 500, "%s/%s", (const char *) dir, (const char *) path);
65*7c568831SAndroid Build Coastguard Worker     return(xmlStrdup((const xmlChar *) buf));
66*7c568831SAndroid Build Coastguard Worker }
67*7c568831SAndroid Build Coastguard Worker 
68*7c568831SAndroid Build Coastguard Worker /************************************************************************
69*7c568831SAndroid Build Coastguard Worker  *									*
70*7c568831SAndroid Build Coastguard Worker  *		Libxml2 specific routines				*
71*7c568831SAndroid Build Coastguard Worker  *									*
72*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
73*7c568831SAndroid Build Coastguard Worker 
74*7c568831SAndroid Build Coastguard Worker static int nb_tests = 0;
75*7c568831SAndroid Build Coastguard Worker static int nb_errors = 0;
76*7c568831SAndroid Build Coastguard Worker static int nb_internals = 0;
77*7c568831SAndroid Build Coastguard Worker static int nb_schematas = 0;
78*7c568831SAndroid Build Coastguard Worker static int nb_unimplemented = 0;
79*7c568831SAndroid Build Coastguard Worker static int nb_leaks = 0;
80*7c568831SAndroid Build Coastguard Worker 
81*7c568831SAndroid Build Coastguard Worker static int
fatalError(void)82*7c568831SAndroid Build Coastguard Worker fatalError(void) {
83*7c568831SAndroid Build Coastguard Worker     fprintf(stderr, "Exitting tests on fatal error\n");
84*7c568831SAndroid Build Coastguard Worker     exit(1);
85*7c568831SAndroid Build Coastguard Worker }
86*7c568831SAndroid Build Coastguard Worker 
87*7c568831SAndroid Build Coastguard Worker /*
88*7c568831SAndroid Build Coastguard Worker  * that's needed to implement <resource>
89*7c568831SAndroid Build Coastguard Worker  */
90*7c568831SAndroid Build Coastguard Worker #define MAX_ENTITIES 20
91*7c568831SAndroid Build Coastguard Worker static char *testEntitiesName[MAX_ENTITIES];
92*7c568831SAndroid Build Coastguard Worker static char *testEntitiesValue[MAX_ENTITIES];
93*7c568831SAndroid Build Coastguard Worker static int nb_entities = 0;
resetEntities(void)94*7c568831SAndroid Build Coastguard Worker static void resetEntities(void) {
95*7c568831SAndroid Build Coastguard Worker     int i;
96*7c568831SAndroid Build Coastguard Worker 
97*7c568831SAndroid Build Coastguard Worker     for (i = 0;i < nb_entities;i++) {
98*7c568831SAndroid Build Coastguard Worker         if (testEntitiesName[i] != NULL)
99*7c568831SAndroid Build Coastguard Worker 	    xmlFree(testEntitiesName[i]);
100*7c568831SAndroid Build Coastguard Worker         if (testEntitiesValue[i] != NULL)
101*7c568831SAndroid Build Coastguard Worker 	    xmlFree(testEntitiesValue[i]);
102*7c568831SAndroid Build Coastguard Worker     }
103*7c568831SAndroid Build Coastguard Worker     nb_entities = 0;
104*7c568831SAndroid Build Coastguard Worker }
addEntity(char * name,char * content)105*7c568831SAndroid Build Coastguard Worker static int addEntity(char *name, char *content) {
106*7c568831SAndroid Build Coastguard Worker     if (nb_entities >= MAX_ENTITIES) {
107*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "Too many entities defined\n");
108*7c568831SAndroid Build Coastguard Worker 	return(-1);
109*7c568831SAndroid Build Coastguard Worker     }
110*7c568831SAndroid Build Coastguard Worker     testEntitiesName[nb_entities] = name;
111*7c568831SAndroid Build Coastguard Worker     testEntitiesValue[nb_entities] = content;
112*7c568831SAndroid Build Coastguard Worker     nb_entities++;
113*7c568831SAndroid Build Coastguard Worker     return(0);
114*7c568831SAndroid Build Coastguard Worker }
115*7c568831SAndroid Build Coastguard Worker 
116*7c568831SAndroid Build Coastguard Worker static int
testResourceLoader(void * vctxt ATTRIBUTE_UNUSED,const char * URL,const char * ID ATTRIBUTE_UNUSED,xmlResourceType type ATTRIBUTE_UNUSED,int flags ATTRIBUTE_UNUSED,xmlParserInputPtr * out)117*7c568831SAndroid Build Coastguard Worker testResourceLoader(void *vctxt ATTRIBUTE_UNUSED, const char *URL,
118*7c568831SAndroid Build Coastguard Worker                    const char *ID ATTRIBUTE_UNUSED,
119*7c568831SAndroid Build Coastguard Worker                    xmlResourceType type ATTRIBUTE_UNUSED,
120*7c568831SAndroid Build Coastguard Worker                    int flags ATTRIBUTE_UNUSED, xmlParserInputPtr *out) {
121*7c568831SAndroid Build Coastguard Worker     int i;
122*7c568831SAndroid Build Coastguard Worker 
123*7c568831SAndroid Build Coastguard Worker     for (i = 0; i < nb_entities; i++) {
124*7c568831SAndroid Build Coastguard Worker         if (!strcmp(testEntitiesName[i], URL)) {
125*7c568831SAndroid Build Coastguard Worker 	    *out = xmlNewInputFromString(testEntitiesName[i],
126*7c568831SAndroid Build Coastguard Worker                                         testEntitiesValue[i],
127*7c568831SAndroid Build Coastguard Worker                                         XML_INPUT_BUF_STATIC);
128*7c568831SAndroid Build Coastguard Worker 	    return(XML_ERR_OK);
129*7c568831SAndroid Build Coastguard Worker 	}
130*7c568831SAndroid Build Coastguard Worker     }
131*7c568831SAndroid Build Coastguard Worker 
132*7c568831SAndroid Build Coastguard Worker     return(xmlNewInputFromUrl(URL, 0, out));
133*7c568831SAndroid Build Coastguard Worker }
134*7c568831SAndroid Build Coastguard Worker 
135*7c568831SAndroid Build Coastguard Worker /*
136*7c568831SAndroid Build Coastguard Worker  * Trapping the error messages at the generic level to grab the equivalent of
137*7c568831SAndroid Build Coastguard Worker  * stderr messages on CLI tools.
138*7c568831SAndroid Build Coastguard Worker  */
139*7c568831SAndroid Build Coastguard Worker static char testErrors[32769];
140*7c568831SAndroid Build Coastguard Worker static int testErrorsSize = 0;
141*7c568831SAndroid Build Coastguard Worker 
test_log(const char * msg,...)142*7c568831SAndroid Build Coastguard Worker static void test_log(const char *msg, ...) {
143*7c568831SAndroid Build Coastguard Worker     va_list args;
144*7c568831SAndroid Build Coastguard Worker     if (logfile != NULL) {
145*7c568831SAndroid Build Coastguard Worker         fprintf(logfile, "\n------------\n");
146*7c568831SAndroid Build Coastguard Worker 	va_start(args, msg);
147*7c568831SAndroid Build Coastguard Worker 	vfprintf(logfile, msg, args);
148*7c568831SAndroid Build Coastguard Worker 	va_end(args);
149*7c568831SAndroid Build Coastguard Worker 	fprintf(logfile, "%s", testErrors);
150*7c568831SAndroid Build Coastguard Worker 	testErrorsSize = 0; testErrors[0] = 0;
151*7c568831SAndroid Build Coastguard Worker     }
152*7c568831SAndroid Build Coastguard Worker     if (verbose) {
153*7c568831SAndroid Build Coastguard Worker 	va_start(args, msg);
154*7c568831SAndroid Build Coastguard Worker 	vfprintf(stderr, msg, args);
155*7c568831SAndroid Build Coastguard Worker 	va_end(args);
156*7c568831SAndroid Build Coastguard Worker     }
157*7c568831SAndroid Build Coastguard Worker }
158*7c568831SAndroid Build Coastguard Worker 
159*7c568831SAndroid Build Coastguard Worker static void
testErrorHandler(void * ctx ATTRIBUTE_UNUSED,const char * msg,...)160*7c568831SAndroid Build Coastguard Worker testErrorHandler(void *ctx  ATTRIBUTE_UNUSED, const char *msg, ...) {
161*7c568831SAndroid Build Coastguard Worker     va_list args;
162*7c568831SAndroid Build Coastguard Worker     int res;
163*7c568831SAndroid Build Coastguard Worker 
164*7c568831SAndroid Build Coastguard Worker     if (testErrorsSize >= 32768)
165*7c568831SAndroid Build Coastguard Worker         return;
166*7c568831SAndroid Build Coastguard Worker     va_start(args, msg);
167*7c568831SAndroid Build Coastguard Worker     res = vsnprintf(&testErrors[testErrorsSize],
168*7c568831SAndroid Build Coastguard Worker                     32768 - testErrorsSize,
169*7c568831SAndroid Build Coastguard Worker 		    msg, args);
170*7c568831SAndroid Build Coastguard Worker     va_end(args);
171*7c568831SAndroid Build Coastguard Worker     if (testErrorsSize + res >= 32768) {
172*7c568831SAndroid Build Coastguard Worker         /* buffer is full */
173*7c568831SAndroid Build Coastguard Worker 	testErrorsSize = 32768;
174*7c568831SAndroid Build Coastguard Worker 	testErrors[testErrorsSize] = 0;
175*7c568831SAndroid Build Coastguard Worker     } else {
176*7c568831SAndroid Build Coastguard Worker         testErrorsSize += res;
177*7c568831SAndroid Build Coastguard Worker     }
178*7c568831SAndroid Build Coastguard Worker     testErrors[testErrorsSize] = 0;
179*7c568831SAndroid Build Coastguard Worker }
180*7c568831SAndroid Build Coastguard Worker 
181*7c568831SAndroid Build Coastguard Worker static xmlXPathContextPtr ctxtXPath;
182*7c568831SAndroid Build Coastguard Worker 
183*7c568831SAndroid Build Coastguard Worker static void
initializeLibxml2(void)184*7c568831SAndroid Build Coastguard Worker initializeLibxml2(void) {
185*7c568831SAndroid Build Coastguard Worker     xmlMemSetup(xmlMemFree, xmlMemMalloc, xmlMemRealloc, xmlMemoryStrdup);
186*7c568831SAndroid Build Coastguard Worker     xmlInitParser();
187*7c568831SAndroid Build Coastguard Worker     ctxtXPath = xmlXPathNewContext(NULL);
188*7c568831SAndroid Build Coastguard Worker     /*
189*7c568831SAndroid Build Coastguard Worker     * Deactivate the cache if created; otherwise we have to create/free it
190*7c568831SAndroid Build Coastguard Worker     * for every test, since it will confuse the memory leak detection.
191*7c568831SAndroid Build Coastguard Worker     * Note that normally this need not be done, since the cache is not
192*7c568831SAndroid Build Coastguard Worker     * created until set explicitly with xmlXPathContextSetCache();
193*7c568831SAndroid Build Coastguard Worker     * but for test purposes it is sometimes useful to activate the
194*7c568831SAndroid Build Coastguard Worker     * cache by default for the whole library.
195*7c568831SAndroid Build Coastguard Worker     */
196*7c568831SAndroid Build Coastguard Worker     if (ctxtXPath->cache != NULL)
197*7c568831SAndroid Build Coastguard Worker 	xmlXPathContextSetCache(ctxtXPath, 0, -1, 0);
198*7c568831SAndroid Build Coastguard Worker     /* used as default namespace in xstc tests */
199*7c568831SAndroid Build Coastguard Worker     xmlXPathRegisterNs(ctxtXPath, BAD_CAST "ts", BAD_CAST "TestSuite");
200*7c568831SAndroid Build Coastguard Worker     xmlXPathRegisterNs(ctxtXPath, BAD_CAST "xlink",
201*7c568831SAndroid Build Coastguard Worker                        BAD_CAST "http://www.w3.org/1999/xlink");
202*7c568831SAndroid Build Coastguard Worker     xmlSetGenericErrorFunc(NULL, testErrorHandler);
203*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_CATALOG_ENABLED
204*7c568831SAndroid Build Coastguard Worker     xmlInitializeCatalog();
205*7c568831SAndroid Build Coastguard Worker     xmlCatalogSetDefaults(XML_CATA_ALLOW_NONE);
206*7c568831SAndroid Build Coastguard Worker #endif
207*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
208*7c568831SAndroid Build Coastguard Worker     xmlSchemaInitTypes();
209*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGInitTypes();
210*7c568831SAndroid Build Coastguard Worker #endif
211*7c568831SAndroid Build Coastguard Worker }
212*7c568831SAndroid Build Coastguard Worker 
213*7c568831SAndroid Build Coastguard Worker static xmlNodePtr
getNext(xmlNodePtr cur,const char * xpath)214*7c568831SAndroid Build Coastguard Worker getNext(xmlNodePtr cur, const char *xpath) {
215*7c568831SAndroid Build Coastguard Worker     xmlNodePtr ret = NULL;
216*7c568831SAndroid Build Coastguard Worker     xmlXPathObjectPtr res;
217*7c568831SAndroid Build Coastguard Worker     xmlXPathCompExprPtr comp;
218*7c568831SAndroid Build Coastguard Worker 
219*7c568831SAndroid Build Coastguard Worker     if ((cur == NULL)  || (cur->doc == NULL) || (xpath == NULL))
220*7c568831SAndroid Build Coastguard Worker         return(NULL);
221*7c568831SAndroid Build Coastguard Worker     ctxtXPath->doc = cur->doc;
222*7c568831SAndroid Build Coastguard Worker     ctxtXPath->node = cur;
223*7c568831SAndroid Build Coastguard Worker     comp = xmlXPathCompile(BAD_CAST xpath);
224*7c568831SAndroid Build Coastguard Worker     if (comp == NULL) {
225*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to compile %s\n", xpath);
226*7c568831SAndroid Build Coastguard Worker 	return(NULL);
227*7c568831SAndroid Build Coastguard Worker     }
228*7c568831SAndroid Build Coastguard Worker     res = xmlXPathCompiledEval(comp, ctxtXPath);
229*7c568831SAndroid Build Coastguard Worker     xmlXPathFreeCompExpr(comp);
230*7c568831SAndroid Build Coastguard Worker     if (res == NULL)
231*7c568831SAndroid Build Coastguard Worker         return(NULL);
232*7c568831SAndroid Build Coastguard Worker     if ((res->type == XPATH_NODESET) &&
233*7c568831SAndroid Build Coastguard Worker         (res->nodesetval != NULL) &&
234*7c568831SAndroid Build Coastguard Worker 	(res->nodesetval->nodeNr > 0) &&
235*7c568831SAndroid Build Coastguard Worker 	(res->nodesetval->nodeTab != NULL))
236*7c568831SAndroid Build Coastguard Worker 	ret = res->nodesetval->nodeTab[0];
237*7c568831SAndroid Build Coastguard Worker     xmlXPathFreeObject(res);
238*7c568831SAndroid Build Coastguard Worker     return(ret);
239*7c568831SAndroid Build Coastguard Worker }
240*7c568831SAndroid Build Coastguard Worker 
241*7c568831SAndroid Build Coastguard Worker static xmlChar *
getString(xmlNodePtr cur,const char * xpath)242*7c568831SAndroid Build Coastguard Worker getString(xmlNodePtr cur, const char *xpath) {
243*7c568831SAndroid Build Coastguard Worker     xmlChar *ret = NULL;
244*7c568831SAndroid Build Coastguard Worker     xmlXPathObjectPtr res;
245*7c568831SAndroid Build Coastguard Worker     xmlXPathCompExprPtr comp;
246*7c568831SAndroid Build Coastguard Worker 
247*7c568831SAndroid Build Coastguard Worker     if ((cur == NULL)  || (cur->doc == NULL) || (xpath == NULL))
248*7c568831SAndroid Build Coastguard Worker         return(NULL);
249*7c568831SAndroid Build Coastguard Worker     ctxtXPath->doc = cur->doc;
250*7c568831SAndroid Build Coastguard Worker     ctxtXPath->node = cur;
251*7c568831SAndroid Build Coastguard Worker     comp = xmlXPathCompile(BAD_CAST xpath);
252*7c568831SAndroid Build Coastguard Worker     if (comp == NULL) {
253*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to compile %s\n", xpath);
254*7c568831SAndroid Build Coastguard Worker 	return(NULL);
255*7c568831SAndroid Build Coastguard Worker     }
256*7c568831SAndroid Build Coastguard Worker     res = xmlXPathCompiledEval(comp, ctxtXPath);
257*7c568831SAndroid Build Coastguard Worker     xmlXPathFreeCompExpr(comp);
258*7c568831SAndroid Build Coastguard Worker     if (res == NULL)
259*7c568831SAndroid Build Coastguard Worker         return(NULL);
260*7c568831SAndroid Build Coastguard Worker     if (res->type == XPATH_STRING) {
261*7c568831SAndroid Build Coastguard Worker         ret = res->stringval;
262*7c568831SAndroid Build Coastguard Worker 	res->stringval = NULL;
263*7c568831SAndroid Build Coastguard Worker     }
264*7c568831SAndroid Build Coastguard Worker     xmlXPathFreeObject(res);
265*7c568831SAndroid Build Coastguard Worker     return(ret);
266*7c568831SAndroid Build Coastguard Worker }
267*7c568831SAndroid Build Coastguard Worker 
268*7c568831SAndroid Build Coastguard Worker /************************************************************************
269*7c568831SAndroid Build Coastguard Worker  *									*
270*7c568831SAndroid Build Coastguard Worker  *		Test test/xsdtest/xsdtestsuite.xml			*
271*7c568831SAndroid Build Coastguard Worker  *									*
272*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
273*7c568831SAndroid Build Coastguard Worker 
274*7c568831SAndroid Build Coastguard Worker static int
xsdIncorrectTestCase(xmlNodePtr cur)275*7c568831SAndroid Build Coastguard Worker xsdIncorrectTestCase(xmlNodePtr cur) {
276*7c568831SAndroid Build Coastguard Worker     xmlNodePtr test;
277*7c568831SAndroid Build Coastguard Worker     xmlBufferPtr buf;
278*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGParserCtxtPtr pctxt;
279*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGPtr rng = NULL;
280*7c568831SAndroid Build Coastguard Worker     int ret = 0, memt;
281*7c568831SAndroid Build Coastguard Worker 
282*7c568831SAndroid Build Coastguard Worker     cur = getNext(cur, "./incorrect[1]");
283*7c568831SAndroid Build Coastguard Worker     if (cur == NULL) {
284*7c568831SAndroid Build Coastguard Worker         return(0);
285*7c568831SAndroid Build Coastguard Worker     }
286*7c568831SAndroid Build Coastguard Worker 
287*7c568831SAndroid Build Coastguard Worker     test = getNext(cur, "./*");
288*7c568831SAndroid Build Coastguard Worker     if (test == NULL) {
289*7c568831SAndroid Build Coastguard Worker         test_log("Failed to find test in correct line %ld\n",
290*7c568831SAndroid Build Coastguard Worker 	        xmlGetLineNo(cur));
291*7c568831SAndroid Build Coastguard Worker         return(1);
292*7c568831SAndroid Build Coastguard Worker     }
293*7c568831SAndroid Build Coastguard Worker 
294*7c568831SAndroid Build Coastguard Worker     memt = xmlMemUsed();
295*7c568831SAndroid Build Coastguard Worker     /*
296*7c568831SAndroid Build Coastguard Worker      * dump the schemas to a buffer, then reparse it and compile the schemas
297*7c568831SAndroid Build Coastguard Worker      */
298*7c568831SAndroid Build Coastguard Worker     buf = xmlBufferCreate();
299*7c568831SAndroid Build Coastguard Worker     if (buf == NULL) {
300*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "out of memory !\n");
301*7c568831SAndroid Build Coastguard Worker 	fatalError();
302*7c568831SAndroid Build Coastguard Worker     }
303*7c568831SAndroid Build Coastguard Worker     xmlBufferSetAllocationScheme(buf, XML_BUFFER_ALLOC_DOUBLEIT);
304*7c568831SAndroid Build Coastguard Worker     xmlNodeDump(buf, test->doc, test, 0, 0);
305*7c568831SAndroid Build Coastguard Worker     pctxt = xmlRelaxNGNewMemParserCtxt(
306*7c568831SAndroid Build Coastguard Worker             (const char *) xmlBufferContent(buf), xmlBufferLength(buf));
307*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGSetParserErrors(pctxt, testErrorHandler, testErrorHandler,
308*7c568831SAndroid Build Coastguard Worker             pctxt);
309*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGSetResourceLoader(pctxt, testResourceLoader, NULL);
310*7c568831SAndroid Build Coastguard Worker     rng = xmlRelaxNGParse(pctxt);
311*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGFreeParserCtxt(pctxt);
312*7c568831SAndroid Build Coastguard Worker     if (rng != NULL) {
313*7c568831SAndroid Build Coastguard Worker 	test_log("Failed to detect incorrect RNG line %ld\n",
314*7c568831SAndroid Build Coastguard Worker 		    xmlGetLineNo(test));
315*7c568831SAndroid Build Coastguard Worker         ret = 1;
316*7c568831SAndroid Build Coastguard Worker 	goto done;
317*7c568831SAndroid Build Coastguard Worker     }
318*7c568831SAndroid Build Coastguard Worker 
319*7c568831SAndroid Build Coastguard Worker done:
320*7c568831SAndroid Build Coastguard Worker     if (buf != NULL)
321*7c568831SAndroid Build Coastguard Worker 	xmlBufferFree(buf);
322*7c568831SAndroid Build Coastguard Worker     if (rng != NULL)
323*7c568831SAndroid Build Coastguard Worker         xmlRelaxNGFree(rng);
324*7c568831SAndroid Build Coastguard Worker     xmlResetLastError();
325*7c568831SAndroid Build Coastguard Worker     if (memt != xmlMemUsed()) {
326*7c568831SAndroid Build Coastguard Worker 	test_log("Validation of tests starting line %ld leaked %d\n",
327*7c568831SAndroid Build Coastguard Worker 		xmlGetLineNo(cur), xmlMemUsed() - memt);
328*7c568831SAndroid Build Coastguard Worker 	nb_leaks++;
329*7c568831SAndroid Build Coastguard Worker     }
330*7c568831SAndroid Build Coastguard Worker     return(ret);
331*7c568831SAndroid Build Coastguard Worker }
332*7c568831SAndroid Build Coastguard Worker 
333*7c568831SAndroid Build Coastguard Worker static void
installResources(xmlNodePtr tst,const xmlChar * base)334*7c568831SAndroid Build Coastguard Worker installResources(xmlNodePtr tst, const xmlChar *base) {
335*7c568831SAndroid Build Coastguard Worker     xmlNodePtr test;
336*7c568831SAndroid Build Coastguard Worker     xmlBufferPtr buf;
337*7c568831SAndroid Build Coastguard Worker     xmlChar *name, *content, *res;
338*7c568831SAndroid Build Coastguard Worker 
339*7c568831SAndroid Build Coastguard Worker     buf = xmlBufferCreate();
340*7c568831SAndroid Build Coastguard Worker     if (buf == NULL) {
341*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "out of memory !\n");
342*7c568831SAndroid Build Coastguard Worker 	fatalError();
343*7c568831SAndroid Build Coastguard Worker     }
344*7c568831SAndroid Build Coastguard Worker     xmlBufferSetAllocationScheme(buf, XML_BUFFER_ALLOC_DOUBLEIT);
345*7c568831SAndroid Build Coastguard Worker     xmlNodeDump(buf, tst->doc, tst, 0, 0);
346*7c568831SAndroid Build Coastguard Worker 
347*7c568831SAndroid Build Coastguard Worker     while (tst != NULL) {
348*7c568831SAndroid Build Coastguard Worker 	test = getNext(tst, "./*");
349*7c568831SAndroid Build Coastguard Worker 	if (test != NULL) {
350*7c568831SAndroid Build Coastguard Worker 	    xmlBufferEmpty(buf);
351*7c568831SAndroid Build Coastguard Worker 	    xmlNodeDump(buf, test->doc, test, 0, 0);
352*7c568831SAndroid Build Coastguard Worker 	    name = getString(tst, "string(@name)");
353*7c568831SAndroid Build Coastguard Worker 	    content = xmlStrdup(xmlBufferContent(buf));
354*7c568831SAndroid Build Coastguard Worker 	    if ((name != NULL) && (content != NULL)) {
355*7c568831SAndroid Build Coastguard Worker 	        res = composeDir(base, name);
356*7c568831SAndroid Build Coastguard Worker 		xmlFree(name);
357*7c568831SAndroid Build Coastguard Worker 	        addEntity((char *) res, (char *) content);
358*7c568831SAndroid Build Coastguard Worker 	    } else {
359*7c568831SAndroid Build Coastguard Worker 	        if (name != NULL) xmlFree(name);
360*7c568831SAndroid Build Coastguard Worker 	        if (content != NULL) xmlFree(content);
361*7c568831SAndroid Build Coastguard Worker 	    }
362*7c568831SAndroid Build Coastguard Worker 	}
363*7c568831SAndroid Build Coastguard Worker 	tst = getNext(tst, "following-sibling::resource[1]");
364*7c568831SAndroid Build Coastguard Worker     }
365*7c568831SAndroid Build Coastguard Worker     if (buf != NULL)
366*7c568831SAndroid Build Coastguard Worker 	xmlBufferFree(buf);
367*7c568831SAndroid Build Coastguard Worker }
368*7c568831SAndroid Build Coastguard Worker 
369*7c568831SAndroid Build Coastguard Worker static void
installDirs(xmlNodePtr tst,const xmlChar * base)370*7c568831SAndroid Build Coastguard Worker installDirs(xmlNodePtr tst, const xmlChar *base) {
371*7c568831SAndroid Build Coastguard Worker     xmlNodePtr test;
372*7c568831SAndroid Build Coastguard Worker     xmlChar *name, *res;
373*7c568831SAndroid Build Coastguard Worker 
374*7c568831SAndroid Build Coastguard Worker     name = getString(tst, "string(@name)");
375*7c568831SAndroid Build Coastguard Worker     if (name == NULL)
376*7c568831SAndroid Build Coastguard Worker         return;
377*7c568831SAndroid Build Coastguard Worker     res = composeDir(base, name);
378*7c568831SAndroid Build Coastguard Worker     xmlFree(name);
379*7c568831SAndroid Build Coastguard Worker     if (res == NULL) {
380*7c568831SAndroid Build Coastguard Worker 	return;
381*7c568831SAndroid Build Coastguard Worker     }
382*7c568831SAndroid Build Coastguard Worker     /* Now process resources and subdir recursively */
383*7c568831SAndroid Build Coastguard Worker     test = getNext(tst, "./resource[1]");
384*7c568831SAndroid Build Coastguard Worker     if (test != NULL) {
385*7c568831SAndroid Build Coastguard Worker         installResources(test, res);
386*7c568831SAndroid Build Coastguard Worker     }
387*7c568831SAndroid Build Coastguard Worker     test = getNext(tst, "./dir[1]");
388*7c568831SAndroid Build Coastguard Worker     while (test != NULL) {
389*7c568831SAndroid Build Coastguard Worker         installDirs(test, res);
390*7c568831SAndroid Build Coastguard Worker 	test = getNext(test, "following-sibling::dir[1]");
391*7c568831SAndroid Build Coastguard Worker     }
392*7c568831SAndroid Build Coastguard Worker     xmlFree(res);
393*7c568831SAndroid Build Coastguard Worker }
394*7c568831SAndroid Build Coastguard Worker 
395*7c568831SAndroid Build Coastguard Worker static int
xsdTestCase(xmlNodePtr tst)396*7c568831SAndroid Build Coastguard Worker xsdTestCase(xmlNodePtr tst) {
397*7c568831SAndroid Build Coastguard Worker     xmlNodePtr test, tmp, cur;
398*7c568831SAndroid Build Coastguard Worker     xmlBufferPtr buf;
399*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc = NULL;
400*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGParserCtxtPtr pctxt;
401*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGValidCtxtPtr ctxt;
402*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGPtr rng = NULL;
403*7c568831SAndroid Build Coastguard Worker     int ret = 0, mem, memt;
404*7c568831SAndroid Build Coastguard Worker     xmlChar *dtd;
405*7c568831SAndroid Build Coastguard Worker 
406*7c568831SAndroid Build Coastguard Worker     resetEntities();
407*7c568831SAndroid Build Coastguard Worker     testErrorsSize = 0; testErrors[0] = 0;
408*7c568831SAndroid Build Coastguard Worker 
409*7c568831SAndroid Build Coastguard Worker     tmp = getNext(tst, "./dir[1]");
410*7c568831SAndroid Build Coastguard Worker     if (tmp != NULL) {
411*7c568831SAndroid Build Coastguard Worker         installDirs(tmp, NULL);
412*7c568831SAndroid Build Coastguard Worker     }
413*7c568831SAndroid Build Coastguard Worker     tmp = getNext(tst, "./resource[1]");
414*7c568831SAndroid Build Coastguard Worker     if (tmp != NULL) {
415*7c568831SAndroid Build Coastguard Worker         installResources(tmp, NULL);
416*7c568831SAndroid Build Coastguard Worker     }
417*7c568831SAndroid Build Coastguard Worker 
418*7c568831SAndroid Build Coastguard Worker     cur = getNext(tst, "./correct[1]");
419*7c568831SAndroid Build Coastguard Worker     if (cur == NULL) {
420*7c568831SAndroid Build Coastguard Worker         return(xsdIncorrectTestCase(tst));
421*7c568831SAndroid Build Coastguard Worker     }
422*7c568831SAndroid Build Coastguard Worker 
423*7c568831SAndroid Build Coastguard Worker     test = getNext(cur, "./*");
424*7c568831SAndroid Build Coastguard Worker     if (test == NULL) {
425*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to find test in correct line %ld\n",
426*7c568831SAndroid Build Coastguard Worker 	        xmlGetLineNo(cur));
427*7c568831SAndroid Build Coastguard Worker         return(1);
428*7c568831SAndroid Build Coastguard Worker     }
429*7c568831SAndroid Build Coastguard Worker 
430*7c568831SAndroid Build Coastguard Worker     memt = xmlMemUsed();
431*7c568831SAndroid Build Coastguard Worker     /*
432*7c568831SAndroid Build Coastguard Worker      * dump the schemas to a buffer, then reparse it and compile the schemas
433*7c568831SAndroid Build Coastguard Worker      */
434*7c568831SAndroid Build Coastguard Worker     buf = xmlBufferCreate();
435*7c568831SAndroid Build Coastguard Worker     if (buf == NULL) {
436*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "out of memory !\n");
437*7c568831SAndroid Build Coastguard Worker 	fatalError();
438*7c568831SAndroid Build Coastguard Worker     }
439*7c568831SAndroid Build Coastguard Worker     xmlBufferSetAllocationScheme(buf, XML_BUFFER_ALLOC_DOUBLEIT);
440*7c568831SAndroid Build Coastguard Worker     xmlNodeDump(buf, test->doc, test, 0, 0);
441*7c568831SAndroid Build Coastguard Worker     pctxt = xmlRelaxNGNewMemParserCtxt(
442*7c568831SAndroid Build Coastguard Worker             (const char *) xmlBufferContent(buf), xmlBufferLength(buf));
443*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGSetParserErrors(pctxt, testErrorHandler, testErrorHandler,
444*7c568831SAndroid Build Coastguard Worker             pctxt);
445*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGSetResourceLoader(pctxt, testResourceLoader, NULL);
446*7c568831SAndroid Build Coastguard Worker     rng = xmlRelaxNGParse(pctxt);
447*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGFreeParserCtxt(pctxt);
448*7c568831SAndroid Build Coastguard Worker 
449*7c568831SAndroid Build Coastguard Worker     if (rng == NULL) {
450*7c568831SAndroid Build Coastguard Worker         test_log("Failed to parse RNGtest line %ld\n",
451*7c568831SAndroid Build Coastguard Worker 	        xmlGetLineNo(test));
452*7c568831SAndroid Build Coastguard Worker 	nb_errors++;
453*7c568831SAndroid Build Coastguard Worker         ret = 1;
454*7c568831SAndroid Build Coastguard Worker 	goto done;
455*7c568831SAndroid Build Coastguard Worker     }
456*7c568831SAndroid Build Coastguard Worker     /*
457*7c568831SAndroid Build Coastguard Worker      * now scan all the siblings of correct to process the <valid> tests
458*7c568831SAndroid Build Coastguard Worker      */
459*7c568831SAndroid Build Coastguard Worker     tmp = getNext(cur, "following-sibling::valid[1]");
460*7c568831SAndroid Build Coastguard Worker     while (tmp != NULL) {
461*7c568831SAndroid Build Coastguard Worker 	dtd = xmlGetProp(tmp, BAD_CAST "dtd");
462*7c568831SAndroid Build Coastguard Worker 	test = getNext(tmp, "./*");
463*7c568831SAndroid Build Coastguard Worker 	if (test == NULL) {
464*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Failed to find test in <valid> line %ld\n",
465*7c568831SAndroid Build Coastguard Worker 		    xmlGetLineNo(tmp));
466*7c568831SAndroid Build Coastguard Worker 
467*7c568831SAndroid Build Coastguard Worker 	} else {
468*7c568831SAndroid Build Coastguard Worker 	    xmlBufferEmpty(buf);
469*7c568831SAndroid Build Coastguard Worker 	    if (dtd != NULL)
470*7c568831SAndroid Build Coastguard Worker 		xmlBufferAdd(buf, dtd, -1);
471*7c568831SAndroid Build Coastguard Worker 	    xmlNodeDump(buf, test->doc, test, 0, 0);
472*7c568831SAndroid Build Coastguard Worker 
473*7c568831SAndroid Build Coastguard Worker 	    /*
474*7c568831SAndroid Build Coastguard Worker 	     * We are ready to run the test
475*7c568831SAndroid Build Coastguard Worker 	     */
476*7c568831SAndroid Build Coastguard Worker 	    mem = xmlMemUsed();
477*7c568831SAndroid Build Coastguard Worker             doc = xmlReadMemory((const char *) xmlBufferContent(buf),
478*7c568831SAndroid Build Coastguard Worker                                 xmlBufferLength(buf), "test", NULL, 0);
479*7c568831SAndroid Build Coastguard Worker 	    if (doc == NULL) {
480*7c568831SAndroid Build Coastguard Worker 		test_log("Failed to parse valid instance line %ld\n",
481*7c568831SAndroid Build Coastguard Worker 			xmlGetLineNo(tmp));
482*7c568831SAndroid Build Coastguard Worker 		nb_errors++;
483*7c568831SAndroid Build Coastguard Worker 	    } else {
484*7c568831SAndroid Build Coastguard Worker 		nb_tests++;
485*7c568831SAndroid Build Coastguard Worker 	        ctxt = xmlRelaxNGNewValidCtxt(rng);
486*7c568831SAndroid Build Coastguard Worker 		xmlRelaxNGSetValidErrors(ctxt,
487*7c568831SAndroid Build Coastguard Worker                         testErrorHandler, testErrorHandler, ctxt);
488*7c568831SAndroid Build Coastguard Worker 		ret = xmlRelaxNGValidateDoc(ctxt, doc);
489*7c568831SAndroid Build Coastguard Worker 		xmlRelaxNGFreeValidCtxt(ctxt);
490*7c568831SAndroid Build Coastguard Worker 		if (ret > 0) {
491*7c568831SAndroid Build Coastguard Worker 		    test_log("Failed to validate valid instance line %ld\n",
492*7c568831SAndroid Build Coastguard Worker 				xmlGetLineNo(tmp));
493*7c568831SAndroid Build Coastguard Worker 		    nb_errors++;
494*7c568831SAndroid Build Coastguard Worker 		} else if (ret < 0) {
495*7c568831SAndroid Build Coastguard Worker 		    test_log("Internal error validating instance line %ld\n",
496*7c568831SAndroid Build Coastguard Worker 			    xmlGetLineNo(tmp));
497*7c568831SAndroid Build Coastguard Worker 		    nb_errors++;
498*7c568831SAndroid Build Coastguard Worker 		}
499*7c568831SAndroid Build Coastguard Worker 		xmlFreeDoc(doc);
500*7c568831SAndroid Build Coastguard Worker 	    }
501*7c568831SAndroid Build Coastguard Worker 	    xmlResetLastError();
502*7c568831SAndroid Build Coastguard Worker 	    if (mem != xmlMemUsed()) {
503*7c568831SAndroid Build Coastguard Worker 	        test_log("Validation of instance line %ld leaked %d\n",
504*7c568831SAndroid Build Coastguard Worker 		        xmlGetLineNo(tmp), xmlMemUsed() - mem);
505*7c568831SAndroid Build Coastguard Worker 	        nb_leaks++;
506*7c568831SAndroid Build Coastguard Worker 	    }
507*7c568831SAndroid Build Coastguard Worker 	}
508*7c568831SAndroid Build Coastguard Worker 	if (dtd != NULL)
509*7c568831SAndroid Build Coastguard Worker 	    xmlFree(dtd);
510*7c568831SAndroid Build Coastguard Worker 	tmp = getNext(tmp, "following-sibling::valid[1]");
511*7c568831SAndroid Build Coastguard Worker     }
512*7c568831SAndroid Build Coastguard Worker     /*
513*7c568831SAndroid Build Coastguard Worker      * now scan all the siblings of correct to process the <invalid> tests
514*7c568831SAndroid Build Coastguard Worker      */
515*7c568831SAndroid Build Coastguard Worker     tmp = getNext(cur, "following-sibling::invalid[1]");
516*7c568831SAndroid Build Coastguard Worker     while (tmp != NULL) {
517*7c568831SAndroid Build Coastguard Worker 	test = getNext(tmp, "./*");
518*7c568831SAndroid Build Coastguard Worker 	if (test == NULL) {
519*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Failed to find test in <invalid> line %ld\n",
520*7c568831SAndroid Build Coastguard Worker 		    xmlGetLineNo(tmp));
521*7c568831SAndroid Build Coastguard Worker 
522*7c568831SAndroid Build Coastguard Worker 	} else {
523*7c568831SAndroid Build Coastguard Worker 	    xmlBufferEmpty(buf);
524*7c568831SAndroid Build Coastguard Worker 	    xmlNodeDump(buf, test->doc, test, 0, 0);
525*7c568831SAndroid Build Coastguard Worker 
526*7c568831SAndroid Build Coastguard Worker 	    /*
527*7c568831SAndroid Build Coastguard Worker 	     * We are ready to run the test
528*7c568831SAndroid Build Coastguard Worker 	     */
529*7c568831SAndroid Build Coastguard Worker 	    mem = xmlMemUsed();
530*7c568831SAndroid Build Coastguard Worker             doc = xmlReadMemory((const char *) xmlBufferContent(buf),
531*7c568831SAndroid Build Coastguard Worker                                 xmlBufferLength(buf), "test", NULL, 0);
532*7c568831SAndroid Build Coastguard Worker 	    if (doc == NULL) {
533*7c568831SAndroid Build Coastguard Worker 		test_log("Failed to parse valid instance line %ld\n",
534*7c568831SAndroid Build Coastguard Worker 			xmlGetLineNo(tmp));
535*7c568831SAndroid Build Coastguard Worker 		nb_errors++;
536*7c568831SAndroid Build Coastguard Worker 	    } else {
537*7c568831SAndroid Build Coastguard Worker 		nb_tests++;
538*7c568831SAndroid Build Coastguard Worker 	        ctxt = xmlRelaxNGNewValidCtxt(rng);
539*7c568831SAndroid Build Coastguard Worker 		xmlRelaxNGSetValidErrors(ctxt,
540*7c568831SAndroid Build Coastguard Worker                         testErrorHandler, testErrorHandler, ctxt);
541*7c568831SAndroid Build Coastguard Worker 		ret = xmlRelaxNGValidateDoc(ctxt, doc);
542*7c568831SAndroid Build Coastguard Worker 		xmlRelaxNGFreeValidCtxt(ctxt);
543*7c568831SAndroid Build Coastguard Worker 		if (ret == 0) {
544*7c568831SAndroid Build Coastguard Worker 		    test_log("Failed to detect invalid instance line %ld\n",
545*7c568831SAndroid Build Coastguard Worker 				xmlGetLineNo(tmp));
546*7c568831SAndroid Build Coastguard Worker 		    nb_errors++;
547*7c568831SAndroid Build Coastguard Worker 		} else if (ret < 0) {
548*7c568831SAndroid Build Coastguard Worker 		    test_log("Internal error validating instance line %ld\n",
549*7c568831SAndroid Build Coastguard Worker 			    xmlGetLineNo(tmp));
550*7c568831SAndroid Build Coastguard Worker 		    nb_errors++;
551*7c568831SAndroid Build Coastguard Worker 		}
552*7c568831SAndroid Build Coastguard Worker 		xmlFreeDoc(doc);
553*7c568831SAndroid Build Coastguard Worker 	    }
554*7c568831SAndroid Build Coastguard Worker 	    xmlResetLastError();
555*7c568831SAndroid Build Coastguard Worker 	    if (mem != xmlMemUsed()) {
556*7c568831SAndroid Build Coastguard Worker 	        test_log("Validation of instance line %ld leaked %d\n",
557*7c568831SAndroid Build Coastguard Worker 		        xmlGetLineNo(tmp), xmlMemUsed() - mem);
558*7c568831SAndroid Build Coastguard Worker 	        nb_leaks++;
559*7c568831SAndroid Build Coastguard Worker 	    }
560*7c568831SAndroid Build Coastguard Worker 	}
561*7c568831SAndroid Build Coastguard Worker 	tmp = getNext(tmp, "following-sibling::invalid[1]");
562*7c568831SAndroid Build Coastguard Worker     }
563*7c568831SAndroid Build Coastguard Worker 
564*7c568831SAndroid Build Coastguard Worker done:
565*7c568831SAndroid Build Coastguard Worker     if (buf != NULL)
566*7c568831SAndroid Build Coastguard Worker 	xmlBufferFree(buf);
567*7c568831SAndroid Build Coastguard Worker     if (rng != NULL)
568*7c568831SAndroid Build Coastguard Worker         xmlRelaxNGFree(rng);
569*7c568831SAndroid Build Coastguard Worker     xmlResetLastError();
570*7c568831SAndroid Build Coastguard Worker     if ((memt != xmlMemUsed()) && (memt != 0)) {
571*7c568831SAndroid Build Coastguard Worker 	test_log("Validation of tests starting line %ld leaked %d\n",
572*7c568831SAndroid Build Coastguard Worker 		xmlGetLineNo(cur), xmlMemUsed() - memt);
573*7c568831SAndroid Build Coastguard Worker 	nb_leaks++;
574*7c568831SAndroid Build Coastguard Worker     }
575*7c568831SAndroid Build Coastguard Worker     return(ret);
576*7c568831SAndroid Build Coastguard Worker }
577*7c568831SAndroid Build Coastguard Worker 
578*7c568831SAndroid Build Coastguard Worker static int
xsdTestSuite(xmlNodePtr cur)579*7c568831SAndroid Build Coastguard Worker xsdTestSuite(xmlNodePtr cur) {
580*7c568831SAndroid Build Coastguard Worker     if (verbose) {
581*7c568831SAndroid Build Coastguard Worker 	xmlChar *doc = getString(cur, "string(documentation)");
582*7c568831SAndroid Build Coastguard Worker 
583*7c568831SAndroid Build Coastguard Worker 	if (doc != NULL) {
584*7c568831SAndroid Build Coastguard Worker 	    printf("Suite %s\n", doc);
585*7c568831SAndroid Build Coastguard Worker 	    xmlFree(doc);
586*7c568831SAndroid Build Coastguard Worker 	}
587*7c568831SAndroid Build Coastguard Worker     }
588*7c568831SAndroid Build Coastguard Worker     cur = getNext(cur, "./testCase[1]");
589*7c568831SAndroid Build Coastguard Worker     while (cur != NULL) {
590*7c568831SAndroid Build Coastguard Worker         xsdTestCase(cur);
591*7c568831SAndroid Build Coastguard Worker 	cur = getNext(cur, "following-sibling::testCase[1]");
592*7c568831SAndroid Build Coastguard Worker     }
593*7c568831SAndroid Build Coastguard Worker 
594*7c568831SAndroid Build Coastguard Worker     return(0);
595*7c568831SAndroid Build Coastguard Worker }
596*7c568831SAndroid Build Coastguard Worker 
597*7c568831SAndroid Build Coastguard Worker static int
xsdTest(void)598*7c568831SAndroid Build Coastguard Worker xsdTest(void) {
599*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
600*7c568831SAndroid Build Coastguard Worker     xmlNodePtr cur;
601*7c568831SAndroid Build Coastguard Worker     const char *filename = "test/xsdtest/xsdtestsuite.xml";
602*7c568831SAndroid Build Coastguard Worker     int ret = 0;
603*7c568831SAndroid Build Coastguard Worker 
604*7c568831SAndroid Build Coastguard Worker     doc = xmlReadFile(filename, NULL, XML_PARSE_NOENT);
605*7c568831SAndroid Build Coastguard Worker     if (doc == NULL) {
606*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to parse %s\n", filename);
607*7c568831SAndroid Build Coastguard Worker 	return(-1);
608*7c568831SAndroid Build Coastguard Worker     }
609*7c568831SAndroid Build Coastguard Worker     printf("## XML Schemas datatypes test suite from James Clark\n");
610*7c568831SAndroid Build Coastguard Worker 
611*7c568831SAndroid Build Coastguard Worker     cur = xmlDocGetRootElement(doc);
612*7c568831SAndroid Build Coastguard Worker     if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
613*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Unexpected format %s\n", filename);
614*7c568831SAndroid Build Coastguard Worker 	ret = -1;
615*7c568831SAndroid Build Coastguard Worker 	goto done;
616*7c568831SAndroid Build Coastguard Worker     }
617*7c568831SAndroid Build Coastguard Worker 
618*7c568831SAndroid Build Coastguard Worker     cur = getNext(cur, "./testSuite[1]");
619*7c568831SAndroid Build Coastguard Worker     if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
620*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Unexpected format %s\n", filename);
621*7c568831SAndroid Build Coastguard Worker 	ret = -1;
622*7c568831SAndroid Build Coastguard Worker 	goto done;
623*7c568831SAndroid Build Coastguard Worker     }
624*7c568831SAndroid Build Coastguard Worker     while (cur != NULL) {
625*7c568831SAndroid Build Coastguard Worker         xsdTestSuite(cur);
626*7c568831SAndroid Build Coastguard Worker 	cur = getNext(cur, "following-sibling::testSuite[1]");
627*7c568831SAndroid Build Coastguard Worker     }
628*7c568831SAndroid Build Coastguard Worker 
629*7c568831SAndroid Build Coastguard Worker done:
630*7c568831SAndroid Build Coastguard Worker     if (doc != NULL)
631*7c568831SAndroid Build Coastguard Worker 	xmlFreeDoc(doc);
632*7c568831SAndroid Build Coastguard Worker     return(ret);
633*7c568831SAndroid Build Coastguard Worker }
634*7c568831SAndroid Build Coastguard Worker 
635*7c568831SAndroid Build Coastguard Worker static int
rngTestSuite(xmlNodePtr cur)636*7c568831SAndroid Build Coastguard Worker rngTestSuite(xmlNodePtr cur) {
637*7c568831SAndroid Build Coastguard Worker     if (verbose) {
638*7c568831SAndroid Build Coastguard Worker 	xmlChar *doc = getString(cur, "string(documentation)");
639*7c568831SAndroid Build Coastguard Worker 
640*7c568831SAndroid Build Coastguard Worker 	if (doc != NULL) {
641*7c568831SAndroid Build Coastguard Worker 	    printf("Suite %s\n", doc);
642*7c568831SAndroid Build Coastguard Worker 	    xmlFree(doc);
643*7c568831SAndroid Build Coastguard Worker 	} else {
644*7c568831SAndroid Build Coastguard Worker 	    doc = getString(cur, "string(section)");
645*7c568831SAndroid Build Coastguard Worker 	    if (doc != NULL) {
646*7c568831SAndroid Build Coastguard Worker 		printf("Section %s\n", doc);
647*7c568831SAndroid Build Coastguard Worker 		xmlFree(doc);
648*7c568831SAndroid Build Coastguard Worker 	    }
649*7c568831SAndroid Build Coastguard Worker 	}
650*7c568831SAndroid Build Coastguard Worker     }
651*7c568831SAndroid Build Coastguard Worker     cur = getNext(cur, "./testSuite[1]");
652*7c568831SAndroid Build Coastguard Worker     while (cur != NULL) {
653*7c568831SAndroid Build Coastguard Worker         xsdTestSuite(cur);
654*7c568831SAndroid Build Coastguard Worker 	cur = getNext(cur, "following-sibling::testSuite[1]");
655*7c568831SAndroid Build Coastguard Worker     }
656*7c568831SAndroid Build Coastguard Worker 
657*7c568831SAndroid Build Coastguard Worker     return(0);
658*7c568831SAndroid Build Coastguard Worker }
659*7c568831SAndroid Build Coastguard Worker 
660*7c568831SAndroid Build Coastguard Worker static int
rngTest1(void)661*7c568831SAndroid Build Coastguard Worker rngTest1(void) {
662*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
663*7c568831SAndroid Build Coastguard Worker     xmlNodePtr cur;
664*7c568831SAndroid Build Coastguard Worker     const char *filename = "test/relaxng/OASIS/spectest.xml";
665*7c568831SAndroid Build Coastguard Worker     int ret = 0;
666*7c568831SAndroid Build Coastguard Worker 
667*7c568831SAndroid Build Coastguard Worker     doc = xmlReadFile(filename, NULL, XML_PARSE_NOENT);
668*7c568831SAndroid Build Coastguard Worker     if (doc == NULL) {
669*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to parse %s\n", filename);
670*7c568831SAndroid Build Coastguard Worker 	return(-1);
671*7c568831SAndroid Build Coastguard Worker     }
672*7c568831SAndroid Build Coastguard Worker     printf("## Relax NG test suite from James Clark\n");
673*7c568831SAndroid Build Coastguard Worker 
674*7c568831SAndroid Build Coastguard Worker     cur = xmlDocGetRootElement(doc);
675*7c568831SAndroid Build Coastguard Worker     if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
676*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Unexpected format %s\n", filename);
677*7c568831SAndroid Build Coastguard Worker 	ret = -1;
678*7c568831SAndroid Build Coastguard Worker 	goto done;
679*7c568831SAndroid Build Coastguard Worker     }
680*7c568831SAndroid Build Coastguard Worker 
681*7c568831SAndroid Build Coastguard Worker     cur = getNext(cur, "./testSuite[1]");
682*7c568831SAndroid Build Coastguard Worker     if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
683*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Unexpected format %s\n", filename);
684*7c568831SAndroid Build Coastguard Worker 	ret = -1;
685*7c568831SAndroid Build Coastguard Worker 	goto done;
686*7c568831SAndroid Build Coastguard Worker     }
687*7c568831SAndroid Build Coastguard Worker     while (cur != NULL) {
688*7c568831SAndroid Build Coastguard Worker         rngTestSuite(cur);
689*7c568831SAndroid Build Coastguard Worker 	cur = getNext(cur, "following-sibling::testSuite[1]");
690*7c568831SAndroid Build Coastguard Worker     }
691*7c568831SAndroid Build Coastguard Worker 
692*7c568831SAndroid Build Coastguard Worker done:
693*7c568831SAndroid Build Coastguard Worker     if (doc != NULL)
694*7c568831SAndroid Build Coastguard Worker 	xmlFreeDoc(doc);
695*7c568831SAndroid Build Coastguard Worker     return(ret);
696*7c568831SAndroid Build Coastguard Worker }
697*7c568831SAndroid Build Coastguard Worker 
698*7c568831SAndroid Build Coastguard Worker static int
rngTest2(void)699*7c568831SAndroid Build Coastguard Worker rngTest2(void) {
700*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
701*7c568831SAndroid Build Coastguard Worker     xmlNodePtr cur;
702*7c568831SAndroid Build Coastguard Worker     const char *filename = "test/relaxng/testsuite.xml";
703*7c568831SAndroid Build Coastguard Worker     int ret = 0;
704*7c568831SAndroid Build Coastguard Worker 
705*7c568831SAndroid Build Coastguard Worker     doc = xmlReadFile(filename, NULL, XML_PARSE_NOENT);
706*7c568831SAndroid Build Coastguard Worker     if (doc == NULL) {
707*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to parse %s\n", filename);
708*7c568831SAndroid Build Coastguard Worker 	return(-1);
709*7c568831SAndroid Build Coastguard Worker     }
710*7c568831SAndroid Build Coastguard Worker     printf("## Relax NG test suite for libxml2\n");
711*7c568831SAndroid Build Coastguard Worker 
712*7c568831SAndroid Build Coastguard Worker     cur = xmlDocGetRootElement(doc);
713*7c568831SAndroid Build Coastguard Worker     if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
714*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Unexpected format %s\n", filename);
715*7c568831SAndroid Build Coastguard Worker 	ret = -1;
716*7c568831SAndroid Build Coastguard Worker 	goto done;
717*7c568831SAndroid Build Coastguard Worker     }
718*7c568831SAndroid Build Coastguard Worker 
719*7c568831SAndroid Build Coastguard Worker     cur = getNext(cur, "./testSuite[1]");
720*7c568831SAndroid Build Coastguard Worker     if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
721*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Unexpected format %s\n", filename);
722*7c568831SAndroid Build Coastguard Worker 	ret = -1;
723*7c568831SAndroid Build Coastguard Worker 	goto done;
724*7c568831SAndroid Build Coastguard Worker     }
725*7c568831SAndroid Build Coastguard Worker     while (cur != NULL) {
726*7c568831SAndroid Build Coastguard Worker         xsdTestSuite(cur);
727*7c568831SAndroid Build Coastguard Worker 	cur = getNext(cur, "following-sibling::testSuite[1]");
728*7c568831SAndroid Build Coastguard Worker     }
729*7c568831SAndroid Build Coastguard Worker 
730*7c568831SAndroid Build Coastguard Worker done:
731*7c568831SAndroid Build Coastguard Worker     if (doc != NULL)
732*7c568831SAndroid Build Coastguard Worker 	xmlFreeDoc(doc);
733*7c568831SAndroid Build Coastguard Worker     return(ret);
734*7c568831SAndroid Build Coastguard Worker }
735*7c568831SAndroid Build Coastguard Worker 
736*7c568831SAndroid Build Coastguard Worker /************************************************************************
737*7c568831SAndroid Build Coastguard Worker  *									*
738*7c568831SAndroid Build Coastguard Worker  *		Schemas test suites from W3C/NIST/MS/Sun		*
739*7c568831SAndroid Build Coastguard Worker  *									*
740*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
741*7c568831SAndroid Build Coastguard Worker 
742*7c568831SAndroid Build Coastguard Worker static int
xstcTestInstance(xmlNodePtr cur,xmlSchemaPtr schemas,const xmlChar * spath,const char * base)743*7c568831SAndroid Build Coastguard Worker xstcTestInstance(xmlNodePtr cur, xmlSchemaPtr schemas,
744*7c568831SAndroid Build Coastguard Worker                  const xmlChar *spath, const char *base) {
745*7c568831SAndroid Build Coastguard Worker     xmlChar *href = NULL;
746*7c568831SAndroid Build Coastguard Worker     xmlChar *path = NULL;
747*7c568831SAndroid Build Coastguard Worker     xmlChar *validity = NULL;
748*7c568831SAndroid Build Coastguard Worker     xmlSchemaValidCtxtPtr ctxt = NULL;
749*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc = NULL;
750*7c568831SAndroid Build Coastguard Worker     int ret = 0, mem;
751*7c568831SAndroid Build Coastguard Worker 
752*7c568831SAndroid Build Coastguard Worker     xmlResetLastError();
753*7c568831SAndroid Build Coastguard Worker     testErrorsSize = 0; testErrors[0] = 0;
754*7c568831SAndroid Build Coastguard Worker     mem = xmlMemUsed();
755*7c568831SAndroid Build Coastguard Worker     href = getString(cur,
756*7c568831SAndroid Build Coastguard Worker                      "string(ts:instanceDocument/@xlink:href)");
757*7c568831SAndroid Build Coastguard Worker     if ((href == NULL) || (href[0] == 0)) {
758*7c568831SAndroid Build Coastguard Worker 	test_log("testGroup line %ld misses href for schemaDocument\n",
759*7c568831SAndroid Build Coastguard Worker 		    xmlGetLineNo(cur));
760*7c568831SAndroid Build Coastguard Worker 	ret = -1;
761*7c568831SAndroid Build Coastguard Worker 	goto done;
762*7c568831SAndroid Build Coastguard Worker     }
763*7c568831SAndroid Build Coastguard Worker     path = xmlBuildURI(href, BAD_CAST base);
764*7c568831SAndroid Build Coastguard Worker     if (path == NULL) {
765*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr,
766*7c568831SAndroid Build Coastguard Worker 	        "Failed to build path to schemas testGroup line %ld : %s\n",
767*7c568831SAndroid Build Coastguard Worker 		xmlGetLineNo(cur), href);
768*7c568831SAndroid Build Coastguard Worker 	ret = -1;
769*7c568831SAndroid Build Coastguard Worker 	goto done;
770*7c568831SAndroid Build Coastguard Worker     }
771*7c568831SAndroid Build Coastguard Worker     if (checkTestFile((const char *) path) <= 0) {
772*7c568831SAndroid Build Coastguard Worker 	test_log("schemas for testGroup line %ld is missing: %s\n",
773*7c568831SAndroid Build Coastguard Worker 		xmlGetLineNo(cur), path);
774*7c568831SAndroid Build Coastguard Worker 	ret = -1;
775*7c568831SAndroid Build Coastguard Worker 	goto done;
776*7c568831SAndroid Build Coastguard Worker     }
777*7c568831SAndroid Build Coastguard Worker     validity = getString(cur,
778*7c568831SAndroid Build Coastguard Worker                          "string(ts:expected/@validity)");
779*7c568831SAndroid Build Coastguard Worker     if (validity == NULL) {
780*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "instanceDocument line %ld misses expected validity\n",
781*7c568831SAndroid Build Coastguard Worker 	        xmlGetLineNo(cur));
782*7c568831SAndroid Build Coastguard Worker 	ret = -1;
783*7c568831SAndroid Build Coastguard Worker 	goto done;
784*7c568831SAndroid Build Coastguard Worker     }
785*7c568831SAndroid Build Coastguard Worker     nb_tests++;
786*7c568831SAndroid Build Coastguard Worker     doc = xmlReadFile((const char *) path, NULL, XML_PARSE_NOENT);
787*7c568831SAndroid Build Coastguard Worker     if (doc == NULL) {
788*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "instance %s fails to parse\n", path);
789*7c568831SAndroid Build Coastguard Worker 	ret = -1;
790*7c568831SAndroid Build Coastguard Worker 	nb_errors++;
791*7c568831SAndroid Build Coastguard Worker 	goto done;
792*7c568831SAndroid Build Coastguard Worker     }
793*7c568831SAndroid Build Coastguard Worker 
794*7c568831SAndroid Build Coastguard Worker     ctxt = xmlSchemaNewValidCtxt(schemas);
795*7c568831SAndroid Build Coastguard Worker     xmlSchemaSetValidErrors(ctxt, testErrorHandler, testErrorHandler, ctxt);
796*7c568831SAndroid Build Coastguard Worker     ret = xmlSchemaValidateDoc(ctxt, doc);
797*7c568831SAndroid Build Coastguard Worker 
798*7c568831SAndroid Build Coastguard Worker     if (xmlStrEqual(validity, BAD_CAST "valid")) {
799*7c568831SAndroid Build Coastguard Worker 	if (ret > 0) {
800*7c568831SAndroid Build Coastguard Worker 	    test_log("valid instance %s failed to validate against %s\n",
801*7c568831SAndroid Build Coastguard Worker 			path, spath);
802*7c568831SAndroid Build Coastguard Worker 	    nb_errors++;
803*7c568831SAndroid Build Coastguard Worker 	} else if (ret < 0) {
804*7c568831SAndroid Build Coastguard Worker 	    test_log("valid instance %s got internal error validating %s\n",
805*7c568831SAndroid Build Coastguard Worker 			path, spath);
806*7c568831SAndroid Build Coastguard Worker 	    nb_internals++;
807*7c568831SAndroid Build Coastguard Worker 	    nb_errors++;
808*7c568831SAndroid Build Coastguard Worker 	}
809*7c568831SAndroid Build Coastguard Worker     } else if (xmlStrEqual(validity, BAD_CAST "invalid")) {
810*7c568831SAndroid Build Coastguard Worker 	if (ret == 0) {
811*7c568831SAndroid Build Coastguard Worker 	    test_log("Failed to detect invalid instance %s against %s\n",
812*7c568831SAndroid Build Coastguard Worker 			path, spath);
813*7c568831SAndroid Build Coastguard Worker 	    nb_errors++;
814*7c568831SAndroid Build Coastguard Worker 	}
815*7c568831SAndroid Build Coastguard Worker     } else {
816*7c568831SAndroid Build Coastguard Worker         test_log("instanceDocument line %ld has unexpected validity value%s\n",
817*7c568831SAndroid Build Coastguard Worker 	        xmlGetLineNo(cur), validity);
818*7c568831SAndroid Build Coastguard Worker 	ret = -1;
819*7c568831SAndroid Build Coastguard Worker 	goto done;
820*7c568831SAndroid Build Coastguard Worker     }
821*7c568831SAndroid Build Coastguard Worker 
822*7c568831SAndroid Build Coastguard Worker done:
823*7c568831SAndroid Build Coastguard Worker     if (href != NULL) xmlFree(href);
824*7c568831SAndroid Build Coastguard Worker     if (path != NULL) xmlFree(path);
825*7c568831SAndroid Build Coastguard Worker     if (validity != NULL) xmlFree(validity);
826*7c568831SAndroid Build Coastguard Worker     if (ctxt != NULL) xmlSchemaFreeValidCtxt(ctxt);
827*7c568831SAndroid Build Coastguard Worker     if (doc != NULL) xmlFreeDoc(doc);
828*7c568831SAndroid Build Coastguard Worker     xmlResetLastError();
829*7c568831SAndroid Build Coastguard Worker     if (mem != xmlMemUsed()) {
830*7c568831SAndroid Build Coastguard Worker 	test_log("Validation of tests starting line %ld leaked %d\n",
831*7c568831SAndroid Build Coastguard Worker 		xmlGetLineNo(cur), xmlMemUsed() - mem);
832*7c568831SAndroid Build Coastguard Worker 	nb_leaks++;
833*7c568831SAndroid Build Coastguard Worker     }
834*7c568831SAndroid Build Coastguard Worker     return(ret);
835*7c568831SAndroid Build Coastguard Worker }
836*7c568831SAndroid Build Coastguard Worker 
837*7c568831SAndroid Build Coastguard Worker static int
xstcTestGroup(xmlNodePtr cur,const char * base)838*7c568831SAndroid Build Coastguard Worker xstcTestGroup(xmlNodePtr cur, const char *base) {
839*7c568831SAndroid Build Coastguard Worker     xmlChar *href = NULL;
840*7c568831SAndroid Build Coastguard Worker     xmlChar *path = NULL;
841*7c568831SAndroid Build Coastguard Worker     xmlChar *validity = NULL;
842*7c568831SAndroid Build Coastguard Worker     xmlSchemaPtr schemas = NULL;
843*7c568831SAndroid Build Coastguard Worker     xmlSchemaParserCtxtPtr ctxt;
844*7c568831SAndroid Build Coastguard Worker     xmlNodePtr instance;
845*7c568831SAndroid Build Coastguard Worker     int ret = 0, mem;
846*7c568831SAndroid Build Coastguard Worker 
847*7c568831SAndroid Build Coastguard Worker     xmlResetLastError();
848*7c568831SAndroid Build Coastguard Worker     testErrorsSize = 0; testErrors[0] = 0;
849*7c568831SAndroid Build Coastguard Worker     mem = xmlMemUsed();
850*7c568831SAndroid Build Coastguard Worker     href = getString(cur,
851*7c568831SAndroid Build Coastguard Worker                      "string(ts:schemaTest/ts:schemaDocument/@xlink:href)");
852*7c568831SAndroid Build Coastguard Worker     if ((href == NULL) || (href[0] == 0)) {
853*7c568831SAndroid Build Coastguard Worker         test_log("testGroup line %ld misses href for schemaDocument\n",
854*7c568831SAndroid Build Coastguard Worker 		    xmlGetLineNo(cur));
855*7c568831SAndroid Build Coastguard Worker 	ret = -1;
856*7c568831SAndroid Build Coastguard Worker 	goto done;
857*7c568831SAndroid Build Coastguard Worker     }
858*7c568831SAndroid Build Coastguard Worker     path = xmlBuildURI(href, BAD_CAST base);
859*7c568831SAndroid Build Coastguard Worker     if (path == NULL) {
860*7c568831SAndroid Build Coastguard Worker 	test_log("Failed to build path to schemas testGroup line %ld : %s\n",
861*7c568831SAndroid Build Coastguard Worker 		xmlGetLineNo(cur), href);
862*7c568831SAndroid Build Coastguard Worker 	ret = -1;
863*7c568831SAndroid Build Coastguard Worker 	goto done;
864*7c568831SAndroid Build Coastguard Worker     }
865*7c568831SAndroid Build Coastguard Worker     if (checkTestFile((const char *) path) <= 0) {
866*7c568831SAndroid Build Coastguard Worker 	test_log("schemas for testGroup line %ld is missing: %s\n",
867*7c568831SAndroid Build Coastguard Worker 		xmlGetLineNo(cur), path);
868*7c568831SAndroid Build Coastguard Worker 	ret = -1;
869*7c568831SAndroid Build Coastguard Worker 	goto done;
870*7c568831SAndroid Build Coastguard Worker     }
871*7c568831SAndroid Build Coastguard Worker     validity = getString(cur,
872*7c568831SAndroid Build Coastguard Worker                          "string(ts:schemaTest/ts:expected/@validity)");
873*7c568831SAndroid Build Coastguard Worker     if (validity == NULL) {
874*7c568831SAndroid Build Coastguard Worker         test_log("testGroup line %ld misses expected validity\n",
875*7c568831SAndroid Build Coastguard Worker 	        xmlGetLineNo(cur));
876*7c568831SAndroid Build Coastguard Worker 	ret = -1;
877*7c568831SAndroid Build Coastguard Worker 	goto done;
878*7c568831SAndroid Build Coastguard Worker     }
879*7c568831SAndroid Build Coastguard Worker     nb_tests++;
880*7c568831SAndroid Build Coastguard Worker     if (xmlStrEqual(validity, BAD_CAST "valid")) {
881*7c568831SAndroid Build Coastguard Worker         nb_schematas++;
882*7c568831SAndroid Build Coastguard Worker 	ctxt = xmlSchemaNewParserCtxt((const char *) path);
883*7c568831SAndroid Build Coastguard Worker 	xmlSchemaSetParserErrors(ctxt, testErrorHandler, testErrorHandler,
884*7c568831SAndroid Build Coastguard Worker                 ctxt);
885*7c568831SAndroid Build Coastguard Worker 	schemas = xmlSchemaParse(ctxt);
886*7c568831SAndroid Build Coastguard Worker 	xmlSchemaFreeParserCtxt(ctxt);
887*7c568831SAndroid Build Coastguard Worker 	if (schemas == NULL) {
888*7c568831SAndroid Build Coastguard Worker 	    test_log("valid schemas %s failed to parse\n",
889*7c568831SAndroid Build Coastguard Worker 			path);
890*7c568831SAndroid Build Coastguard Worker 	    ret = 1;
891*7c568831SAndroid Build Coastguard Worker 	    nb_errors++;
892*7c568831SAndroid Build Coastguard Worker 	}
893*7c568831SAndroid Build Coastguard Worker 	if ((ret == 0) && (strstr(testErrors, "nimplemented") != NULL)) {
894*7c568831SAndroid Build Coastguard Worker 	    test_log("valid schemas %s hit an unimplemented block\n",
895*7c568831SAndroid Build Coastguard Worker 			path);
896*7c568831SAndroid Build Coastguard Worker 	    ret = 1;
897*7c568831SAndroid Build Coastguard Worker 	    nb_unimplemented++;
898*7c568831SAndroid Build Coastguard Worker 	    nb_errors++;
899*7c568831SAndroid Build Coastguard Worker 	}
900*7c568831SAndroid Build Coastguard Worker 	instance = getNext(cur, "./ts:instanceTest[1]");
901*7c568831SAndroid Build Coastguard Worker 	while (instance != NULL) {
902*7c568831SAndroid Build Coastguard Worker 	    if (schemas != NULL) {
903*7c568831SAndroid Build Coastguard Worker 		xstcTestInstance(instance, schemas, path, base);
904*7c568831SAndroid Build Coastguard Worker 	    } else {
905*7c568831SAndroid Build Coastguard Worker 		/*
906*7c568831SAndroid Build Coastguard Worker 		* We'll automatically mark the instances as failed
907*7c568831SAndroid Build Coastguard Worker 		* if the schema was broken.
908*7c568831SAndroid Build Coastguard Worker 		*/
909*7c568831SAndroid Build Coastguard Worker 		nb_errors++;
910*7c568831SAndroid Build Coastguard Worker 	    }
911*7c568831SAndroid Build Coastguard Worker 	    instance = getNext(instance,
912*7c568831SAndroid Build Coastguard Worker 		"following-sibling::ts:instanceTest[1]");
913*7c568831SAndroid Build Coastguard Worker 	}
914*7c568831SAndroid Build Coastguard Worker     } else if (xmlStrEqual(validity, BAD_CAST "invalid")) {
915*7c568831SAndroid Build Coastguard Worker         nb_schematas++;
916*7c568831SAndroid Build Coastguard Worker 	ctxt = xmlSchemaNewParserCtxt((const char *) path);
917*7c568831SAndroid Build Coastguard Worker 	xmlSchemaSetParserErrors(ctxt, testErrorHandler, testErrorHandler,
918*7c568831SAndroid Build Coastguard Worker                 ctxt);
919*7c568831SAndroid Build Coastguard Worker 	schemas = xmlSchemaParse(ctxt);
920*7c568831SAndroid Build Coastguard Worker 	xmlSchemaFreeParserCtxt(ctxt);
921*7c568831SAndroid Build Coastguard Worker 	if (schemas != NULL) {
922*7c568831SAndroid Build Coastguard Worker 	    test_log("Failed to detect error in schemas %s\n",
923*7c568831SAndroid Build Coastguard Worker 			path);
924*7c568831SAndroid Build Coastguard Worker 	    nb_errors++;
925*7c568831SAndroid Build Coastguard Worker 	    ret = 1;
926*7c568831SAndroid Build Coastguard Worker 	}
927*7c568831SAndroid Build Coastguard Worker 	if ((ret == 0) && (strstr(testErrors, "nimplemented") != NULL)) {
928*7c568831SAndroid Build Coastguard Worker 	    nb_unimplemented++;
929*7c568831SAndroid Build Coastguard Worker 	    test_log("invalid schemas %s hit an unimplemented block\n",
930*7c568831SAndroid Build Coastguard Worker 			path);
931*7c568831SAndroid Build Coastguard Worker 	    ret = 1;
932*7c568831SAndroid Build Coastguard Worker 	    nb_errors++;
933*7c568831SAndroid Build Coastguard Worker 	}
934*7c568831SAndroid Build Coastguard Worker     } else {
935*7c568831SAndroid Build Coastguard Worker         test_log("testGroup line %ld misses unexpected validity value%s\n",
936*7c568831SAndroid Build Coastguard Worker 	        xmlGetLineNo(cur), validity);
937*7c568831SAndroid Build Coastguard Worker 	ret = -1;
938*7c568831SAndroid Build Coastguard Worker 	goto done;
939*7c568831SAndroid Build Coastguard Worker     }
940*7c568831SAndroid Build Coastguard Worker 
941*7c568831SAndroid Build Coastguard Worker done:
942*7c568831SAndroid Build Coastguard Worker     if (href != NULL) xmlFree(href);
943*7c568831SAndroid Build Coastguard Worker     if (path != NULL) xmlFree(path);
944*7c568831SAndroid Build Coastguard Worker     if (validity != NULL) xmlFree(validity);
945*7c568831SAndroid Build Coastguard Worker     if (schemas != NULL) xmlSchemaFree(schemas);
946*7c568831SAndroid Build Coastguard Worker     xmlResetLastError();
947*7c568831SAndroid Build Coastguard Worker     if (mem != xmlMemUsed()) {
948*7c568831SAndroid Build Coastguard Worker 	test_log("Processing test line %ld %s leaked %d\n",
949*7c568831SAndroid Build Coastguard Worker 		xmlGetLineNo(cur), path, xmlMemUsed() - mem);
950*7c568831SAndroid Build Coastguard Worker 	nb_leaks++;
951*7c568831SAndroid Build Coastguard Worker     }
952*7c568831SAndroid Build Coastguard Worker     return(ret);
953*7c568831SAndroid Build Coastguard Worker }
954*7c568831SAndroid Build Coastguard Worker 
955*7c568831SAndroid Build Coastguard Worker static int
xstcMetadata(const char * metadata,const char * base)956*7c568831SAndroid Build Coastguard Worker xstcMetadata(const char *metadata, const char *base) {
957*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
958*7c568831SAndroid Build Coastguard Worker     xmlNodePtr cur;
959*7c568831SAndroid Build Coastguard Worker     xmlChar *contributor;
960*7c568831SAndroid Build Coastguard Worker     xmlChar *name;
961*7c568831SAndroid Build Coastguard Worker     int ret = 0;
962*7c568831SAndroid Build Coastguard Worker 
963*7c568831SAndroid Build Coastguard Worker     doc = xmlReadFile(metadata, NULL, XML_PARSE_NOENT);
964*7c568831SAndroid Build Coastguard Worker     if (doc == NULL) {
965*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to parse %s\n", metadata);
966*7c568831SAndroid Build Coastguard Worker 	return(-1);
967*7c568831SAndroid Build Coastguard Worker     }
968*7c568831SAndroid Build Coastguard Worker 
969*7c568831SAndroid Build Coastguard Worker     cur = xmlDocGetRootElement(doc);
970*7c568831SAndroid Build Coastguard Worker     if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSet"))) {
971*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Unexpected format %s\n", metadata);
972*7c568831SAndroid Build Coastguard Worker 	return(-1);
973*7c568831SAndroid Build Coastguard Worker     }
974*7c568831SAndroid Build Coastguard Worker     contributor = xmlGetProp(cur, BAD_CAST "contributor");
975*7c568831SAndroid Build Coastguard Worker     if (contributor == NULL) {
976*7c568831SAndroid Build Coastguard Worker         contributor = xmlStrdup(BAD_CAST "Unknown");
977*7c568831SAndroid Build Coastguard Worker     }
978*7c568831SAndroid Build Coastguard Worker     name = xmlGetProp(cur, BAD_CAST "name");
979*7c568831SAndroid Build Coastguard Worker     if (name == NULL) {
980*7c568831SAndroid Build Coastguard Worker         name = xmlStrdup(BAD_CAST "Unknown");
981*7c568831SAndroid Build Coastguard Worker     }
982*7c568831SAndroid Build Coastguard Worker     printf("## %s test suite for Schemas version %s\n", contributor, name);
983*7c568831SAndroid Build Coastguard Worker     xmlFree(contributor);
984*7c568831SAndroid Build Coastguard Worker     xmlFree(name);
985*7c568831SAndroid Build Coastguard Worker 
986*7c568831SAndroid Build Coastguard Worker     cur = getNext(cur, "./ts:testGroup[1]");
987*7c568831SAndroid Build Coastguard Worker     if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testGroup"))) {
988*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Unexpected format %s\n", metadata);
989*7c568831SAndroid Build Coastguard Worker 	ret = -1;
990*7c568831SAndroid Build Coastguard Worker 	goto done;
991*7c568831SAndroid Build Coastguard Worker     }
992*7c568831SAndroid Build Coastguard Worker     while (cur != NULL) {
993*7c568831SAndroid Build Coastguard Worker         xstcTestGroup(cur, base);
994*7c568831SAndroid Build Coastguard Worker 	cur = getNext(cur, "following-sibling::ts:testGroup[1]");
995*7c568831SAndroid Build Coastguard Worker     }
996*7c568831SAndroid Build Coastguard Worker 
997*7c568831SAndroid Build Coastguard Worker done:
998*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(doc);
999*7c568831SAndroid Build Coastguard Worker     return(ret);
1000*7c568831SAndroid Build Coastguard Worker }
1001*7c568831SAndroid Build Coastguard Worker 
1002*7c568831SAndroid Build Coastguard Worker /************************************************************************
1003*7c568831SAndroid Build Coastguard Worker  *									*
1004*7c568831SAndroid Build Coastguard Worker  *		The driver for the tests				*
1005*7c568831SAndroid Build Coastguard Worker  *									*
1006*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
1007*7c568831SAndroid Build Coastguard Worker 
1008*7c568831SAndroid Build Coastguard Worker int
main(int argc ATTRIBUTE_UNUSED,char ** argv ATTRIBUTE_UNUSED)1009*7c568831SAndroid Build Coastguard Worker main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
1010*7c568831SAndroid Build Coastguard Worker     int ret = 0;
1011*7c568831SAndroid Build Coastguard Worker     int old_errors, old_tests, old_leaks, expected_errors;
1012*7c568831SAndroid Build Coastguard Worker 
1013*7c568831SAndroid Build Coastguard Worker     logfile = fopen(LOGFILE, "wb");
1014*7c568831SAndroid Build Coastguard Worker     if (logfile == NULL) {
1015*7c568831SAndroid Build Coastguard Worker         fprintf(stderr,
1016*7c568831SAndroid Build Coastguard Worker 	        "Could not open the log file, running in verbose mode\n");
1017*7c568831SAndroid Build Coastguard Worker 	verbose = 1;
1018*7c568831SAndroid Build Coastguard Worker     }
1019*7c568831SAndroid Build Coastguard Worker     initializeLibxml2();
1020*7c568831SAndroid Build Coastguard Worker 
1021*7c568831SAndroid Build Coastguard Worker     if ((argc >= 2) && (!strcmp(argv[1], "-v")))
1022*7c568831SAndroid Build Coastguard Worker         verbose = 1;
1023*7c568831SAndroid Build Coastguard Worker 
1024*7c568831SAndroid Build Coastguard Worker 
1025*7c568831SAndroid Build Coastguard Worker     old_errors = nb_errors;
1026*7c568831SAndroid Build Coastguard Worker     old_tests = nb_tests;
1027*7c568831SAndroid Build Coastguard Worker     old_leaks = nb_leaks;
1028*7c568831SAndroid Build Coastguard Worker     xsdTest();
1029*7c568831SAndroid Build Coastguard Worker     expected_errors = 3;
1030*7c568831SAndroid Build Coastguard Worker     printf("Ran %d tests, %d errors, %d leaks\n",
1031*7c568831SAndroid Build Coastguard Worker            nb_tests - old_tests,
1032*7c568831SAndroid Build Coastguard Worker            nb_errors - old_errors,
1033*7c568831SAndroid Build Coastguard Worker            nb_leaks - old_leaks);
1034*7c568831SAndroid Build Coastguard Worker     if (nb_errors - old_errors == expected_errors) {
1035*7c568831SAndroid Build Coastguard Worker         printf("%d errors were expected\n", expected_errors);
1036*7c568831SAndroid Build Coastguard Worker         nb_errors = old_errors;
1037*7c568831SAndroid Build Coastguard Worker     } else {
1038*7c568831SAndroid Build Coastguard Worker         printf("%d errors were expected, got %d errors\n",
1039*7c568831SAndroid Build Coastguard Worker                expected_errors, nb_errors - old_errors);
1040*7c568831SAndroid Build Coastguard Worker         nb_errors = old_errors + 1;
1041*7c568831SAndroid Build Coastguard Worker     }
1042*7c568831SAndroid Build Coastguard Worker 
1043*7c568831SAndroid Build Coastguard Worker     old_errors = nb_errors;
1044*7c568831SAndroid Build Coastguard Worker     old_tests = nb_tests;
1045*7c568831SAndroid Build Coastguard Worker     old_leaks = nb_leaks;
1046*7c568831SAndroid Build Coastguard Worker     rngTest1();
1047*7c568831SAndroid Build Coastguard Worker     if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
1048*7c568831SAndroid Build Coastguard Worker 	printf("Ran %d tests, no errors\n", nb_tests - old_tests);
1049*7c568831SAndroid Build Coastguard Worker     else
1050*7c568831SAndroid Build Coastguard Worker 	printf("Ran %d tests, %d errors, %d leaks\n",
1051*7c568831SAndroid Build Coastguard Worker 	       nb_tests - old_tests,
1052*7c568831SAndroid Build Coastguard Worker 	       nb_errors - old_errors,
1053*7c568831SAndroid Build Coastguard Worker 	       nb_leaks - old_leaks);
1054*7c568831SAndroid Build Coastguard Worker 
1055*7c568831SAndroid Build Coastguard Worker     old_errors = nb_errors;
1056*7c568831SAndroid Build Coastguard Worker     old_tests = nb_tests;
1057*7c568831SAndroid Build Coastguard Worker     old_leaks = nb_leaks;
1058*7c568831SAndroid Build Coastguard Worker     rngTest2();
1059*7c568831SAndroid Build Coastguard Worker     if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
1060*7c568831SAndroid Build Coastguard Worker 	printf("Ran %d tests, no errors\n", nb_tests - old_tests);
1061*7c568831SAndroid Build Coastguard Worker     else
1062*7c568831SAndroid Build Coastguard Worker 	printf("Ran %d tests, %d errors, %d leaks\n",
1063*7c568831SAndroid Build Coastguard Worker 	       nb_tests - old_tests,
1064*7c568831SAndroid Build Coastguard Worker 	       nb_errors - old_errors,
1065*7c568831SAndroid Build Coastguard Worker 	       nb_leaks - old_leaks);
1066*7c568831SAndroid Build Coastguard Worker 
1067*7c568831SAndroid Build Coastguard Worker     old_errors = nb_errors;
1068*7c568831SAndroid Build Coastguard Worker     old_tests = nb_tests;
1069*7c568831SAndroid Build Coastguard Worker     old_leaks = nb_leaks;
1070*7c568831SAndroid Build Coastguard Worker     nb_internals = 0;
1071*7c568831SAndroid Build Coastguard Worker     nb_schematas = 0;
1072*7c568831SAndroid Build Coastguard Worker     xstcMetadata("xstc/Tests/Metadata/NISTXMLSchemaDatatypes.testSet",
1073*7c568831SAndroid Build Coastguard Worker 		 "xstc/Tests/Metadata/");
1074*7c568831SAndroid Build Coastguard Worker     if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
1075*7c568831SAndroid Build Coastguard Worker 	printf("Ran %d tests (%d schemata), no errors\n",
1076*7c568831SAndroid Build Coastguard Worker 	       nb_tests - old_tests, nb_schematas);
1077*7c568831SAndroid Build Coastguard Worker     else
1078*7c568831SAndroid Build Coastguard Worker 	printf("Ran %d tests (%d schemata), %d errors (%d internals), %d leaks\n",
1079*7c568831SAndroid Build Coastguard Worker 	       nb_tests - old_tests,
1080*7c568831SAndroid Build Coastguard Worker 	       nb_schematas,
1081*7c568831SAndroid Build Coastguard Worker 	       nb_errors - old_errors,
1082*7c568831SAndroid Build Coastguard Worker 	       nb_internals,
1083*7c568831SAndroid Build Coastguard Worker 	       nb_leaks - old_leaks);
1084*7c568831SAndroid Build Coastguard Worker 
1085*7c568831SAndroid Build Coastguard Worker     old_errors = nb_errors;
1086*7c568831SAndroid Build Coastguard Worker     old_tests = nb_tests;
1087*7c568831SAndroid Build Coastguard Worker     old_leaks = nb_leaks;
1088*7c568831SAndroid Build Coastguard Worker     nb_internals = 0;
1089*7c568831SAndroid Build Coastguard Worker     nb_schematas = 0;
1090*7c568831SAndroid Build Coastguard Worker     xstcMetadata("xstc/Tests/Metadata/SunXMLSchema1-0-20020116.testSet",
1091*7c568831SAndroid Build Coastguard Worker 		 "xstc/Tests/");
1092*7c568831SAndroid Build Coastguard Worker     if ((nb_errors == old_errors) && (nb_leaks == old_leaks)) {
1093*7c568831SAndroid Build Coastguard Worker 	printf("Ran %d tests (%d schemata), no errors\n",
1094*7c568831SAndroid Build Coastguard Worker 	       nb_tests - old_tests, nb_schematas);
1095*7c568831SAndroid Build Coastguard Worker     } else {
1096*7c568831SAndroid Build Coastguard Worker 	printf("Ran %d tests (%d schemata), %d errors (%d internals), %d leaks\n",
1097*7c568831SAndroid Build Coastguard Worker 	       nb_tests - old_tests,
1098*7c568831SAndroid Build Coastguard Worker 	       nb_schematas,
1099*7c568831SAndroid Build Coastguard Worker 	       nb_errors - old_errors,
1100*7c568831SAndroid Build Coastguard Worker 	       nb_internals,
1101*7c568831SAndroid Build Coastguard Worker 	       nb_leaks - old_leaks);
1102*7c568831SAndroid Build Coastguard Worker         printf("Some errors were expected.\n");
1103*7c568831SAndroid Build Coastguard Worker         nb_errors = old_errors;
1104*7c568831SAndroid Build Coastguard Worker     }
1105*7c568831SAndroid Build Coastguard Worker 
1106*7c568831SAndroid Build Coastguard Worker     old_errors = nb_errors;
1107*7c568831SAndroid Build Coastguard Worker     old_tests = nb_tests;
1108*7c568831SAndroid Build Coastguard Worker     old_leaks = nb_leaks;
1109*7c568831SAndroid Build Coastguard Worker     nb_internals = 0;
1110*7c568831SAndroid Build Coastguard Worker     nb_schematas = 0;
1111*7c568831SAndroid Build Coastguard Worker     xstcMetadata("xstc/Tests/Metadata/MSXMLSchema1-0-20020116.testSet",
1112*7c568831SAndroid Build Coastguard Worker 		 "xstc/Tests/");
1113*7c568831SAndroid Build Coastguard Worker     if ((nb_errors == old_errors) && (nb_leaks == old_leaks)) {
1114*7c568831SAndroid Build Coastguard Worker 	printf("Ran %d tests (%d schemata), no errors\n",
1115*7c568831SAndroid Build Coastguard Worker 	       nb_tests - old_tests, nb_schematas);
1116*7c568831SAndroid Build Coastguard Worker     } else {
1117*7c568831SAndroid Build Coastguard Worker 	printf("Ran %d tests (%d schemata), %d errors (%d internals), %d leaks\n",
1118*7c568831SAndroid Build Coastguard Worker 	       nb_tests - old_tests,
1119*7c568831SAndroid Build Coastguard Worker 	       nb_schematas,
1120*7c568831SAndroid Build Coastguard Worker 	       nb_errors - old_errors,
1121*7c568831SAndroid Build Coastguard Worker 	       nb_internals,
1122*7c568831SAndroid Build Coastguard Worker 	       nb_leaks - old_leaks);
1123*7c568831SAndroid Build Coastguard Worker         printf("Some errors were expected.\n");
1124*7c568831SAndroid Build Coastguard Worker         nb_errors = old_errors;
1125*7c568831SAndroid Build Coastguard Worker     }
1126*7c568831SAndroid Build Coastguard Worker 
1127*7c568831SAndroid Build Coastguard Worker     if ((nb_errors == 0) && (nb_leaks == 0)) {
1128*7c568831SAndroid Build Coastguard Worker         ret = 0;
1129*7c568831SAndroid Build Coastguard Worker 	printf("Total %d tests, no errors\n",
1130*7c568831SAndroid Build Coastguard Worker 	       nb_tests);
1131*7c568831SAndroid Build Coastguard Worker     } else {
1132*7c568831SAndroid Build Coastguard Worker         ret = 1;
1133*7c568831SAndroid Build Coastguard Worker 	printf("Total %d tests, %d errors, %d leaks\n",
1134*7c568831SAndroid Build Coastguard Worker 	       nb_tests, nb_errors, nb_leaks);
1135*7c568831SAndroid Build Coastguard Worker     }
1136*7c568831SAndroid Build Coastguard Worker     xmlXPathFreeContext(ctxtXPath);
1137*7c568831SAndroid Build Coastguard Worker     xmlCleanupParser();
1138*7c568831SAndroid Build Coastguard Worker 
1139*7c568831SAndroid Build Coastguard Worker     if (logfile != NULL)
1140*7c568831SAndroid Build Coastguard Worker         fclose(logfile);
1141*7c568831SAndroid Build Coastguard Worker     return(ret);
1142*7c568831SAndroid Build Coastguard Worker }
1143*7c568831SAndroid Build Coastguard Worker #else /* !SCHEMAS */
1144*7c568831SAndroid Build Coastguard Worker int
main(int argc ATTRIBUTE_UNUSED,char ** argv ATTRIBUTE_UNUSED)1145*7c568831SAndroid Build Coastguard Worker main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
1146*7c568831SAndroid Build Coastguard Worker     fprintf(stderr, "runsuite requires support for schemas and xpath in libxml2\n");
1147*7c568831SAndroid Build Coastguard Worker }
1148*7c568831SAndroid Build Coastguard Worker #endif
1149