From 7a0670a9512981cee18d1960db46a3b57844595d Mon Sep 17 00:00:00 2001 From: "Kevin (Kun) \"Kassimo\" Qian" Date: Sat, 22 Sep 2018 00:59:26 -0700 Subject: Implement deno.trace() (#795) --- js/trace_test.ts | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 js/trace_test.ts (limited to 'js/trace_test.ts') 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" }); +}); -- cgit v1.2.3