Merge branch 'tizen_base' into tizen
[platform/upstream/libxml2.git] / runtest.c
index 02fe09a..bb74d2a 100644 (file)
--- a/runtest.c
+++ b/runtest.c
  */
 #ifdef O_BINARY
 #define RD_FLAGS       O_RDONLY | O_BINARY
+#define WR_FLAGS       O_WRONLY | O_CREAT | O_TRUNC | O_BINARY
 #else
-#define        RD_FLAGS        O_RDONLY
+#define RD_FLAGS       O_RDONLY
+#define WR_FLAGS       O_WRONLY | O_CREAT | O_TRUNC
 #endif
 
 typedef int (*functest) (const char *filename, const char *result,
@@ -100,6 +102,7 @@ struct testDesc {
     int     options;  /* parser options for the test */
 };
 
+static int update_results = 0;
 static int checkTestFile(const char *filename);
 
 #if defined(_WIN32) && !defined(__CYGWIN__)
@@ -604,12 +607,34 @@ static int checkTestFile(const char *filename) {
     return(1);
 }
 
-static int compareFiles(const char *r1, const char *r2) {
+static int compareFiles(const char *r1 /* temp */, const char *r2 /* result */) {
     int res1, res2;
     int fd1, fd2;
     char bytes1[4096];
     char bytes2[4096];
 
+    if (update_results) {
+        fd1 = open(r1, RD_FLAGS);
+        if (fd1 < 0)
+            return(-1);
+        fd2 = open(r2, WR_FLAGS, 0644);
+        if (fd2 < 0) {
+            close(fd1);
+            return(-1);
+        }
+        do {
+            res1 = read(fd1, bytes1, 4096);
+            if (res1 <= 0)
+                break;
+            res2 = write(fd2, bytes1, res1);
+            if (res2 <= 0 || res2 != res1)
+                break;
+        } while (1);
+        close(fd2);
+        close(fd1);
+        return(res1 != 0);
+    }
+
     fd1 = open(r1, RD_FLAGS);
     if (fd1 < 0)
         return(-1);
@@ -646,13 +671,31 @@ static int compareFileMem(const char *filename, const char *mem, int size) {
     int idx = 0;
     struct stat info;
 
-    if (stat(filename, &info) < 0)
+    if (update_results) {
+        fd = open(filename, WR_FLAGS, 0644);
+        if (fd < 0) {
+           fprintf(stderr, "failed to open %s for writing", filename);
+            return(-1);
+       }
+        res = write(fd, mem, size);
+        close(fd);
+        return(res != size);
+    }
+
+    if (stat(filename, &info) < 0) {
+        fprintf(stderr, "failed to stat %s\n", filename);
        return(-1);
-    if (info.st_size != size)
+    }
+    if (info.st_size != size) {
+        fprintf(stderr, "file %s is %ld bytes, result is %d bytes\n",
+               filename, info.st_size, size);
         return(-1);
+    }
     fd = open(filename, RD_FLAGS);
-    if (fd < 0)
+    if (fd < 0) {
+       fprintf(stderr, "failed to open %s for reading", filename);
         return(-1);
+    }
     while (idx < size) {
         res = read(fd, bytes, 4096);
        if (res <= 0)
@@ -671,6 +714,9 @@ static int compareFileMem(const char *filename, const char *mem, int size) {
        idx += res;
     }
     close(fd);
+    if (idx != size) {
+       fprintf(stderr,"Compare error index %d, size %d\n", idx, size);
+    }
     return(idx != size);
 }
 
@@ -1827,7 +1873,7 @@ pushParseTest(const char *filename, const char *result,
     ctxt = xmlCreatePushParserCtxt(NULL, NULL, base + cur, 4, filename);
     xmlCtxtUseOptions(ctxt, options);
     cur += 4;
-    while (cur < size) {
+    do {
         if (cur + 1024 >= size) {
 #ifdef LIBXML_HTML_ENABLED
            if (options & XML_PARSE_HTML)
@@ -1845,7 +1891,7 @@ pushParseTest(const char *filename, const char *result,
            xmlParseChunk(ctxt, base + cur, 1024, 0);
            cur += 1024;
        }
-    }
+    } while (cur < size);
     doc = ctxt->myDoc;
 #ifdef LIBXML_HTML_ENABLED
     if (options & XML_PARSE_HTML)
@@ -1871,7 +1917,7 @@ pushParseTest(const char *filename, const char *result,
     if ((base == NULL) || (res != 0)) {
        if (base != NULL)
            xmlFree((char *)base);
-        fprintf(stderr, "Result for %s failed\n", filename);
+        fprintf(stderr, "Result for %s failed in %s\n", filename, result);
        return(-1);
     }
     xmlFree((char *)base);
@@ -1926,7 +1972,7 @@ memParseTest(const char *filename, const char *result,
     if ((base == NULL) || (res != 0)) {
        if (base != NULL)
            xmlFree((char *)base);
-        fprintf(stderr, "Result for %s failed\n", filename);
+        fprintf(stderr, "Result for %s failed in %s\n", filename, result);
        return(-1);
     }
     xmlFree((char *)base);
@@ -2037,16 +2083,16 @@ errParseTest(const char *filename, const char *result, const char *err,
            xmlDocDumpMemory(doc, (xmlChar **) &base, &size);
        }
        res = compareFileMem(result, base, size);
+       if (res != 0) {
+           fprintf(stderr, "Result for %s failed in %s\n", filename, result);
+           return(-1);
+       }
     }
     if (doc != NULL) {
        if (base != NULL)
            xmlFree((char *)base);
        xmlFreeDoc(doc);
     }
-    if (res != 0) {
-        fprintf(stderr, "Result for %s failed\n", filename);
-       return(-1);
-    }
     if (err != NULL) {
        res = compareFileMem(err, testErrors, testErrorsSize);
        if (res != 0) {
@@ -2159,7 +2205,7 @@ streamProcessTest(const char *filename, const char *result, const char *err,
             free(temp);
         }
        if (ret) {
-           fprintf(stderr, "Result for %s failed\n", filename);
+           fprintf(stderr, "Result for %s failed in %s\n", filename, result);
            return(-1);
        }
     }
@@ -2362,7 +2408,7 @@ xpathCommonTest(const char *filename, const char *result,
     if (result != NULL) {
        ret = compareFiles(temp, result);
        if (ret) {
-           fprintf(stderr, "Result for %s failed\n", filename);
+           fprintf(stderr, "Result for %s failed in %s\n", filename, result);
        }
     }
 
@@ -2533,7 +2579,7 @@ xmlidDocTest(const char *filename,
     if (result != NULL) {
        ret = compareFiles(temp, result);
        if (ret) {
-           fprintf(stderr, "Result for %s failed\n", filename);
+           fprintf(stderr, "Result for %s failed in %s\n", filename, result);
            res = 1;
        }
     }
@@ -2661,7 +2707,7 @@ uriCommonTest(const char *filename,
     if (result != NULL) {
        ret = compareFiles(temp, result);
        if (ret) {
-           fprintf(stderr, "Result for %s failed\n", filename);
+           fprintf(stderr, "Result for %s failed in %s\n", filename, result);
            res = 1;
        }
     }
@@ -3430,11 +3476,11 @@ patternTest(const char *filename,
     result[499] = 0;
     memcpy(xml + len, ".xml", 5);
 
-    if (!checkTestFile(xml)) {
+    if (!checkTestFile(xml) && !update_results) {
        fprintf(stderr, "Missing xml file %s\n", xml);
        return(-1);
     }
-    if (!checkTestFile(result)) {
+    if (!checkTestFile(result) && !update_results) {
        fprintf(stderr, "Missing result file %s\n", result);
        return(-1);
     }
@@ -3533,7 +3579,7 @@ patternTest(const char *filename,
 
     ret = compareFiles(temp, result);
     if (ret) {
-       fprintf(stderr, "Result for %s failed\n", filename);
+       fprintf(stderr, "Result for %s failed in %s\n", filename, result);
        ret = 1;
     }
     if (temp != NULL) {
@@ -3805,7 +3851,7 @@ c14nCommonTest(const char *filename, int with_comments, int mode,
     prefix[len] = 0;
 
     snprintf(buf, 499, "result/c14n/%s/%s", subdir,prefix);
-    if (!checkTestFile(buf)) {
+    if (!checkTestFile(buf) && !update_results) {
         fprintf(stderr, "Missing result file %s", buf);
        return(-1);
     }
@@ -4354,9 +4400,9 @@ launchTests(testDescPtr tst) {
            } else {
                error = NULL;
            }
-           if ((result) &&(!checkTestFile(result))) {
+           if ((result) &&(!checkTestFile(result)) && !update_results) {
                fprintf(stderr, "Missing result file %s\n", result);
-           } else if ((error) &&(!checkTestFile(error))) {
+           } else if ((error) &&(!checkTestFile(error)) && !update_results) {
                fprintf(stderr, "Missing error file %s\n", error);
            } else {
                mem = xmlMemUsed();
@@ -4440,6 +4486,8 @@ main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
     for (a = 1; a < argc;a++) {
         if (!strcmp(argv[a], "-v"))
            verbose = 1;
+        else if (!strcmp(argv[a], "-u"))
+           update_results = 1;
         else if (!strcmp(argv[a], "-quiet"))
            tests_quiet = 1;
        else {