UNPKG

faastjs

Version:

Serverless batch computing made simple.

102 lines 15.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const ava_1 = tslib_1.__importDefault(require("ava")); const child_process_1 = tslib_1.__importDefault(require("child_process")); const fs_extra_1 = require("fs-extra"); const path_1 = tslib_1.__importDefault(require("path")); const path_2 = require("path"); const index_1 = require("../index"); const aws_faast_1 = require("../src/aws/aws-faast"); const local_faast_1 = require("../src/local/local-faast"); const packer_1 = require("../src/packer"); const kb = 1024; function exec(cmd) { const result = child_process_1.default.execSync(cmd).toString(); index_1.log.info(result); return result; } const testPacker = ava_1.default.macro({ exec: async (t, provider, pack, config, size) => { const identifier = `${provider}-${config.name}`; const tmpDir = path_1.default.join("tmp", identifier); exec(`mkdir -p ${tmpDir}`); process.env["FAAST_PACKAGE_DIR"] = "tmp"; const { archive } = await pack(require.resolve("./fixtures/functions"), config, {}, identifier); await (0, fs_extra_1.remove)(tmpDir); const writePromise = new Promise(resolve => archive.on("end", resolve)); const unzipPromise = (0, packer_1.unzipInDir)(tmpDir, archive); await Promise.all([writePromise, unzipPromise]); const zipFile = path_1.default.join("tmp", identifier + ".zip"); const bytes = (await (0, fs_extra_1.stat)(zipFile)).size; t.true(bytes < size, `package size ${bytes} exceeded maximum ${size}`); t.is(exec(`cd ${tmpDir} && node index.js`), "faast: successful cold start.\n"); config.check && (await config.check(t, tmpDir)); }, title: (_title = "", provider, _packer, options) => `packer ${provider}-${options.name}` }); function added(dir) { return async (t, root) => { const filePath = (0, path_2.join)(root, dir, "file.txt"); t.true(await (0, fs_extra_1.pathExists)(filePath), `file ${filePath} does not exist in package`); const { mode } = await (0, fs_extra_1.stat)((0, path_2.join)(root, dir, "script")); const { mode: origMode } = await (0, fs_extra_1.stat)("test/fixtures/dir/script"); t.is(mode, origMode, "file modes are preserved"); t.is(mode & 0o700, 0o700, "executable mode is preserved in added files"); }; } function excluded(file) { return async (t, root) => { const filePath = (0, path_2.join)(root, file); t.false(await (0, fs_extra_1.pathExists)(filePath), `file ${file} exists but it should be excluded`); }; } const configs = [ { name: "https", mode: "https" }, { name: "queue", mode: "queue" }, { name: "https-package", mode: "https", packageJson: "test/fixtures/package.json" }, { name: "queue-package", mode: "queue", packageJson: "test/fixtures/package.json" }, { name: "include", include: ["test/fixtures/dir/**/*"], check: added("test/fixtures/dir") }, { name: "include-cwd", include: [{ path: "dir/**/*", cwd: "test/fixtures" }], check: added("dir") }, { name: "include-dir", include: ["test/fixtures/dir"], check: added("test/fixtures/dir") }, { name: "include-dir-cwd", include: [{ path: "dir", cwd: "test/fixtures" }], check: added("dir") }, { name: "exclude", include: ["test/fixtures/dir/**/*"], exclude: ["**/*.exc"], check: excluded("test/fixtures/dir/excluded.exc") }, { name: "exclude-file", include: ["test/fixtures/dir/**/*"], exclude: ["test/fixtures/dir/excluded.exc"], check: excluded("test/fixtures/dir/excluded.exc") } ]; const packers = { aws: aws_faast_1.awsPacker, local: local_faast_1.localPacker }; for (const name of index_1.providers) { for (const config of configs) { let size = 130 * kb; (0, ava_1.default)(testPacker, name, packers[name], config, size); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdC1wYWNrZXIudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvdW5pdC1wYWNrZXIudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzREFBNkM7QUFDN0MsMEVBQWdDO0FBQ2hDLHVDQUFvRDtBQUNwRCx3REFBd0I7QUFDeEIsK0JBQTRCO0FBQzVCLG9DQUFtRTtBQUNuRSxvREFBaUQ7QUFDakQsMERBQXVEO0FBQ3ZELDBDQUF5RDtBQUd6RCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFPaEIsU0FBUyxJQUFJLENBQUMsR0FBVztJQUNyQixNQUFNLE1BQU0sR0FBRyx1QkFBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QyxXQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pCLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFTRCxNQUFNLFVBQVUsR0FBRyxhQUFJLENBQUMsS0FBSyxDQUFDO0lBQzFCLElBQUksRUFBRSxLQUFLLEVBQ1AsQ0FBbUIsRUFDbkIsUUFBa0IsRUFDbEIsSUFBWSxFQUNaLE1BQTRCLEVBQzVCLElBQVksRUFDZCxFQUFFO1FBQ0EsTUFBTSxVQUFVLEdBQUcsR0FBRyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hELE1BQU0sTUFBTSxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxZQUFZLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUV6QyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQzFCLE9BQU8sQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsRUFDdkMsTUFBTSxFQUNOLEVBQUUsRUFDRixV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T0FBTyxHQUF1QztJQUNoRCxHQUFHLEVBQUUscUJBQVM7SUFDZCxLQUFLLEVBQUUseUJBQVc7Q0FDckIsQ0FBQztBQUVGLEtBQUssTUFBTSxJQUFJLElBQUksaUJBQVMsRUFBRTtJQUMxQixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtRQUMxQixJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUEsYUFBSSxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztLQUN2RDtDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHRlc3QsIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJhdmFcIjtcbmltcG9ydCBzeXMgZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHBhdGhFeGlzdHMsIHJlbW92ZSwgc3RhdCB9IGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgQ29tbW9uT3B0aW9ucywgbG9nLCBQcm92aWRlciwgcHJvdmlkZXJzIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBhd3NQYWNrZXIgfSBmcm9tIFwiLi4vc3JjL2F3cy9hd3MtZmFhc3RcIjtcbmltcG9ydCB7IGxvY2FsUGFja2VyIH0gZnJvbSBcIi4uL3NyYy9sb2NhbC9sb2NhbC1mYWFzdFwiO1xuaW1wb3J0IHsgUGFja2VyUmVzdWx0LCB1bnppcEluRGlyIH0gZnJvbSBcIi4uL3NyYy9wYWNrZXJcIjtcbmltcG9ydCB7IFdyYXBwZXJPcHRpb25zIH0gZnJvbSBcIi4uL3NyYy93cmFwcGVyXCI7XG5cbmNvbnN0IGtiID0gMTAyNDtcblxuaW50ZXJmYWNlIFBhY2thZ2VDb25maWd1cmF0aW9uIGV4dGVuZHMgQ29tbW9uT3B0aW9ucyB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGNoZWNrPzogKHQ6IEV4ZWN1dGlvbkNvbnRleHQsIHJvb3Q6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuZnVuY3Rpb24gZXhlYyhjbWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHN5cy5leGVjU3luYyhjbWQpLnRvU3RyaW5nKCk7XG4gICAgbG9nLmluZm8ocmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG50eXBlIFBhY2tlciA9IChcbiAgICBmdW5jdGlvbk1vZHVsZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IENvbW1vbk9wdGlvbnMsXG4gICAgd3JhcHBlck9wdGlvbnM6IFdyYXBwZXJPcHRpb25zLFxuICAgIEZ1bmN0aW9uTmFtZTogc3RyaW5nXG4pID0+IFByb21pc2U8UGFja2VyUmVzdWx0PjtcblxuY29uc3QgdGVzdFBhY2tlciA9IHRlc3QubWFjcm8oe1xuICAgIGV4ZWM6IGFzeW5jIChcbiAgICAgICAgdDogRXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgcHJvdmlkZXI6IFByb3ZpZGVyLFxuICAgICAgICBwYWNrOiBQYWNrZXIsXG4gICAgICAgIGNvbmZpZzogUGFja2FnZUNvbmZpZ3VyYXRpb24sXG4gICAgICAgIHNpemU6IG51bWJlclxuICAgICkgPT4ge1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gYCR7cHJvdmlkZXJ9LSR7Y29uZmlnLm5hbWV9YDtcbiAgICAgICAgY29uc3QgdG1wRGlyID0gcGF0aC5qb2luKFwidG1wXCIsIGlkZW50aWZpZXIpO1xuICAgICAgICBleGVjKGBta2RpciAtcCAke3RtcERpcn1gKTtcblxuICAgICAgICBwcm9jZXNzLmVudltcIkZBQVNUX1BBQ0tBR0VfRElSXCJdID0gXCJ0bXBcIjtcblxuICAgICAgICBjb25zdCB7IGFyY2hpdmUgfSA9IGF3YWl0IHBhY2soXG4gICAgICAgICAgICByZXF1aXJlLnJlc29sdmUoXCIuL2ZpeHR1cmVzL2Z1bmN0aW9uc1wiKSxcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgaWRlbnRpZmllclxuICAgICAgICApO1xuXG4gICAgICAgIGF3YWl0IHJlbW92ZSh0bXBEaXIpO1xuICAgICAgICBjb25zdCB3cml0ZVByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGFyY2hpdmUub24oXCJlbmRcIiwgcmVzb2x2ZSkpO1xuICAgICAgICBjb25zdCB1bnppcFByb21pc2UgPSB1bnppcEluRGlyKHRtcERpciwgYXJjaGl2ZSk7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3dyaXRlUHJvbWlzZSwgdW56aXBQcm9taXNlXSk7XG4gICAgICAgIGNvbnN0IHppcEZpbGUgPSBwYXRoLmpvaW4oXCJ0bXBcIiwgaWRlbnRpZmllciArIFwiLnppcFwiKTtcbiAgICAgICAgY29uc3QgYnl0ZXMgPSAoYXdhaXQgc3RhdCh6aXBGaWxlKSkuc2l6ZTtcbiAgICAgICAgdC50cnVlKGJ5dGVzIDwgc2l6ZSwgYHBhY2thZ2Ugc2l6ZSAke2J5dGVzfSBleGNlZWRlZCBtYXhpbXVtICR7c2l6ZX1gKTtcbiAgICAgICAgdC5pcyhleGVjKGBjZCAke3RtcERpcn0gJiYgbm9kZSBpbmRleC5qc2ApLCBcImZhYXN0OiBzdWNjZXNzZnVsIGNvbGQgc3RhcnQuXFxuXCIpO1xuICAgICAgICBjb25maWcuY2hlY2sgJiYgKGF3YWl0IGNvbmZpZy5jaGVjayh0LCB0bXBEaXIpKTtcbiAgICB9LFxuICAgIHRpdGxlOiAoX3RpdGxlID0gXCJcIiwgcHJvdmlkZXIsIF9wYWNrZXIsIG9wdGlvbnMpID0+XG4gICAgICAgIGBwYWNrZXIgJHtwcm92aWRlcn0tJHtvcHRpb25zLm5hbWV9YFxufSk7XG5cbmZ1bmN0aW9uIGFkZGVkKGRpcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jICh0OiBFeGVjdXRpb25Db250ZXh0LCByb290OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBqb2luKHJvb3QsIGRpciwgXCJmaWxlLnR4dFwiKTtcbiAgICAgICAgdC50cnVlKGF3YWl0IHBhdGhFeGlzdHMoZmlsZVBhdGgpLCBgZmlsZSAke2ZpbGVQYXRofSBkb2VzIG5vdCBleGlzdCBpbiBwYWNrYWdlYCk7XG4gICAgICAgIGNvbnN0IHsgbW9kZSB9ID0gYXdhaXQgc3RhdChqb2luKHJvb3QsIGRpciwgXCJzY3JpcHRcIikpO1xuICAgICAgICBjb25zdCB7IG1vZGU6IG9yaWdNb2RlIH0gPSBhd2FpdCBzdGF0KFwidGVzdC9maXh0dXJlcy9kaXIvc2NyaXB0XCIpO1xuICAgICAgICB0LmlzKG1vZGUsIG9yaWdNb2RlLCBcImZpbGUgbW9kZXMgYXJlIHByZXNlcnZlZFwiKTtcbiAgICAgICAgdC5pcyhtb2RlICYgMG83MDAsIDBvNzAwLCBcImV4ZWN1dGFibGUgbW9kZSBpcyBwcmVzZXJ2ZWQgaW4gYWRkZWQgZmlsZXNcIik7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZWQoZmlsZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jICh0OiBFeGVjdXRpb25Db250ZXh0LCByb290OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBqb2luKHJvb3QsIGZpbGUpO1xuICAgICAgICB0LmZhbHNlKFxuICAgICAgICAgICAgYXdhaXQgcGF0aEV4aXN0cyhmaWxlUGF0aCksXG4gICAgICAgICAgICBgZmlsZSAke2ZpbGV9IGV4aXN0cyBidXQgaXQgc2hvdWxkIGJlIGV4Y2x1ZGVkYFxuICAgICAgICApO1xuICAgIH07XG59XG5cbmNvbnN0IGNvbmZpZ3M6IFBhY2thZ2VDb25maWd1cmF0aW9uW10gPSBbXG4gICAgeyBuYW1lOiBcImh0dHBzXCIsIG1vZGU6IFwiaHR0cHNcIiB9LFxuICAgIHsgbmFtZTogXCJxdWV1ZVwiLCBtb2RlOiBcInF1ZXVlXCIgfSxcbiAgICB7IG5hbWU6IFwiaHR0cHMtcGFja2FnZVwiLCBtb2RlOiBcImh0dHBzXCIsIHBhY2thZ2VKc29uOiBcInRlc3QvZml4dHVyZXMvcGFja2FnZS5qc29uXCIgfSxcbiAgICB7IG5hbWU6IFwicXVldWUtcGFja2FnZVwiLCBtb2RlOiBcInF1ZXVlXCIsIHBhY2thZ2VKc29uOiBcInRlc3QvZml4dHVyZXMvcGFja2FnZS5qc29uXCIgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiaW5jbHVkZVwiLFxuICAgICAgICBpbmNsdWRlOiBbXCJ0ZXN0L2ZpeHR1cmVzL2Rpci8qKi8qXCJdLFxuICAgICAgICBjaGVjazogYWRkZWQoXCJ0ZXN0L2ZpeHR1cmVzL2RpclwiKVxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImluY2x1ZGUtY3dkXCIsXG4gICAgICAgIGluY2x1ZGU6IFt7IHBhdGg6IFwiZGlyLyoqLypcIiwgY3dkOiBcInRlc3QvZml4dHVyZXNcIiB9XSxcbiAgICAgICAgY2hlY2s6IGFkZGVkKFwiZGlyXCIpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiaW5jbHVkZS1kaXJcIixcbiAgICAgICAgaW5jbHVkZTogW1widGVzdC9maXh0dXJlcy9kaXJcIl0sXG4gICAgICAgIGNoZWNrOiBhZGRlZChcInRlc3QvZml4dHVyZXMvZGlyXCIpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiaW5jbHVkZS1kaXItY3dkXCIsXG4gICAgICAgIGluY2x1ZGU6IFt7IHBhdGg6IFwiZGlyXCIsIGN3ZDogXCJ0ZXN0L2ZpeHR1cmVzXCIgfV0sXG4gICAgICAgIGNoZWNrOiBhZGRlZChcImRpclwiKVxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImV4Y2x1ZGVcIixcbiAgICAgICAgaW5jbHVkZTogW1widGVzdC9maXh0dXJlcy9kaXIvKiovKlwiXSxcbiAgICAgICAgZXhjbHVkZTogW1wiKiovKi5leGNcIl0sXG4gICAgICAgIGNoZWNrOiBleGNsdWRlZChcInRlc3QvZml4dHVyZXMvZGlyL2V4Y2x1ZGVkLmV4Y1wiKVxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImV4Y2x1ZGUtZmlsZVwiLFxuICAgICAgICBpbmNsdWRlOiBbXCJ0ZXN0L2ZpeHR1cmVzL2Rpci8qKi8qXCJdLFxuICAgICAgICBleGNsdWRlOiBbXCJ0ZXN0L2ZpeHR1cmVzL2Rpci9leGNsdWRlZC5leGNcIl0sXG4gICAgICAgIGNoZWNrOiBleGNsdWRlZChcInRlc3QvZml4dHVyZXMvZGlyL2V4Y2x1ZGVkLmV4Y1wiKVxuICAgIH1cbl07XG5cbmNvbnN0IHBhY2tlcnM6IHsgW3Byb3ZpZGVyIGluIFByb3ZpZGVyXTogUGFja2VyIH0gPSB7XG4gICAgYXdzOiBhd3NQYWNrZXIsXG4gICAgbG9jYWw6IGxvY2FsUGFja2VyXG59O1xuXG5mb3IgKGNvbnN0IG5hbWUgb2YgcHJvdmlkZXJzKSB7XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgY29uZmlncykge1xuICAgICAgICBsZXQgc2l6ZSA9IDEzMCAqIGtiO1xuICAgICAgICB0ZXN0KHRlc3RQYWNrZXIsIG5hbWUsIHBhY2tlcnNbbmFtZV0sIGNvbmZpZywgc2l6ZSk7XG4gICAgfVxufVxuIl19