import { expect, test } from "bun:test";import { chmodSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";import { tmpdir } from "node:os";import { join } from "node:path";import type { GpuInfo } from "../../models/types";import { queryNvidiaSmiSnapshot } from "./gpu"; test("collects stable NVIDIA identities from one shared snapshot", async () => { const directory = mkdtempSync(join(tmpdir(), "local-studio-nvidia-smi-")); const binaryPath = join(directory, "nvidia-smi"); const argumentsPath = join(directory, "arguments"); const countPath = join(directory, "count"); const previousBinary = process.env["NVIDIA_SMI_PATH"]; const previousArgumentsPath = process.env["LOCAL_STUDIO_NVIDIA_SMI_ARGUMENTS_PATH"]; const previousCountPath = process.env["LOCAL_STUDIO_NVIDIA_SMI_COUNT_PATH"]; try { writeFileSync( binaryPath, [ "#!/bin/sh", 'printf \'%s\\n\' "$@" > "$LOCAL_STUDIO_NVIDIA_SMI_ARGUMENTS_PATH"', "printf '1\\n' >> \"$LOCAL_STUDIO_NVIDIA_SMI_COUNT_PATH\"", "printf '%s\\n' 'GPU-3090, 00000000:82:00.0, NVIDIA GeForce RTX 3090, 24576, 2048, 22528, 12, 48, 80.5, 350, 580.95.05'", ].join("\n"), ); chmodSync(binaryPath, 0o755); process.env["NVIDIA_SMI_PATH"] = binaryPath; process.env["LOCAL_STUDIO_NVIDIA_SMI_ARGUMENTS_PATH"] = argumentsPath; process.env["LOCAL_STUDIO_NVIDIA_SMI_COUNT_PATH"] = countPath; const snapshot = await queryNvidiaSmiSnapshot(); expect(snapshot).toEqual({ available: true, driverVersion: "580.95.05", gpus: [ { uuid: "GPU-3090", pci_bus_id: "00000000:82:00.0", index: 0, name: "NVIDIA GeForce RTX 3090", memory_total_mb: 24576, memory_used_mb: 2048, memory_free_mb: 22528, utilization_pct: 12, temp_c: 48, power_draw: 80.5, power_limit: 350, }, ], }); expect(readFileSync(countPath, "utf8")).toBe("1\n"); expect(readFileSync(argumentsPath, "utf8").trim().split("\n")).toEqual([ "--query-gpu=uuid,pci.bus_id,name,memory.total,memory.used,memory.free,utilization.gpu,temperature.gpu,power.draw,power.limit,driver_version", "--format=csv,noheader,nounits", ]); } finally { if (previousBinary === undefined) delete process.env["NVIDIA_SMI_PATH"]; else process.env["NVIDIA_SMI_PATH"] = previousBinary; if (previousArgumentsPath === undefined) { delete process.env["LOCAL_STUDIO_NVIDIA_SMI_ARGUMENTS_PATH"]; } else { process.env["LOCAL_STUDIO_NVIDIA_SMI_ARGUMENTS_PATH"] = previousArgumentsPath; } if (previousCountPath === undefined) delete process.env["LOCAL_STUDIO_NVIDIA_SMI_COUNT_PATH"]; else process.env["LOCAL_STUDIO_NVIDIA_SMI_COUNT_PATH"] = previousCountPath; rmSync(directory, { recursive: true, force: true }); }}); test("keeps stable identity optional for non-NVIDIA telemetry", () => { const gpu: GpuInfo = { index: 0, name: "Intel Arc Pro B70", memory_total_mb: 24576, memory_used_mb: 0, memory_free_mb: 24576, utilization_pct: 0, temp_c: 0, power_draw: 0, power_limit: 0, }; expect(gpu.uuid).toBeUndefined(); expect(gpu.pci_bus_id).toBeUndefined();});
import { expect, test } from "bun:test";
import { chmodSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import type { GpuInfo } from "../../models/types";
import { queryNvidiaSmiSnapshot } from "./gpu";
test("collects stable NVIDIA identities from one shared snapshot", async () => {
const directory = mkdtempSync(join(tmpdir(), "local-studio-nvidia-smi-"));
const binaryPath = join(directory, "nvidia-smi");
const argumentsPath = join(directory, "arguments");
const countPath = join(directory, "count");
const previousBinary = process.env["NVIDIA_SMI_PATH"];
const previousArgumentsPath = process.env["LOCAL_STUDIO_NVIDIA_SMI_ARGUMENTS_PATH"];
const previousCountPath = process.env["LOCAL_STUDIO_NVIDIA_SMI_COUNT_PATH"];
try {
writeFileSync(
binaryPath,
[
"#!/bin/sh",
'printf \'%s\\n\' "$@" > "$LOCAL_STUDIO_NVIDIA_SMI_ARGUMENTS_PATH"',
"printf '1\\n' >> \"$LOCAL_STUDIO_NVIDIA_SMI_COUNT_PATH\"",
"printf '%s\\n' 'GPU-3090, 00000000:82:00.0, NVIDIA GeForce RTX 3090, 24576, 2048, 22528, 12, 48, 80.5, 350, 580.95.05'",
].join("\n"),
);
chmodSync(binaryPath, 0o755);
process.env["NVIDIA_SMI_PATH"] = binaryPath;
process.env["LOCAL_STUDIO_NVIDIA_SMI_ARGUMENTS_PATH"] = argumentsPath;
process.env["LOCAL_STUDIO_NVIDIA_SMI_COUNT_PATH"] = countPath;
const snapshot = await queryNvidiaSmiSnapshot();
expect(snapshot).toEqual({
available: true,
driverVersion: "580.95.05",
gpus: [
{
uuid: "GPU-3090",
pci_bus_id: "00000000:82:00.0",
index: 0,
name: "NVIDIA GeForce RTX 3090",
memory_total_mb: 24576,
memory_used_mb: 2048,
memory_free_mb: 22528,
utilization_pct: 12,
temp_c: 48,
power_draw: 80.5,
power_limit: 350,
},
],
});
expect(readFileSync(countPath, "utf8")).toBe("1\n");
expect(readFileSync(argumentsPath, "utf8").trim().split("\n")).toEqual([
"--query-gpu=uuid,pci.bus_id,name,memory.total,memory.used,memory.free,utilization.gpu,temperature.gpu,power.draw,power.limit,driver_version",
"--format=csv,noheader,nounits",
]);
} finally {
if (previousBinary === undefined) delete process.env["NVIDIA_SMI_PATH"];
else process.env["NVIDIA_SMI_PATH"] = previousBinary;
if (previousArgumentsPath === undefined) {
delete process.env["LOCAL_STUDIO_NVIDIA_SMI_ARGUMENTS_PATH"];
} else {
process.env["LOCAL_STUDIO_NVIDIA_SMI_ARGUMENTS_PATH"] = previousArgumentsPath;
}
if (previousCountPath === undefined) delete process.env["LOCAL_STUDIO_NVIDIA_SMI_COUNT_PATH"];
else process.env["LOCAL_STUDIO_NVIDIA_SMI_COUNT_PATH"] = previousCountPath;
rmSync(directory, { recursive: true, force: true });
}
});
test("keeps stable identity optional for non-NVIDIA telemetry", () => {
const gpu: GpuInfo = {
index: 0,
name: "Intel Arc Pro B70",
memory_total_mb: 24576,
memory_used_mb: 0,
memory_free_mb: 24576,
utilization_pct: 0,
temp_c: 0,
power_draw: 0,
power_limit: 0,
};
expect(gpu.uuid).toBeUndefined();
expect(gpu.pci_bus_id).toBeUndefined();
});