-
Notifications
You must be signed in to change notification settings - Fork 41
Expand file tree
/
Copy pathnativePythonFinder.configureTimeout.unit.test.ts
More file actions
119 lines (100 loc) · 4.11 KB
/
nativePythonFinder.configureTimeout.unit.test.ts
File metadata and controls
119 lines (100 loc) · 4.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import assert from 'node:assert';
import {
ConfigureRetryState,
RpcTimeoutError,
getConfigureTimeoutMs,
} from '../../../managers/common/nativePythonFinder';
suite('RpcTimeoutError', () => {
test('has correct name property', () => {
const error = new RpcTimeoutError('configure', 30000);
assert.strictEqual(error.name, 'RpcTimeoutError');
});
test('has correct method property', () => {
const error = new RpcTimeoutError('configure', 30000);
assert.strictEqual(error.method, 'configure');
});
test('message includes method name and timeout', () => {
const error = new RpcTimeoutError('resolve', 5000);
assert.strictEqual(error.message, "Request 'resolve' timed out after 5000ms");
});
test('is instanceof Error', () => {
const error = new RpcTimeoutError('configure', 30000);
assert.ok(error instanceof Error);
assert.ok(error instanceof RpcTimeoutError);
});
});
suite('getConfigureTimeoutMs', () => {
test('returns base timeout (30s) on first attempt', () => {
assert.strictEqual(getConfigureTimeoutMs(0), 30_000);
});
test('doubles timeout on first retry (60s)', () => {
assert.strictEqual(getConfigureTimeoutMs(1), 60_000);
});
test('doubles again on second retry (120s)', () => {
assert.strictEqual(getConfigureTimeoutMs(2), 120_000);
});
test('caps at REFRESH_TIMEOUT_MS (120s) for higher retries', () => {
// 30_000 * 2^3 = 240_000, but capped at 120_000
assert.strictEqual(getConfigureTimeoutMs(3), 120_000);
assert.strictEqual(getConfigureTimeoutMs(10), 120_000);
});
});
suite('ConfigureRetryState', () => {
let state: ConfigureRetryState;
setup(() => {
state = new ConfigureRetryState();
});
test('initial timeout count is 0', () => {
assert.strictEqual(state.timeoutCount, 0);
});
test('initial timeout is base (30s)', () => {
assert.strictEqual(state.getTimeoutMs(), 30_000);
});
test('onSuccess resets timeout count', () => {
state.onTimeout(); // count = 1
state.onSuccess();
assert.strictEqual(state.timeoutCount, 0);
assert.strictEqual(state.getTimeoutMs(), 30_000);
});
test('first timeout does not kill (returns false)', () => {
const shouldKill = state.onTimeout();
assert.strictEqual(shouldKill, false);
assert.strictEqual(state.timeoutCount, 1);
});
test('first timeout increases next timeout to 60s', () => {
state.onTimeout();
assert.strictEqual(state.getTimeoutMs(), 60_000);
});
test('second consecutive timeout kills (returns true)', () => {
state.onTimeout(); // count = 1
const shouldKill = state.onTimeout(); // count = 2 → kill → reset to 0
assert.strictEqual(shouldKill, true);
assert.strictEqual(state.timeoutCount, 0); // Reset after kill
});
test('non-timeout error resets counter via reset()', () => {
state.onTimeout(); // count = 1
state.reset(); // simulates non-timeout error
assert.strictEqual(state.timeoutCount, 0);
// Next timeout should not trigger kill
const shouldKill = state.onTimeout();
assert.strictEqual(shouldKill, false);
});
test('interleaved non-timeout error prevents premature kill', () => {
state.onTimeout(); // count = 1
state.reset(); // non-timeout error resets
state.onTimeout(); // count = 1 again (not 2)
assert.strictEqual(state.timeoutCount, 1);
// Still shouldn't kill — only 1 consecutive timeout
assert.strictEqual(state.getTimeoutMs(), 60_000);
});
test('reset after kill allows fresh retry cycle', () => {
state.onTimeout();
state.onTimeout(); // kill → reset
// Counter was reset by onTimeout when it returned true
assert.strictEqual(state.timeoutCount, 0);
assert.strictEqual(state.getTimeoutMs(), 30_000);
// First timeout of new cycle should not kill
const shouldKill = state.onTimeout();
assert.strictEqual(shouldKill, false);
});
});