import test from 'brittle' import fs from 'fs' import path from 'path' import os from 'os' import { discoverCgroupContainers, readCgroupCpu, readCgroupMemory, isDockerCollectorEnabled, resolveDockerSocket, } from '../server/services/collectors/docker.js' import { makeDockerCpuChart, makeDockerMemChart, DOCKER_CONTAINERS_CHART, } from '../shared/metrics.js' function writeFixtureCgroup(root, id) { const dir = path.join(root, `docker-${id}.scope`) fs.mkdirSync(dir, { recursive: true }) fs.writeFileSync( path.join(dir, 'cpu.stat'), 'usage_usec 5000000\nuser_usec 4000000\nsystem_usec 1000000\n' ) fs.writeFileSync(path.join(dir, 'memory.current'), String(64 * 1024 * 1024)) fs.writeFileSync(path.join(dir, 'memory.max'), String(256 * 1024 * 1024)) return dir } test('docker chart helpers', (t) => { t.is(DOCKER_CONTAINERS_CHART.id, 'docker.containers') const cpu = makeDockerCpuChart('abc123def456', 'nginx') t.is(cpu.id, 'docker.cpu.abc123def456') t.is(cpu.context, 'docker.cpu') t.is(cpu.title, 'nginx · CPU') t.is(cpu.family, 'nginx') const mem = makeDockerMemChart('abc123def456', 'nginx') t.is(mem.id, 'docker.mem.abc123def456') t.is(mem.title, 'nginx · memory') t.ok(mem.dimensions.find((d) => d.id === 'usage')) }) test('isDockerCollectorEnabled', (t) => { const prev = process.env.PEARDATA_DOCKER delete process.env.PEARDATA_DOCKER t.absent(isDockerCollectorEnabled()) process.env.PEARDATA_DOCKER = '1' t.ok(isDockerCollectorEnabled()) if (prev == null) delete process.env.PEARDATA_DOCKER else process.env.PEARDATA_DOCKER = prev }) test('resolveDockerSocket prefers existing preferred path', (t) => { const fallback = resolveDockerSocket('/nonexistent-docker-sock-peardata-test') t.ok(typeof fallback === 'string') t.ok(fallback.includes('docker.sock') || fallback.includes('podman.sock')) }) test('readCgroupCpu / memory from fixture', (t) => { const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'peardata-cgroup-')) const slice = path.join(tmp, 'system.slice') fs.mkdirSync(slice, { recursive: true }) const id = 'a'.repeat(64) const cgroupPath = writeFixtureCgroup(slice, id) const cpu = readCgroupCpu(cgroupPath) t.ok(cpu) t.is(cpu.usageNs, 5000000 * 1000) const mem = readCgroupMemory(cgroupPath) t.ok(mem) t.is(mem.usage, 64 * 1024 * 1024) t.is(mem.limit, 256 * 1024 * 1024) t.ok(typeof discoverCgroupContainers === 'function') fs.rmSync(tmp, { recursive: true, force: true }) })