15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * runsuite.c: C program to run libxml2 againts published testsuites
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * daniel@veillard.com
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_CONFIG_H
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(_WIN32) || defined(__CYGWIN__)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h>
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/stat.h>
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <fcntl.h>
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parser.h>
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parserInternals.h>
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/tree.h>
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/uri.h>
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_XPATH_ENABLED)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlreader.h>
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xpath.h>
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xpathInternals.h>
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/relaxng.h>
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlschemas.h>
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlschemastypes.h>
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOGFILE "runsuite.log"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static FILE *logfile = NULL;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int verbose = 0;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32) && !defined(__CYGWIN__)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define vsnprintf _vsnprintf
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define snprintf _snprintf
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		File name and path utilities				*
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int checkTestFile(const char *filename) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct stat buf;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (stat(filename, &buf) == -1)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(0);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32) && !defined(__CYGWIN__)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!(buf.st_mode & _S_IFREG))
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(0);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!S_ISREG(buf.st_mode))
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(0);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(1);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar *composeDir(const xmlChar *dir, const xmlChar *path) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char buf[500];
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dir == NULL) return(xmlStrdup(path));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (path == NULL) return(NULL);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    snprintf(buf, 500, "%s/%s", (const char *) dir, (const char *) path);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlStrdup((const xmlChar *) buf));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Libxml2 specific routines				*
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int nb_tests = 0;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int nb_errors = 0;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int nb_internals = 0;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int nb_schematas = 0;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int nb_unimplemented = 0;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int nb_leaks = 0;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int extraMemoryFromResolver = 0;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fatalError(void) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stderr, "Exitting tests on fatal error\n");
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exit(1);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * that's needed to implement <resource>
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_ENTITIES 20
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *testEntitiesName[MAX_ENTITIES];
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *testEntitiesValue[MAX_ENTITIES];
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int nb_entities = 0;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void resetEntities(void) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0;i < nb_entities;i++) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (testEntitiesName[i] != NULL)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(testEntitiesName[i]);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (testEntitiesValue[i] != NULL)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(testEntitiesValue[i]);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nb_entities = 0;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int addEntity(char *name, char *content) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nb_entities >= MAX_ENTITIES) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stderr, "Too many entities defined\n");
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testEntitiesName[nb_entities] = name;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testEntitiesValue[nb_entities] = content;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nb_entities++;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We need to trap calls to the resolver to not account memory for the catalog
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * which is shared to the current running test. We also don't want to have
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * network downloads modifying tests.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlParserInputPtr
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)testExternalEntityLoader(const char *URL, const char *ID,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlParserCtxtPtr ctxt) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr ret;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0;i < nb_entities;i++) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!strcmp(testEntitiesName[i], URL)) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlNewStringInputStream(ctxt,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                (const xmlChar *) testEntitiesValue[i]);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != NULL) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        ret->filename = (const char *)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                xmlStrdup((xmlChar *)testEntitiesName[i]);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(ret);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (checkTestFile(URL)) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int memused = xmlMemUsed();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	extraMemoryFromResolver += xmlMemUsed() - memused;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "Failed to find resource %s\n", URL);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Trapping the error messages at the generic level to grab the equivalent of
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * stderr messages on CLI tools.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char testErrors[32769];
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int testErrorsSize = 0;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void test_log(const char *msg, ...) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_list args;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (logfile != NULL) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(logfile, "\n------------\n");
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	va_start(args, msg);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vfprintf(logfile, msg, args);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	va_end(args);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(logfile, "%s", testErrors);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	testErrorsSize = 0; testErrors[0] = 0;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (verbose) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	va_start(args, msg);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vfprintf(stderr, msg, args);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	va_end(args);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)testErrorHandler(void *ctx  ATTRIBUTE_UNUSED, const char *msg, ...) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_list args;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (testErrorsSize >= 32768)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_start(args, msg);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = vsnprintf(&testErrors[testErrorsSize],
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    32768 - testErrorsSize,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    msg, args);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_end(args);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (testErrorsSize + res >= 32768) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* buffer is full */
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	testErrorsSize = 32768;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	testErrors[testErrorsSize] = 0;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        testErrorsSize += res;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testErrors[testErrorsSize] = 0;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlXPathContextPtr ctxtXPath;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)initializeLibxml2(void) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGetWarningsDefaultValue = 0;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlPedanticParserDefault(0);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlMemSetup(xmlMemFree, xmlMemMalloc, xmlMemRealloc, xmlMemoryStrdup);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInitParser();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSetExternalEntityLoader(testExternalEntityLoader);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxtXPath = xmlXPathNewContext(NULL);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Deactivate the cache if created; otherwise we have to create/free it
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * for every test, since it will confuse the memory leak detection.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Note that normally this need not be done, since the cache is not
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * created until set explicitely with xmlXPathContextSetCache();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * but for test purposes it is sometimes usefull to activate the
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * cache by default for the whole library.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxtXPath->cache != NULL)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathContextSetCache(ctxtXPath, 0, -1, 0);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* used as default nanemspace in xstc tests */
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathRegisterNs(ctxtXPath, BAD_CAST "ts", BAD_CAST "TestSuite");
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathRegisterNs(ctxtXPath, BAD_CAST "xlink",
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       BAD_CAST "http://www.w3.org/1999/xlink");
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSetGenericErrorFunc(NULL, testErrorHandler);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaInitTypes();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGInitTypes();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)getNext(xmlNodePtr cur, const char *xpath) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr ret = NULL;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathObjectPtr res;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathCompExprPtr comp;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur == NULL)  || (cur->doc == NULL) || (xpath == NULL))
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxtXPath->doc = cur->doc;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxtXPath->node = cur;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    comp = xmlXPathCompile(BAD_CAST xpath);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (comp == NULL) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "Failed to compile %s\n", xpath);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlXPathCompiledEval(comp, ctxtXPath);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathFreeCompExpr(comp);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (res == NULL)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((res->type == XPATH_NODESET) &&
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (res->nodesetval != NULL) &&
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(res->nodesetval->nodeNr > 0) &&
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(res->nodesetval->nodeTab != NULL))
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = res->nodesetval->nodeTab[0];
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathFreeObject(res);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar *
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)getString(xmlNodePtr cur, const char *xpath) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret = NULL;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathObjectPtr res;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathCompExprPtr comp;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur == NULL)  || (cur->doc == NULL) || (xpath == NULL))
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxtXPath->doc = cur->doc;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxtXPath->node = cur;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    comp = xmlXPathCompile(BAD_CAST xpath);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (comp == NULL) {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "Failed to compile %s\n", xpath);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlXPathCompiledEval(comp, ctxtXPath);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathFreeCompExpr(comp);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (res == NULL)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (res->type == XPATH_STRING) {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = res->stringval;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res->stringval = NULL;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathFreeObject(res);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Test test/xsdtest/xsdtestsuite.xml			*
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsdIncorectTestCase(xmlNodePtr cur) {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr test;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlBufferPtr buf;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGParserCtxtPtr pctxt;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGPtr rng = NULL;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0, memt;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = getNext(cur, "./incorrect[1]");
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(0);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test = getNext(cur, "./*");
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (test == NULL) {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_log("Failed to find test in correct line %ld\n",
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        xmlGetLineNo(cur));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(1);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memt = xmlMemUsed();
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extraMemoryFromResolver = 0;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * dump the schemas to a buffer, then reparse it and compile the schemas
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf = xmlBufferCreate();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL) {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "out of memory !\n");
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fatalError();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodeDump(buf, test->doc, test, 0, 0);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt = xmlRelaxNGNewMemParserCtxt((const char *)buf->content, buf->use);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGSetParserErrors(pctxt,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (xmlRelaxNGValidityErrorFunc) testErrorHandler,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (xmlRelaxNGValidityWarningFunc) testErrorHandler,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 pctxt);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rng = xmlRelaxNGParse(pctxt);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGFreeParserCtxt(pctxt);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rng != NULL) {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	test_log("Failed to detect incorect RNG line %ld\n",
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlGetLineNo(test));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = 1;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done:
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf != NULL)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlBufferFree(buf);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rng != NULL)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlRelaxNGFree(rng);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlResetLastError();
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((memt < xmlMemUsed()) && (extraMemoryFromResolver == 0)) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	test_log("Validation of tests starting line %ld leaked %d\n",
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGetLineNo(cur), xmlMemUsed() - memt);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nb_leaks++;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)installResources(xmlNodePtr tst, const xmlChar *base) {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr test;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlBufferPtr buf;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *name, *content, *res;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf = xmlBufferCreate();
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL) {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "out of memory !\n");
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fatalError();
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodeDump(buf, tst->doc, tst, 0, 0);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (tst != NULL) {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	test = getNext(tst, "./*");
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (test != NULL) {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlBufferEmpty(buf);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodeDump(buf, test->doc, test, 0, 0);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    name = getString(tst, "string(@name)");
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    content = xmlStrdup(buf->content);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((name != NULL) && (content != NULL)) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        res = composeDir(base, name);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(name);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        addEntity((char *) res, (char *) content);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (name != NULL) xmlFree(name);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (content != NULL) xmlFree(content);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tst = getNext(tst, "following-sibling::resource[1]");
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf != NULL)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlBufferFree(buf);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)installDirs(xmlNodePtr tst, const xmlChar *base) {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr test;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *name, *res;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name = getString(tst, "string(@name)");
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = composeDir(base, name);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(name);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (res == NULL) {
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Now process resources and subdir recursively */
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test = getNext(tst, "./resource[1]");
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (test != NULL) {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        installResources(test, res);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test = getNext(tst, "./dir[1]");
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (test != NULL) {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        installDirs(test, res);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	test = getNext(test, "following-sibling::dir[1]");
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(res);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsdTestCase(xmlNodePtr tst) {
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr test, tmp, cur;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlBufferPtr buf;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc = NULL;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGParserCtxtPtr pctxt;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGValidCtxtPtr ctxt;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGPtr rng = NULL;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0, mem, memt;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *dtd;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resetEntities();
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testErrorsSize = 0; testErrors[0] = 0;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tmp = getNext(tst, "./dir[1]");
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (tmp != NULL) {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        installDirs(tmp, NULL);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tmp = getNext(tst, "./resource[1]");
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (tmp != NULL) {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        installResources(tmp, NULL);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = getNext(tst, "./correct[1]");
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(xsdIncorectTestCase(tst));
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test = getNext(cur, "./*");
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (test == NULL) {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "Failed to find test in correct line %ld\n",
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        xmlGetLineNo(cur));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(1);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memt = xmlMemUsed();
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extraMemoryFromResolver = 0;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * dump the schemas to a buffer, then reparse it and compile the schemas
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf = xmlBufferCreate();
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL) {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "out of memory !\n");
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fatalError();
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodeDump(buf, test->doc, test, 0, 0);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt = xmlRelaxNGNewMemParserCtxt((const char *)buf->content, buf->use);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGSetParserErrors(pctxt,
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (xmlRelaxNGValidityErrorFunc) testErrorHandler,
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (xmlRelaxNGValidityWarningFunc) testErrorHandler,
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 pctxt);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rng = xmlRelaxNGParse(pctxt);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGFreeParserCtxt(pctxt);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extraMemoryFromResolver)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        memt = 0;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rng == NULL) {
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_log("Failed to parse RNGtest line %ld\n",
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        xmlGetLineNo(test));
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nb_errors++;
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = 1;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * now scan all the siblings of correct to process the <valid> tests
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tmp = getNext(cur, "following-sibling::valid[1]");
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (tmp != NULL) {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dtd = xmlGetProp(tmp, BAD_CAST "dtd");
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	test = getNext(tmp, "./*");
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (test == NULL) {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "Failed to find test in <valid> line %ld\n",
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlGetLineNo(tmp));
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlBufferEmpty(buf);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (dtd != NULL)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlBufferAdd(buf, dtd, -1);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodeDump(buf, test->doc, test, 0, 0);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * We are ready to run the test
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    mem = xmlMemUsed();
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    extraMemoryFromResolver = 0;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            doc = xmlReadMemory((const char *)buf->content, buf->use,
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                        "test", NULL, 0);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (doc == NULL) {
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		test_log("Failed to parse valid instance line %ld\n",
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlGetLineNo(tmp));
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nb_errors++;
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nb_tests++;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        ctxt = xmlRelaxNGNewValidCtxt(rng);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlRelaxNGSetValidErrors(ctxt,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     (xmlRelaxNGValidityErrorFunc) testErrorHandler,
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     (xmlRelaxNGValidityWarningFunc) testErrorHandler,
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     ctxt);
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlRelaxNGValidateDoc(ctxt, doc);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlRelaxNGFreeValidCtxt(ctxt);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret > 0) {
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    test_log("Failed to validate valid instance line %ld\n",
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlGetLineNo(tmp));
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    nb_errors++;
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (ret < 0) {
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    test_log("Internal error validating instance line %ld\n",
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlGetLineNo(tmp));
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    nb_errors++;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFreeDoc(doc);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlResetLastError();
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((mem != xmlMemUsed()) && (extraMemoryFromResolver == 0)) {
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        test_log("Validation of instance line %ld leaked %d\n",
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        xmlGetLineNo(tmp), xmlMemUsed() - mem);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlMemoryDump();
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        nb_leaks++;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (dtd != NULL)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(dtd);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tmp = getNext(tmp, "following-sibling::valid[1]");
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * now scan all the siblings of correct to process the <invalid> tests
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tmp = getNext(cur, "following-sibling::invalid[1]");
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (tmp != NULL) {
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	test = getNext(tmp, "./*");
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (test == NULL) {
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "Failed to find test in <invalid> line %ld\n",
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlGetLineNo(tmp));
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlBufferEmpty(buf);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodeDump(buf, test->doc, test, 0, 0);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * We are ready to run the test
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    mem = xmlMemUsed();
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    extraMemoryFromResolver = 0;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            doc = xmlReadMemory((const char *)buf->content, buf->use,
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                        "test", NULL, 0);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (doc == NULL) {
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		test_log("Failed to parse valid instance line %ld\n",
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlGetLineNo(tmp));
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nb_errors++;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nb_tests++;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        ctxt = xmlRelaxNGNewValidCtxt(rng);
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlRelaxNGSetValidErrors(ctxt,
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     (xmlRelaxNGValidityErrorFunc) testErrorHandler,
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     (xmlRelaxNGValidityWarningFunc) testErrorHandler,
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     ctxt);
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlRelaxNGValidateDoc(ctxt, doc);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlRelaxNGFreeValidCtxt(ctxt);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret == 0) {
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    test_log("Failed to detect invalid instance line %ld\n",
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlGetLineNo(tmp));
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    nb_errors++;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (ret < 0) {
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    test_log("Internal error validating instance line %ld\n",
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlGetLineNo(tmp));
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    nb_errors++;
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFreeDoc(doc);
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlResetLastError();
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((mem != xmlMemUsed()) && (extraMemoryFromResolver == 0)) {
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        test_log("Validation of instance line %ld leaked %d\n",
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        xmlGetLineNo(tmp), xmlMemUsed() - mem);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlMemoryDump();
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        nb_leaks++;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tmp = getNext(tmp, "following-sibling::invalid[1]");
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done:
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf != NULL)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlBufferFree(buf);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rng != NULL)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlRelaxNGFree(rng);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlResetLastError();
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((memt != xmlMemUsed()) && (memt != 0)) {
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	test_log("Validation of tests starting line %ld leaked %d\n",
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGetLineNo(cur), xmlMemUsed() - memt);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nb_leaks++;
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsdTestSuite(xmlNodePtr cur) {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (verbose) {
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *doc = getString(cur, "string(documentation)");
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (doc != NULL) {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf("Suite %s\n", doc);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(doc);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = getNext(cur, "./testCase[1]");
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xsdTestCase(cur);
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = getNext(cur, "following-sibling::testCase[1]");
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsdTest(void) {
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *filename = "test/xsdtest/xsdtestsuite.xml";
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    doc = xmlReadFile(filename, NULL, XML_PARSE_NOENT);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) {
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "Failed to parse %s\n", filename);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("## XML Schemas datatypes test suite from James Clark\n");
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = xmlDocGetRootElement(doc);
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "Unexpected format %s\n", filename);
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = getNext(cur, "./testSuite[1]");
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "Unexpected format %s\n", filename);
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xsdTestSuite(cur);
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = getNext(cur, "following-sibling::testSuite[1]");
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done:
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc != NULL)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeDoc(doc);
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rngTestSuite(xmlNodePtr cur) {
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (verbose) {
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *doc = getString(cur, "string(documentation)");
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (doc != NULL) {
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf("Suite %s\n", doc);
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(doc);
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    doc = getString(cur, "string(section)");
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (doc != NULL) {
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf("Section %s\n", doc);
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(doc);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = getNext(cur, "./testSuite[1]");
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xsdTestSuite(cur);
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = getNext(cur, "following-sibling::testSuite[1]");
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rngTest1(void) {
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc;
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *filename = "test/relaxng/OASIS/spectest.xml";
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    doc = xmlReadFile(filename, NULL, XML_PARSE_NOENT);
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) {
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "Failed to parse %s\n", filename);
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("## Relax NG test suite from James Clark\n");
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = xmlDocGetRootElement(doc);
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "Unexpected format %s\n", filename);
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = getNext(cur, "./testSuite[1]");
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "Unexpected format %s\n", filename);
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rngTestSuite(cur);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = getNext(cur, "following-sibling::testSuite[1]");
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done:
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc != NULL)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeDoc(doc);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rngTest2(void) {
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc;
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *filename = "test/relaxng/testsuite.xml";
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    doc = xmlReadFile(filename, NULL, XML_PARSE_NOENT);
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) {
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "Failed to parse %s\n", filename);
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("## Relax NG test suite for libxml2\n");
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = xmlDocGetRootElement(doc);
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "Unexpected format %s\n", filename);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = getNext(cur, "./testSuite[1]");
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "Unexpected format %s\n", filename);
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xsdTestSuite(cur);
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = getNext(cur, "following-sibling::testSuite[1]");
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done:
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc != NULL)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeDoc(doc);
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Schemas test suites from W3C/NIST/MS/Sun		*
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xstcTestInstance(xmlNodePtr cur, xmlSchemaPtr schemas,
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const xmlChar *spath, const char *base) {
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *href = NULL;
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *path = NULL;
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *validity = NULL;
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValidCtxtPtr ctxt = NULL;
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc = NULL;
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0, mem;
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlResetLastError();
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testErrorsSize = 0; testErrors[0] = 0;
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mem = xmlMemUsed();
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    href = getString(cur,
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "string(ts:instanceDocument/@xlink:href)");
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((href == NULL) || (href[0] == 0)) {
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	test_log("testGroup line %ld misses href for schemaDocument\n",
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlGetLineNo(cur));
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = xmlBuildURI(href, BAD_CAST base);
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (path == NULL) {
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stderr,
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        "Failed to build path to schemas testGroup line %ld : %s\n",
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGetLineNo(cur), href);
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (checkTestFile((const char *) path) <= 0) {
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	test_log("schemas for testGroup line %ld is missing: %s\n",
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGetLineNo(cur), path);
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    validity = getString(cur,
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         "string(ts:expected/@validity)");
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (validity == NULL) {
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "instanceDocument line %ld misses expected validity\n",
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        xmlGetLineNo(cur));
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nb_tests++;
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    doc = xmlReadFile((const char *) path, NULL, XML_PARSE_NOENT);
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) {
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "instance %s fails to parse\n", path);
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nb_errors++;
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt = xmlSchemaNewValidCtxt(schemas);
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSetValidErrors(ctxt,
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (xmlSchemaValidityErrorFunc) testErrorHandler,
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (xmlSchemaValidityWarningFunc) testErrorHandler,
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 ctxt);
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaValidateDoc(ctxt, doc);
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(validity, BAD_CAST "valid")) {
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret > 0) {
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    test_log("valid instance %s failed to validate against %s\n",
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			path, spath);
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nb_errors++;
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (ret < 0) {
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    test_log("valid instance %s got internal error validating %s\n",
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			path, spath);
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nb_internals++;
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nb_errors++;
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlStrEqual(validity, BAD_CAST "invalid")) {
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == 0) {
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    test_log("Failed to detect invalid instance %s against %s\n",
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			path, spath);
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nb_errors++;
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_log("instanceDocument line %ld has unexpected validity value%s\n",
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        xmlGetLineNo(cur), validity);
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done:
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (href != NULL) xmlFree(href);
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (path != NULL) xmlFree(path);
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (validity != NULL) xmlFree(validity);
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt != NULL) xmlSchemaFreeValidCtxt(ctxt);
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc != NULL) xmlFreeDoc(doc);
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlResetLastError();
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mem != xmlMemUsed()) {
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	test_log("Validation of tests starting line %ld leaked %d\n",
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGetLineNo(cur), xmlMemUsed() - mem);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nb_leaks++;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xstcTestGroup(xmlNodePtr cur, const char *base) {
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *href = NULL;
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *path = NULL;
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *validity = NULL;
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPtr schemas = NULL;
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParserCtxtPtr ctxt;
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr instance;
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0, mem;
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlResetLastError();
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testErrorsSize = 0; testErrors[0] = 0;
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mem = xmlMemUsed();
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    href = getString(cur,
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "string(ts:schemaTest/ts:schemaDocument/@xlink:href)");
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((href == NULL) || (href[0] == 0)) {
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_log("testGroup line %ld misses href for schemaDocument\n",
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlGetLineNo(cur));
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = xmlBuildURI(href, BAD_CAST base);
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (path == NULL) {
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	test_log("Failed to build path to schemas testGroup line %ld : %s\n",
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGetLineNo(cur), href);
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (checkTestFile((const char *) path) <= 0) {
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	test_log("schemas for testGroup line %ld is missing: %s\n",
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGetLineNo(cur), path);
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    validity = getString(cur,
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         "string(ts:schemaTest/ts:expected/@validity)");
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (validity == NULL) {
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_log("testGroup line %ld misses expected validity\n",
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        xmlGetLineNo(cur));
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nb_tests++;
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(validity, BAD_CAST "valid")) {
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nb_schematas++;
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt = xmlSchemaNewParserCtxt((const char *) path);
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSetParserErrors(ctxt,
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     (xmlSchemaValidityErrorFunc) testErrorHandler,
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     (xmlSchemaValidityWarningFunc) testErrorHandler,
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     ctxt);
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	schemas = xmlSchemaParse(ctxt);
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeParserCtxt(ctxt);
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (schemas == NULL) {
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    test_log("valid schemas %s failed to parse\n",
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			path);
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = 1;
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nb_errors++;
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((ret == 0) && (strstr(testErrors, "nimplemented") != NULL)) {
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    test_log("valid schemas %s hit an unimplemented block\n",
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			path);
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = 1;
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nb_unimplemented++;
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nb_errors++;
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	instance = getNext(cur, "./ts:instanceTest[1]");
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (instance != NULL) {
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (schemas != NULL) {
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xstcTestInstance(instance, schemas, path, base);
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* We'll automatically mark the instances as failed
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* if the schema was broken.
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nb_errors++;
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    instance = getNext(instance,
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"following-sibling::ts:instanceTest[1]");
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlStrEqual(validity, BAD_CAST "invalid")) {
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nb_schematas++;
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt = xmlSchemaNewParserCtxt((const char *) path);
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSetParserErrors(ctxt,
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     (xmlSchemaValidityErrorFunc) testErrorHandler,
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     (xmlSchemaValidityWarningFunc) testErrorHandler,
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     ctxt);
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	schemas = xmlSchemaParse(ctxt);
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeParserCtxt(ctxt);
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (schemas != NULL) {
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    test_log("Failed to detect error in schemas %s\n",
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			path);
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nb_errors++;
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = 1;
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((ret == 0) && (strstr(testErrors, "nimplemented") != NULL)) {
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nb_unimplemented++;
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    test_log("invalid schemas %s hit an unimplemented block\n",
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			path);
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = 1;
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nb_errors++;
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_log("testGroup line %ld misses unexpected validity value%s\n",
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        xmlGetLineNo(cur), validity);
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done:
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (href != NULL) xmlFree(href);
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (path != NULL) xmlFree(path);
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (validity != NULL) xmlFree(validity);
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schemas != NULL) xmlSchemaFree(schemas);
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlResetLastError();
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((mem != xmlMemUsed()) && (extraMemoryFromResolver == 0)) {
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	test_log("Processing test line %ld %s leaked %d\n",
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGetLineNo(cur), path, xmlMemUsed() - mem);
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nb_leaks++;
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xstcMetadata(const char *metadata, const char *base) {
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc;
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *contributor;
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *name;
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    doc = xmlReadFile(metadata, NULL, XML_PARSE_NOENT);
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) {
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "Failed to parse %s\n", metadata);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = xmlDocGetRootElement(doc);
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSet"))) {
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "Unexpected format %s\n", metadata);
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    contributor = xmlGetProp(cur, BAD_CAST "contributor");
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (contributor == NULL) {
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        contributor = xmlStrdup(BAD_CAST "Unknown");
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name = xmlGetProp(cur, BAD_CAST "name");
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL) {
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name = xmlStrdup(BAD_CAST "Unknown");
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("## %s test suite for Schemas version %s\n", contributor, name);
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(contributor);
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(name);
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = getNext(cur, "./ts:testGroup[1]");
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testGroup"))) {
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "Unexpected format %s\n", metadata);
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xstcTestGroup(cur, base);
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = getNext(cur, "following-sibling::ts:testGroup[1]");
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done:
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFreeDoc(doc);
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		The driver for the tests				*
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int old_errors, old_tests, old_leaks;
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    logfile = fopen(LOGFILE, "w");
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (logfile == NULL) {
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr,
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        "Could not open the log file, running in verbose mode\n");
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	verbose = 1;
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    initializeLibxml2();
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((argc >= 2) && (!strcmp(argv[1], "-v")))
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        verbose = 1;
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_errors = nb_errors;
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_tests = nb_tests;
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_leaks = nb_leaks;
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xsdTest();
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf("Ran %d tests, no errors\n", nb_tests - old_tests);
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf("Ran %d tests, %d errors, %d leaks\n",
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_tests - old_tests,
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_errors - old_errors,
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_leaks - old_leaks);
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_errors = nb_errors;
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_tests = nb_tests;
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_leaks = nb_leaks;
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rngTest1();
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf("Ran %d tests, no errors\n", nb_tests - old_tests);
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf("Ran %d tests, %d errors, %d leaks\n",
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_tests - old_tests,
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_errors - old_errors,
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_leaks - old_leaks);
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_errors = nb_errors;
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_tests = nb_tests;
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_leaks = nb_leaks;
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rngTest2();
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf("Ran %d tests, no errors\n", nb_tests - old_tests);
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf("Ran %d tests, %d errors, %d leaks\n",
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_tests - old_tests,
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_errors - old_errors,
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_leaks - old_leaks);
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_errors = nb_errors;
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_tests = nb_tests;
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_leaks = nb_leaks;
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nb_internals = 0;
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nb_schematas = 0;
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xstcMetadata("xstc/Tests/Metadata/NISTXMLSchemaDatatypes.testSet",
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 "xstc/Tests/Metadata/");
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf("Ran %d tests (%d schemata), no errors\n",
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_tests - old_tests, nb_schematas);
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf("Ran %d tests (%d schemata), %d errors (%d internals), %d leaks\n",
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_tests - old_tests,
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_schematas,
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_errors - old_errors,
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_internals,
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_leaks - old_leaks);
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_errors = nb_errors;
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_tests = nb_tests;
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_leaks = nb_leaks;
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nb_internals = 0;
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nb_schematas = 0;
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xstcMetadata("xstc/Tests/Metadata/SunXMLSchema1-0-20020116.testSet",
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 "xstc/Tests/");
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf("Ran %d tests (%d schemata), no errors\n",
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_tests - old_tests, nb_schematas);
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf("Ran %d tests (%d schemata), %d errors (%d internals), %d leaks\n",
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_tests - old_tests,
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_schematas,
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_errors - old_errors,
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_internals,
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_leaks - old_leaks);
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_errors = nb_errors;
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_tests = nb_tests;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_leaks = nb_leaks;
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nb_internals = 0;
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nb_schematas = 0;
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xstcMetadata("xstc/Tests/Metadata/MSXMLSchema1-0-20020116.testSet",
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 "xstc/Tests/");
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf("Ran %d tests (%d schemata), no errors\n",
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_tests - old_tests, nb_schematas);
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf("Ran %d tests (%d schemata), %d errors (%d internals), %d leaks\n",
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_tests - old_tests,
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_schematas,
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_errors - old_errors,
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_internals,
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_leaks - old_leaks);
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((nb_errors == 0) && (nb_leaks == 0)) {
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = 0;
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf("Total %d tests, no errors\n",
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_tests);
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = 1;
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf("Total %d tests, %d errors, %d leaks\n",
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       nb_tests, nb_errors, nb_leaks);
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathFreeContext(ctxtXPath);
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCleanupParser();
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlMemoryDump();
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (logfile != NULL)
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fclose(logfile);
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else /* !SCHEMAS */
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stderr, "runsuite requires support for schemas and xpath in libxml2\n");
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1185