mirror of
https://github.com/larksuite/cli.git
synced 2026-07-08 02:00:19 +08:00
104 lines
2.9 KiB
JavaScript
104 lines
2.9 KiB
JavaScript
// Copyright (c) 2026 Lark Technologies Pte. Ltd.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
const { test } = require("node:test");
|
|
const assert = require("node:assert");
|
|
const fs = require("fs");
|
|
const os = require("os");
|
|
const path = require("path");
|
|
const crypto = require("crypto");
|
|
const {
|
|
verifyChecksum,
|
|
getExpectedChecksum,
|
|
ChecksumError,
|
|
PackageIntegrityError,
|
|
} = require("./install.js");
|
|
|
|
function mktmpdir() {
|
|
return fs.mkdtempSync(path.join(os.tmpdir(), "install-test-"));
|
|
}
|
|
|
|
test("verifyChecksum: correct hash resolves", async () => {
|
|
const dir = mktmpdir();
|
|
try {
|
|
const filePath = path.join(dir, "data.bin");
|
|
const bytes = Buffer.from("hello world");
|
|
fs.writeFileSync(filePath, bytes);
|
|
const correctHash = crypto.createHash("sha256").update(bytes).digest("hex");
|
|
|
|
await verifyChecksum(filePath, correctHash);
|
|
} finally {
|
|
fs.rmSync(dir, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test("verifyChecksum: mismatched hash throws ChecksumError", async () => {
|
|
const dir = mktmpdir();
|
|
try {
|
|
const filePath = path.join(dir, "data.bin");
|
|
fs.writeFileSync(filePath, "hello world");
|
|
const wrongHash = "0".repeat(64);
|
|
|
|
await assert.rejects(
|
|
() => verifyChecksum(filePath, wrongHash),
|
|
(err) => err instanceof ChecksumError,
|
|
);
|
|
} finally {
|
|
fs.rmSync(dir, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test("getExpectedChecksum: returns hash for listed archive", () => {
|
|
const dir = mktmpdir();
|
|
try {
|
|
const checksumsPath = path.join(dir, "checksums.txt");
|
|
const knownHash = "a".repeat(64);
|
|
fs.writeFileSync(
|
|
checksumsPath,
|
|
`${knownHash} lark-cli-1.0.0-linux-amd64.tar.gz\n`
|
|
);
|
|
|
|
const result = getExpectedChecksum(
|
|
"lark-cli-1.0.0-linux-amd64.tar.gz",
|
|
checksumsPath,
|
|
);
|
|
assert.strictEqual(result, knownHash);
|
|
} finally {
|
|
fs.rmSync(dir, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test("getExpectedChecksum: throws PackageIntegrityError (not ChecksumError) when checksums.txt file is absent", () => {
|
|
const dir = mktmpdir();
|
|
try {
|
|
const missingPath = path.join(dir, "does-not-exist.txt");
|
|
|
|
assert.throws(
|
|
() => getExpectedChecksum("lark-cli-1.0.0-linux-amd64.tar.gz", missingPath),
|
|
(err) =>
|
|
err instanceof PackageIntegrityError &&
|
|
!(err instanceof ChecksumError),
|
|
);
|
|
} finally {
|
|
fs.rmSync(dir, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test("getExpectedChecksum: throws ChecksumError when entry missing", () => {
|
|
const dir = mktmpdir();
|
|
try {
|
|
const checksumsPath = path.join(dir, "checksums.txt");
|
|
fs.writeFileSync(
|
|
checksumsPath,
|
|
`${"a".repeat(64)} some-other-archive.tar.gz\n`
|
|
);
|
|
|
|
assert.throws(
|
|
() => getExpectedChecksum("nonexistent-archive.tar.gz", checksumsPath),
|
|
(err) => err instanceof ChecksumError,
|
|
);
|
|
} finally {
|
|
fs.rmSync(dir, { recursive: true, force: true });
|
|
}
|
|
});
|