mirror of
https://github.com/Kaelio/ktx.git
synced 2026-06-07 07:55:13 +02:00
168 lines
5.8 KiB
JavaScript
168 lines
5.8 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
import { tmpdir } from 'node:os';
|
|
import path from 'node:path';
|
|
import { describe, it } from 'node:test';
|
|
import { acquirePublicBenchmarkFixtures } from './acquire-public-benchmark-fixtures.mjs';
|
|
|
|
function tempRoot() {
|
|
return mkdtempSync(path.join(tmpdir(), 'ktx-acquire-'));
|
|
}
|
|
|
|
function writeManifest(dir, fixtures) {
|
|
const p = path.join(dir, 'manifest.json');
|
|
writeFileSync(p, JSON.stringify({ fixtures }), 'utf8');
|
|
return p;
|
|
}
|
|
|
|
describe('acquirePublicBenchmarkFixtures', () => {
|
|
it('downloads, hashes, and writes data.sqlite for each manifest entry', async () => {
|
|
const root = tempRoot();
|
|
try {
|
|
const fixturesRoot = path.join(root, 'fixtures');
|
|
const manifestPath = writeManifest(root, [
|
|
{ id: 'foo_fixture', url: 'https://example.invalid/foo', sha256: '' },
|
|
]);
|
|
const calls = [];
|
|
const result = await acquirePublicBenchmarkFixtures({
|
|
manifestPath,
|
|
fixturesRoot,
|
|
fetch: async (url) => {
|
|
calls.push(url);
|
|
return {
|
|
ok: true,
|
|
status: 200,
|
|
async arrayBuffer() {
|
|
return Buffer.from('hello-sqlite');
|
|
},
|
|
};
|
|
},
|
|
log: () => {},
|
|
});
|
|
assert.equal(calls.length, 1);
|
|
assert.equal(calls[0], 'https://example.invalid/foo');
|
|
assert.equal(result.length, 1);
|
|
assert.equal(result[0].action, 'downloaded');
|
|
const dest = path.join(fixturesRoot, 'foo_fixture', 'data.sqlite');
|
|
assert.ok(existsSync(dest));
|
|
assert.equal(readFileSync(dest, 'utf8'), 'hello-sqlite');
|
|
} finally {
|
|
rmSync(root, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
it('skips when existing file matches the manifest sha256', async () => {
|
|
const root = tempRoot();
|
|
try {
|
|
const fixturesRoot = path.join(root, 'fixtures');
|
|
const fixtureDir = path.join(fixturesRoot, 'foo_fixture');
|
|
const dest = path.join(fixtureDir, 'data.sqlite');
|
|
const { mkdirSync } = await import('node:fs');
|
|
mkdirSync(fixtureDir, { recursive: true });
|
|
writeFileSync(dest, Buffer.from('hello-sqlite'));
|
|
const expectedHash = '52a3e2d435cdf97a44eca3dd4882d008b9ef73b63bc75476d320fdd665c812c0'; // pragma: allowlist secret
|
|
const manifestPath = writeManifest(root, [
|
|
{ id: 'foo_fixture', url: 'https://example.invalid/foo', sha256: expectedHash },
|
|
]);
|
|
let fetchCalls = 0;
|
|
const result = await acquirePublicBenchmarkFixtures({
|
|
manifestPath,
|
|
fixturesRoot,
|
|
fetch: async () => {
|
|
fetchCalls += 1;
|
|
throw new Error('should not fetch');
|
|
},
|
|
log: () => {},
|
|
});
|
|
assert.equal(result[0].action, 'skip');
|
|
assert.equal(fetchCalls, 0);
|
|
assert.equal(readFileSync(dest, 'utf8'), 'hello-sqlite');
|
|
} finally {
|
|
rmSync(root, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
it('throws when the downloaded payload sha256 does not match the manifest', async () => {
|
|
const root = tempRoot();
|
|
try {
|
|
const fixturesRoot = path.join(root, 'fixtures');
|
|
const manifestPath = writeManifest(root, [
|
|
{
|
|
id: 'foo_fixture',
|
|
url: 'https://example.invalid/foo',
|
|
sha256: '0000000000000000000000000000000000000000000000000000000000000000',
|
|
},
|
|
]);
|
|
await assert.rejects(
|
|
acquirePublicBenchmarkFixtures({
|
|
manifestPath,
|
|
fixturesRoot,
|
|
fetch: async () => ({
|
|
ok: true,
|
|
status: 200,
|
|
async arrayBuffer() {
|
|
return Buffer.from('different-payload');
|
|
},
|
|
}),
|
|
log: () => {},
|
|
}),
|
|
/Hash mismatch/,
|
|
);
|
|
} finally {
|
|
rmSync(root, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
it('surfaces non-OK HTTP statuses with the fixture id', async () => {
|
|
const root = tempRoot();
|
|
try {
|
|
const fixturesRoot = path.join(root, 'fixtures');
|
|
const manifestPath = writeManifest(root, [
|
|
{ id: 'foo_fixture', url: 'https://example.invalid/foo', sha256: '' },
|
|
]);
|
|
await assert.rejects(
|
|
acquirePublicBenchmarkFixtures({
|
|
manifestPath,
|
|
fixturesRoot,
|
|
fetch: async () => ({
|
|
ok: false,
|
|
status: 404,
|
|
async arrayBuffer() {
|
|
return Buffer.alloc(0);
|
|
},
|
|
}),
|
|
log: () => {},
|
|
}),
|
|
/foo_fixture .* HTTP 404/,
|
|
);
|
|
} finally {
|
|
rmSync(root, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
it('pins every checked-in public benchmark fixture download in the manifest', () => {
|
|
const manifestPath = new URL('./public-benchmark-manifest.json', import.meta.url);
|
|
const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
|
|
const fixtureIds = manifest.fixtures.map((fixture) => fixture.id).sort();
|
|
|
|
assert.deepEqual(fixtureIds, [
|
|
'adventureworkslt_with_declared_metadata',
|
|
'chinook_with_declared_metadata',
|
|
'northwind_with_declared_metadata',
|
|
'sakila_with_declared_metadata',
|
|
]);
|
|
|
|
const adventureWorks = manifest.fixtures.find(
|
|
(fixture) => fixture.id === 'adventureworkslt_with_declared_metadata',
|
|
);
|
|
assert.ok(adventureWorks);
|
|
assert.equal(adventureWorks.displayName, 'AdventureWorksLT (SQLite, declared metadata)');
|
|
assert.equal(
|
|
adventureWorks.url,
|
|
'https://github.com/nuitsjp/AdventureWorks-for-SQLite/releases/download/Release-1_0_0/AdventureWorksLT.db',
|
|
);
|
|
assert.equal(adventureWorks.sha256, 'f1a87a31f4efb5654f57a3b1ca47fac338972ceb7553673d66ea0bd9d55a7008'); // pragma: allowlist secret
|
|
assert.equal(adventureWorks.license, 'MIT');
|
|
assert.equal(adventureWorks.source, 'https://github.com/nuitsjp/AdventureWorks-for-SQLite');
|
|
});
|
|
});
|