blob: 57818d1d1c1e64ebcd902ed0ce367d87d27d2fbc [file] [log] [blame]
/*---------------------------------------------------------
* Copyright 2021 The Go Authors. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------*/
import * as assert from 'assert';
import { Mutex } from '../../src/utils/mutex';
suite('Mutex Tests', () => {
test('works for basic concurrent access', async () => {
const m = new Mutex();
let cnt = 0;
const worker = async (delay: number, count: number) => {
for (let i = 0; i < count; i++) {
const unlock = await m.lock();
try {
const cntCopy = cnt;
await sleep(delay);
cnt = cntCopy + 1;
} finally {
unlock();
}
}
};
await Promise.all([worker(3, 5), worker(1, 10)]);
assert.strictEqual(cnt, 15);
});
test('works when lock holders throw errors', async () => {
const m = new Mutex();
let cnt = 0;
const worker = async (delay: number) => {
const unlock = await m.lock();
try {
const cntCopy = cnt;
await sleep(delay);
cnt = cntCopy + 1;
throw new Error('ooops');
} finally {
unlock();
}
};
const safeWorker = async (delay: number) => {
try {
await worker(delay);
} catch (e) {
// swallow the exception
}
};
await Promise.all([safeWorker(3), safeWorker(2), safeWorker(1), safeWorker(0)]);
assert.strictEqual(cnt, 4);
});
});
function sleep(ms: number) {
return new Promise((resolve) => setTimeout(resolve, ms));
}