Skip to content

Commit 3bf4dae

Browse files
authored
Test server should bind to localhost. (#19735)
* Test server should bind to localhost. * Fix tests. * Some logging for easier diagnosis.
1 parent b68bcd7 commit 3bf4dae

File tree

5 files changed

+37
-18
lines changed

5 files changed

+37
-18
lines changed

src/client/testing/testController/common/server.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import {
1212
} from '../../../common/process/types';
1313
import { traceLog } from '../../../logging';
1414
import { DataReceivedEvent, ITestServer, TestCommandOptions } from './types';
15-
import { DEFAULT_TEST_PORT } from './utils';
1615
import { ITestDebugLauncher, LaunchOptions } from '../../common/types';
1716
import { UNITTEST_PROVIDER } from '../../common/constants';
1817

@@ -23,13 +22,11 @@ export class PythonTestServer implements ITestServer, Disposable {
2322

2423
private server: http.Server;
2524

26-
public port: number;
25+
private ready: Promise<void>;
2726

2827
constructor(private executionFactory: IPythonExecutionFactory, private debugLauncher: ITestDebugLauncher) {
2928
this.uuids = new Map();
3029

31-
this.port = DEFAULT_TEST_PORT;
32-
3330
const requestListener: http.RequestListener = async (request, response) => {
3431
const buffers = [];
3532

@@ -59,11 +56,21 @@ export class PythonTestServer implements ITestServer, Disposable {
5956
};
6057

6158
this.server = http.createServer(requestListener);
62-
this.server.listen(() => {
63-
this.port = (this.server.address() as net.AddressInfo).port;
59+
this.ready = new Promise((resolve, _reject) => {
60+
this.server.listen(undefined, 'localhost', () => {
61+
resolve();
62+
});
6463
});
6564
}
6665

66+
public serverReady(): Promise<void> {
67+
return this.ready;
68+
}
69+
70+
public getPort(): number {
71+
return (this.server.address() as net.AddressInfo).port;
72+
}
73+
6774
public dispose(): void {
6875
this.server.close();
6976
this._onDataReceived.dispose();
@@ -98,15 +105,15 @@ export class PythonTestServer implements ITestServer, Disposable {
98105
args = [
99106
options.command.script,
100107
'--port',
101-
this.port.toString(),
108+
this.getPort().toString(),
102109
'--uuid',
103110
uuid,
104111
'--testids',
105112
...options.testIds,
106113
].concat(options.command.args);
107114
} else {
108115
// if not case of execution, go with the normal args
109-
args = [options.command.script, '--port', this.port.toString(), '--uuid', uuid].concat(
116+
args = [options.command.script, '--port', this.getPort().toString(), '--uuid', uuid].concat(
110117
options.command.args,
111118
);
112119
}

src/client/testing/testController/common/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ export type TestCommandOptions = {
160160
export interface ITestServer {
161161
readonly onDataReceived: Event<DataReceivedEvent>;
162162
sendCommand(options: TestCommandOptions): Promise<void>;
163+
serverReady(): Promise<void>;
163164
}
164165

165166
export interface ITestDiscoveryAdapter {

src/client/testing/testController/common/utils.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
33

4-
export const DEFAULT_TEST_PORT = 45454;
5-
64
export function fixLogLines(content: string): string {
75
const lines = content.split(/\r?\n/g);
86
return `${lines.join('\r\n')}\r\n`;

src/client/testing/testController/controller.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,14 +142,15 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
142142
return this.refreshTestData(undefined, { forceRefresh: true });
143143
};
144144

145-
// this.pythonTestServer = new PythonTestServer(this.pythonExecFactory); // old way where debugLauncher did not have to be passed
146145
this.pythonTestServer = new PythonTestServer(this.pythonExecFactory, this.debugLauncher);
147146
}
148147

149148
public async activate(): Promise<void> {
149+
traceVerbose('Waiting for test server to start...');
150+
await this.pythonTestServer.serverReady();
151+
traceVerbose('Test server started.');
150152
const workspaces: readonly WorkspaceFolder[] = this.workspaceService.workspaceFolders || [];
151153
workspaces.forEach((workspace) => {
152-
console.warn(`instantiating test adapters - workspace name: ${workspace.name}`);
153154
const settings = this.configSettings.getSettings(workspace.uri);
154155

155156
let discoveryAdapter: ITestDiscoveryAdapter;

src/test/testing/testController/server.unit.test.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,10 @@ suite('Python Test Server', () => {
5656
};
5757

5858
server = new PythonTestServer(stubExecutionFactory, debugLauncher);
59+
await server.serverReady();
5960

6061
await server.sendCommand(options);
61-
const { port } = server;
62+
const port = server.getPort();
6263

6364
assert.deepStrictEqual(execArgs, ['myscript', '--port', `${port}`, '--uuid', fakeUuid, '-foo', 'foo']);
6465
});
@@ -78,10 +79,11 @@ suite('Python Test Server', () => {
7879
};
7980

8081
server = new PythonTestServer(stubExecutionFactory, debugLauncher);
82+
await server.serverReady();
8183

8284
await server.sendCommand(options);
8385

84-
const { port } = server;
86+
const port = server.getPort();
8587
const expected = ['python', 'myscript', '--port', `${port}`, '--uuid', fakeUuid, '-foo', 'foo'].join(' ');
8688

8789
assert.deepStrictEqual(output, [expected]);
@@ -102,6 +104,8 @@ suite('Python Test Server', () => {
102104
};
103105

104106
server = new PythonTestServer(stubExecutionFactory, debugLauncher);
107+
await server.serverReady();
108+
105109
server.onDataReceived(({ data }) => {
106110
eventData = JSON.parse(data);
107111
});
@@ -123,6 +127,8 @@ suite('Python Test Server', () => {
123127
let response;
124128

125129
server = new PythonTestServer(stubExecutionFactory, debugLauncher);
130+
await server.serverReady();
131+
126132
server.onDataReceived(({ data }) => {
127133
response = data;
128134
deferred.resolve();
@@ -131,7 +137,7 @@ suite('Python Test Server', () => {
131137
await server.sendCommand(options);
132138

133139
// Send data back.
134-
const { port } = server;
140+
const port = server.getPort();
135141
const requestOptions = {
136142
hostname: 'localhost',
137143
method: 'POST',
@@ -162,6 +168,8 @@ suite('Python Test Server', () => {
162168
let response;
163169

164170
server = new PythonTestServer(stubExecutionFactory, debugLauncher);
171+
await server.serverReady();
172+
165173
server.onDataReceived(({ data }) => {
166174
response = data;
167175
deferred.resolve();
@@ -170,7 +178,7 @@ suite('Python Test Server', () => {
170178
await server.sendCommand(options);
171179

172180
// Send data back.
173-
const { port } = server;
181+
const port = server.getPort();
174182
const requestOptions = {
175183
hostname: 'localhost',
176184
method: 'POST',
@@ -202,6 +210,8 @@ suite('Python Test Server', () => {
202210
let response;
203211

204212
server = new PythonTestServer(stubExecutionFactory, debugLauncher);
213+
await server.serverReady();
214+
205215
server.onDataReceived(({ data }) => {
206216
response = data;
207217
deferred.resolve();
@@ -210,7 +220,7 @@ suite('Python Test Server', () => {
210220
await server.sendCommand(options);
211221

212222
// Send data back.
213-
const { port } = server;
223+
const port = server.getPort();
214224
const requestOptions = {
215225
hostname: 'localhost',
216226
method: 'POST',
@@ -241,6 +251,8 @@ suite('Python Test Server', () => {
241251
let response;
242252

243253
server = new PythonTestServer(stubExecutionFactory, debugLauncher);
254+
await server.serverReady();
255+
244256
server.onDataReceived(({ data }) => {
245257
response = data;
246258
deferred.resolve();
@@ -249,7 +261,7 @@ suite('Python Test Server', () => {
249261
await server.sendCommand(options);
250262

251263
// Send data back.
252-
const { port } = server;
264+
const port = server.getPort();
253265
const requestOptions = {
254266
hostname: 'localhost',
255267
method: 'POST',

0 commit comments

Comments
 (0)