rsxjs
Version:
Resilience Extensions for JS.
88 lines (71 loc) • 2.18 kB
JavaScript
/**
* @file tests/mutex/test-mutex.js
* @copyright 2018-present Karim Alibhai. All rights reserved.
*/
import { test } from "../../helpers";
import { delay } from "bluebird";
import { Mutex } from "../../../";
const DELAY = 100;
function createTest(method, fn) {
return async (t) => {
const LEN = 30;
const frames = [];
const lockedFn = Mutex[method](fn);
// concurrently start 30 of these, should
// take 3s to run and all frames should be
// 100ms+ apart
const start = Date.now();
await Promise.all([...new Array(LEN).keys()].map(() => lockedFn(frames)));
const end = Date.now();
t.true(end - start >= 3e3, "should take at least 3s to run");
t.is(frames.length, LEN, `should have ${LEN} frames`);
for (let i = 1; i < frames.length; ++i) {
t.true(
frames[i] - frames[i - 1] >= DELAY,
`should have at least ${DELAY}ms between frames`
);
}
};
}
test(
"Mutex#fromAsync",
createTest("fromAsync", async function (frames) {
await delay(DELAY + 1);
frames.push(Date.now());
})
);
test(
"Mutex#fromGenerator",
createTest("fromGenerator", function* (frames) {
const r = Math.random();
if (r !== (yield r) || r !== (yield Promise.resolve(r))) {
throw new Error(`Mutex.fromGenerator() should return values in yields`);
}
yield delay(DELAY + 1);
frames.push(Date.now());
})
);
test("Mutex#lock", async (t) => {
const LEN = 30;
const frames = [];
async function lockedFn() {
const m = await Mutex.lock({ name: "test" });
await delay(DELAY + 1);
frames.push(Date.now());
await m.unlock();
}
// concurrently start 30 of these, should
// take 3s to run and all frames should be
// 100ms+ apart
const start = Date.now();
await Promise.all([...new Array(LEN).keys()].map(() => lockedFn(frames)));
const end = Date.now();
t.true(end - start >= 3e3, "should take at least 3s to run");
t.is(frames.length, LEN, `should have ${LEN} frames`);
for (let i = 1; i < frames.length; ++i) {
t.true(
frames[i] - frames[i - 1] >= DELAY,
`should have at least ${DELAY}ms between frames`
);
}
});