From 3292747b1a534a78ca2ba8a889307ea8585b55b6 Mon Sep 17 00:00:00 2001 From: Claudio Freire Date: Tue, 16 Aug 2016 23:50:52 -0300 Subject: [PATCH 1/2] pg_regress: allow ignoring some lines Allows some lines to be selectively ignored when comparing against expected output, something that comes up when some output isn't fully deterministic (think stuff dependent on physical order of tuples), and not really interesting either. --- src/test/regress/pg_regress.c | 74 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 4 deletions(-) diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c index 574f5b8..2f2e1b3 100644 --- a/src/test/regress/pg_regress.c +++ b/src/test/regress/pg_regress.c @@ -1300,6 +1300,65 @@ run_diff(const char *cmd, const char *filename) return WEXITSTATUS(r); } +static bool +clean_results_file(const char *infilename, const char *outfilename) +{ + char scbuf[1024]; + char cleanup_word[1024]; + FILE *infile, *outfile; + bool inside_cleanup; + bool inside_selective_cleanup; + int i; + + cleanup_word[1023] = 0; + + infile = fopen(infilename, "r"); + if (!infile) + { + fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"), + progname, infilename, strerror(errno)); + exit(2); + } + + outfile = fopen(outfilename, "w"); + if (!outfile) + { + fclose(infile); + fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"), + progname, outfilename, strerror(errno)); + exit(2); + } + + inside_cleanup = false; + inside_selective_cleanup = false; + while (fgets(scbuf, sizeof(scbuf), infile) != NULL) + { + if (strncmp(scbuf, "--end-ignore--", 14) == 0) + inside_cleanup = inside_selective_cleanup = false; + if (!inside_cleanup && (!inside_selective_cleanup || strstr(scbuf, cleanup_word) == NULL)) { + fwrite(scbuf, 1, strlen(scbuf), outfile); + } + if (!inside_cleanup) { + if (strncmp(scbuf, "--begin-ignore--", 16) == 0) + inside_cleanup = true; + else if (strncmp(scbuf, "--begin-word-ignore--", 21) == 0) { + inside_selective_cleanup = true; + strncpy(cleanup_word, scbuf+21, sizeof(cleanup_word)); + + /* strip trailing whitespace, especially the newline */ + i = strlen(cleanup_word); + while (i > 0 && isspace((unsigned char) cleanup_word[i - 1])) + cleanup_word[--i] = '\0'; + } + } + } + + fclose(infile); + fclose(outfile); + + return true; +} + /* * Check the actual result file for the given test against expected results * @@ -1310,6 +1369,7 @@ static bool results_differ(const char *testname, const char *resultsfile, const char *default_expectfile) { char expectfile[MAXPGPATH]; + char cleanresultsfile[MAXPGPATH]; char diff[MAXPGPATH]; char cmd[MAXPGPATH * 3]; char best_expect_file[MAXPGPATH]; @@ -1319,6 +1379,11 @@ results_differ(const char *testname, const char *resultsfile, const char *defaul int l; const char *platform_expectfile; + snprintf(cleanresultsfile, sizeof(cleanresultsfile), + "%s.tmp", + resultsfile); + clean_results_file(resultsfile, cleanresultsfile); + /* * We can pass either the resultsfile or the expectfile, they should have * the same type (filename.type) anyway. @@ -1344,7 +1409,7 @@ results_differ(const char *testname, const char *resultsfile, const char *defaul /* OK, run the diff */ snprintf(cmd, sizeof(cmd), "diff %s \"%s\" \"%s\" > \"%s\"", - basic_diff_opts, expectfile, resultsfile, diff); + basic_diff_opts, expectfile, cleanresultsfile, diff); /* Is the diff file empty? */ if (run_diff(cmd, diff) == 0) @@ -1377,7 +1442,7 @@ results_differ(const char *testname, const char *resultsfile, const char *defaul snprintf(cmd, sizeof(cmd), "diff %s \"%s\" \"%s\" > \"%s\"", - basic_diff_opts, alt_expectfile, resultsfile, diff); + basic_diff_opts, alt_expectfile, cleanresultsfile, diff); if (run_diff(cmd, diff) == 0) { @@ -1405,7 +1470,7 @@ results_differ(const char *testname, const char *resultsfile, const char *defaul { snprintf(cmd, sizeof(cmd), "diff %s \"%s\" \"%s\" > \"%s\"", - basic_diff_opts, default_expectfile, resultsfile, diff); + basic_diff_opts, default_expectfile, cleanresultsfile, diff); if (run_diff(cmd, diff) == 0) { @@ -1429,7 +1494,7 @@ results_differ(const char *testname, const char *resultsfile, const char *defaul */ snprintf(cmd, sizeof(cmd), "diff %s \"%s\" \"%s\" >> \"%s\"", - pretty_diff_opts, best_expect_file, resultsfile, difffilename); + pretty_diff_opts, best_expect_file, cleanresultsfile, difffilename); run_diff(cmd, difffilename); /* And append a separator */ @@ -1442,6 +1507,7 @@ results_differ(const char *testname, const char *resultsfile, const char *defaul } unlink(diff); + unlink(cleanresultsfile); return true; } -- 2.6.6