Skip to content

Commit fa48543

Browse files
committed
Moshe Suggestion
1 parent 60b916d commit fa48543

File tree

1 file changed

+27
-54
lines changed

1 file changed

+27
-54
lines changed

lib/internal/test_runner/test.js

Lines changed: 27 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ const {
2222
SafePromiseRace,
2323
ObjectDefineProperty,
2424
Symbol,
25+
SymbolDispose,
2526
} = primordials;
2627
const { AsyncResource } = require('async_hooks');
28+
const { addAbortListener } = require('events');
2729
const { AbortController } = require('internal/abort_controller');
2830
const {
2931
codes: {
@@ -77,56 +79,27 @@ let kResistStopPropagation;
7779

7880
function stopTest(timeout, signal) {
7981
const deferred = createDeferredPromise();
82+
const abortListener = addAbortListener(signal, deferred.resolve);
83+
let timer;
84+
8085

8186
if (timeout === kDefaultTimeout) {
82-
signal.addEventListener('abort', deferred.resolve, { __proto__: null, once: true });
83-
84-
ObjectDefineProperty(deferred, 'cleanup', {
85-
__proto__: null,
86-
configurable: true,
87-
writable: true,
88-
value: () => signal.removeEventListener('abort', deferred.resolve),
89-
});
90-
91-
return deferred;
92-
}
93-
94-
signal.addEventListener('abort', throwOnAbort, { __proto__: null, once: true });
95-
const cleanAbort = () => signal.removeEventListener('abort', throwOnAbort);
96-
const timer = setTimeout(() => {
97-
deferred.resolve();
98-
cleanAbort();
99-
}, timeout);
100-
101-
timer.unref();
102-
function throwOnAbort() {
103-
deferred.reject(new AbortError(undefined, { cause: signal.reason }));
104-
clearTimeout(timer);
105-
}
106-
107-
ObjectDefineProperty(deferred, 'promise', {
108-
__proto__: null,
109-
configurable: true,
110-
writable: true,
111-
value: PromisePrototypeThen(deferred.promise, () => {
87+
deferred.promise[SymbolDispose] = abortListener[SymbolDispose];
88+
} if (timeout !== kDefaultTimeout) {
89+
timer = setTimeout(() => deferred.resolve(), timeout);
90+
timer.unref();
91+
deferred.promise = PromisePrototypeThen(deferred.promise, () => {
11292
throw new ERR_TEST_FAILURE(
11393
`test timed out after ${timeout}ms`,
11494
kTestTimeoutFailure,
11595
);
116-
}),
117-
});
118-
119-
ObjectDefineProperty(deferred, 'cleanup', {
120-
__proto__: null,
121-
configurable: true,
122-
writable: true,
123-
value: () => {
124-
clearTimeout(timer);
125-
cleanAbort();
126-
},
127-
});
128-
129-
return deferred;
96+
});
97+
deferred.promise[SymbolDispose] = () => {
98+
abortListener[SymbolDispose]();
99+
timer[SymbolDispose]();
100+
}
101+
}
102+
return deferred.promise;
130103
}
131104

132105
class TestContext {
@@ -591,7 +564,7 @@ class Test extends AsyncResource {
591564
}
592565
});
593566

594-
let stopPromiseWrapper;
567+
let stopPromise;
595568

596569
try {
597570
if (this.parent?.hooks.before.length > 0) {
@@ -600,7 +573,7 @@ class Test extends AsyncResource {
600573
if (this.parent?.hooks.beforeEach.length > 0) {
601574
await this.parent.runHook('beforeEach', { args, ctx });
602575
}
603-
stopPromiseWrapper = stopTest(this.timeout, this.signal);
576+
stopPromise = stopTest(this.timeout, this.signal);
604577
const runArgs = ArrayPrototypeSlice(args);
605578
ArrayPrototypeUnshift(runArgs, this.fn, ctx);
606579

@@ -616,14 +589,14 @@ class Test extends AsyncResource {
616589
'passed a callback but also returned a Promise',
617590
kCallbackAndPromisePresent,
618591
));
619-
await SafePromiseRace([ret, stopPromiseWrapper.promise]);
592+
await SafePromiseRace([ret, stopPromise]);
620593
} else {
621-
await SafePromiseRace([PromiseResolve(promise), stopPromiseWrapper.promise]);
594+
await SafePromiseRace([PromiseResolve(promise), stopPromise]);
622595
}
623596
} else {
624597
// This test is synchronous or using Promises.
625598
const promise = ReflectApply(this.runInAsyncScope, this, runArgs);
626-
await SafePromiseRace([PromiseResolve(promise), stopPromiseWrapper.promise]);
599+
await SafePromiseRace([PromiseResolve(promise), stopPromise]);
627600
}
628601

629602
if (this[kShouldAbort]()) {
@@ -647,7 +620,7 @@ class Test extends AsyncResource {
647620
this.fail(new ERR_TEST_FAILURE(err, kTestCodeFailure));
648621
}
649622
} finally {
650-
stopPromiseWrapper?.cleanup();
623+
stopPromise?.[SymbolDispose]();
651624

652625
// Do not abort hooks and the root test as hooks instance are shared between tests suite so aborting them will
653626
// cause them to not run for further tests.
@@ -863,7 +836,7 @@ class Suite extends Test {
863836
async run() {
864837
const hookArgs = this.getRunArgs();
865838

866-
let stopPromiseWrapper;
839+
let stopPromise;
867840
try {
868841
this.parent.activeSubtests++;
869842
await this.buildSuite;
@@ -881,11 +854,11 @@ class Suite extends Test {
881854

882855
await this.runHook('before', hookArgs);
883856

884-
stopPromiseWrapper = stopTest(this.timeout, this.signal);
857+
stopPromise = stopTest(this.timeout, this.signal);
885858
const subtests = this.skipped || this.error ? [] : this.subtests;
886859
const promise = SafePromiseAll(subtests, (subtests) => subtests.start());
887860

888-
await SafePromiseRace([promise, stopPromiseWrapper.promise]);
861+
await SafePromiseRace([promise, stopPromise]);
889862
await this.runHook('after', hookArgs);
890863

891864
this.pass();
@@ -896,7 +869,7 @@ class Suite extends Test {
896869
this.fail(new ERR_TEST_FAILURE(err, kTestCodeFailure));
897870
}
898871
} finally {
899-
stopPromiseWrapper?.cleanup();
872+
stopPromise?.[SymbolDispose]();
900873
}
901874

902875
this.postRun();

0 commit comments

Comments
 (0)