mirror of
https://github.com/whyour/qinglong.git
synced 2026-09-22 02:27:44 +08:00
feat(ql3): establish 3.0 incubation baseline
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
const assert = require('node:assert/strict');
|
||||
const { test } = require('node:test');
|
||||
const {
|
||||
createLocalExecutionContextRecipe,
|
||||
createLocalTaskExecutionRevision,
|
||||
localTaskExecutionRevisionDigest,
|
||||
normalizeLocalDispatchCandidate,
|
||||
normalizeLocalTaskExecutionRevision,
|
||||
} = require('../dist/local-runtime/localDispatch');
|
||||
|
||||
test('context recipes are content-addressed and canonical', () => {
|
||||
const recipe = createLocalExecutionContextRecipe({
|
||||
environment: [
|
||||
{ name: 'Z_VALUE', kind: 'public', value: 'z' },
|
||||
{ name: 'A_VALUE', kind: 'secret', secretRef: 'secret-a' },
|
||||
],
|
||||
createdAtMs: 1,
|
||||
});
|
||||
assert.match(recipe.contextRef, /^localctx:sha256:[a-f0-9]{64}$/);
|
||||
assert.equal(recipe.contextRef, `localctx:sha256:${recipe.contentDigest}`);
|
||||
assert.deepEqual(
|
||||
recipe.environment.map(({ name }) => name),
|
||||
['A_VALUE', 'Z_VALUE'],
|
||||
);
|
||||
assert.throws(
|
||||
() =>
|
||||
createLocalExecutionContextRecipe({
|
||||
environment: [
|
||||
{ name: 'QL3_RECEIPT_TOKEN', kind: 'public', value: 'forged' },
|
||||
],
|
||||
createdAtMs: 1,
|
||||
}),
|
||||
/invalid or duplicated/,
|
||||
);
|
||||
});
|
||||
|
||||
test('local revisions use bounded absolute commands and immutable context refs', () => {
|
||||
const recipe = createLocalExecutionContextRecipe({
|
||||
environment: [],
|
||||
createdAtMs: 1,
|
||||
});
|
||||
const revision = createLocalTaskExecutionRevision({
|
||||
projectId: 'default',
|
||||
taskId: 'task-1',
|
||||
taskRevision: 'revision-1',
|
||||
executorType: 'local_process',
|
||||
command: { kind: 'argv', file: '/bin/echo', args: ['hello'] },
|
||||
contextRef: recipe.contextRef,
|
||||
createdAtMs: 1,
|
||||
});
|
||||
assert.equal(Object.isFrozen(revision), true);
|
||||
assert.equal(Object.isFrozen(revision.command), true);
|
||||
assert.match(revision.contentDigest, /^[a-f0-9]{64}$/);
|
||||
assert.equal(
|
||||
revision.contentDigest,
|
||||
localTaskExecutionRevisionDigest(revision),
|
||||
);
|
||||
assert.equal(
|
||||
createLocalTaskExecutionRevision({ ...revision, createdAtMs: 2 })
|
||||
.contentDigest,
|
||||
revision.contentDigest,
|
||||
);
|
||||
assert.throws(
|
||||
() =>
|
||||
normalizeLocalTaskExecutionRevision({
|
||||
...revision,
|
||||
contentDigest: '0'.repeat(64),
|
||||
}),
|
||||
/digest does not match/,
|
||||
);
|
||||
assert.throws(
|
||||
() =>
|
||||
normalizeLocalTaskExecutionRevision({
|
||||
...revision,
|
||||
command: { kind: 'argv', file: 'echo', args: [] },
|
||||
}),
|
||||
/absolute/,
|
||||
);
|
||||
});
|
||||
|
||||
test('dispatch candidates reject non-local executors and invalid ordering facts', () => {
|
||||
const candidate = {
|
||||
runId: 'run-1',
|
||||
attemptId: 'attempt-1',
|
||||
projectId: 'default',
|
||||
taskId: 'task-1',
|
||||
taskRevision: 'revision-1',
|
||||
attemptNumber: 1,
|
||||
executorType: 'local_process',
|
||||
priority: 1,
|
||||
queuedAtMs: 1,
|
||||
attemptCreatedAtMs: 1,
|
||||
};
|
||||
assert.deepEqual(normalizeLocalDispatchCandidate(candidate), candidate);
|
||||
assert.throws(
|
||||
() =>
|
||||
normalizeLocalDispatchCandidate({
|
||||
...candidate,
|
||||
executorType: 'remote_worker',
|
||||
}),
|
||||
/executor type/,
|
||||
);
|
||||
});
|
||||
Reference in New Issue
Block a user