import { describe, expect, test } from "bun:test"; import { parsePingOutput } from "../../../../../src/server/checker/runner/icmp/parse"; describe("parsePingOutput", () => { test("解析 Linux ping 输出", () => { const stats = parsePingOutput( `3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 1.234/2.345/3.456/0.567 ms`, "linux", ); expect(stats).toEqual({ alive: true, avgLatencyMs: 2.345, maxLatencyMs: 3.456, minLatencyMs: 1.234, packetLoss: 0, received: 3, transmitted: 3, }); }); test("解析 macOS ping 输出", () => { const stats = parsePingOutput( `3 packets transmitted, 3 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 1.234/2.345/3.456/0.567 ms`, "darwin", ); expect(stats?.avgLatencyMs).toBe(2.345); expect(stats?.packetLoss).toBe(0); }); test("解析 Windows 英文 ping 输出", () => { const stats = parsePingOutput( `Packets: Sent = 3, Received = 3, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 1ms, Maximum = 3ms, Average = 2ms`, "win32", ); expect(stats).toMatchObject({ avgLatencyMs: 2, maxLatencyMs: 3, minLatencyMs: 1, packetLoss: 0 }); }); test("解析 Windows 中文 ping 输出", () => { const stats = parsePingOutput( `数据包: 已发送 = 3,已接收 = 3,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位): 最短 = 1ms,最长 = 3ms,平均 = 2ms`, "win32", ); expect(stats).toMatchObject({ avgLatencyMs: 2, maxLatencyMs: 3, minLatencyMs: 1, packetLoss: 0 }); }); test("解析全部丢包", () => { const stats = parsePingOutput(`3 packets transmitted, 0 received, 100% packet loss, time 2003ms`, "linux"); expect(stats).toMatchObject({ alive: false, avgLatencyMs: null, maxLatencyMs: null, minLatencyMs: null }); }); test("无法解析返回 null", () => { expect(parsePingOutput("unexpected output", "linux")).toBeNull(); }); });