diff options
Diffstat (limited to 'src/interfaces/ecpg/test/pg_regress_ecpg.c')
-rw-r--r-- | src/interfaces/ecpg/test/pg_regress_ecpg.c | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/src/interfaces/ecpg/test/pg_regress_ecpg.c b/src/interfaces/ecpg/test/pg_regress_ecpg.c new file mode 100644 index 00000000000..c829653f520 --- /dev/null +++ b/src/interfaces/ecpg/test/pg_regress_ecpg.c @@ -0,0 +1,177 @@ +/*------------------------------------------------------------------------- + * + * pg_regress_ecpg --- regression test driver for ecpg + * + * This is a C implementation of the previous shell script for running + * the regression tests, and should be mostly compatible with it. + * Initial author of C translation: Magnus Hagander + * + * This code is released under the terms of the PostgreSQL License. + * + * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * $PostgreSQL: pgsql/src/interfaces/ecpg/test/pg_regress_ecpg.c,v 1.1 2007/06/12 11:07:30 mha Exp $ + * + *------------------------------------------------------------------------- + */ + +#include "pg_regress.h" + +#define LINEBUFSIZE 300 +static void +ecpg_filter(const char *sourcefile, const char *outfile) +{ + /* + * Create a filtered copy of sourcefile, replacing + * #line x "./../bla/foo.h" + * with + * #line x "foo.h" + */ + FILE *s, *t; + char linebuf[LINEBUFSIZE]; + + s = fopen(sourcefile, "r"); + if (!s) + { + fprintf(stderr, "Could not open file %s for reading\n", sourcefile); + exit_nicely(2); + } + t = fopen(outfile, "w"); + if (!t) + { + fprintf(stderr, "Could not open file %s for writing\n", outfile); + exit_nicely(2); + } + + while (fgets(linebuf, LINEBUFSIZE, s)) + { + /* check for "#line " in the beginning */ + if (strstr(linebuf, "#line ") == linebuf) + { + char *p = strchr(linebuf, '"'); + char *n; + int plen = 1; + while (*p && (*(p + plen) == '.' || strchr(p + plen, '/') != NULL)) + { + plen++; + } + /* plen is one more than the number of . and / characters */ + if (plen > 1) + { + n = (char *) malloc(plen); + strncpy(n, p+1, plen - 1); + n[plen-1] = '\0'; + replace_string(linebuf, n, ""); + } + } + fputs(linebuf, t); + } + fclose(s); + fclose(t); +} + +/* + * start an ecpg test process for specified file (including redirection), + * and return process ID + */ + +static PID_TYPE +ecpg_start_test(const char *testname, + _stringlist **resultfiles, + _stringlist **expectfiles, + _stringlist **tags) +{ + PID_TYPE pid; + char inprg[MAXPGPATH]; + char insource[MAXPGPATH]; + char *outfile_stdout, expectfile_stdout[MAXPGPATH]; + char *outfile_stderr, expectfile_stderr[MAXPGPATH]; + char *outfile_source, expectfile_source[MAXPGPATH]; + char cmd[MAXPGPATH * 3]; + char *testname_dash; + + snprintf(inprg, sizeof(inprg), "%s/%s", inputdir, testname); + + testname_dash = strdup(testname); + replace_string(testname_dash, "/", "-"); + snprintf(expectfile_stdout, sizeof(expectfile_stdout), + "%s/expected/%s.stdout", + outputdir, testname_dash); + snprintf(expectfile_stderr, sizeof(expectfile_stderr), + "%s/expected/%s.stderr", + outputdir, testname_dash); + snprintf(expectfile_source, sizeof(expectfile_source), + "%s/expected/%s.c", + outputdir, testname_dash); + + /* + * We can use replace_string() here because the replacement string does + * not occupy more space than the replaced one. + */ + outfile_stdout = strdup(expectfile_stdout); + replace_string(outfile_stdout, "/expected/", "/results/"); + outfile_stderr = strdup(expectfile_stderr); + replace_string(outfile_stderr, "/expected/", "/results/"); + outfile_source = strdup(expectfile_source); + replace_string(outfile_source, "/expected/", "/results/"); + + add_stringlist_item(resultfiles, outfile_stdout); + add_stringlist_item(expectfiles, expectfile_stdout); + add_stringlist_item(tags, "stdout"); + + add_stringlist_item(resultfiles, outfile_stderr); + add_stringlist_item(expectfiles, expectfile_stderr); + add_stringlist_item(tags, "stderr"); + + add_stringlist_item(resultfiles, outfile_source); + add_stringlist_item(expectfiles, expectfile_source); + add_stringlist_item(tags, "source"); + + snprintf(insource, sizeof(insource), "%s.c", testname); + ecpg_filter(insource, outfile_source); + + snprintf(inprg, sizeof(inprg), "%s/%s", inputdir, testname); + + snprintf(cmd, sizeof(cmd), + SYSTEMQUOTE "\"%s\" >\"%s\" 2>\"%s\"" SYSTEMQUOTE, + inprg, + outfile_stdout, + outfile_stderr); + + pid = spawn_process(cmd); + + if (pid == INVALID_PID) + { + fprintf(stderr, _("could not start process for test %s\n"), + testname); + exit_nicely(2); + } + + free(outfile_stdout); + free(outfile_stderr); + free(outfile_source); + + return pid; +} + +static void +ecpg_init(void) +{ + /* no reason to set -w for ecpg checks, except for when on windows */ + if (strstr(host_platform, "-win32")) + basic_diff_opts = "-w"; + else + basic_diff_opts = ""; + if (strstr(host_platform, "-win32")) + pretty_diff_opts = "-C3 -w"; + else + pretty_diff_opts = "-C3"; +} + +int +main(int argc, char *argv[]) +{ + return regression_main(argc, argv, ecpg_init, ecpg_start_test); +} + |