|
3 | 3 |
|
4 | 4 | const assert = require("node:assert/strict"); |
5 | 5 | const { spawn, spawnSync } = require("node:child_process"); |
6 | | -const { EventEmitter } = require("node:events"); |
| 6 | +const { EventEmitter, once } = require("node:events"); |
7 | 7 | const fs = require("node:fs"); |
8 | 8 | const net = require("node:net"); |
9 | 9 | const os = require("node:os"); |
@@ -304,7 +304,21 @@ test("injected transport serializes startup and removes only its owned socket", |
304 | 304 | const children = []; |
305 | 305 | let replacement; |
306 | 306 | let installReplacementBeforeClose = false; |
| 307 | + const identityFs = { |
| 308 | + ...fs, |
| 309 | + lstatSync(candidate, ...args) { |
| 310 | + const stat = fs.lstatSync(candidate, ...args); |
| 311 | + if (candidate !== socketPath || !installReplacementBeforeClose) return stat; |
| 312 | + return new Proxy(stat, { |
| 313 | + get(target, property, receiver) { |
| 314 | + if (property === "ino") return target.ino + 1; |
| 315 | + return Reflect.get(target, property, receiver); |
| 316 | + }, |
| 317 | + }); |
| 318 | + }, |
| 319 | + }; |
307 | 320 | const { Transport } = loadInjectedTransport({ |
| 321 | + fsImpl: identityFs, |
308 | 322 | spawnImpl(_command, args) { |
309 | 323 | const child = fakeChild(); |
310 | 324 | children.push(child); |
@@ -335,8 +349,9 @@ test("injected transport serializes startup and removes only its owned socket", |
335 | 349 | await assert.rejects(second.ensureAuthority(), /already owned/); |
336 | 350 |
|
337 | 351 | installReplacementBeforeClose = true; |
| 352 | + const childClosed = once(children[0], "close"); |
338 | 353 | first.dispose(); |
339 | | - await new Promise((resolve) => setTimeout(resolve, 50)); |
| 354 | + await childClosed; |
340 | 355 | assert.equal(fs.lstatSync(socketPath).isSocket(), true, "replacement socket must survive dispose"); |
341 | 356 | await closeServer(replacement); |
342 | 357 | } finally { |
|
0 commit comments