Files
openclaw/test/scripts/crabbox-routing-policy.test.ts
2026-07-31 22:28:20 +08:00

95 lines
2.8 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
crabboxProviderChain,
normalizeCrabboxWorkload,
selectReadyCrabboxProvider,
} from "../../scripts/crabbox-routing-policy.mjs";
const advertisedProviders = ["aws", "azure", "blacksmith-testbox", "daytona"];
describe("Crabbox routing policy", () => {
it("normalizes supported workload aliases", () => {
expect(normalizeCrabboxWorkload("check")).toBe("ci-fast");
expect(normalizeCrabboxWorkload("release")).toBe("release-proof");
expect(normalizeCrabboxWorkload("unknown")).toBeNull();
});
it("routes CI checks through Blacksmith, Daytona, Azure, then AWS", () => {
expect(
crabboxProviderChain({
workload: "ci-fast",
configuredProvider: "blacksmith-testbox",
target: "linux",
advertisedProviders,
}),
).toEqual(["blacksmith-testbox", "daytona", "azure", "aws"]);
});
it("does not let persistent cloud config outrank the CI policy", () => {
expect(
crabboxProviderChain({
workload: "ci-proof",
configuredProvider: "aws",
target: "linux",
advertisedProviders,
}),
).toEqual(["blacksmith-testbox", "daytona", "azure", "aws"]);
});
it("prefers Daytona for interactive Linux work", () => {
expect(
crabboxProviderChain({
workload: "interactive",
configuredProvider: "blacksmith-testbox",
target: "linux",
advertisedProviders,
}),
).toEqual(["daytona", "azure", "aws"]);
});
it("keeps untrusted work off Blacksmith and Daytona pending isolation proof", () => {
expect(
crabboxProviderChain({
workload: "untrusted",
configuredProvider: "blacksmith-testbox",
target: "linux",
advertisedProviders,
}),
).toEqual(["azure", "aws"]);
});
it("uses Azure then AWS for Windows and only AWS for macOS", () => {
expect(
crabboxProviderChain({
workload: "ci-fast",
configuredProvider: "blacksmith-testbox",
target: "windows",
advertisedProviders,
}),
).toEqual(["azure", "aws"]);
expect(
crabboxProviderChain({
workload: "ci-fast",
configuredProvider: "blacksmith-testbox",
target: "macos",
advertisedProviders,
}),
).toEqual(["aws"]);
});
it("selects the first ready provider without racing providers", () => {
const readiness = new Map([
["blacksmith-testbox", { ready: false, reason: "queued" }],
["daytona", { ready: true, reason: "broker-ready" }],
["azure", { ready: true, reason: "broker-ready" }],
]);
expect(
selectReadyCrabboxProvider(["blacksmith-testbox", "daytona", "azure"], readiness),
).toEqual({
provider: "daytona",
readiness: { ready: true, reason: "broker-ready" },
});
});
});