diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2018-08-26 15:11:21 +0100 |
---|---|---|
committer | Edward Thomson <ethomson@edwardthomson.com> | 2018-09-06 11:17:01 +0100 |
commit | 90753a96515f85e2d0e79a16d3a06ba5b363c68e (patch) | |
tree | 312f412acd9757759382ac747a8c854af84bcc47 | |
parent | 695067f7d65ff6de2162917ce3092a2307020e59 (diff) | |
download | libgit2-90753a96515f85e2d0e79a16d3a06ba5b363c68e.tar.gz |
clar: refactor explicitly run test behavior
Previously, supplying `-s` to explicitly enable some test(s) would run
the tests immediately from the argument parser. This forces us to set
up the entire clar environment (for example: sandboxing) before argument
parsing takes place.
Refactor the behavior of `-s` to add the explicitly chosen tests to a
list that is executed later. This untangles the argument parsing from
the setup lifecycle, allowing us to use the arguments to perform the
setup.
-rw-r--r-- | tests/clar.c | 55 |
1 files changed, 44 insertions, 11 deletions
diff --git a/tests/clar.c b/tests/clar.c index d5212d1ca..bef7c001d 100644 --- a/tests/clar.c +++ b/tests/clar.c @@ -106,10 +106,14 @@ struct clar_error { struct clar_error *next; }; -static struct { - int argc; - char **argv; +struct clar_explicit { + size_t suite_idx; + const char *filter; + + struct clar_explicit *next; +}; +static struct { enum cl_test_status test_status; const char *active_test; const char *active_suite; @@ -124,6 +128,9 @@ static struct { int exit_on_error; int report_suite_names; + struct clar_explicit *explicit; + struct clar_explicit *last_explicit; + struct clar_error *errors; struct clar_error *last_error; @@ -359,7 +366,24 @@ clar_parse_args(int argc, char **argv) _clar.report_suite_names = 1; switch (action) { - case 's': _clar_suites[j].enabled = 1; clar_run_suite(&_clar_suites[j], argument); break; + case 's': { + struct clar_explicit *explicit = + calloc(1, sizeof(struct clar_explicit)); + assert(explicit); + + explicit->suite_idx = j; + explicit->filter = argument; + + if (_clar.explicit == NULL) + _clar.explicit = explicit; + + if (_clar.last_explicit != NULL) + _clar.last_explicit->next = explicit; + + _clar_suites[j].enabled = 1; + _clar.last_explicit = explicit; + break; + } case 'i': _clar_suites[j].enabled = 1; break; case 'x': _clar_suites[j].enabled = 0; break; } @@ -412,23 +436,25 @@ clar_test_init(int argc, char **argv) "" ); + if (argc > 1) + clar_parse_args(argc, argv); + if (clar_sandbox() < 0) { clar_print_onabort("Failed to sandbox the test runner.\n"); exit(-1); } - - _clar.argc = argc; - _clar.argv = argv; } int clar_test_run(void) { - if (_clar.argc > 1) - clar_parse_args(_clar.argc, _clar.argv); + size_t i; + struct clar_explicit *explicit; - if (!_clar.suites_ran) { - size_t i; + if (_clar.explicit) { + for (explicit = _clar.explicit; explicit; explicit = explicit->next) + clar_run_suite(&_clar_suites[explicit->suite_idx], explicit->filter); + } else { for (i = 0; i < _clar_suite_count; ++i) clar_run_suite(&_clar_suites[i], NULL); } @@ -439,6 +465,8 @@ clar_test_run(void) void clar_test_shutdown(void) { + struct clar_explicit *explicit, *explicit_next; + clar_print_shutdown( _clar.tests_ran, (int)_clar_suite_count, @@ -446,6 +474,11 @@ clar_test_shutdown(void) ); clar_unsandbox(); + + for (explicit = _clar.explicit; explicit; explicit = explicit_next) { + explicit_next = explicit->next; + free(explicit); + } } int |