mirror of
https://github.com/whyour/qinglong.git
synced 2026-09-21 00:38:14 +08:00
147 lines
4.1 KiB
JavaScript
147 lines
4.1 KiB
JavaScript
const assert = require('node:assert/strict');
|
|
const { generateKeyPairSync } = require('node:crypto');
|
|
const { test } = require('node:test');
|
|
|
|
const {
|
|
createPluginPackagePublisherTrustSnapshot,
|
|
} = require('@qinglong/runtime-core/plugin-package-publisher-trust');
|
|
const {
|
|
PostgresPluginPackagePublisherTrustAuthorityRepository,
|
|
} = require('../dist/plugin-package/publisher/pluginPackagePublisherTrustAuthorityRepository');
|
|
|
|
function snapshot(publisher, keyId) {
|
|
const { publicKey } = generateKeyPairSync('ed25519');
|
|
return createPluginPackagePublisherTrustSnapshot([
|
|
{
|
|
publisher,
|
|
keyId,
|
|
publicKeyPem: publicKey.export({ type: 'spki', format: 'pem' }),
|
|
notBeforeMs: 1,
|
|
notAfterMs: 10_000,
|
|
},
|
|
]);
|
|
}
|
|
|
|
function fixture() {
|
|
const snapshots = new Map();
|
|
let head = null;
|
|
const queries = [];
|
|
const query = async (text, values = []) => {
|
|
queries.push({ text, values });
|
|
if (
|
|
text.includes(
|
|
'INSERT INTO "ql3"."plugin_package_publisher_trust_snapshots"',
|
|
)
|
|
) {
|
|
snapshots.set(values[0], JSON.parse(values[4]));
|
|
return { rows: [], rowCount: 1 };
|
|
}
|
|
if (
|
|
text.includes(
|
|
'FROM "ql3"."plugin_package_publisher_trust_heads" AS head',
|
|
)
|
|
) {
|
|
if (!head || head.authorityId !== values[0]) return { rows: [] };
|
|
const effective = snapshots.get(head.effectiveTrustDigest);
|
|
return {
|
|
rows: [
|
|
{
|
|
headJson: head,
|
|
headDigest: head.headDigest,
|
|
snapshotJson: effective,
|
|
snapshotDigest: effective.snapshotDigest,
|
|
},
|
|
],
|
|
};
|
|
}
|
|
if (
|
|
text.includes(
|
|
'INSERT INTO "ql3"."plugin_package_publisher_trust_heads"',
|
|
)
|
|
) {
|
|
if (head && head.authorityId === values[0]) {
|
|
return { rows: [], rowCount: 0 };
|
|
}
|
|
head = JSON.parse(values[6]);
|
|
return { rows: [], rowCount: 1 };
|
|
}
|
|
return { rows: [], rowCount: 0 };
|
|
};
|
|
const client = {
|
|
query,
|
|
release() {},
|
|
};
|
|
const repository =
|
|
new PostgresPluginPackagePublisherTrustAuthorityRepository({
|
|
query,
|
|
async connect() {
|
|
return client;
|
|
},
|
|
});
|
|
return { repository, queries, head: () => head };
|
|
}
|
|
|
|
test('observes one base snapshot and returns the durable effective head', async () => {
|
|
const value = fixture();
|
|
const base = snapshot('publisher-a.example', 'key-a');
|
|
const created = await value.repository.observeSnapshot({
|
|
authorityId: 'cluster',
|
|
snapshot: base,
|
|
observedBy: 'package-manager-1',
|
|
observedAtMs: 100,
|
|
});
|
|
assert.equal(created.status, 'created');
|
|
assert.equal(created.head.generation, 1);
|
|
assert.equal(created.head.baseSnapshotDigest, base.snapshotDigest);
|
|
assert.equal(
|
|
created.head.effectiveTrustDigest,
|
|
base.snapshotDigest,
|
|
);
|
|
|
|
const replay = await value.repository.observeSnapshot({
|
|
authorityId: 'cluster',
|
|
snapshot: base,
|
|
observedBy: 'package-manager-2',
|
|
observedAtMs: 200,
|
|
});
|
|
assert.equal(replay.status, 'existing');
|
|
assert.deepEqual(
|
|
await value.repository.findAuthority('cluster'),
|
|
{
|
|
head: value.head(),
|
|
effectiveSnapshot: base,
|
|
},
|
|
);
|
|
assert.equal(
|
|
value.queries.filter(({ text }) =>
|
|
text.includes(
|
|
'INSERT INTO "ql3"."plugin_package_publisher_trust_heads"',
|
|
),
|
|
).length,
|
|
2,
|
|
);
|
|
});
|
|
|
|
test('observes changed material as a candidate without advancing the head', async () => {
|
|
const value = fixture();
|
|
const base = snapshot('publisher-a.example', 'key-a');
|
|
await value.repository.observeSnapshot({
|
|
authorityId: 'cluster',
|
|
snapshot: base,
|
|
observedBy: 'package-manager-1',
|
|
observedAtMs: 100,
|
|
});
|
|
const candidate = snapshot('publisher-b.example', 'key-b');
|
|
const observed = await value.repository.observeSnapshot({
|
|
authorityId: 'cluster',
|
|
snapshot: candidate,
|
|
observedBy: 'package-manager-1',
|
|
observedAtMs: 200,
|
|
});
|
|
assert.equal(observed.status, 'candidate');
|
|
assert.equal(observed.head.generation, 1);
|
|
assert.equal(observed.head.baseSnapshotDigest, base.snapshotDigest);
|
|
assert.equal(observed.head.effectiveTrustDigest, base.snapshotDigest);
|
|
assert.deepEqual(observed.effectiveSnapshot, base);
|
|
});
|