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