package docker import ( "testing" "github.com/docker/docker/api/types/container" ) // TestComputeStats — verifikasi rumus tanpa daemon, angka dibuat persis. func TestComputeStats(t *testing.T) { raw := &container.StatsResponse{ CPUStats: container.CPUStats{ CPUUsage: container.CPUUsage{TotalUsage: 300_000_000}, SystemUsage: 1_000_000_000, OnlineCPUs: 4, }, PreCPUStats: container.CPUStats{ CPUUsage: container.CPUUsage{TotalUsage: 100_000_000}, SystemUsage: 500_000_000, }, MemoryStats: container.MemoryStats{ Usage: 200 * 1024 * 1024, Limit: 500 * 1024 * 1024, Stats: map[string]uint64{"cache": 50 * 1024 * 1024}, }, Networks: map[string]container.NetworkStats{ "eth0": {RxBytes: 1000, TxBytes: 2000}, "eth1": {RxBytes: 500, TxBytes: 300}, }, BlkioStats: container.BlkioStats{ IoServiceBytesRecursive: []container.BlkioStatEntry{ {Op: "Read", Value: 4096}, {Op: "Write", Value: 8192}, {Op: "Sync", Value: 999}, }, }, PidsStats: container.PidsStats{Current: 17}, } s := computeStats(raw) // CPU: (300−100)/(1000−500) × 4 × 100 = 160% if s.CPUPercent < 159.9 || s.CPUPercent > 160.1 { t.Fatalf("CPU%% = %v, mau ~160", s.CPUPercent) } // Mem: (200−50) MB dari limit 500 MB = 30% if s.MemUsed != 150*1024*1024 || s.MemPercent < 29.9 || s.MemPercent > 30.1 { t.Fatalf("mem salah: used=%d pct=%v", s.MemUsed, s.MemPercent) } if s.NetRx != 1500 || s.NetTx != 2300 { t.Fatalf("net salah: rx=%d tx=%d", s.NetRx, s.NetTx) } if s.BlkRead != 4096 || s.BlkWrite != 8192 { t.Fatalf("blk salah: r=%d w=%d", s.BlkRead, s.BlkWrite) } if s.PIDs != 17 { t.Fatalf("pids=%d", s.PIDs) } } // TestComputeStatsZeroGuard — delta nol / data kosong tidak boleh NaN/panic. func TestComputeStatsZeroGuard(t *testing.T) { s := computeStats(&container.StatsResponse{}) if s.CPUPercent != 0 || s.MemPercent != 0 || s.MemUsed != 0 { t.Fatalf("guard gagal: %+v", s) } }