Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/api/test/browser/mainThreadManagedSockets.test.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import assert from 'assert';
7
import { disposableTimeout, timeout } from '../../../../base/common/async.js';
8
import { VSBuffer } from '../../../../base/common/buffer.js';
9
import { Emitter } from '../../../../base/common/event.js';
10
import { DisposableStore } from '../../../../base/common/lifecycle.js';
11
import { SocketCloseEvent } from '../../../../base/parts/ipc/common/ipc.net.js';
12
import { mock } from '../../../../base/test/common/mock.js';
13
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';
14
import { RemoteSocketHalf } from '../../../../platform/remote/common/managedSocket.js';
15
import { MainThreadManagedSocket } from '../../browser/mainThreadManagedSockets.js';
16
import { ExtHostManagedSocketsShape } from '../../common/extHost.protocol.js';
17
18
suite('MainThreadManagedSockets', () => {
19
20
const ds = ensureNoDisposablesAreLeakedInTestSuite();
21
22
suite('ManagedSocket', () => {
23
let extHost: ExtHostMock;
24
let half: RemoteSocketHalf;
25
26
class ExtHostMock extends mock<ExtHostManagedSocketsShape>() {
27
private onDidFire = new Emitter<void>();
28
public readonly events: any[] = [];
29
30
override $remoteSocketWrite(socketId: number, buffer: VSBuffer): void {
31
this.events.push({ socketId, data: buffer.toString() });
32
this.onDidFire.fire();
33
}
34
35
override $remoteSocketDrain(socketId: number) {
36
this.events.push({ socketId, event: 'drain' });
37
this.onDidFire.fire();
38
return Promise.resolve();
39
}
40
41
override $remoteSocketEnd(socketId: number) {
42
this.events.push({ socketId, event: 'end' });
43
this.onDidFire.fire();
44
}
45
46
expectEvent(test: (evt: any) => void, message: string) {
47
if (this.events.some(test)) {
48
return;
49
}
50
51
const d = new DisposableStore();
52
return new Promise<void>(resolve => {
53
d.add(this.onDidFire.event(() => {
54
if (this.events.some(test)) {
55
return;
56
}
57
}));
58
d.add(disposableTimeout(() => {
59
throw new Error(`Expected ${message} but only had ${JSON.stringify(this.events, null, 2)}`);
60
}, 1000));
61
}).finally(() => d.dispose());
62
}
63
}
64
65
setup(() => {
66
extHost = new ExtHostMock();
67
half = {
68
onClose: new Emitter<SocketCloseEvent>(),
69
onData: new Emitter<VSBuffer>(),
70
onEnd: new Emitter<void>(),
71
};
72
});
73
74
async function doConnect() {
75
const socket = MainThreadManagedSocket.connect(1, extHost, '/hello', 'world=true', '', half);
76
await extHost.expectEvent(evt => evt.data && evt.data.startsWith('GET ws://localhost/hello?world=true&skipWebSocketFrames=true HTTP/1.1\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Key:'), 'websocket open event');
77
half.onData.fire(VSBuffer.fromString('Opened successfully ;)\r\n\r\n'));
78
return ds.add(await socket);
79
}
80
81
test('connects', async () => {
82
await doConnect();
83
});
84
85
test('includes trailing connection data', async () => {
86
const socketProm = MainThreadManagedSocket.connect(1, extHost, '/hello', 'world=true', '', half);
87
await extHost.expectEvent(evt => evt.data && evt.data.includes('GET ws://localhost'), 'websocket open event');
88
half.onData.fire(VSBuffer.fromString('Opened successfully ;)\r\n\r\nSome trailing data'));
89
const socket = ds.add(await socketProm);
90
91
const data: string[] = [];
92
ds.add(socket.onData(d => data.push(d.toString())));
93
await timeout(1); // allow microtasks to flush
94
assert.deepStrictEqual(data, ['Some trailing data']);
95
});
96
97
test('round trips data', async () => {
98
const socket = await doConnect();
99
const data: string[] = [];
100
ds.add(socket.onData(d => data.push(d.toString())));
101
102
socket.write(VSBuffer.fromString('ping'));
103
await extHost.expectEvent(evt => evt.data === 'ping', 'expected ping');
104
half.onData.fire(VSBuffer.fromString("pong"));
105
assert.deepStrictEqual(data, ['pong']);
106
});
107
});
108
});
109
110