Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Speed up VS2017 Appveyor which is taking 45 mins #4059

Closed
derekbruening opened this issue Jan 27, 2020 · 7 comments
Closed

Speed up VS2017 Appveyor which is taking 45 mins #4059

derekbruening opened this issue Jan 27, 2020 · 7 comments

Comments

@derekbruening
Copy link
Contributor

VS2013 was taking ~33 mins.

Some of this may be some timeouts. Some may be a slower compiler?

Build and test times:

$ egrep 'Build dire|Test project' Downloads/log\ \(22\).txt 
[00:02:01]    Build directory: C:/projects/dynamorio/build/build_debug-internal-32
[00:06:48] Test project C:/projects/dynamorio/build/build_debug-internal-32
[00:21:01]    Build directory: C:/projects/dynamorio/build/build_debug-internal-64
[00:25:34] Test project C:/projects/dynamorio/build/build_debug-internal-64
[00:35:33]    Build directory: C:/projects/dynamorio/build/build_release-external-32
[00:38:12] Test project C:/projects/dynamorio/build/build_release-external-32
[00:38:12]    Build directory: C:/projects/dynamorio/build/build_release-external-64
[00:44:47] Test project C:/projects/dynamorio/build/build_release-external-64
[00:44:47]    Build directory: C:/projects/dynamorio/build/build_release-external-64
[00:44:47] Command exited with code 1

We can probably shrink some of the longer tests: like drcachesim tests running that concurrency
app and taking a minute each.

@derekbruening
Copy link
Contributor Author

The longest-running test by far is nudge_test:

[00:19:41] 225/262 Test #128: code_api|client.nudge_test ...................................***Timeout 600.01 sec

10 minutes!

I took a look and found a lot of issues:

#4074: ASSERT in ntdll_redir in infloop on nudge => relax for nudge thread; actually I undid this after the next assert was fixed to not swap state

I fixed this.

#4074: ASSERT in infloop in tls cleanup post-nudge => swapping peb pointer too early

I fixed this.

#4075: deadlock in infloop when nudge sent: thread_initexit_lock has no owner but lock_requests==4

I failed to figure this one out. But at least with the changes below we now exit in a reasonable time.

Add timeouts to all wait loops in runall.cmake

Now we have:

Sending nudge -nudge_pid;9816;0;10
CMake Error at D:/derek/dr/git/src/suite/tests/runall.cmake:232 (message):
  Timed out waiting for "done"

I also added a TIMEOUT to the execute_process() call.

Add detection of assert to runall.cmake

CMake Error at D:/derek/dr/git/src/suite/tests/runall.cmake:237 (message):
  Found assert: |Application
  D:\derek\dr\git\build_x86_dbg_tests\suite\tests\bin\win32.infloop.exe
  (15860).  Internal Error: DynamoRIO debug check failure:
  D:\derek\dr\git\src\core\win32\drwinapi\ntdll_redir.c:263
  !dynamo_initialized || dynamo_exited || standalone_library ||
  get_thread_private_dcontext() == NULL ||
  !os_using_app_state(get_thread_private_dcontext())
<...>

derekbruening added a commit that referenced this issue Feb 2, 2020
Fixes two asserts involving nudge threads swapping to app state and
then accessing privlib TLS and other state.

Adds timeouts to each step in runall.cmake to avoid hangs.
Adds identification of an assert to runall.cmake.

Issue: #4074, #4059
Fixes #4074
derekbruening added a commit that referenced this issue Feb 2, 2020
Fixes two asserts involving nudge threads swapping to app state and
then accessing privlib TLS and other state.

Adds timeouts to each step in runall.cmake to avoid hangs.
Adds a timeout to the nudge sending.
Adds identification of an assert to runall.cmake.

Issue: #4074, #4059
Fixes #4074
@derekbruening
Copy link
Contributor Author

derekbruening commented Feb 2, 2020

New breakdown showing 32-bit shrunk down a bit now, 10 mins instead of 15:

