Skip to content

Commit 35994d4

Browse files
OhYashnovemberborn
andauthored
Have the global timeout take into account t.timeout() durations
Fixes #2384. Co-authored-by: Mark Wubben <[email protected]>
1 parent a8c908e commit 35994d4

File tree

7 files changed

+55
-5
lines changed

7 files changed

+55
-5
lines changed

lib/api.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,16 @@ export default class Api extends Emittery {
7373
const pendingWorkers = new Set();
7474
const timedOutWorkerFiles = new Set();
7575
let restartTimer;
76+
let ignoreTimeoutsUntil = 0;
7677
if (apiOptions.timeout && !apiOptions.debug) {
7778
const timeout = ms(apiOptions.timeout);
7879

7980
restartTimer = debounce(() => {
81+
if (Date.now() < ignoreTimeoutsUntil) {
82+
restartTimer();
83+
return;
84+
}
85+
8086
// If failFast is active, prevent new test files from running after
8187
// the current ones are exited.
8288
if (failFast) {
@@ -233,6 +239,11 @@ export default class Api extends Emittery {
233239
}
234240

235241
const worker = fork(file, options, apiOptions.nodeArguments);
242+
worker.onStateChange(data => {
243+
if (data.type === 'test-timeout-configured' && !apiOptions.debug) {
244+
ignoreTimeoutsUntil = Math.max(ignoreTimeoutsUntil, Date.now() + data.period);
245+
}
246+
});
236247
runStatus.observeWorker(worker, file, {selectingLines: lineNumbers.length > 0});
237248
deregisteredSharedWorkers.push(observeWorkerProcess(worker, runStatus));
238249

lib/runner.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@ export default class Runner extends Emittery {
6666
return true;
6767
};
6868

69+
this.notifyTimeoutUpdate = timeoutMs => {
70+
this.emit('stateChange', {
71+
type: 'test-timeout-configured',
72+
period: timeoutMs
73+
});
74+
};
75+
6976
let hasStarted = false;
7077
let scheduledStart = false;
7178
const meta = Object.freeze({
@@ -290,7 +297,8 @@ export default class Runner extends Emittery {
290297
powerAssert: this.powerAssert,
291298
title: `${task.title}${titleSuffix || ''}`,
292299
isHook: true,
293-
testPassed
300+
testPassed,
301+
notifyTimeoutUpdate: this.notifyTimeoutUpdate
294302
}));
295303
const outcome = await this.runMultiple(hooks, this.serial);
296304
for (const result of outcome.storedResults) {
@@ -341,7 +349,8 @@ export default class Runner extends Emittery {
341349
metadata: task.metadata,
342350
powerAssert: this.powerAssert,
343351
title: task.title,
344-
registerUniqueTitle: this.registerUniqueTitle
352+
registerUniqueTitle: this.registerUniqueTitle,
353+
notifyTimeoutUpdate: this.notifyTimeoutUpdate
345354
});
346355

347356
const result = await this.runSingle(test);

lib/test.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ export default class Test {
208208
this.registerUniqueTitle = options.registerUniqueTitle;
209209
this.logs = [];
210210
this.teardowns = [];
211+
this.notifyTimeoutUpdate = options.notifyTimeoutUpdate;
211212

212213
const {snapshotBelongsTo = this.title, nextSnapshotIndex = 0} = options;
213214
this.snapshotBelongsTo = snapshotBelongsTo;
@@ -431,6 +432,8 @@ export default class Test {
431432
this.finishDueToTimeout();
432433
}
433434
}, ms);
435+
436+
this.notifyTimeoutUpdate(this.timeoutMs);
434437
}
435438

436439
refreshTimeout() {

test-tap/api.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,8 @@ for (const opt of opts) {
291291

292292
return api.run({files: [
293293
path.join(__dirname, 'fixture/fail-fast/timeout/fails.cjs'),
294-
path.join(__dirname, 'fixture/fail-fast/timeout/passes.cjs')
294+
path.join(__dirname, 'fixture/fail-fast/timeout/passes.cjs'),
295+
path.join(__dirname, 'fixture/fail-fast/timeout/passes-slow.cjs')
295296
]})
296297
.then(runStatus => {
297298
t.ok(api.options.failFast);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
const delay = require('delay');
2+
3+
const test = require('../../../../entrypoints/main.cjs');
4+
5+
test('slow pass with timeout', async t => {
6+
t.timeout(120);
7+
await delay(110);
8+
t.pass();
9+
});

test-tap/helper/ava-test.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ export function withExperiments(experiments = {}) {
2020
fn,
2121
registerUniqueTitle,
2222
metadata: {type: 'test'},
23-
title
23+
title,
24+
notifyTimeoutUpdate() {}
2425
});
2526
}
2627

@@ -32,7 +33,8 @@ export function withExperiments(experiments = {}) {
3233
fn,
3334
registerUniqueTitle,
3435
metadata: {type: 'test', failing: true},
35-
title: 'test.failing'
36+
title: 'test.failing',
37+
notifyTimeoutUpdate() {}
3638
});
3739
};
3840

test-tap/runner.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,21 @@ test('runner emits "stateChange" events', t => {
6363
});
6464
});
6565

66+
test('notifyTimeoutUpdate emits "stateChange" event', t => {
67+
const runner = new Runner();
68+
69+
runner.on('stateChange', evt => {
70+
if (evt.type === 'test-timeout-configured') {
71+
t.same(evt, {
72+
type: 'test-timeout-configured',
73+
period: 120
74+
});
75+
t.end();
76+
}
77+
});
78+
runner.notifyTimeoutUpdate(120);
79+
});
80+
6681
test('run serial tests before concurrent ones', t => {
6782
const array = [];
6883
return promiseEnd(new Runner(), runner => {

0 commit comments

Comments
 (0)