| 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 {
|
|
|