summaryrefslogtreecommitdiff
path: root/cli/tests/unit/flock_test.ts
blob: 13d09bcf5626f92e8bac3d633a09d0e5e8244ba2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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",
    );
  },
);