diff options
author | George Kadianakis <desnacked@riseup.net> | 2020-08-19 13:55:07 +0300 |
---|---|---|
committer | George Kadianakis <desnacked@riseup.net> | 2020-08-19 13:55:07 +0300 |
commit | b1b007967599ccac2de91aa36d3a11a9bcb4ffdb (patch) | |
tree | 538485882a30d20d273023cc40cac2fe4007926e /src/test/testing_common.c | |
parent | deea19637006dd9bf65431acf2e15f96f3209602 (diff) | |
parent | 974abdf6325be29f04fcb3b332dce2bb3ac15a9c (diff) | |
download | tor-b1b007967599ccac2de91aa36d3a11a9bcb4ffdb.tar.gz tor-b1b007967599ccac2de91aa36d3a11a9bcb4ffdb.zip |
Merge branch 'mr/124' into maint-0.4.4
Diffstat (limited to 'src/test/testing_common.c')
-rw-r--r-- | src/test/testing_common.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/test/testing_common.c b/src/test/testing_common.c index b3337f24b0..d68dfa4047 100644 --- a/src/test/testing_common.c +++ b/src/test/testing_common.c @@ -286,6 +286,8 @@ main(int c, const char **v) /* Don't add default logs; the tests manage their own. */ quiet_level = QUIET_SILENT; + unsigned num=1, den=1; + for (i_out = i = 1; i < c; ++i) { if (!strcmp(v[i], "--warn")) { loglevel = LOG_WARN; @@ -297,6 +299,19 @@ main(int c, const char **v) loglevel = LOG_DEBUG; } else if (!strcmp(v[i], "--accel")) { accel_crypto = 1; + } else if (!strcmp(v[i], "--fraction")) { + if (i+1 == c) { + printf("--fraction needs an argument.\n"); + return 1; + } + const char *fracstr = v[++i]; + char ch; + if (sscanf(fracstr, "%u/%u%c", &num, &den, &ch) != 2) { + printf("--fraction expects a fraction as an input.\n"); + } + if (den == 0 || num == 0 || num > den) { + printf("--fraction expects a valid fraction as an input.\n"); + } } else { v[i_out++] = v[i]; } @@ -373,6 +388,33 @@ main(int c, const char **v) smartlist_free(skip); } + if (den != 1) { + // count the tests. Linear but fast. + unsigned n_tests = 0; + struct testgroup_t *tg; + struct testcase_t *tc; + for (tg = testgroups; tg->prefix != NULL; ++tg) { + for (tc = tg->cases; tc->name != NULL; ++tc) { + ++n_tests; + } + } + // Which tests should we run? This can give iffy results if den is huge + // but it doesn't actually matter in practice. + unsigned tests_per_chunk = CEIL_DIV(n_tests, den); + unsigned start_at = (num-1) * tests_per_chunk; + + // Skip the tests that are outside of the range. + unsigned idx = 0; + for (tg = testgroups; tg->prefix != NULL; ++tg) { + for (tc = tg->cases; tc->name != NULL; ++tc) { + if (idx < start_at || idx >= start_at + tests_per_chunk) { + tc->flags |= TT_SKIP; + } + ++idx; + } + } + } + int have_failed = (tinytest_main(c, v, testgroups) != 0); free_pregenerated_keys(); |