$ egrep 'Build dire|Test project' ~/Downloads/log\ \(26\).txt 
[00:01:48]    Build directory: C:/projects/dynamorio/build/build_debug-internal-32
[00:06:39] Test project C:/projects/dynamorio/build/build_debug-internal-32
[00:16:23]    Build directory: C:/projects/dynamorio/build/build_debug-internal-64
[00:21:00] Test project C:/projects/dynamorio/build/build_debug-internal-64
[00:29:01]    Build directory: C:/projects/dynamorio/build/build_release-external-32
[00:31:39] Test project C:/projects/dynamorio/build/build_release-external-32
[00:31:39]    Build directory: C:/projects/dynamorio/build/build_release-external-64
[00:38:24] Test project C:/projects/dynamorio/build/build_release-external-64
[00:38:24]    Build directory: C:/projects/dynamorio/build/build_release-external-64
$ grep '[0-9] sec' ~/Downloads/log\ \(26\).txt | sed 's/\r//' | awk '{print $(NF-1),$NF,$0}' | sort -n

9.99 sec [00:11:05] 180/262 Test #180: code_api|sample.instrace_simple ..............................   Passed    9.99 sec
11.01 sec [00:23:29] 132/235 Test #128: code_api|client.drreg-test ...................................   Passed   11.01 sec
11.06 sec [00:27:24] 193/235 Test #194: code_api|tool.reuse_distance .................................   Passed   11.06 sec
11.99 sec [00:27:43] 196/235 Test #195: code_api|tool.basic_counts ...................................   Passed   11.99 sec
12.18 sec [00:11:25] 190/262 Test #187: code_api|sample.instrace_x86_text ............................   Passed   12.18 sec
12.53 sec [00:14:26] 219/262 Test #220: code_api|tool.basic_counts ...................................   Passed   12.53 sec
12.96 sec [00:24:17] 154/235 Test #153: code_api|sample.memtrace_simple ..............................   Passed   12.96 sec
13.12 sec [00:24:35] 165/235 Test #162: code_api|sample.instrace_x86_text ............................   Passed   13.12 sec
13.14 sec [00:06:58]   7/262 Test   #7: drmemtrace_proj ..............................................   Passed   13.14 sec
13.55 sec [00:14:37] 221/262 Test #221: code_api|tool.drcachesim.invariants ..........................   Passed   13.55 sec
13.77 sec [00:14:26] 218/262 Test #219: code_api|tool.reuse_distance .................................   Passed   13.77 sec
14.40 sec [00:10:46] 179/262 Test #178: code_api|sample.memtrace_simple ..............................   Passed   14.40 sec
15.18 sec [00:24:35] 171/235 Test #166: code_api|sample.instrcalls ...................................   Passed   15.18 sec
15.35 sec [00:08:44]  91/262 Test  #75: code_api|win32.dotnet ........................................   Passed   15.35 sec
16.61 sec [00:23:08] ] 16.61 sec
17.49 sec [00:28:12] 199/235 Test #198: code_api|tool.drcacheoff.simple ..............................   Passed   17.49 sec
18.51 sec [00:28:12] 197/235 Test #197: code_api|tool.drcachesim.invariants ..........................   Passed   18.51 sec
19.94 sec [00:28:12] 200/235 Test #201: code_api|tool.drcacheoff.opcode_mix ..........................   Passed   19.94 sec
23.36 sec [00:11:40] 202/262 Test #191: code_api|sample.instrcalls ...................................   Passed   23.36 sec
24.78 sec [00:15:25] 223/262 Test #222: code_api|tool.drcacheoff.simple ..............................   Passed   24.78 sec
24.87 sec [00:28:22] 201/235 Test #200: code_api|tool.drcacheoff.basic_counts ........................   Passed   24.87 sec
28.95 sec [00:15:25] 225/262 Test #225: code_api|tool.drcacheoff.opcode_mix ..........................   Passed   28.95 sec
30.67 sec [00:07:23]  10/262 Test   #6: samples_proj .................................................   Passed   30.67 sec
33.34 sec [00:15:25] 224/262 Test #224: code_api|tool.drcacheoff.basic_counts ........................   Passed   33.34 sec
35.31 sec [00:21:49]  28/235 Test   #6: samples_proj .................................................   Passed   35.31 sec
39.11 sec [00:29:01] 235/235 Test #202: code_api|tool.drcacheoff.view ................................   Passed   39.11 sec
46.57 sec [00:12:48] 214/262 Test #215: code_api|tool.drcachesim.threads-with-config-file ............   Passed   46.57 sec
48.94 sec [00:26:05] 189/235 Test #190: code_api|tool.drcachesim.threads-with-config-file ............   Passed   48.94 sec
50.25 sec [00:13:51] 215/262 Test #214: code_api|tool.drcachesim.threads .............................   Passed   50.25 sec
53.53 sec [00:10:14] ] 53.53 sec
55.00 sec [00:13:51] 216/262 Test #217: code_api|tool.drcachesim.TLB-threads .........................   Passed   55.00 sec
55.05 sec [00:27:09] 190/235 Test #189: code_api|tool.drcachesim.threads .............................   Passed   55.05 sec
57.17 sec [00:16:23] ***Exception:  57.17 sec
57.71 sec [00:27:09] 191/235 Test #192: code_api|tool.drcachesim.TLB-threads .........................   Passed   57.71 sec
84.03 sec [00:27:43] 194/235 Test #191: code_api|tool.drcachesim.coherence ...........................   Passed   84.03 sec
90.02 sec [00:08:33] ] 90.02 sec
101.56 sec [00:14:37] 220/262 Test #216: code_api|tool.drcachesim.coherence ...........................   Passed  101.56 sec
473.63 sec [00:29:01] Total Test time (real) = 473.63 sec
571.97 sec [00:16:23] Total Test time (real) = 571.97 sec

