diff options
author | Tilman Roeder <dyed.green.info@gmail.com> | 2021-08-24 14:21:31 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-24 15:21:31 +0200 |
commit | 93d83a84dbe1f6ecf93b596f88bc85ba378fa986 (patch) | |
tree | 8f9165f29064b0eb6d34661577877ebc2a3e37b3 /cli/tests | |
parent | 46e4ba38b2b1ccee8d3b4f04be1a2cc0b42cd52a (diff) |
feat(unstable): Add file locking APIs (#11746)
This commit adds following unstable APIs:
- Deno.flock()
- Deno.flockSync()
- Deno.funlock()
- Deno.funlockSync()
Diffstat (limited to 'cli/tests')
-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", + ); + }, +); |