Files
wehub-resource-sync 7088f49b01
Build dist / build (push) Has been cancelled
CI / test (18.x) (push) Has been cancelled
CI / test (20.x) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:39:33 +08:00

127 lines
4.1 KiB
JavaScript

import { test } from 'node:test';
import assert from 'node:assert/strict';
import { _setMemoryReaderForTests, formatBytes, getMemoryUsage, parseLinuxMeminfo, parseVmStat } from '../dist/memory.js';
test('getMemoryUsage returns null when totalBytes is zero', async () => {
_setMemoryReaderForTests(() => ({
totalBytes: 0,
freeBytes: 0,
}));
const result = await getMemoryUsage();
assert.equal(result, null);
});
test('getMemoryUsage returns null when totalBytes is negative', async () => {
_setMemoryReaderForTests(() => ({
totalBytes: -1,
freeBytes: 0,
}));
const result = await getMemoryUsage();
assert.equal(result, null);
});
test('getMemoryUsage returns null when totalBytes is non-finite', async () => {
_setMemoryReaderForTests(() => ({
totalBytes: Infinity,
freeBytes: 1000,
}));
const result = await getMemoryUsage();
assert.equal(result, null);
});
test('getMemoryUsage treats non-finite freeBytes as 0', async () => {
_setMemoryReaderForTests(() => ({
totalBytes: 8 * 1024 ** 3,
freeBytes: NaN,
}));
const result = await getMemoryUsage();
assert.equal(result.usedPercent, 100);
assert.equal(result.freeBytes, 0);
assert.equal(result.usedBytes, 8 * 1024 ** 3);
});
test('getMemoryUsage clamps negative freeBytes to 0', async () => {
_setMemoryReaderForTests(() => ({
totalBytes: 16 * 1024 ** 3,
freeBytes: -500,
}));
const result = await getMemoryUsage();
assert.equal(result.freeBytes, 0);
assert.equal(result.usedPercent, 100);
});
test('getMemoryUsage calculates correct percentages for normal values', async () => {
_setMemoryReaderForTests(() => ({
totalBytes: 16 * 1024 ** 3,
freeBytes: 8 * 1024 ** 3,
}));
const result = await getMemoryUsage();
assert.equal(result.usedPercent, 50);
assert.equal(result.usedBytes, 8 * 1024 ** 3);
assert.equal(result.freeBytes, 8 * 1024 ** 3);
assert.equal(result.totalBytes, 16 * 1024 ** 3);
});
test('getMemoryUsage clamps usedPercent between 0 and 100', async () => {
// freeBytes larger than totalBytes → clamp free to total → used = 0
_setMemoryReaderForTests(() => ({
totalBytes: 4 * 1024 ** 3,
freeBytes: 5 * 1024 ** 3,
}));
const result = await getMemoryUsage();
assert.equal(result.usedPercent, 0);
assert.equal(result.freeBytes, 4 * 1024 ** 3);
});
test('parseVmStat returns null when page size is present but active pages are missing', () => {
const output = `Mach Virtual Memory Statistics: (page size of 4096 bytes)
Pages free: 500000.
Pages wired down: 100000.`;
assert.equal(parseVmStat(output), null);
});
test('parseVmStat returns null when wired pages are missing', () => {
const output = `Mach Virtual Memory Statistics: (page size of 4096 bytes)
Pages free: 500000.
Pages active: 100000.`;
assert.equal(parseVmStat(output), null);
});
test('parseLinuxMeminfo returns valid result for very large finite values', () => {
// These values are large but still finite in JS
const output = `MemTotal: 99999999999999999999999999999999999 kB
MemAvailable: 99999999999999999999999999999999999 kB`;
const result = parseLinuxMeminfo(output);
// Number() of these large values is finite (1.024e+38), so it parses successfully
assert.ok(result !== null);
assert.ok(Number.isFinite(result.totalBytes));
});
test('parseLinuxMeminfo returns null when MemTotal is missing', () => {
const output = `MemAvailable: 18290212 kB`;
assert.equal(parseLinuxMeminfo(output), null);
});
test('formatBytes handles edge cases', () => {
assert.equal(formatBytes(-100), '0 B');
assert.equal(formatBytes(NaN), '0 B');
assert.equal(formatBytes(Infinity), '0 B');
assert.equal(formatBytes(1023), '1023 B');
assert.equal(formatBytes(1024), '1.0 KB');
assert.equal(formatBytes(1024 * 1024), '1.0 MB');
assert.equal(formatBytes(1024 ** 4), '1.0 TB');
assert.equal(formatBytes(5.5 * 1024), '5.5 KB');
assert.equal(formatBytes(15 * 1024), '15 KB');
});
test.after(() => {
_setMemoryReaderForTests(null);
});