Path: blob/main/src/vs/workbench/contrib/debug/test/node/streamDebugAdapter.test.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import * as crypto from 'crypto';7import * as net from 'net';8import * as platform from '../../../../../base/common/platform.js';9import { tmpdir } from 'os';10import { join } from '../../../../../base/common/path.js';11import * as ports from '../../../../../base/node/ports.js';12import { SocketDebugAdapter, NamedPipeDebugAdapter, StreamDebugAdapter } from '../../node/debugAdapter.js';13import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';141516function sendInitializeRequest(debugAdapter: StreamDebugAdapter): Promise<DebugProtocol.Response> {17return new Promise((resolve, reject) => {18debugAdapter.sendRequest('initialize', { adapterID: 'test' }, (result) => {19resolve(result);20}, 3000);21});22}2324function serverConnection(socket: net.Socket) {25socket.on('data', (data: Buffer) => {26const str = data.toString().split('\r\n')[2];27const request = JSON.parse(str);28const response: any = {29seq: request.seq,30request_seq: request.seq,31type: 'response',32command: request.command33};34if (request.arguments.adapterID === 'test') {35response.success = true;36} else {37response.success = false;38response.message = 'failed';39}4041const responsePayload = JSON.stringify(response);42socket.write(`Content-Length: ${responsePayload.length}\r\n\r\n${responsePayload}`);43});44}4546suite('Debug - StreamDebugAdapter', () => {4748ensureNoDisposablesAreLeakedInTestSuite();4950test(`StreamDebugAdapter (NamedPipeDebugAdapter) can initialize a connection`, async () => {5152const pipeName = crypto.randomBytes(10).toString('hex');53const pipePath = platform.isWindows ? join('\\\\.\\pipe\\', pipeName) : join(tmpdir(), pipeName);54const server = await new Promise<net.Server>((resolve, reject) => {55const server = net.createServer(serverConnection);56server.once('listening', () => resolve(server));57server.once('error', reject);58server.listen(pipePath);59});6061const debugAdapter = new NamedPipeDebugAdapter({62type: 'pipeServer',63path: pipePath64});65try {66await debugAdapter.startSession();67const response: DebugProtocol.Response = await sendInitializeRequest(debugAdapter);68assert.strictEqual(response.command, 'initialize');69assert.strictEqual(response.request_seq, 1);70assert.strictEqual(response.success, true, response.message);71} finally {72await debugAdapter.stopSession();73server.close();74debugAdapter.dispose();75}76});7778test(`StreamDebugAdapter (SocketDebugAdapter) can initialize a connection`, async () => {7980const rndPort = Math.floor(Math.random() * 1000 + 8000);81const port = await ports.findFreePort(rndPort, 10 /* try 10 ports */, 3000 /* try up to 3 seconds */, 87 /* skip 87 ports between attempts */);82const server = net.createServer(serverConnection).listen(port);83const debugAdapter = new SocketDebugAdapter({84type: 'server',85port86});87try {88await debugAdapter.startSession();89const response: DebugProtocol.Response = await sendInitializeRequest(debugAdapter);90assert.strictEqual(response.command, 'initialize');91assert.strictEqual(response.request_seq, 1);92assert.strictEqual(response.success, true, response.message);93} finally {94await debugAdapter.stopSession();95server.close();96debugAdapter.dispose();97}98});99});100101102