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