Open History to see the last commit
1import { describe, expect, it } from "vite-plus/test";
2
3import type { ResourceTelemetryProcess } from "@t3tools/contracts";
4import * as DateTime from "effect/DateTime";
5
6import {
7 formatCpuTime,
8 formatSamplingStatus,
9 visibleResourceTelemetryProcesses,
10} from "./ResourceTelemetryDiagnostics.logic";
11
12const process = (pid: number, ppid: number, depth: number): ResourceTelemetryProcess => ({
13 identity: { pid, startTimeMs: pid * 1_000 },
14 ppid,
15 childPids: [],
16 depth,
17 name: `process-${pid}`,
18 command: `process-${pid}`,
19 status: "Running",
20 category: pid === 1 ? "server" : "server-child",
21 cpuPercent: 0,
22 cpuTimeMs: 0,
23 residentBytes: 0,
24 peakResidentBytes: 0,
25 virtualBytes: 0,
26 ioReadBytes: 0,
27 ioWriteBytes: 0,
28 ioReadBytesPerSecond: 0,
29 ioWriteBytesPerSecond: 0,
30 ioSemantics: "storage",
31 runTimeMs: 0,
32 firstSeenAt: DateTime.makeUnsafe(0),
33 lastSeenAt: DateTime.makeUnsafe(0),
34});
35
36describe("visibleResourceTelemetryProcesses", () => {
37 it("hides descendants by parentage even when rows are not depth-first", () => {
38 const processes = [
39 process(1, 0, 0),
40 process(10, 0, 0),
41 process(2, 1, 1),
42 process(11, 10, 1),
43 process(3, 2, 2),
44 ];
45
46 expect(visibleResourceTelemetryProcesses(processes, new Set(["1:1000"]))).toEqual([
47 processes[0],
48 processes[1],
49 processes[3],
50 ]);
51 });
52
53 it("keeps a root row visible when its launcher is collapsed", () => {
54 const processes = [process(1, 10, 0), process(2, 1, 1), process(10, 0, 0), process(11, 10, 1)];
55
56 expect(visibleResourceTelemetryProcesses(processes, new Set(["10:10000"]))).toEqual([
57 processes[0],
58 processes[1],
59 processes[2],
60 ]);
61 });
62});
63
64describe("formatCpuTime", () => {
65 it("switches units when rounding reaches the next unit", () => {
66 expect([59.94, 59.97, 3_599.7, 3_600].map((seconds) => formatCpuTime(seconds))).toEqual([
67 "59.9s",
68 "1m",
69 "1h",
70 "1h",
71 ]);
72 });
73});
74
75describe("formatSamplingStatus", () => {
76 it("reads an idle interval as on demand rather than every 0 ms", () => {
77 expect([0, 500, 2_000].map((intervalMs) => formatSamplingStatus(intervalMs))).toEqual([
78 "Sampling on demand",
79 "Sampling every 500 ms",
80 "Sampling every 2 seconds",
81 ]);
82 });
83});