Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/debug/test/node/streamDebugAdapter.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 * as crypto from 'crypto';
8
import * as net from 'net';
9
import * as platform from '../../../../../base/common/platform.js';
10
import { tmpdir } from 'os';
11
import { join } from '../../../../../base/common/path.js';
12
import * as ports from '../../../../../base/node/ports.js';
13
import { SocketDebugAdapter, NamedPipeDebugAdapter, StreamDebugAdapter } from '../../node/debugAdapter.js';
14
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
15
16
17
function sendInitializeRequest(debugAdapter: StreamDebugAdapter): Promise<DebugProtocol.Response> {
18
return new Promise((resolve, reject) => {
19
debugAdapter.sendRequest('initialize', { adapterID: 'test' }, (result) => {
20
resolve(result);
21
}, 3000);
22
});
23
}
24
25
function serverConnection(socket: net.Socket) {
26
socket.on('data', (data: Buffer) => {
27
const str = data.toString().split('\r\n')[2];
28
const request = JSON.parse(str);
29
const response: any = {
30
seq: request.seq,
31
request_seq: request.seq,
32
type: 'response',
33
command: request.command
34
};
35
if (request.arguments.adapterID === 'test') {
36
response.success = true;
37
} else {
38
response.success = false;
39
response.message = 'failed';
40
}
41
42
const responsePayload = JSON.stringify(response);
43
socket.write(`Content-Length: ${responsePayload.length}\r\n\r\n${responsePayload}`);
44
});
45
}
46
47
suite('Debug - StreamDebugAdapter', () => {
48
49
ensureNoDisposablesAreLeakedInTestSuite();
50
51
test(`StreamDebugAdapter (NamedPipeDebugAdapter) can initialize a connection`, async () => {
52
53
const pipeName = crypto.randomBytes(10).toString('hex');
54
const pipePath = platform.isWindows ? join('\\\\.\\pipe\\', pipeName) : join(tmpdir(), pipeName);
55
const server = await new Promise<net.Server>((resolve, reject) => {
56
const server = net.createServer(serverConnection);
57
server.once('listening', () => resolve(server));
58
server.once('error', reject);
59
server.listen(pipePath);
60
});
61
62
const debugAdapter = new NamedPipeDebugAdapter({
63
type: 'pipeServer',
64
path: pipePath
65
});
66
try {
67
await debugAdapter.startSession();
68
const response: DebugProtocol.Response = await sendInitializeRequest(debugAdapter);
69
assert.strictEqual(response.command, 'initialize');
70
assert.strictEqual(response.request_seq, 1);
71
assert.strictEqual(response.success, true, response.message);
72
} finally {
73
await debugAdapter.stopSession();
74
server.close();
75
debugAdapter.dispose();
76
}
77
});
78
79
test(`StreamDebugAdapter (SocketDebugAdapter) can initialize a connection`, async () => {
80
81
const rndPort = Math.floor(Math.random() * 1000 + 8000);
82
const port = await ports.findFreePort(rndPort, 10 /* try 10 ports */, 3000 /* try up to 3 seconds */, 87 /* skip 87 ports between attempts */);
83
const server = net.createServer(serverConnection).listen(port);
84
const debugAdapter = new SocketDebugAdapter({
85
type: 'server',
86
port
87
});
88
try {
89
await debugAdapter.startSession();
90
const response: DebugProtocol.Response = await sendInitializeRequest(debugAdapter);
91
assert.strictEqual(response.command, 'initialize');
92
assert.strictEqual(response.request_seq, 1);
93
assert.strictEqual(response.success, true, response.message);
94
} finally {
95
await debugAdapter.stopSession();
96
server.close();
97
debugAdapter.dispose();
98
}
99
});
100
});
101
102