22 lines
1.1 KiB
JavaScript
22 lines
1.1 KiB
JavaScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { Agent, acquireQvac, releaseQvac, closeQvac, qvacStatus } from '../daemon/qvac-master.js';
|
|
|
|
test('concurrent master acquisition loads once and failed acquisition does not leak owners', async () => {
|
|
const original = { resources: Agent.engine.resources, load: Agent.engine.load, close: Agent.engine.close };
|
|
let loads = 0;
|
|
Agent.engine.resources = async () => ({ gpus: [{}] });
|
|
Agent.engine.load = async () => { loads++; return { device: 'gpu' }; };
|
|
Agent.engine.close = async () => {};
|
|
try {
|
|
await Promise.all([acquireQvac(), acquireQvac()]);
|
|
assert.equal(loads, 1); assert.equal(qvacStatus().owners, 2);
|
|
releaseQvac(); releaseQvac(); await closeQvac();
|
|
Agent.engine.resources = async () => { throw new Error('discovery failed'); };
|
|
await assert.rejects(acquireQvac(), /discovery failed/);
|
|
assert.equal(qvacStatus().owners, 0);
|
|
Agent.engine.resources = async () => ({ gpus: [{}] });
|
|
await acquireQvac(); assert.equal(loads, 2); releaseQvac();
|
|
} finally { await closeQvac(); Object.assign(Agent.engine, original); }
|
|
});
|