diff options
Diffstat (limited to 'cli/tests/unit/flock_test.ts')
-rw-r--r-- | cli/tests/unit/flock_test.ts | 102 |
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", + ); + }, +); |