Next target: the 4 drcachesim tests running the client.annotation-concurrency test, each taking 50-100 seconds in each of 32-bit and 64-bit. The plan is to parametrize the matrix size and iterations.

derekbruening added a commit that referenced this issue Feb 2, 2020
Parametrizes the client.annotation-concurrency test to optionally take
in the matrix size and iteration count.  Changes the 4 drcachesim
tests that use this application to pass in a 128 size and 5
iterations, instead of the default 512 and 10, shrinking their
execution time by 7x.

Issue: #4059
derekbruening added a commit that referenced this issue Feb 2, 2020
Parametrizes the client.annotation-concurrency test to optionally take
in the matrix size and iteration count.  Changes the 4 drcachesim
tests that use this application to pass in a 128 size and 5
iterations, instead of the default 512 and 10, shrinking their
execution time by 7x.

Issue: #4059
@derekbruening
Copy link
Contributor Author

I'm thinking of disabling test building for the 64-bit release build for PR's, since we're not running the tests there (only doing release tests for Linux). That should save at least 5 minutes (!).

Another option would be to reduce the # of tests run for 32-bit. This assumes that 32-bit Windows is not as important these days. I would remove some of the less differentiated tests, like half the drcachesim ones. We would still leave the full set for the merge to master.

derekbruening added a commit that referenced this issue Feb 2, 2020
For Appveyor PR's (master merges remain unchanged):

+ Disables building tests for the 64-bit release build, since we're
  not running those (only running on Linux).

+ Disables less-differentiated tests for 32-bit: removes most from
  each group of tool.drcachesim, tool.drcpusim, tool.[^d],
  client.annotation-*.

Issue: #4059
@derekbruening
Copy link
Contributor Author

Down to 29:23 now.

Latest breakdown:

$ egrep 'Build dire|Test project' ~/Downloads/log\ \(30\).txt 
[00:01:40]    Build directory: C:/projects/dynamorio/build/build_debug-internal-32
[00:06:35] Test project C:/projects/dynamorio/build/build_debug-internal-32
[00:11:36]    Build directory: C:/projects/dynamorio/build/build_debug-internal-64
[00:16:12] Test project C:/projects/dynamorio/build/build_debug-internal-64
[00:22:52]    Build directory: C:/projects/dynamorio/build/build_release-external-32
[00:25:28] Test project C:/projects/dynamorio/build/build_release-external-32
[00:25:28]    Build directory: C:/projects/dynamorio/build/build_release-external-64
[00:29:21] Test project C:/projects/dynamorio/build/build_release-external-64
[00:29:21]    Build directory: C:/projects/dynamorio/build/build_release-external-64

derekbruening added a commit that referenced this issue Feb 3, 2020
…4079)

For Appveyor PR's (master merges remain unchanged):

+ Disables building tests for the 64-bit release build, since we're
  not running those (only running on Linux).

+ Disables less-differentiated tests for 32-bit: removes most from
  each group of tool.drcachesim, tool.drcpusim, tool.[^d],
  client.annotation-*.

