summaryrefslogtreecommitdiff
path: root/cli/tests/unit/flock_test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'cli/tests/unit/flock_test.ts')
-rw-r--r--cli/tests/unit/flock_test.ts102
1 files changed, 102 insertions, 0 deletions
diff --git a/cli/tests/unit/flock_test.ts b/cli/tests/unit/flock_test.ts
new file mode 100644
index 000000000..13d09bcf5
--- /dev/null
+++ b/cli/tests/unit/flock_test.ts
@@ -0,0 +1,102 @@
+// 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",
+ );
+ },
+);