Skip to content

Commit d77a6a7

Browse files
authored
Merge pull request #3412 from dmichon-msft/async-concurrency-test
[node-core-library] Add async iterator test
2 parents 5508b57 + 9aa7c14 commit d77a6a7

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"changes": [
3+
{
4+
"packageName": "@rushstack/node-core-library",
5+
"comment": "",
6+
"type": "none"
7+
}
8+
],
9+
"packageName": "@rushstack/node-core-library"
10+
}

libraries/node-core-library/src/test/Async.test.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,48 @@ describe(Async.name, () => {
249249
).rejects.toThrow(expectedError);
250250
});
251251

252+
it('does not exceed the maxiumum concurrency for an async iterator', async () => {
253+
let waitingIterators: number = 0;
254+
255+
let resolve2!: (value: { done: true; value: undefined }) => void;
256+
const signal2: Promise<{ done: true; value: undefined }> = new Promise((resolve, reject) => {
257+
resolve2 = resolve;
258+
});
259+
260+
let iteratorIndex: number = 0;
261+
const asyncIterator: AsyncIterator<number> = {
262+
next: () => {
263+
iteratorIndex++;
264+
if (iteratorIndex < 20) {
265+
return Promise.resolve({ done: false, value: iteratorIndex });
266+
} else {
267+
++waitingIterators;
268+
return signal2;
269+
}
270+
}
271+
};
272+
const asyncIterable: AsyncIterable<number> = {
273+
[Symbol.asyncIterator]: () => asyncIterator
274+
};
275+
276+
const expectedConcurrency: 4 = 4;
277+
const finalPromise: Promise<void> = Async.forEachAsync(
278+
asyncIterable,
279+
async (item) => {
280+
// Do nothing
281+
},
282+
{
283+
concurrency: expectedConcurrency
284+
}
285+
);
286+
287+
// Wait for all the instant resolutions to be done
288+
await Async.sleep(1);
289+
expect(waitingIterators).toEqual(expectedConcurrency);
290+
resolve2({ done: true, value: undefined });
291+
await finalPromise;
292+
});
293+
252294
it('rejects if an async iterator rejects', async () => {
253295
const expectedError: Error = new Error('iterator error');
254296
let iteratorIndex: number = 0;

0 commit comments

Comments
 (0)