node/test/fixtures/sea/get-asset.js

103 lines
2.6 KiB
JavaScript

'use strict';
const { isSea, getAsset, getAssetAsBlob } = require('node:sea');
const { readFileSync } = require('node:fs');
const assert = require('node:assert');
assert(isSea());
// Test invalid getAsset() calls.
{
assert.throws(() => getAsset('utf8_test_text.txt', 'invalid'), {
code: 'ERR_ENCODING_NOT_SUPPORTED'
});
[
1,
1n,
Symbol(),
false,
() => {},
{},
[],
null,
undefined,
].forEach(arg => assert.throws(() => getAsset(arg), {
code: 'ERR_INVALID_ARG_TYPE'
}));
assert.throws(() => getAsset('nonexistent'), {
code: 'ERR_SINGLE_EXECUTABLE_APPLICATION_ASSET_NOT_FOUND'
});
}
// Test invalid getAssetAsBlob() calls.
{
// Invalid options argument.
[
123,
123n,
Symbol(),
'',
true,
].forEach(arg => assert.throws(() => {
getAssetAsBlob('utf8_test_text.txt', arg)
}, {
code: 'ERR_INVALID_ARG_TYPE'
}));
assert.throws(() => getAssetAsBlob('nonexistent'), {
code: 'ERR_SINGLE_EXECUTABLE_APPLICATION_ASSET_NOT_FOUND'
});
}
const textAssetOnDisk = readFileSync(process.env.__TEST_UTF8_TEXT_PATH, 'utf8');
const binaryAssetOnDisk = readFileSync(process.env.__TEST_PERSON_JPG);
// Check getAsset() buffer copies.
{
// Check that the asset embedded is the same as the original.
const assetCopy1 = getAsset('person.jpg')
const assetCopyBuffer1 = Buffer.from(assetCopy1);
assert.deepStrictEqual(assetCopyBuffer1, binaryAssetOnDisk);
const assetCopy2 = getAsset('person.jpg');
const assetCopyBuffer2 = Buffer.from(assetCopy2);
assert.deepStrictEqual(assetCopyBuffer2, binaryAssetOnDisk);
// Zero-fill copy1.
assetCopyBuffer1.fill(0);
// Test that getAsset() returns an immutable copy.
assert.deepStrictEqual(assetCopyBuffer2, binaryAssetOnDisk);
assert.notDeepStrictEqual(assetCopyBuffer1, binaryAssetOnDisk);
}
// Check getAsset() with encoding.
{
const actualAsset = getAsset('utf8_test_text.txt', 'utf8')
assert.strictEqual(actualAsset, textAssetOnDisk);
// Log it out so that the test could compare it and see if
// it's encoded/decoded correctly in the SEA.
console.log(actualAsset);
}
// Check getAssetAsBlob().
{
let called = false;
async function test() {
const blob = getAssetAsBlob('person.jpg');
const buffer = await blob.arrayBuffer();
assert.deepStrictEqual(Buffer.from(buffer), binaryAssetOnDisk);
const blob2 = getAssetAsBlob('utf8_test_text.txt');
const text = await blob2.text();
assert.strictEqual(text, textAssetOnDisk);
}
test().then(() => {
called = true;
});
process.on('exit', () => {
assert(called);
});
}