| /* | 
 |  * testOOM.c: Test out-of-memory handling | 
 |  * | 
 |  * See Copyright for the status of this software. | 
 |  * | 
 |  * hp@redhat.com | 
 |  */ | 
 |  | 
 | /* FIXME this test would be much better if instead of just checking | 
 |  * for debug spew or crashes on OOM, it also validated the expected | 
 |  * results of parsing a particular file vs. the actual results | 
 |  */ | 
 |  | 
 | #include "libxml.h" | 
 |  | 
 | #include <string.h> | 
 | #include <stdarg.h> | 
 |  | 
 | #ifdef HAVE_SYS_TYPES_H | 
 | #include <sys/types.h> | 
 | #endif | 
 | #ifdef HAVE_UNISTD_H | 
 | #include <unistd.h> | 
 | #endif | 
 | #ifdef HAVE_STDLIB_H | 
 | #include <stdlib.h> | 
 | #endif | 
 | #ifdef HAVE_STRING_H | 
 | #include <string.h> | 
 | #endif | 
 |  | 
 | #include <libxml/xmlreader.h> | 
 |  | 
 | #include "testOOMlib.h" | 
 |  | 
 | #ifndef TRUE | 
 | #define TRUE (1) | 
 | #endif | 
 | #ifndef FALSE | 
 | #define FALSE (0) | 
 | #endif | 
 |  | 
 |  | 
 | int debug = 0; | 
 | int dump = 0; | 
 | int noent = 0; | 
 | int count = 0; | 
 | int valid = 0; | 
 |  | 
 | static void usage(const char *progname) { | 
 |     printf("Usage : %s [options] XMLfiles ...\n", progname); | 
 |     printf("\tParse the XML files using the xmlTextReader API\n"); | 
 |     printf("\t --count: count the number of attribute and elements\n"); | 
 |     printf("\t --valid: validate the document\n"); | 
 |     exit(1); | 
 | } | 
 | static int elem, attrs; | 
 |  | 
 | static int processNode(xmlTextReaderPtr reader) { | 
 |     int type; | 
 |  | 
 |     type = xmlTextReaderNodeType(reader); | 
 |     if (count) { | 
 | 	if (type == 1) { | 
 | 	    elem++; | 
 | 	    attrs += xmlTextReaderAttributeCount(reader); | 
 | 	} | 
 |     } | 
 |  | 
 |     return TRUE; | 
 | } | 
 |  | 
 | /* This always returns TRUE since we don't validate the results of | 
 |  * parsing a particular document vs. the expected results of parsing | 
 |  * that document. The idea is that such a failure would return FALSE. | 
 |  */ | 
 | static int | 
 | check_load_file_memory_func (void *data) | 
 | { | 
 |      const char *filename = data; | 
 |      xmlTextReaderPtr reader; | 
 |      int ret; | 
 |  | 
 |      if (count) { | 
 |           elem = 0; | 
 |           attrs = 0; | 
 |      } | 
 |  | 
 |      reader = xmlNewTextReaderFilename(filename); | 
 |       | 
 |      if (reader != NULL) { | 
 |           if (valid) { | 
 |                if (xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1) == -1) { | 
 |                     xmlFreeTextReader (reader); | 
 |                     return TRUE; | 
 |                } | 
 |           } | 
 |            | 
 |           /* | 
 |            * Process all nodes in sequence | 
 |            */ | 
 |           ret = xmlTextReaderRead (reader); | 
 |            | 
 |           while (TRUE) { | 
 |                if (ret == -1) { | 
 |                     xmlFreeTextReader (reader); | 
 |                     return TRUE; | 
 |                } else if (ret != 1) | 
 |                     break; | 
 |                 | 
 |                if (!processNode(reader)) { | 
 |                     xmlFreeTextReader (reader); | 
 |                     return FALSE; | 
 |                } | 
 |                 | 
 |                ret = xmlTextReaderRead(reader); | 
 |           } | 
 |  | 
 |           /* | 
 |            * Done, cleanup and status | 
 |            */ | 
 |           xmlFreeTextReader (reader); | 
 |  | 
 |           return TRUE; | 
 |      } else { | 
 |           return TRUE; | 
 |      } | 
 | } | 
 |  | 
 | int main(int argc, char **argv) { | 
 |     int i; | 
 |     int files = 0; | 
 |  | 
 |     if (argc <= 1) { | 
 | 	usage(argv[0]); | 
 | 	return(1); | 
 |     } | 
 |     LIBXML_TEST_VERSION;       | 
 |  | 
 |     xmlMemSetup (test_free, | 
 |                  test_malloc, | 
 |                  test_realloc, | 
 |                  test_strdup); | 
 |      | 
 |     for (i = 1; i < argc ; i++) { | 
 | 	if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug"))) | 
 | 	    debug++; | 
 | 	else if ((!strcmp(argv[i], "-dump")) || (!strcmp(argv[i], "--dump"))) | 
 | 	    dump++; | 
 | 	else if ((!strcmp(argv[i], "-count")) || (!strcmp(argv[i], "--count"))) | 
 | 	    count++; | 
 | 	else if ((!strcmp(argv[i], "-valid")) || (!strcmp(argv[i], "--valid"))) | 
 | 	    valid++; | 
 | 	else if ((!strcmp(argv[i], "-noent")) || | 
 | 	         (!strcmp(argv[i], "--noent"))) | 
 | 	    noent++; | 
 |     } | 
 |     if (noent != 0) | 
 |       xmlSubstituteEntitiesDefault(1); | 
 |     for (i = 1; i < argc ; i++) { | 
 | 	if (argv[i][0] != '-') { | 
 |              if (!test_oom_handling (check_load_file_memory_func, | 
 |                                      argv[i])) { | 
 |                   fprintf (stderr, "Failed!\n"); | 
 |                   return (1); | 
 |              } | 
 |  | 
 |              xmlCleanupParser(); | 
 |  | 
 |              if (test_get_malloc_blocks_outstanding () > 0) { | 
 |                   fprintf (stderr, "%d blocks leaked\n", | 
 |                            test_get_malloc_blocks_outstanding ()); | 
 | 		  xmlMemoryDump(); | 
 |                   return (1); | 
 |              } | 
 |               | 
 | 	    files ++; | 
 | 	} | 
 |     } | 
 |     xmlMemoryDump(); | 
 |  | 
 |     return(0); | 
 | } |