UNPKG

faastjs

Version:

Serverless batch computing made simple.

102 lines 15.6 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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T0FBTyxHQUF1QztJQUNoRCxHQUFHLEVBQUUscUJBQVM7SUFDZCxLQUFLLEVBQUUseUJBQVc7Q0FDckIsQ0FBQztBQUVGLEtBQUssTUFBTSxJQUFJLElBQUksaUJBQVMsRUFBRSxDQUFDO0lBQzNCLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7UUFDM0IsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFBLGFBQUksRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEQsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdGVzdCwgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcImF2YVwiO1xuaW1wb3J0IHN5cyBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgcGF0aEV4aXN0cywgcmVtb3ZlLCBzdGF0IH0gZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBDb21tb25PcHRpb25zLCBsb2csIFByb3ZpZGVyLCBwcm92aWRlcnMgfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB7IGF3c1BhY2tlciB9IGZyb20gXCIuLi9zcmMvYXdzL2F3cy1mYWFzdFwiO1xuaW1wb3J0IHsgbG9jYWxQYWNrZXIgfSBmcm9tIFwiLi4vc3JjL2xvY2FsL2xvY2FsLWZhYXN0XCI7XG5pbXBvcnQgeyBQYWNrZXJSZXN1bHQsIHVuemlwSW5EaXIgfSBmcm9tIFwiLi4vc3JjL3BhY2tlclwiO1xuaW1wb3J0IHsgV3JhcHBlck9wdGlvbnMgfSBmcm9tIFwiLi4vc3JjL3dyYXBwZXJcIjtcblxuY29uc3Qga2IgPSAxMDI0O1xuXG5pbnRlcmZhY2UgUGFja2FnZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBDb21tb25PcHRpb25zIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgY2hlY2s/OiAodDogRXhlY3V0aW9uQ29udGV4dCwgcm9vdDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG5mdW5jdGlvbiBleGVjKGNtZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gc3lzLmV4ZWNTeW5jKGNtZCkudG9TdHJpbmcoKTtcbiAgICBsb2cuaW5mbyhyZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbnR5cGUgUGFja2VyID0gKFxuICAgIGZ1bmN0aW9uTW9kdWxlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogQ29tbW9uT3B0aW9ucyxcbiAgICB3cmFwcGVyT3B0aW9uczogV3JhcHBlck9wdGlvbnMsXG4gICAgRnVuY3Rpb25OYW1lOiBzdHJpbmdcbikgPT4gUHJvbWlzZTxQYWNrZXJSZXN1bHQ+O1xuXG5jb25zdCB0ZXN0UGFja2VyID0gdGVzdC5tYWNybyh7XG4gICAgZXhlYzogYXN5bmMgKFxuICAgICAgICB0OiBFeGVjdXRpb25Db250ZXh0LFxuICAgICAgICBwcm92aWRlcjogUHJvdmlkZXIsXG4gICAgICAgIHBhY2s6IFBhY2tlcixcbiAgICAgICAgY29uZmlnOiBQYWNrYWdlQ29uZmlndXJhdGlvbixcbiAgICAgICAgc2l6ZTogbnVtYmVyXG4gICAgKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBgJHtwcm92aWRlcn0tJHtjb25maWcubmFtZX1gO1xuICAgICAgICBjb25zdCB0bXBEaXIgPSBwYXRoLmpvaW4oXCJ0bXBcIiwgaWRlbnRpZmllcik7XG4gICAgICAgIGV4ZWMoYG1rZGlyIC1wICR7dG1wRGlyfWApO1xuXG4gICAgICAgIHByb2Nlc3MuZW52W1wiRkFBU1RfUEFDS0FHRV9ESVJcIl0gPSBcInRtcFwiO1xuXG4gICAgICAgIGNvbnN0IHsgYXJjaGl2ZSB9ID0gYXdhaXQgcGFjayhcbiAgICAgICAgICAgIHJlcXVpcmUucmVzb2x2ZShcIi4vZml4dHVyZXMvZnVuY3Rpb25zXCIpLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBpZGVudGlmaWVyXG4gICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgcmVtb3ZlKHRtcERpcik7XG4gICAgICAgIGNvbnN0IHdyaXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gYXJjaGl2ZS5vbihcImVuZFwiLCByZXNvbHZlKSk7XG4gICAgICAgIGNvbnN0IHVuemlwUHJvbWlzZSA9IHVuemlwSW5EaXIodG1wRGlyLCBhcmNoaXZlKTtcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbd3JpdGVQcm9taXNlLCB1bnppcFByb21pc2VdKTtcbiAgICAgICAgY29uc3QgemlwRmlsZSA9IHBhdGguam9pbihcInRtcFwiLCBpZGVudGlmaWVyICsgXCIuemlwXCIpO1xuICAgICAgICBjb25zdCBieXRlcyA9IChhd2FpdCBzdGF0KHppcEZpbGUpKS5zaXplO1xuICAgICAgICB0LnRydWUoYnl0ZXMgPCBzaXplLCBgcGFja2FnZSBzaXplICR7Ynl0ZXN9IGV4Y2VlZGVkIG1heGltdW0gJHtzaXplfWApO1xuICAgICAgICB0LmlzKGV4ZWMoYGNkICR7dG1wRGlyfSAmJiBub2RlIGluZGV4LmpzYCksIFwiZmFhc3Q6IHN1Y2Nlc3NmdWwgY29sZCBzdGFydC5cXG5cIik7XG4gICAgICAgIGNvbmZpZy5jaGVjayAmJiAoYXdhaXQgY29uZmlnLmNoZWNrKHQsIHRtcERpcikpO1xuICAgIH0sXG4gICAgdGl0bGU6IChfdGl0bGUgPSBcIlwiLCBwcm92aWRlciwgX3BhY2tlciwgb3B0aW9ucykgPT5cbiAgICAgICAgYHBhY2tlciAke3Byb3ZpZGVyfS0ke29wdGlvbnMubmFtZX1gXG59KTtcblxuZnVuY3Rpb24gYWRkZWQoZGlyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgKHQ6IEV4ZWN1dGlvbkNvbnRleHQsIHJvb3Q6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4ocm9vdCwgZGlyLCBcImZpbGUudHh0XCIpO1xuICAgICAgICB0LnRydWUoYXdhaXQgcGF0aEV4aXN0cyhmaWxlUGF0aCksIGBmaWxlICR7ZmlsZVBhdGh9IGRvZXMgbm90IGV4aXN0IGluIHBhY2thZ2VgKTtcbiAgICAgICAgY29uc3QgeyBtb2RlIH0gPSBhd2FpdCBzdGF0KGpvaW4ocm9vdCwgZGlyLCBcInNjcmlwdFwiKSk7XG4gICAgICAgIGNvbnN0IHsgbW9kZTogb3JpZ01vZGUgfSA9IGF3YWl0IHN0YXQoXCJ0ZXN0L2ZpeHR1cmVzL2Rpci9zY3JpcHRcIik7XG4gICAgICAgIHQuaXMobW9kZSwgb3JpZ01vZGUsIFwiZmlsZSBtb2RlcyBhcmUgcHJlc2VydmVkXCIpO1xuICAgICAgICB0LmlzKG1vZGUgJiAwbzcwMCwgMG83MDAsIFwiZXhlY3V0YWJsZSBtb2RlIGlzIHByZXNlcnZlZCBpbiBhZGRlZCBmaWxlc1wiKTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBleGNsdWRlZChmaWxlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgKHQ6IEV4ZWN1dGlvbkNvbnRleHQsIHJvb3Q6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4ocm9vdCwgZmlsZSk7XG4gICAgICAgIHQuZmFsc2UoXG4gICAgICAgICAgICBhd2FpdCBwYXRoRXhpc3RzKGZpbGVQYXRoKSxcbiAgICAgICAgICAgIGBmaWxlICR7ZmlsZX0gZXhpc3RzIGJ1dCBpdCBzaG91bGQgYmUgZXhjbHVkZWRgXG4gICAgICAgICk7XG4gICAgfTtcbn1cblxuY29uc3QgY29uZmlnczogUGFja2FnZUNvbmZpZ3VyYXRpb25bXSA9IFtcbiAgICB7IG5hbWU6IFwiaHR0cHNcIiwgbW9kZTogXCJodHRwc1wiIH0sXG4gICAgeyBuYW1lOiBcInF1ZXVlXCIsIG1vZGU6IFwicXVldWVcIiB9LFxuICAgIHsgbmFtZTogXCJodHRwcy1wYWNrYWdlXCIsIG1vZGU6IFwiaHR0cHNcIiwgcGFja2FnZUpzb246IFwidGVzdC9maXh0dXJlcy9wYWNrYWdlLmpzb25cIiB9LFxuICAgIHsgbmFtZTogXCJxdWV1ZS1wYWNrYWdlXCIsIG1vZGU6IFwicXVldWVcIiwgcGFja2FnZUpzb246IFwidGVzdC9maXh0dXJlcy9wYWNrYWdlLmpzb25cIiB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJpbmNsdWRlXCIsXG4gICAgICAgIGluY2x1ZGU6IFtcInRlc3QvZml4dHVyZXMvZGlyLyoqLypcIl0sXG4gICAgICAgIGNoZWNrOiBhZGRlZChcInRlc3QvZml4dHVyZXMvZGlyXCIpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiaW5jbHVkZS1jd2RcIixcbiAgICAgICAgaW5jbHVkZTogW3sgcGF0aDogXCJkaXIvKiovKlwiLCBjd2Q6IFwidGVzdC9maXh0dXJlc1wiIH1dLFxuICAgICAgICBjaGVjazogYWRkZWQoXCJkaXJcIilcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJpbmNsdWRlLWRpclwiLFxuICAgICAgICBpbmNsdWRlOiBbXCJ0ZXN0L2ZpeHR1cmVzL2RpclwiXSxcbiAgICAgICAgY2hlY2s6IGFkZGVkKFwidGVzdC9maXh0dXJlcy9kaXJcIilcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJpbmNsdWRlLWRpci1jd2RcIixcbiAgICAgICAgaW5jbHVkZTogW3sgcGF0aDogXCJkaXJcIiwgY3dkOiBcInRlc3QvZml4dHVyZXNcIiB9XSxcbiAgICAgICAgY2hlY2s6IGFkZGVkKFwiZGlyXCIpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiZXhjbHVkZVwiLFxuICAgICAgICBpbmNsdWRlOiBbXCJ0ZXN0L2ZpeHR1cmVzL2Rpci8qKi8qXCJdLFxuICAgICAgICBleGNsdWRlOiBbXCIqKi8qLmV4Y1wiXSxcbiAgICAgICAgY2hlY2s6IGV4Y2x1ZGVkKFwidGVzdC9maXh0dXJlcy9kaXIvZXhjbHVkZWQuZXhjXCIpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiZXhjbHVkZS1maWxlXCIsXG4gICAgICAgIGluY2x1ZGU6IFtcInRlc3QvZml4dHVyZXMvZGlyLyoqLypcIl0sXG4gICAgICAgIGV4Y2x1ZGU6IFtcInRlc3QvZml4dHVyZXMvZGlyL2V4Y2x1ZGVkLmV4Y1wiXSxcbiAgICAgICAgY2hlY2s6IGV4Y2x1ZGVkKFwidGVzdC9maXh0dXJlcy9kaXIvZXhjbHVkZWQuZXhjXCIpXG4gICAgfVxuXTtcblxuY29uc3QgcGFja2VyczogeyBbcHJvdmlkZXIgaW4gUHJvdmlkZXJdOiBQYWNrZXIgfSA9IHtcbiAgICBhd3M6IGF3c1BhY2tlcixcbiAgICBsb2NhbDogbG9jYWxQYWNrZXJcbn07XG5cbmZvciAoY29uc3QgbmFtZSBvZiBwcm92aWRlcnMpIHtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBjb25maWdzKSB7XG4gICAgICAgIGxldCBzaXplID0gMTMwICoga2I7XG4gICAgICAgIHRlc3QodGVzdFBhY2tlciwgbmFtZSwgcGFja2Vyc1tuYW1lXSwgY29uZmlnLCBzaXplKTtcbiAgICB9XG59XG4iXX0=