aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2011-11-03 15:06:08 -0200
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2011-11-03 15:20:10 -0200
commit7ed36056751cc900418871b39595100cbb06de21 (patch)
tree10740d80411f0e5afc4bc10ffdc3697dbdc2a1b3 /src
parent94cd0f1ad8af722a48a30a1087377b52ca99d633 (diff)
downloadpostgresql-7ed36056751cc900418871b39595100cbb06de21.tar.gz
postgresql-7ed36056751cc900418871b39595100cbb06de21.zip
Implement a dry-run mode for isolationtester
This mode prints out the permutations that would be run by the given spec file, in the same format used by the permutation lines in spec files. This helps in building new spec files. Author: Alexander Shulgin, with some tweaks by me
Diffstat (limited to 'src')
-rw-r--r--src/test/isolation/isolationtester.c73
1 files changed, 63 insertions, 10 deletions
diff --git a/src/test/isolation/isolationtester.c b/src/test/isolation/isolationtester.c
index b1d49c82320..822739ec3bb 100644
--- a/src/test/isolation/isolationtester.c
+++ b/src/test/isolation/isolationtester.c
@@ -35,6 +35,10 @@ static PGconn **conns = NULL;
static const char **backend_pids = NULL;
static int nconns = 0;
+/* In dry run only output permutations to be run by the tester. */
+static int dry_run = false;
+
+static void run_testspec(TestSpec *testspec);
static void run_all_permutations(TestSpec * testspec);
static void run_all_permutations_recurse(TestSpec * testspec, int nsteps,
Step ** steps);
@@ -69,20 +73,46 @@ main(int argc, char **argv)
int i;
PGresult *res;
PQExpBufferData wait_query;
+ int opt;
+
+ while ((opt = getopt(argc, argv, "n")) != -1)
+ {
+ switch (opt)
+ {
+ case 'n':
+ dry_run = true;
+ break;
+ default:
+ fprintf(stderr, "Usage: isolationtester [-n] [CONNINFO]\n");
+ return EXIT_FAILURE;
+ }
+ }
/*
- * If the user supplies a parameter on the command line, use it as the
- * conninfo string; otherwise default to setting dbname=postgres and using
- * environment variables or defaults for all other connection parameters.
+ * If the user supplies a non-option parameter on the command line, use it
+ * as the conninfo string; otherwise default to setting dbname=postgres and
+ * using environment variables or defaults for all other connection
+ * parameters.
*/
- if (argc > 1)
- conninfo = argv[1];
+ if (argc > optind)
+ conninfo = argv[optind];
else
conninfo = "dbname = postgres";
/* Read the test spec from stdin */
spec_yyparse();
testspec = &parseresult;
+
+ /*
+ * In dry-run mode, just print the permutations that would be run, and
+ * exit.
+ */
+ if (dry_run)
+ {
+ run_testspec(testspec);
+ return 0;
+ }
+
printf("Parsed test spec with %d sessions\n", testspec->nsessions);
/*
@@ -240,10 +270,7 @@ main(int argc, char **argv)
* Run the permutations specified in the spec, or all if none were
* explicitly specified.
*/
- if (testspec->permutations)
- run_named_permutations(testspec);
- else
- run_all_permutations(testspec);
+ run_testspec(testspec);
/* Clean up and exit */
for (i = 0; i < nconns; i++)
@@ -254,6 +281,19 @@ main(int argc, char **argv)
static int *piles;
/*
+ * Run the permutations specified in the spec, or all if none were
+ * explicitly specified.
+ */
+static void
+run_testspec(TestSpec *testspec)
+{
+ if (testspec->permutations)
+ run_named_permutations(testspec);
+ else
+ run_all_permutations(testspec);
+}
+
+/*
* Run all permutations of the steps and sessions.
*/
static void
@@ -437,6 +477,19 @@ run_permutation(TestSpec * testspec, int nsteps, Step ** steps)
int i;
Step *waiting = NULL;
+ /*
+ * In dry run mode, just display the permutation in the same format used by
+ * spec files, and return.
+ */
+ if (dry_run)
+ {
+ printf("permutation");
+ for (i = 0; i < nsteps; i++)
+ printf(" \"%s\"", steps[i]->name);
+ printf("\n");
+ return;
+ }
+
printf("\nstarting permutation:");
for (i = 0; i < nsteps; i++)
printf(" %s", steps[i]->name);
@@ -649,7 +702,7 @@ try_complete_step(Step *step, int flags)
}
/* Detail may contain xid values, so just show primary. */
step->errormsg = malloc(5 +
- strlen(PQresultErrorField(res, PG_DIAG_SEVERITY)) +
+ strlen(PQresultErrorField(res, PG_DIAG_SEVERITY)) +
strlen(PQresultErrorField(res,
PG_DIAG_MESSAGE_PRIMARY)));
sprintf(step->errormsg, "%s: %s",