Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 11 additions & 43 deletions runs/contextful-measures.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
import { it } from "@effect/vitest";
import { spawnSync } from "node:child_process";
import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { Effect, Exit } from "effect";
import { describe, expect } from "vitest";
import { makeCFRuntimeTest } from "@fractalboxdev/flare-dispatch-core/testing";
Expand All @@ -26,48 +22,19 @@ describe("contextful-measures", () => {
it("allows a scheduled measurement to queue behind a full sandbox pool", () => {
expect(contextfulMeasures.limits.admissionMaxQueueAgeSec).toBe(21600);
});
it("builds a newline-terminated report from every record with the execution attempt", () => {
const dir = mkdtempSync(join(tmpdir(), "contextful-measures-"));
try {
const recordsDir = join(dir, "target/evaluate/records");
mkdirSync(recordsDir, { recursive: true });
writeFileSync(join(recordsDir, "b.json"), '{"tier":"b","passed":false}');
writeFileSync(join(recordsDir, "a.json"), '{"tier":"a","passed":true}');
const result = spawnSync("sh", ["-c", reportCommand], {
cwd: dir,
env: {
...process.env,
MEASURE_COMMIT: sha,
MEASURE_RUN_ID: "contextful_measures_attempt-2",
MEASURE_RUN_ATTEMPT: "2",
MEASURE_EXIT: "3",
},
encoding: "utf8",
});
expect(result.status).toBe(0);
const text = readFileSync(join(dir, "measure-report.json"), "utf8");
expect(text.endsWith("\n")).toBe(true);
expect(JSON.parse(text)).toEqual({
commit: sha,
run_id: "contextful_measures_attempt-2",
run_attempt: 2,
exit_code: 3,
records: [
{ tier: "a", passed: true },
{ tier: "b", passed: false },
],
});
expect(runAttempt("contextful_measures_attempt-2")).toBe(2);
expect(runAttempt("contextful_measures_daily")).toBe(1);
} finally {
rmSync(dir, { recursive: true, force: true });
}
it("delegates the note line to contextful-ci measure-report with the execution attempt", () => {
expect(reportCommand).toContain("+refs/notes/measures:refs/notes/measures || true");
expect(reportCommand).toContain(
'contextful-ci -- measure-report --commit "$MEASURE_COMMIT" --run-id "$MEASURE_RUN_ID" --run-attempt "$MEASURE_RUN_ATTEMPT" --exit-code "$MEASURE_EXIT" --out measure-report.json',
);
expect(runAttempt("contextful_measures_attempt-2")).toBe(2);
expect(runAttempt("contextful_measures_daily")).toBe(1);
});
it.effect("measures the resolved default-branch SHA and attaches its report", () => {
const { layer, handles } = makeCFRuntimeTest({
executionId: "contextful_measures_attempt-2",
github: { branchHeads: { "fractalboxdev/contextful:main": sha } },
sandboxProgram: { "cargo run --locked": { exitCode: 0 }, "node -e": { exitCode: 0 } },
sandboxProgram: { "measure --tier all": { exitCode: 0 }, "measure-report": { exitCode: 0 } },
sandboxFiles: { "/workspace/contextful/measure-report.json": report },
});
return Effect.gen(function* () {
Expand All @@ -78,16 +45,17 @@ describe("contextful-measures", () => {
{ repo: input.repo, commit: sha, text: report },
]);
expect(handles.artifact.uploads[0]?.name).toBe("measure-report.json");
const reportExec = handles.sandbox.execs.find((entry) => entry.command.startsWith("node -e"));
const reportExec = handles.sandbox.execs.find((entry) => entry.command.includes("measure-report"));
expect(reportExec?.env?.MEASURE_RUN_ID).toBe("contextful_measures_attempt-2");
expect(reportExec?.env?.MEASURE_RUN_ATTEMPT).toBe("2");
expect(reportExec?.env?.MEASURE_EXIT).toBe("0");
}).pipe(Effect.provide(layer));
});

it.effect("attaches a report even when a measure tier is red", () => {
const { layer, handles } = makeCFRuntimeTest({
github: { branchHeads: { "fractalboxdev/contextful:main": sha } },
sandboxProgram: { "cargo run --locked": { exitCode: 3 }, "node -e": { exitCode: 0 } },
sandboxProgram: { "measure --tier all": { exitCode: 3 }, "measure-report": { exitCode: 0 } },
sandboxFiles: { "/workspace/contextful/measure-report.json": report },
});
return Effect.gen(function* () {
Expand Down
9 changes: 7 additions & 2 deletions runs/contextful-measures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,13 @@ const Output = Schema.Struct({
reportUrl: Schema.String,
});

/** Build the JSON record in the container, preserving failed-tier results. */
export const reportCommand = `node -e 'const fs=require("node:fs"); const path=require("node:path"); const dir="target/evaluate/records"; const records=fs.existsSync(dir)?fs.readdirSync(dir).filter(n=>n.endsWith(".json")).sort().map(n=>JSON.parse(fs.readFileSync(path.join(dir,n),"utf8"))):[]; fs.writeFileSync("${REPORT_FILE}",JSON.stringify({commit:process.env.MEASURE_COMMIT,run_id:process.env.MEASURE_RUN_ID,run_attempt:Number(process.env.MEASURE_RUN_ATTEMPT),exit_code:Number(process.env.MEASURE_EXIT),records})+"\\n");'`;
/**
* Contextful's `measure-report` owns the note line: it collects every record, red
* tiers included, and annotates trend figures against the history under
* `refs/notes/measures`, which a plain clone omits. A failed notes fetch leaves
* no history, and the report then carries no annotation.
*/
export const reportCommand = `(git fetch -q origin +refs/notes/measures:refs/notes/measures || true) && cargo run --locked -q -p contextful-ci -- measure-report --commit "$MEASURE_COMMIT" --run-id "$MEASURE_RUN_ID" --run-attempt "$MEASURE_RUN_ATTEMPT" --exit-code "$MEASURE_EXIT" --out ${REPORT_FILE}`;

export const runAttempt = (executionId: string): number =>
Number(executionId.match(/_attempt-(\d+)$/)?.[1] ?? 1);
Expand Down
Loading