mirror of
https://github.com/denoland/deno.git
synced 2024-10-30 09:08:00 -04:00
93d83a84db
This commit adds following unstable APIs: - Deno.flock() - Deno.flockSync() - Deno.funlock() - Deno.funlockSync()
102 lines
3 KiB
TypeScript
102 lines
3 KiB
TypeScript
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
|
|
import { assertEquals, unitTest } from "./test_util.ts";
|
|
|
|
unitTest(
|
|
{ perms: { read: true, run: true, hrtime: true } },
|
|
async function flockFileSync() {
|
|
const path = "cli/tests/testdata/fixture.json";
|
|
const script = (exclusive: boolean, wait: number) => `
|
|
const { rid } = Deno.openSync("${path}");
|
|
Deno.flockSync(rid, ${exclusive ? "true" : "false"});
|
|
await new Promise(res => setTimeout(res, ${wait}));
|
|
Deno.funlockSync(rid);
|
|
`;
|
|
const run = (e: boolean, w: number) =>
|
|
Deno.run({ cmd: [Deno.execPath(), "eval", "--unstable", script(e, w)] });
|
|
const firstBlocksSecond = async (
|
|
first: boolean,
|
|
second: boolean,
|
|
): Promise<boolean> => {
|
|
const firstPs = run(first, 1000);
|
|
await new Promise((res) => setTimeout(res, 250));
|
|
const start = performance.now();
|
|
const secondPs = run(second, 0);
|
|
await secondPs.status();
|
|
const didBlock = (performance.now() - start) > 500;
|
|
firstPs.close();
|
|
secondPs.close();
|
|
return didBlock;
|
|
};
|
|
|
|
assertEquals(
|
|
await firstBlocksSecond(true, false),
|
|
true,
|
|
"exclusive blocks shared",
|
|
);
|
|
assertEquals(
|
|
await firstBlocksSecond(false, true),
|
|
true,
|
|
"shared blocks exclusive",
|
|
);
|
|
assertEquals(
|
|
await firstBlocksSecond(true, true),
|
|
true,
|
|
"exclusive blocks exclusive",
|
|
);
|
|
assertEquals(
|
|
await firstBlocksSecond(false, false),
|
|
false,
|
|
"shared does not block shared",
|
|
);
|
|
},
|
|
);
|
|
|
|
unitTest(
|
|
{ perms: { read: true, run: true, hrtime: true } },
|
|
async function flockFileAsync() {
|
|
const path = "cli/tests/testdata/fixture.json";
|
|
const script = (exclusive: boolean, wait: number) => `
|
|
const { rid } = await Deno.open("${path}");
|
|
await Deno.flock(rid, ${exclusive ? "true" : "false"});
|
|
await new Promise(res => setTimeout(res, ${wait}));
|
|
await Deno.funlock(rid);
|
|
`;
|
|
const run = (e: boolean, w: number) =>
|
|
Deno.run({ cmd: [Deno.execPath(), "eval", "--unstable", script(e, w)] });
|
|
const firstBlocksSecond = async (
|
|
first: boolean,
|
|
second: boolean,
|
|
): Promise<boolean> => {
|
|
const firstPs = run(first, 1000);
|
|
await new Promise((res) => setTimeout(res, 250));
|
|
const start = performance.now();
|
|
const secondPs = run(second, 0);
|
|
await secondPs.status();
|
|
const didBlock = (performance.now() - start) > 500;
|
|
firstPs.close();
|
|
secondPs.close();
|
|
return didBlock;
|
|
};
|
|
|
|
assertEquals(
|
|
await firstBlocksSecond(true, false),
|
|
true,
|
|
"exclusive blocks shared",
|
|
);
|
|
assertEquals(
|
|
await firstBlocksSecond(false, true),
|
|
true,
|
|
"shared blocks exclusive",
|
|
);
|
|
assertEquals(
|
|
await firstBlocksSecond(true, true),
|
|
true,
|
|
"exclusive blocks exclusive",
|
|
);
|
|
assertEquals(
|
|
await firstBlocksSecond(false, false),
|
|
false,
|
|
"shared does not block shared",
|
|
);
|
|
},
|
|
);
|