Issue: #4059
derekbruening added a commit that referenced this issue Feb 9, 2020
Switches to a separate invocation of package.cmake for cronbuilds, to
make them look like release packages.  Cronbuilds on Travis and Appveyor
no longer run the same jobs as a regular build but instead run one
package.cmake job.

Checks out Dr. Memory to include it in the package.
Does a shallow clone, assuming 250 is enough for the embedded DR.
Excludes drmemory/ from vera checks.

Removes the "package" parameter from non-cron builds which should make
them a little faster (xref i#4059).

There are still further decisions and actions but now the cronbuilds have the same
content as past manual builds.

Issue: #2861, #4059
@derekbruening
Copy link
Contributor Author

I removed the fig2dev, ghostscript, and imagemagick installs for #3235.
Before:

$ egrep 'Build dire|Test project' ~/Downloads/log\ \(31\).txt 
[00:01:37]    Build directory: C:/projects/dynamorio/build/build_debug-internal-32

After:

$ egrep 'Build dire|Test project' ~/Downloads/log\ \(50\).txt 
[00:00:45]    Build directory: C:/projects/dynamorio/build/build_debug-internal-32

So that shrunk install time from 1:37 to 0:45.

@derekbruening derekbruening self-assigned this Feb 22, 2020
@derekbruening
Copy link
Contributor Author

So today we're looking at PR builds taking ~27.5 mins, and master builds ~35.5 mins.

Breakdowns:
PR:

$ egrep 'Build dire|Test project' ~/Downloads/log\ \(50\).txt 
[00:00:45]    Build directory: C:/projects/dynamorio/build/build_debug-internal-32
[00:05:55] Test project C:/projects/dynamorio/build/build_debug-internal-32
[00:10:35]    Build directory: C:/projects/dynamorio/build/build_debug-internal-64
[00:15:19] Test project C:/projects/dynamorio/build/build_debug-internal-64
[00:22:06]    Build directory: C:/projects/dynamorio/build/build_release-external-32
[00:24:48] Test project C:/projects/dynamorio/build/build_release-external-32
[00:24:48]    Build directory: C:/projects/dynamorio/build/build_release-external-64
[00:27:36] Test project C:/projects/dynamorio/build/build_release-external-64
[00:27:36]    Build directory: C:/projects/dynamorio/build/build_release-external-64
[00:27:36] Test project C:/projects/dynamorio/build/build_release-external-64

So 5 mins for each of the main builds, 5 mins for -32 tests, 7 mins for -64 tests, 5 mins for the final 2 builds.

Master has +3 mins on -32 tests (has the tests I removed from the PR's); +2 mins on rel-64 build (building tests while PR is not); +3 mins building vps:

$ egrep 'Build dire|Test project' ~/Downloads/log\ \(51\).txt 
[00:00:42]    Build directory: C:/projects/dynamorio/build/build_debug-internal-32
[00:05:42] Test project C:/projects/dynamorio/build/build_debug-internal-32
[00:13:11]    Build directory: C:/projects/dynamorio/build/build_debug-internal-64
[00:17:54] Test project C:/projects/dynamorio/build/build_debug-internal-64
[00:25:58]    Build directory: C:/projects/dynamorio/build/build_release-external-32
[00:28:45] Test project C:/projects/dynamorio/build/build_release-external-32
[00:28:45]    Build directory: C:/projects/dynamorio/build/build_release-external-64
[00:33:56] Test project C:/projects/dynamorio/build/build_release-external-64
[00:34:16]    Build directory: C:/projects/dynamorio/build/build_vps-debug-internal-32
[00:35:13]    Build directory: C:/projects/dynamorio/build/build_vps-debug-internal-32
[00:35:13] Test project C:/projects/dynamorio/build/build_vps-debug-internal-32

At this point further gains for PR's could come from:

  • Don't build 32-bit release in PR's: gain 2:42. Most likely any release-only build warnings will show up in 64-bit.
  • Shorten long tests further.

For master:

For shortening long tests here are the longest ones:

$ grep '[0-9] sec' ~/Downloads/log\ \(50\).txt | sed 's/\r//' | awk '{print $(NF-1),$NF,$0}' | sort -n
<...>
10.20 sec [00:16:58]  91/237 Test  #89: code_api|client.annotation-concurrency.bb-truncate-1 .........   Passed   10.20 sec
10.71 sec [00:17:41] 130/237 Test #128: code_api|client.drreg-test ...................................   Passed   10.71 sec
11.15 sec [00:20:47] 197/237 Test #196: code_api|tool.basic_counts ...................................   Passed   11.15 sec
11.38 sec [00:20:32] 195/237 Test #195: code_api|tool.reuse_distance .................................   Passed   11.38 sec
12.17 sec [00:09:24] 186/225 Test #180: code_api|sample.instrace_x86_text ............................   Passed   12.17 sec
12.62 sec [00:06:13]   7/225 Test   #7: drmemtrace_proj ..............................................   Passed   12.62 sec
12.66 sec [00:09:51] 200/225 Test #200: code_api|tool.basic_counts ...................................   Passed   12.66 sec
12.88 sec [00:18:34] 155/237 Test #154: code_api|sample.memtrace_simple ..............................   Passed   12.88 sec
12.96 sec [00:18:53] 166/237 Test #163: code_api|sample.instrace_x86_text ............................   Passed   12.96 sec
13.70 sec [00:09:55] 201/225 Test #201: code_api|tool.drcachesim.invariants ..........................   Passed   13.70 sec
13.99 sec [00:08:54] 172/225 Test #171: code_api|sample.memtrace_simple ..............................   Passed   13.99 sec
15.10 sec [00:20:47] 198/237 Test #198: code_api|tool.drcachesim.invariants ..........................   Passed   15.10 sec
15.13 sec [00:18:53] 171/237 Test #167: code_api|sample.instrcalls ...................................   Passed   15.13 sec
16.24 sec [00:07:21]  94/225 Test  #75: code_api|win32.dotnet ........................................   Passed   16.24 sec
17.92 sec [00:21:18] 199/237 Test #199: code_api|tool.drcacheoff.simple ..............................   Passed   17.92 sec
19.87 sec [00:21:18] 201/237 Test #202: code_api|tool.drcacheoff.opcode_mix ..........................   Passed   19.87 sec
21.20 sec [00:19:50] 190/237 Test #191: code_api|tool.drcachesim.threads-with-config-file ............   Passed   21.20 sec
22.34 sec [00:19:50] 191/237 Test #190: code_api|tool.drcachesim.threads .............................   Passed   22.34 sec
22.34 sec [00:20:21] 192/237 Test #193: code_api|tool.drcachesim.TLB-threads .........................   Passed   22.34 sec
24.94 sec [00:21:18] 202/237 Test #201: code_api|tool.drcacheoff.basic_counts ........................   Passed   24.94 sec
25.46 sec [00:10:35] 225/225 Test #202: code_api|tool.drcacheoff.simple ..............................   Passed   25.46 sec
32.14 sec [00:20:32] 194/237 Test #192: code_api|tool.drcachesim.coherence ...........................   Passed   32.14 sec
36.84 sec [00:16:07]  29/237 Test   #6: samples_proj .................................................   Passed   36.84 sec
41.24 sec [00:22:06] 237/237 Test #203: code_api|tool.drcacheoff.view ................................   Passed   41.24 sec
42.86 sec [00:06:47]  32/225 Test   #6: samples_proj .................................................   Passed   42.86 sec

I don't think samples_proj is going to get faster: so we're talking about speeding up the drcachesim tests further. Cutting, say, 10 of those 15s-30s in half would save say 4 mins cpu time, but with parallel jobs might save 1-2 mins overall?

derekbruening added a commit that referenced this issue Feb 22, 2020
Removes the 32-bit release build from PR builds (the 64-bit should
catch nearly all warnings).

Further shrinks drcachesim tests using the Jacobi app by dropping to a
64 matrix size and 3 instead of 5 iterations.

Shrinks drcacheoff tests on Windows by capping the trace sizes at 1M,
except for basic_counts which needs the full run to see kernel events.
Relaxes all of the templates to allow for correspondingly varying
simulator statistics.

Issue: #4059
derekbruening added a commit that referenced this issue Feb 22, 2020
Removes the 32-bit release build from PR builds (the 64-bit should
catch nearly all warnings).

Further shrinks drcachesim tests using the Jacobi app by dropping to a
64 matrix size and 3 instead of 5 iterations.

Shrinks drcacheoff tests on Windows by capping the trace sizes at 1M,
except for basic_counts which needs the full run to see kernel events.
Relaxes all of the templates to allow for correspondingly varying
simulator statistics.

Issue: #4059
@derekbruening
Copy link
Contributor Author

Now we're down to 23:20:
https://ci.appveyor.com/project/DynamoRIO/dynamorio/builds/30987661

$ egrep 'Build dire|Test project' ~/Downloads/log\ \(53\).txt 
[00:00:50]    Build directory: C:/projects/dynamorio/build/build_debug-internal-32
[00:05:40] Test project C:/projects/dynamorio/build/build_debug-internal-32
[00:10:01]    Build directory: C:/projects/dynamorio/build/build_debug-internal-64
[00:14:41] Test project C:/projects/dynamorio/build/build_debug-internal-64
[00:20:24]    Build directory: C:/projects/dynamorio/build/build_release-external-64
[00:23:10] Test project C:/projects/dynamorio/build/build_release-external-64
[00:23:10]    Build directory: C:/projects/dynamorio/build/build_release-external-64
[00:23:10] Test project C:/projects/dynamorio/build/build_release-external-64
$ grep '[0-9] sec' ~/Downloads/log\ \(53\).txt | sed 's/\r//' | awk '{print $(NF-1),$NF,$0}' | sort -n
<...>
10.76 sec [00:16:58] 133/236 Test #128: code_api|client.drreg-test ...................................   Passed   10.76 sec
11.20 sec [00:19:42] 196/236 Test #195: code_api|tool.basic_counts ...................................   Passed   11.20 sec
11.79 sec [00:19:42] 194/236 Test #194: code_api|tool.reuse_distance .................................   Passed   11.79 sec
11.96 sec [00:05:58]   7/224 Test   #7: drmemtrace_proj ..............................................   Passed   11.96 sec
12.23 sec [00:09:02] 186/224 Test #179: code_api|sample.instrace_x86_text ............................   Passed   12.23 sec
12.55 sec [00:17:30] 154/236 Test #153: code_api|sample.memtrace_simple ..............................   Passed   12.55 sec
12.63 sec [00:09:29] 199/224 Test #199: code_api|tool.basic_counts ...................................   Passed   12.63 sec
13.05 sec [00:18:00] 165/236 Test #162: code_api|sample.instrace_x86_text ............................   Passed   13.05 sec
13.81 sec [00:09:34] 200/224 Test #200: code_api|tool.drcachesim.invariants ..........................   Passed   13.81 sec
14.14 sec [00:08:32] 171/224 Test #170: code_api|sample.memtrace_simple ..............................   Passed   14.14 sec
15.00 sec [00:18:08] 171/236 Test #166: code_api|sample.instrcalls ...................................   Passed   15.00 sec
15.73 sec [00:07:15]  94/224 Test  #75: code_api|win32.dotnet ........................................   Passed   15.73 sec
15.93 sec [00:19:57] 199/236 Test #197: code_api|tool.drcachesim.invariants ..........................   Passed   15.93 sec
17.04 sec [00:19:17] 189/236 Test #190: code_api|tool.drcachesim.threads-with-config-file ............   Passed   17.04 sec
17.78 sec [00:19:17] 190/236 Test #189: code_api|tool.drcachesim.threads .............................   Passed   17.78 sec
17.86 sec [00:19:32] 191/236 Test #192: code_api|tool.drcachesim.TLB-threads .........................   Passed   17.86 sec
24.81 sec [00:19:32] 192/236 Test #191: code_api|tool.drcachesim.coherence ...........................   Passed   24.81 sec
25.65 sec [00:20:16] 213/236 Test #200: code_api|tool.drcacheoff.basic_counts ........................   Passed   25.65 sec
35.53 sec [00:15:30]  30/236 Test   #6: samples_proj .................................................   Passed   35.53 sec
41.77 sec [00:06:31]  32/224 Test   #6: samples_proj .................................................   Passed   41.77 sec
241.00 sec [00:10:01] Total Test time (real) = 241.00 sec
342.75 sec [00:20:24] Total Test time (real) = 342.75 sec

There are only 4 tests over 20s now.

Going to call this good enough.
Closing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant