faastjs
Version:
Serverless batch computing made simple.
102 lines • 15.5 kB
JavaScript
;
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