pocxxeci 0.30.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of pocxxeci might be problematic. Click here for more details.

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