Skip to content

Commit 60d4ecb

Browse files
authored
Make async tests more reliable (#1024)
1 parent 58749fe commit 60d4ecb

2 files changed

Lines changed: 29 additions & 7 deletions

File tree

client-node-tests/src/converter.test.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,20 +78,29 @@ function assertDiagnosticCode(value: string | number | DiagnosticCode | undefine
7878
}
7979

8080
suite('Async Array', () => {
81+
82+
suiteSetup(() => {
83+
async.setTestMode();
84+
});
85+
86+
suiteTeardown(() => {
87+
async.clearTestMode();
88+
});
89+
8190
test('map', async() => {
8291
const ranges: proto.Range[] = new Array(10000);
8392
for (let i = 0; i < ranges.length; i++) {
8493
ranges[i] = proto.Range.create(i, i, i, i);
8594
}
8695
let yielded = 0;
87-
const converted = await async.map(ranges, p2c.asRange, undefined, { yieldCallback: () => { yielded++; }});
96+
const converted = await async.map(ranges, p2c.asRange, undefined, { yieldAfter: 2, yieldCallback: () => { yielded++; }});
8897
ok(yielded > 0);
8998
strictEqual(converted.length, ranges.length);
9099
for (let i = 0; i < converted.length; i++) {
91100
ok(converted[i] instanceof vscode.Range);
92101
strictEqual(converted[i]?.start.line, i);
93102
}
94-
});
103+
}).timeout(5000);
95104

96105
test('map async', async() => {
97106
const ranges: proto.Range[] = new Array(5000);
@@ -105,14 +114,14 @@ suite('Async Array', () => {
105114
resolve(p2c.asRange(item));
106115
});
107116
});
108-
}, undefined, { yieldCallback: () => { yielded++; }});
117+
}, undefined, { yieldAfter: 2, yieldCallback: () => { yielded++; }});
109118
ok(yielded > 0);
110119
strictEqual(converted.length, ranges.length);
111120
for (let i = 0; i < converted.length; i++) {
112121
ok(converted[i] instanceof vscode.Range);
113122
strictEqual(converted[i]?.start.line, i);
114123
}
115-
});
124+
}).timeout(5000);
116125

117126
test('forEach', async() => {
118127
const ranges: proto.Range[] = new Array(7500);
@@ -124,10 +133,10 @@ suite('Async Array', () => {
124133
await async.forEach(ranges, (item) => {
125134
const codeRange = p2c.asRange(item);
126135
sum += codeRange.start.line;
127-
}, undefined, { yieldCallback: () => { yielded++; }});
136+
}, undefined, { yieldAfter: 2, yieldCallback: () => { yielded++; }});
128137
ok(yielded > 0);
129138
strictEqual(sum, 28128750);
130-
});
139+
}).timeout(5000);
131140
});
132141

133142
suite('Protocol Converter', () => {

client/src/common/utils/async.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,18 @@ export class Semaphore<T = void> {
156156
}
157157
}
158158

159+
let $test: boolean = false;
160+
export function setTestMode() {
161+
$test = true;
162+
}
163+
export function clearTestMode() {
164+
$test = false;
165+
}
166+
159167
const defaultYieldTimeout: number = 15 /*ms*/;
160168

169+
declare const console: any;
170+
161171
class Timer {
162172

163173
private readonly yieldAfter: number;
@@ -167,14 +177,17 @@ class Timer {
167177
private counterInterval: number;
168178

169179
constructor(yieldAfter: number = defaultYieldTimeout) {
170-
this.yieldAfter = Math.max(yieldAfter, defaultYieldTimeout);
180+
this.yieldAfter = $test === true ? Math.max(yieldAfter, 2) : Math.max(yieldAfter, defaultYieldTimeout);
171181
this.startTime = Date.now();
172182
this.counter = 0;
173183
this.total = 0;
174184
// start with a counter interval of 1.
175185
this.counterInterval = 1;
176186
}
177187
public start() {
188+
this.counter = 0;
189+
this.total = 0;
190+
this.counterInterval = 1;
178191
this.startTime = Date.now();
179192
}
180193
public shouldYield(): boolean {

0 commit comments

Comments
 (0)