From 5cd3df8fe1da5dcf8795568802f7b175043999de Mon Sep 17 00:00:00 2001 From: cjihrig Date: Thu, 21 Mar 2024 14:09:23 -0400 Subject: [PATCH] test_runner: simplify test end time tracking This commit simplifies the logic for tracking test end time. The end time is now only set in postRun(), which every test runs when it ends. PR-URL: https://github.com/nodejs/node/pull/52182 Reviewed-By: Yagiz Nizipli Reviewed-By: Chemi Atlow --- lib/internal/test_runner/test.js | 29 ++++++------------- .../output/hooks_spec_reporter.snapshot | 12 ++++---- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/lib/internal/test_runner/test.js b/lib/internal/test_runner/test.js index cb4824331e943e..bec00e385fab24 100644 --- a/lib/internal/test_runner/test.js +++ b/lib/internal/test_runner/test.js @@ -473,7 +473,7 @@ class Test extends AsyncResource { }; #cancel(error) { - if (this.endTime !== null) { + if (this.endTime !== null || this.error !== null) { return; } @@ -511,17 +511,15 @@ class Test extends AsyncResource { return; } - this.endTime = hrtime(); this.passed = false; this.error = err; } pass() { - if (this.endTime !== null) { + if (this.error !== null) { return; } - this.endTime = hrtime(); this.passed = true; } @@ -654,15 +652,8 @@ class Test extends AsyncResource { } this.pass(); - try { - await afterEach(); - await after(); - } catch (err) { - // If one of the after hooks has thrown unset endTime so that the - // catch below can do its cancel/fail logic. - this.endTime = null; - throw err; - } + await afterEach(); + await after(); } catch (err) { if (isTestFailureError(err)) { if (err.failureType === kTestTimeoutFailure) { @@ -698,13 +689,10 @@ class Test extends AsyncResource { } postRun(pendingSubtestsError) { - this.startTime ??= hrtime(); - - // If the test was failed before it even started, then the end time will - // be earlier than the start time. Correct that here. - if (this.endTime < this.startTime) { - this.endTime = hrtime(); - } + // If the test was cancelled before it started, then the start and end + // times need to be corrected. + this.endTime ??= hrtime(); + this.startTime ??= this.endTime; // The test has run, so recursively cancel any outstanding subtests and // mark this test as failed if any subtests failed. @@ -912,6 +900,7 @@ class TestHook extends Test { error.failureType = kHookFailure; } + this.endTime ??= hrtime(); parent.reporter.fail(0, loc, parent.subtests.length + 1, loc.file, { __proto__: null, duration_ms: this.duration(), diff --git a/test/fixtures/test-runner/output/hooks_spec_reporter.snapshot b/test/fixtures/test-runner/output/hooks_spec_reporter.snapshot index a4f40e4321ff89..4158335409aba1 100644 --- a/test/fixtures/test-runner/output/hooks_spec_reporter.snapshot +++ b/test/fixtures/test-runner/output/hooks_spec_reporter.snapshot @@ -11,10 +11,10 @@ describe hooks - no subtests (*ms) before throws - 1 (*ms) + 1 'test did not finish before its parent and was cancelled' - 2 (*ms) + 2 'test did not finish before its parent and was cancelled' before throws (*ms) @@ -390,7 +390,7 @@ - after() called run after when before throws - 1 (*ms) + 1 'test did not finish before its parent and was cancelled' run after when before throws (*ms) @@ -422,11 +422,11 @@ failing tests: * - 1 (*ms) + 1 'test did not finish before its parent and was cancelled' * - 2 (*ms) + 2 'test did not finish before its parent and was cancelled' * @@ -772,7 +772,7 @@ * * - 1 (*ms) + 1 'test did not finish before its parent and was cancelled' *