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
|
import { testPerm, assertEqual } from "./test_util.ts";
import * as deno from "deno";
testPerm({ write: true }, async function traceFunctionSuccess() {
const op = await deno.trace(async () => {
const enc = new TextEncoder();
const data = enc.encode("Hello");
// Mixing sync and async calls
const filename = deno.makeTempDirSync() + "/test.txt";
await deno.writeFile(filename, data, 0o666);
deno.removeSync(filename);
});
assertEqual(op.length, 3);
assertEqual(op[0], { sync: true, name: "MakeTempDir" });
assertEqual(op[1], { sync: false, name: "WriteFile" });
assertEqual(op[2], { sync: true, name: "Remove" });
});
testPerm({ write: true }, async function tracePromiseSuccess() {
// Ensure we don't miss any send actions
// (new Promise(fn), fn runs synchronously)
const asyncFunction = async () => {
const enc = new TextEncoder();
const data = enc.encode("Hello");
// Mixing sync and async calls
const filename = deno.makeTempDirSync() + "/test.txt";
await deno.writeFile(filename, data, 0o666);
deno.removeSync(filename);
};
const promise = Promise.resolve().then(asyncFunction);
const op = await deno.trace(promise);
assertEqual(op.length, 3);
assertEqual(op[0], { sync: true, name: "MakeTempDir" });
assertEqual(op[1], { sync: false, name: "WriteFile" });
assertEqual(op[2], { sync: true, name: "Remove" });
});
testPerm({ write: true }, async function traceRepeatSuccess() {
const op1 = await deno.trace(async () => await deno.makeTempDir());
assertEqual(op1.length, 1);
assertEqual(op1[0], { sync: false, name: "MakeTempDir" });
const op2 = await deno.trace(() => deno.statSync("."));
assertEqual(op2.length, 1);
assertEqual(op2[0], { sync: true, name: "Stat" });
});
testPerm({ write: true }, async function traceIdempotence() {
let op1, op2, op3;
op1 = await deno.trace(async () => {
const filename = (await deno.makeTempDir()) + "/test.txt";
op2 = await deno.trace(async () => {
const enc = new TextEncoder();
const data = enc.encode("Hello");
deno.writeFileSync(filename, data, 0o666);
op3 = await deno.trace(async () => {
await deno.remove(filename);
});
await deno.makeTempDir();
});
});
// Flatten the calls
assertEqual(op1.length, 4);
assertEqual(op1[0], { sync: false, name: "MakeTempDir" });
assertEqual(op1[1], { sync: true, name: "WriteFile" });
assertEqual(op1[2], { sync: false, name: "Remove" });
assertEqual(op1[3], { sync: false, name: "MakeTempDir" });
assertEqual(op2.length, 3);
assertEqual(op2[0], { sync: true, name: "WriteFile" });
assertEqual(op2[1], { sync: false, name: "Remove" });
assertEqual(op2[2], { sync: false, name: "MakeTempDir" });
assertEqual(op3.length, 1);
assertEqual(op3[0], { sync: false, name: "Remove" });
// Expect top-level repeat still works after all the nestings
const op4 = await deno.trace(() => deno.statSync("."));
assertEqual(op4.length, 1);
assertEqual(op4[0], { sync: true, name: "Stat" });
});
|