Index: third_party/libxml/src/runtest.c |
diff --git a/third_party/libxml/src/runtest.c b/third_party/libxml/src/runtest.c |
index 02fe09a680924ff2802d4d2de938bd81dc4ce367..bb74d2a82e2be682db4dc2bc0129362f4fbb90ee 100644 |
--- a/third_party/libxml/src/runtest.c |
+++ b/third_party/libxml/src/runtest.c |
@@ -81,8 +81,10 @@ |
*/ |
#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 { |