aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2020-10-07 08:03:52 -0400
committerNick Mathewson <nickm@torproject.org>2020-10-07 08:03:52 -0400
commit8ac1f8663b1f3fd734cf9a54f48ae04a75e48ebf (patch)
tree0351ecf1f21c64d9a66350fb6a683c2c7b5fea52
parentc374d49381aefdcacca7d3dc23cd09cedf25d3ba (diff)
parentb5a88e8d478e553eb7c6bc022d47a084d6845e64 (diff)
downloadtor-8ac1f8663b1f3fd734cf9a54f48ae04a75e48ebf.tar.gz
tor-8ac1f8663b1f3fd734cf9a54f48ae04a75e48ebf.zip
Merge branch 'maint-0.4.3' into release-0.4.3
-rw-r--r--changes/parallel_unit_test4
-rw-r--r--src/test/include.am23
-rw-r--r--src/test/testing_common.c42
-rwxr-xr-xsrc/test/unittest_part1.sh3
-rwxr-xr-xsrc/test/unittest_part2.sh3
-rwxr-xr-xsrc/test/unittest_part3.sh3
-rwxr-xr-xsrc/test/unittest_part4.sh3
-rwxr-xr-xsrc/test/unittest_part5.sh3
-rwxr-xr-xsrc/test/unittest_part6.sh3
-rwxr-xr-xsrc/test/unittest_part7.sh3
-rwxr-xr-xsrc/test/unittest_part8.sh3
11 files changed, 90 insertions, 3 deletions
diff --git a/changes/parallel_unit_test b/changes/parallel_unit_test
new file mode 100644
index 0000000000..79de28636d
--- /dev/null
+++ b/changes/parallel_unit_test
@@ -0,0 +1,4 @@
+ o Minor features (tests):
+ - Our "make check" target now runs the unit tests in 8 parallel chunks.
+ Doing this speeds up hardened CI builds by more than a factor of two.
+ Closes ticket 40098.
diff --git a/src/test/include.am b/src/test/include.am
index 90e50752ce..33556083df 100644
--- a/src/test/include.am
+++ b/src/test/include.am
@@ -25,7 +25,16 @@ TESTSCRIPTS = \
src/test/test_workqueue_socketpair.sh \
src/test/test_switch_id.sh \
src/test/test_cmdline.sh \
- src/test/test_parseconf.sh
+ src/test/test_parseconf.sh \
+ src/test/test_switch_id.sh \
+ src/test/unittest_part1.sh \
+ src/test/unittest_part2.sh \
+ src/test/unittest_part3.sh \
+ src/test/unittest_part4.sh \
+ src/test/unittest_part5.sh \
+ src/test/unittest_part6.sh \
+ src/test/unittest_part7.sh \
+ src/test/unittest_part8.sh
if USE_RUST
TESTSCRIPTS += \
@@ -53,7 +62,7 @@ TESTSCRIPTS += \
scripts/maint/checkSpaceTest.sh
endif
-TESTS += src/test/test src/test/test-slow src/test/test-memwipe \
+TESTS += src/test/test-slow src/test/test-memwipe \
src/test/test_workqueue \
src/test/test_keygen.sh \
src/test/test_key_expiration.sh \
@@ -432,7 +441,15 @@ EXTRA_DIST += \
src/test/test_workqueue_pipe2.sh \
src/test/test_workqueue_socketpair.sh \
src/test/test_cmdline.sh \
- src/test/test_parseconf.sh
+ src/test/test_parseconf.sh \
+ src/test/unittest_part1.sh \
+ src/test/unittest_part2.sh \
+ src/test/unittest_part3.sh \
+ src/test/unittest_part4.sh \
+ src/test/unittest_part5.sh \
+ src/test/unittest_part6.sh \
+ src/test/unittest_part7.sh \
+ src/test/unittest_part8.sh
test-rust:
$(TESTS_ENVIRONMENT) "$(abs_top_srcdir)/src/test/test_rust.sh"
diff --git a/src/test/testing_common.c b/src/test/testing_common.c
index e9aa4112c0..d7c6edb646 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();
diff --git a/src/test/unittest_part1.sh b/src/test/unittest_part1.sh
new file mode 100755
index 0000000000..5be0f499f9
--- /dev/null
+++ b/src/test/unittest_part1.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+"${abs_top_builddir:-.}/src/test/test" --fraction 1/8
diff --git a/src/test/unittest_part2.sh b/src/test/unittest_part2.sh
new file mode 100755
index 0000000000..9a614eb8c1
--- /dev/null
+++ b/src/test/unittest_part2.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+"${abs_top_builddir:-.}/src/test/test" --fraction 2/8
diff --git a/src/test/unittest_part3.sh b/src/test/unittest_part3.sh
new file mode 100755
index 0000000000..5cbc3fe495
--- /dev/null
+++ b/src/test/unittest_part3.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+"${abs_top_builddir:-.}/src/test/test" --fraction 3/8
diff --git a/src/test/unittest_part4.sh b/src/test/unittest_part4.sh
new file mode 100755
index 0000000000..bc6fe01f68
--- /dev/null
+++ b/src/test/unittest_part4.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+"${abs_top_builddir:-.}/src/test/test" --fraction 4/8
diff --git a/src/test/unittest_part5.sh b/src/test/unittest_part5.sh
new file mode 100755
index 0000000000..9bbff34fb8
--- /dev/null
+++ b/src/test/unittest_part5.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+"${abs_top_builddir:-.}/src/test/test" --fraction 5/8
diff --git a/src/test/unittest_part6.sh b/src/test/unittest_part6.sh
new file mode 100755
index 0000000000..2d5eaa8a28
--- /dev/null
+++ b/src/test/unittest_part6.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+"${abs_top_builddir:-.}/src/test/test" --fraction 6/8
diff --git a/src/test/unittest_part7.sh b/src/test/unittest_part7.sh
new file mode 100755
index 0000000000..5e6ce2aea5
--- /dev/null
+++ b/src/test/unittest_part7.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+"${abs_top_builddir:-.}/src/test/test" --fraction 7/8
diff --git a/src/test/unittest_part8.sh b/src/test/unittest_part8.sh
new file mode 100755
index 0000000000..7fea9c9c7f
--- /dev/null
+++ b/src/test/unittest_part8.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+"${abs_top_builddir:-.}/src/test/test" --fraction 8/8