实现 type: ping checker,通过 Bun.spawn 调用系统 ping 命令,自行实现跨平台 输出解析器(Linux/macOS/Windows 含中文 locale),支持 alive、丢包率、延迟、 耗时等 expect 断言,复用现有 checker 架构零外部依赖。 包含完整的类型定义、TypeBox schema、语义校验、命令构建、解析、断言、执行、 注册、配置加载测试,以及 probe-config.schema.json 更新和文档更新。 审查修复:提取 buildPingCommand 为独立纯函数并补充跨平台单测,补充 maxDurationMs/maxAvgLatencyMs 类型非法和空字符串 host 边界测试用例。 变更已归档,delta specs 已同步至 main specs。
71 lines
2.8 KiB
TypeScript
71 lines
2.8 KiB
TypeScript
import { describe, expect, test } from "bun:test";
|
|
|
|
import type { RawTargetConfig } from "../../../../../src/server/checker/types";
|
|
|
|
import { validatePingConfig } from "../../../../../src/server/checker/runner/icmp/validate";
|
|
|
|
function validate(target: RawTargetConfig) {
|
|
return validatePingConfig({ defaults: {}, targets: [target] });
|
|
}
|
|
|
|
describe("validatePingConfig", () => {
|
|
test("有效配置无错误", () => {
|
|
expect(validate({ id: "ping", ping: { count: 3, host: "127.0.0.1", packetSize: 56 }, type: "ping" })).toEqual([]);
|
|
});
|
|
|
|
test("host 缺失", () => {
|
|
const issues = validate({ id: "ping", ping: {}, type: "ping" });
|
|
expect(issues.some((item) => item.path.endsWith("ping.host"))).toBe(true);
|
|
});
|
|
|
|
test("host 类型非法", () => {
|
|
const issues = validate({ id: "ping", ping: { host: 123 }, type: "ping" });
|
|
expect(issues.some((item) => item.path.endsWith("ping.host"))).toBe(true);
|
|
});
|
|
|
|
test("count 非法", () => {
|
|
const issues = validate({ id: "ping", ping: { count: 0, host: "127.0.0.1" }, type: "ping" });
|
|
expect(issues.some((item) => item.path.endsWith("ping.count"))).toBe(true);
|
|
});
|
|
|
|
test("packetSize 非法", () => {
|
|
const issues = validate({ id: "ping", ping: { host: "127.0.0.1", packetSize: 65501 }, type: "ping" });
|
|
expect(issues.some((item) => item.path.endsWith("ping.packetSize"))).toBe(true);
|
|
});
|
|
|
|
test("ping 未知字段", () => {
|
|
const issues = validate({ id: "ping", ping: { host: "127.0.0.1", timeout: 5 }, type: "ping" });
|
|
expect(issues.some((item) => item.code === "unknown-field" && item.path.endsWith("ping.timeout"))).toBe(true);
|
|
});
|
|
|
|
test("expect 未知字段", () => {
|
|
const issues = validate({ expect: { status: [200] }, id: "ping", ping: { host: "127.0.0.1" }, type: "ping" });
|
|
expect(issues.some((item) => item.path.endsWith("expect.status"))).toBe(true);
|
|
});
|
|
|
|
test("expect 数值非法", () => {
|
|
const issues = validate({ expect: { maxPacketLoss: 101 }, id: "ping", ping: { host: "127.0.0.1" }, type: "ping" });
|
|
expect(issues.some((item) => item.path.endsWith("expect.maxPacketLoss"))).toBe(true);
|
|
});
|
|
|
|
test("maxDurationMs 类型非法", () => {
|
|
const issues = validate({ expect: { maxDurationMs: -1 }, id: "ping", ping: { host: "127.0.0.1" }, type: "ping" });
|
|
expect(issues.some((item) => item.path.endsWith("expect.maxDurationMs"))).toBe(true);
|
|
});
|
|
|
|
test("maxAvgLatencyMs 类型非法", () => {
|
|
const issues = validate({
|
|
expect: { maxAvgLatencyMs: "slow" },
|
|
id: "ping",
|
|
ping: { host: "127.0.0.1" },
|
|
type: "ping",
|
|
});
|
|
expect(issues.some((item) => item.path.endsWith("expect.maxAvgLatencyMs"))).toBe(true);
|
|
});
|
|
|
|
test("host 为空字符串", () => {
|
|
const issues = validate({ id: "ping", ping: { host: " " }, type: "ping" });
|
|
expect(issues.some((item) => item.path.endsWith("ping.host"))).toBe(true);
|
|
});
|
|
});
|