[Init] Initial commit - NetMesh terminal manager
Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
This commit is contained in:
92
electron/plugins/quotaManager.test.cjs
Normal file
92
electron/plugins/quotaManager.test.cjs
Normal file
@@ -0,0 +1,92 @@
|
||||
"use strict";
|
||||
|
||||
const assert = require("node:assert/strict");
|
||||
const test = require("node:test");
|
||||
|
||||
const { PluginQuotaManager } = require("./quotaManager.cjs");
|
||||
const { RPC_ERRORS } = require("./rpcRouter.cjs");
|
||||
|
||||
test("transport, capability, log, concurrency, and byte quotas fail closed and refill", async () => {
|
||||
let now = 0;
|
||||
const manager = new PluginQuotaManager({
|
||||
clock: () => now,
|
||||
quotas: {
|
||||
messageBurst: 2,
|
||||
messagesPerSecond: 1,
|
||||
concurrentCapabilities: 1,
|
||||
capabilityBurst: 2,
|
||||
capabilitiesPerMinute: 1,
|
||||
logWritesPerMinute: 1,
|
||||
bytesPerMinute: 4,
|
||||
},
|
||||
});
|
||||
const identity = { runtimeId: "runtime-1" };
|
||||
manager.guardMessage(identity);
|
||||
manager.guardMessage(identity);
|
||||
assert.throws(() => manager.guardMessage(identity), (error) => error.code === RPC_ERRORS.resourceExhausted);
|
||||
now += 1_000;
|
||||
manager.guardMessage(identity);
|
||||
|
||||
const middleware = manager.createMiddleware();
|
||||
let release;
|
||||
const pending = middleware({ runtimeId: "runtime-1", method: "network.request" }, () => (
|
||||
new Promise((resolve) => { release = resolve; })
|
||||
));
|
||||
await assert.rejects(
|
||||
middleware({ runtimeId: "runtime-1", method: "network.request" }, async () => null),
|
||||
(error) => error.code === RPC_ERRORS.resourceExhausted,
|
||||
);
|
||||
release();
|
||||
await pending;
|
||||
|
||||
await middleware({ runtimeId: "runtime-log", method: "log.write" }, async () => null);
|
||||
await assert.rejects(
|
||||
middleware({ runtimeId: "runtime-log", method: "log.write" }, async () => null),
|
||||
(error) => error.code === RPC_ERRORS.resourceExhausted,
|
||||
);
|
||||
|
||||
manager.chargeBytes("runtime-1", "network", 4);
|
||||
assert.throws(
|
||||
() => manager.chargeBytes("runtime-1", "network", 1),
|
||||
(error) => error.code === RPC_ERRORS.resourceExhausted,
|
||||
);
|
||||
now += 60_000;
|
||||
manager.chargeBytes("runtime-1", "network", 4);
|
||||
manager.shutdown();
|
||||
});
|
||||
|
||||
test("runtime process quotas report sustained CPU and memory violations", async () => {
|
||||
const samples = [];
|
||||
const cleared = [];
|
||||
const violations = [];
|
||||
let metrics = { memoryBytes: 0, cpuPercent: 90 };
|
||||
const manager = new PluginQuotaManager({
|
||||
getProcessMetrics: async () => metrics,
|
||||
onViolation: async (_identity, error) => violations.push(error.message),
|
||||
quotas: { sustainedCpuSamples: 2, cpuPercent: 80, memoryBytes: 100 },
|
||||
setInterval: (callback) => { samples.push(callback); return { id: samples.length }; },
|
||||
clearInterval: (timer) => cleared.push(timer),
|
||||
});
|
||||
const runtime = { getProcessId: () => 123 };
|
||||
manager.trackRuntime({ runtimeId: "runtime-1" }, runtime);
|
||||
await new Promise((resolve) => setImmediate(resolve));
|
||||
await samples[0]();
|
||||
assert.deepEqual(violations, ["Plugin sustained CPU quota exceeded"]);
|
||||
assert.equal(cleared.length, 1);
|
||||
|
||||
metrics = { memoryBytes: 101, cpuPercent: 0 };
|
||||
manager.trackRuntime({ runtimeId: "runtime-2" }, runtime);
|
||||
await new Promise((resolve) => setImmediate(resolve));
|
||||
assert.deepEqual(violations, [
|
||||
"Plugin sustained CPU quota exceeded",
|
||||
"Plugin memory quota exceeded",
|
||||
]);
|
||||
manager.trackProcess(
|
||||
"runtime-3\0companion:one",
|
||||
{ runtimeId: "runtime-3" },
|
||||
runtime,
|
||||
);
|
||||
manager.releaseRuntime("runtime-3");
|
||||
assert.equal(cleared.length, 3, "runtime release disposes companion process monitors");
|
||||
manager.shutdown();
|
||||
});
|
||||
Reference in New Issue
Block a user