Files
openclaw/test/scripts/docker-all-scheduler.test.ts
2026-04-27 14:24:10 +01:00

169 lines
3.2 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
canStartSchedulerLane,
describeDockerSchedulerLimits,
} from "../../scripts/test-docker-all.mjs";
const limits = {
resourceLimits: {
docker: 2,
npm: 2,
},
weightLimit: 2,
};
function activePool({
count = 0,
resources = {},
weight = 0,
}: {
count?: number;
resources?: Record<string, number>;
weight?: number;
} = {}) {
return {
count,
resources: new Map(Object.entries(resources)),
weight,
};
}
describe("scripts/test-docker-all scheduler", () => {
it("allows an overweight lane to start alone under low parallelism", () => {
expect(
canStartSchedulerLane(
{
name: "install-e2e",
resources: ["npm"],
weight: 4,
},
activePool(),
2,
limits,
),
).toBe(true);
});
it("does not co-schedule another lane while an overweight lane is active", () => {
expect(
canStartSchedulerLane(
{
name: "package-update",
resources: ["npm"],
weight: 1,
},
activePool({
count: 1,
resources: {
docker: 4,
npm: 4,
},
weight: 4,
}),
2,
limits,
),
).toBe(false);
});
it("can co-schedule the split installer provider lanes", () => {
expect(
canStartSchedulerLane(
{
name: "install-e2e-anthropic",
resources: ["npm", "service"],
weight: 3,
},
activePool({
count: 1,
resources: {
docker: 3,
npm: 3,
service: 3,
},
weight: 3,
}),
10,
{
resourceLimits: {
docker: 10,
npm: 10,
service: 7,
},
weightLimit: 10,
},
),
).toBe(true);
});
it("preserves the parallelism count cap", () => {
expect(
canStartSchedulerLane(
{
name: "package-update",
resources: ["npm"],
weight: 1,
},
activePool({
count: 2,
resources: {
docker: 1,
npm: 1,
},
weight: 1,
}),
2,
limits,
),
).toBe(false);
});
it("keeps resource and weight limits as co-scheduling limits", () => {
expect(
canStartSchedulerLane(
{
name: "npm-smoke",
resources: ["npm"],
weight: 1,
},
activePool({
count: 1,
resources: {
docker: 1,
npm: 1,
},
weight: 1,
}),
2,
limits,
),
).toBe(true);
expect(
canStartSchedulerLane(
{
name: "npm-heavy",
resources: ["npm"],
weight: 2,
},
activePool({
count: 1,
resources: {
docker: 1,
npm: 1,
},
weight: 1,
}),
2,
limits,
),
).toBe(false);
});
it("describes effective scheduler limits for operator errors", () => {
expect(describeDockerSchedulerLimits(2, limits)).toBe(
"parallelism=2 weightLimit=2 resources=docker=2 npm=2",
);
});
});