Add lock tests
This commit is contained in:
parent
7daa363723
commit
4fb3839b3e
1 changed files with 60 additions and 0 deletions
|
|
@ -5,6 +5,7 @@ import type { RelativePath } from "../../persistence/database";
|
||||||
import { Locks } from "./locks";
|
import { Locks } from "./locks";
|
||||||
import { awaitAll } from "../await-all";
|
import { awaitAll } from "../await-all";
|
||||||
import { sleep } from "../sleep";
|
import { sleep } from "../sleep";
|
||||||
|
import { SyncResetError } from "../../services/sync-reset-error";
|
||||||
|
|
||||||
describe("withLock", () => {
|
describe("withLock", () => {
|
||||||
const testPath: RelativePath = "test/document/path";
|
const testPath: RelativePath = "test/document/path";
|
||||||
|
|
@ -230,3 +231,62 @@ describe("withLock", () => {
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("reset", () => {
|
||||||
|
const testPath: RelativePath = "test/document/path";
|
||||||
|
const logger = new Logger();
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/init-declarations
|
||||||
|
let locks: Locks<RelativePath>;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
locks = new Locks<RelativePath>(logger);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should reject pending waiters with SyncResetError while running operation completes", async () => {
|
||||||
|
const firstPromise = locks.withLock(testPath, async () => {
|
||||||
|
await sleep(2);
|
||||||
|
return "first";
|
||||||
|
});
|
||||||
|
|
||||||
|
await sleep(1);
|
||||||
|
|
||||||
|
const secondPromise = locks.withLock(testPath, async () => "second");
|
||||||
|
void secondPromise.catch(() => { });
|
||||||
|
|
||||||
|
locks.reset();
|
||||||
|
|
||||||
|
assert.strictEqual(await firstPromise, "first");
|
||||||
|
|
||||||
|
await assert.rejects(secondPromise, (err: Error) => {
|
||||||
|
assert.ok(err instanceof SyncResetError);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should allow locks to work normally after reset", async () => {
|
||||||
|
const firstPromise = locks.withLock(testPath, async () => {
|
||||||
|
await sleep(1);
|
||||||
|
return "first";
|
||||||
|
});
|
||||||
|
|
||||||
|
await sleep(1);
|
||||||
|
|
||||||
|
const secondPromise = locks.withLock(testPath, async () => "second");
|
||||||
|
void secondPromise.catch(() => { });
|
||||||
|
|
||||||
|
locks.reset();
|
||||||
|
|
||||||
|
await firstPromise;
|
||||||
|
|
||||||
|
const result = await locks.withLock(testPath, () => "after-reset");
|
||||||
|
assert.strictEqual(result, "after-reset");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should handle reset with no pending operations", async () => {
|
||||||
|
locks.reset();
|
||||||
|
|
||||||
|
const result = await locks.withLock(testPath, () => "success");
|
||||||
|
assert.strictEqual(result, "success");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue