UNPKG

@fromjs/backend

Version:
191 lines (190 loc) 8.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const compileNodeApp_1 = require("./compileNodeApp"); const backend_1 = require("./backend"); const child_process_1 = require("child_process"); var rimraf = require("rimraf"); const path = require("path"); const fs = require("fs"); const getFolderSize = require("get-folder-size"); const outdir = "node-test-out"; const backendPort = 1510; describe("Node", () => { let sessionDirectory = outdir + "/session"; let requestHandler, logServer, backend; beforeAll(async () => { rimraf.sync(outdir); fs.mkdirSync(outdir); ({ requestHandler, logServer } = await new Promise((resolve) => { const beOptions = new backend_1.BackendOptions({ sessionDirectory, bePort: backendPort, backendOriginWithoutPort: "http://localhost", onReady: resolve, }); backend = new backend_1.default(beOptions); })); console.log("Done create backend", backendPort); }, 10000); function getSessionSize() { return new Promise((resolve) => { getFolderSize(sessionDirectory, (err, size) => { console.log("Session size: ", (size / 1024 / 1024).toFixed(2) + " MB" + " (" + path.resolve(sessionDirectory) + ")"); resolve(size); }); }); } async function runTest(testName, { ignoreFilePattern = null, includeFilePattern = null, runNTimes = 1, returnAfterExec = false, }) { let sessionSizeBefore = await getSessionSize(); const compileStart = new Date(); await compileNodeApp_1.compileNodeApp({ directory: "packages/backend/nodeTestFixtures/" + testName, requestHandler, outdir: outdir + "/" + testName, ignoreFilePattern, includeFilePattern, }); let compileDuration = new Date().valueOf() - compileStart.valueOf(); // console.log("file", path.resolve(outdir, testName, testName + ".js")); let stdout, code; const execStart = new Date(); for (var i = 0; i < runNTimes; i++) { ({ stdout, code } = await getCmdOutput("node " + path.resolve(outdir, testName, testName + ".js"))); } let execDuration = new Date().valueOf() - execStart.valueOf(); if (code !== 0) { throw Error("Node command exited with code " + code); } if (returnAfterExec) { return {}; } const processRequestQueueStart = new Date(); await backend.processRequestQueue(); let processRequestQueueDuration = new Date().valueOf() - processRequestQueueStart.valueOf(); let sessionSizeAfter = await getSessionSize(); let sessionSizeIncreaseInMB = Math.round(((sessionSizeAfter - sessionSizeBefore) / 1024 / 1024) * 10) / 10; console.log({ compileDuration, execDuration, processRequestQueueDuration, sessionSizeIncreaseInMB, }); // console.log(stdout); let inspectIndex = parseFloat(stdout.match(/Inspect:\d+/)[0].replace("Inspect:", "")); console.log({ inspectIndex }); return { execDuration, compileDuration, traverse: async (charIndex) => { const steps = await backend.handleTraverse(inspectIndex, charIndex, { keepResultData: true, }); console.log("step count", steps.length); const lastStep = steps[steps.length - 1]; return { step: lastStep }; }, }; } it("Can read uninstrumented contents of a js file", async () => { let { traverse } = await runTest("readJSFile", {}); const { step } = await traverse(11); expect(step.operationLog.operation).toBe("readFileSyncResult"); expect(step.operationLog.result.primitive).toBe('const a = "Hello"\n'); expect(step.charIndex).toBe(11); }, 15000); it("Can require json files", async () => { let { traverse } = await runTest("requireJson", {}); const { step } = await traverse(0); expect(step.operationLog.operation).toBe("fileContent"); }, 15000); it("Can calculate PI", async () => { let { traverse } = await runTest("pi", { returnAfterExec: true }); // just doing this one for timing }, 25000); it("reactSsr", async () => { let { traverse, execDuration, compileDuration } = await runTest("reactSsr", { ignoreFilePattern: /umd|profiling|production|unstable|test\-utils|scheduler\-tracing|envify|browser|\.min\.js|factoryWithTypeCheckers/, runNTimes: 1, }); const { step } = await traverse(0); // for now don't really care to much about the exact traversal expect(step.operationLog.operation).toBe("callExpression"); }, 80000); it("can traverse file reads and writes – fileReadWrites", async () => { let { execDuration, compileDuration, traverse } = await runTest("fileReadWrites", {}); let { step } = await traverse(0); expect(step.operationLog.operation).toBe("stringLiteral"); expect(step.operationLog.result.primitive).toBe("Hello"); ({ step } = await traverse("Hello".length)); expect(step.operationLog.operation).toBe("stringLiteral"); expect(step.operationLog.result.primitive).toBe("World"); expect(step.charIndex).toBe(0); }, 100000); it("can load and use lodash", async () => { let { execDuration, compileDuration, traverse } = await runTest("lodash", {}); let { step } = await traverse(0); console.log(JSON.stringify(step, null, 2)); expect(step.operationLog.operation).toBe("stringLiteral"); expect(step.operationLog.result.primitive).toBe("helloWorld"); ({ step } = await traverse(12)); expect(step.operationLog.operation).toBe("stringLiteral"); expect(step.operationLog.result.primitive).toBe("equal"); }, 120000); it("can handle event emitter .emit", async () => { let { execDuration, compileDuration, traverse } = await runTest("eventEmitter", {}); let { step } = await traverse(0); console.log(JSON.stringify(step, null, 2)); expect(step.operationLog.operation).toBe("stringLiteral"); expect(step.operationLog.result.primitive).toBe("abc"); ({ step } = await traverse(3)); expect(step.operationLog.operation).toBe("stringLiteral"); expect(step.operationLog.result.primitive).toBe("xyz"); }, 120000); it("supports lucky matches", async () => { let { execDuration, compileDuration, traverse } = await runTest("luckyMatches", {}); let { step } = await traverse(0); console.log(JSON.stringify(step, null, 2)); expect(step.operationLog.operation).toBe("stringLiteral"); expect(step.operationLog.result.primitive).toBe("a"); }, 120000); it("intl test", async () => { let { execDuration, compileDuration, traverse } = await runTest("intl", { ignoreFilePattern: /dist/, }); let { step } = await traverse(0); expect(step.operationLog.operation).toBe("numericLiteral"); expect(step.operationLog.result.primitive).toBe(123456.789); }, 120000); }); function getCmdOutput(cmd) { return new Promise((resolve) => { let err = ""; let stdout = ""; let stderr = ""; child_process_1.exec(cmd, (_err, _stdout, _stderr) => { if (_err) { console.log("[err]", _err.toString()); err += _err.toString(); } if (_stdout) { stdout += _stdout.toString(); console.log("[std] ", _stdout.toString()); } if (_stderr) { stderr += _stderr.toString(); console.log("[err]", _stderr.toString()); } }).on("exit", (code) => { // Wait to receive all output setTimeout(() => { resolve({ code, err, stdout, stderr }); }, 5); }); }); } exports.getCmdOutput = getCmdOutput;