summaryrefslogtreecommitdiff
path: root/js/trace_test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'js/trace_test.ts')
-rw-r--r--js/trace_test.ts81
1 files changed, 81 insertions, 0 deletions
diff --git a/js/trace_test.ts b/js/trace_test.ts
new file mode 100644
index 000000000..ac83c1064
--- /dev/null
+++ b/js/trace_test.ts
@@ -0,0 +1,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);
+ await 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);
+ await 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(async () => await 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(async () => await deno.statSync("."));
+ assertEqual(op4.length, 1);
+ assertEqual(op4[0], { sync: true, name: "Stat" });
+});