- 新增 type: cpu checker,基于 os.cpus() 两次快照计算 CPU 使用率 - 配置项:sampleDuration(默认 1s)、includePerCore(默认 false) - expect 字段:usagePercent、idlePercent、maxCoreUsagePercent、minCoreUsagePercent、durationMs - idlePercent 与 usagePercent 互补恒等于 100,百分比范围 0-100 - logicalCoreCount 仅输出到 observation,不作为 expect 字段 - 不暴露 userPercent / systemPercent - 语义校验禁止 sampleDuration >= timeout - 支持 AbortSignal 超时取消 - 完整测试覆盖:schema、validate、normalize、resolve、calculate、execute、expect、config-loader - 新增用户文档 docs/user/checkers/cpu.md - 更新 checker 索引、配置类型列表、示例配置和 schema
85 lines
3.6 KiB
TypeScript
85 lines
3.6 KiB
TypeScript
import { describe, expect, test } from "bun:test";
|
|
|
|
import type { RawTargetConfig } from "../../../../../src/server/checker/types";
|
|
|
|
import { validateCpuConfig } from "../../../../../src/server/checker/runner/cpu/validate";
|
|
|
|
function validate(target: RawTargetConfig) {
|
|
return validateCpuConfig({ targets: [target] });
|
|
}
|
|
|
|
describe("validateCpuConfig", () => {
|
|
test("有效配置无错误", () => {
|
|
expect(validate({ cpu: { sampleDuration: "1s" }, id: "cpu-test", type: "cpu" })).toEqual([]);
|
|
});
|
|
|
|
test("空 cpu 配置无错误", () => {
|
|
expect(validate({ cpu: {}, id: "cpu-test", type: "cpu" })).toEqual([]);
|
|
});
|
|
|
|
test("缺少 cpu 配置分组", () => {
|
|
const issues = validate({ id: "cpu-test", type: "cpu" });
|
|
expect(issues.some((i) => i.path.endsWith("cpu") && i.code === "required")).toBe(true);
|
|
});
|
|
|
|
test("无效 sampleDuration 格式", () => {
|
|
const issues = validate({ cpu: { sampleDuration: "abc" }, id: "cpu-test", type: "cpu" });
|
|
expect(issues.some((i) => i.path.endsWith("sampleDuration"))).toBe(true);
|
|
});
|
|
|
|
test("sampleDuration >= timeout 报错", () => {
|
|
const issues = validate({ cpu: { sampleDuration: "5s" }, id: "cpu-test", timeout: "5s", type: "cpu" });
|
|
expect(issues.some((i) => i.path.endsWith("sampleDuration") && i.message.includes("必须小于 timeout"))).toBe(true);
|
|
});
|
|
|
|
test("sampleDuration 大于默认 timeout (10s) 报错", () => {
|
|
const issues = validate({ cpu: { sampleDuration: "15s" }, id: "cpu-test", type: "cpu" });
|
|
expect(issues.some((i) => i.message.includes("默认 10s"))).toBe(true);
|
|
});
|
|
|
|
test("sampleDuration < timeout 通过", () => {
|
|
const issues = validate({ cpu: { sampleDuration: "1s" }, id: "cpu-test", timeout: "5s", type: "cpu" });
|
|
expect(issues.some((i) => i.path.includes("sampleDuration"))).toBe(false);
|
|
});
|
|
|
|
test("includePerCore 非布尔值报错", () => {
|
|
const issues = validate({ cpu: { includePerCore: "yes" }, id: "cpu-test", type: "cpu" });
|
|
expect(issues.some((i) => i.path.endsWith("includePerCore") && i.code === "invalid-type")).toBe(true);
|
|
});
|
|
|
|
test("cpu 未知字段报错", () => {
|
|
const issues = validate({ cpu: { extra: true }, id: "cpu-test", type: "cpu" });
|
|
expect(issues.some((i) => i.path.endsWith("extra") && i.code === "unknown-field")).toBe(true);
|
|
});
|
|
|
|
test("expect 未知字段报错", () => {
|
|
const issues = validate({ cpu: {}, expect: { logicalCoreCount: { gte: 4 } }, id: "cpu-test", type: "cpu" });
|
|
expect(issues.some((i) => i.path.endsWith("logicalCoreCount") && i.code === "unknown-field")).toBe(true);
|
|
});
|
|
|
|
test("expect userPercent 未知字段报错", () => {
|
|
const issues = validate({ cpu: {}, expect: { userPercent: { lte: 50 } }, id: "cpu-test", type: "cpu" });
|
|
expect(issues.some((i) => i.path.endsWith("userPercent") && i.code === "unknown-field")).toBe(true);
|
|
});
|
|
|
|
test("expect systemPercent 未知字段报错", () => {
|
|
const issues = validate({ cpu: {}, expect: { systemPercent: { lte: 50 } }, id: "cpu-test", type: "cpu" });
|
|
expect(issues.some((i) => i.path.endsWith("systemPercent") && i.code === "unknown-field")).toBe(true);
|
|
});
|
|
|
|
test("expect 合法 ValueMatcher 通过", () => {
|
|
const issues = validate({
|
|
cpu: {},
|
|
expect: { maxCoreUsagePercent: { lte: 95 }, usagePercent: { lte: 85 } },
|
|
id: "cpu-test",
|
|
type: "cpu",
|
|
});
|
|
expect(issues.filter((i) => i.path.includes("expect"))).toEqual([]);
|
|
});
|
|
|
|
test("expect 非法 ValueMatcher 报错", () => {
|
|
const issues = validate({ cpu: {}, expect: { usagePercent: [1, 2] }, id: "cpu-test", type: "cpu" });
|
|
expect(issues.some((i) => i.path.includes("usagePercent"))).toBe(true);
|
|
});
|
|
});
|