-
-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathremote-xpc-framed-transport.spec.ts
More file actions
57 lines (48 loc) · 1.97 KB
/
Copy pathremote-xpc-framed-transport.spec.ts
File metadata and controls
57 lines (48 loc) · 1.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import assert from 'node:assert/strict';
import * as net from 'node:net';
import {describe, it} from 'node:test';
import {RemoteXpcFramedTransport} from '../../../src/lib/remote-xpc/remote-xpc-framed-transport.js';
function listenOnLoopback(server: net.Server): Promise<number> {
return new Promise<number>((resolve, reject) => {
server.once('error', reject);
server.listen(0, '::1', (): void => {
resolve((server.address() as net.AddressInfo).port);
});
});
}
function closeServer(server: net.Server): Promise<void> {
return new Promise<void>((resolve) => server.close(() => resolve()));
}
describe('RemoteXpcFramedTransport', function () {
it('rejects connect() on socket failure instead of emitting an unlistened error', async function () {
const probe = net.createServer();
const port = await listenOnLoopback(probe);
await closeServer(probe);
const transport = new RemoteXpcFramedTransport(['::1', port]);
await assert.rejects(transport.connect({timeoutMs: 2000}), /ECONNREFUSED/);
});
it('emits error when the socket fails in the connected phase', async function () {
let onAccepted: (socket: net.Socket) => void = () => undefined;
const acceptedPromise = new Promise<net.Socket>((resolve) => {
onAccepted = resolve;
});
const server = net.createServer((socket): void => {
onAccepted(socket);
});
const port = await listenOnLoopback(server);
let acceptedSocket: net.Socket | undefined;
const transport = new RemoteXpcFramedTransport(['::1', port]);
try {
await transport.connect({timeoutMs: 2000});
acceptedSocket = await acceptedPromise;
const errorPromise = new Promise<Error>((resolve) => transport.once('error', resolve));
acceptedSocket.resetAndDestroy();
const error = await errorPromise;
assert.match(error.message, /ECONNRESET/);
} finally {
await transport.close();
acceptedSocket?.destroy();
await closeServer(server);
}
});
});