Skip to content

Commit 5e0189c

Browse files
author
Benjamin Pasero
committed
tests - browser tests to go through new log service
1 parent f9c5a55 commit 5e0189c

8 files changed

Lines changed: 95 additions & 40 deletions

File tree

extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const webviewId = 'myWebview';
1414
const testDocument = join(vscode.workspace.rootPath || '', './bower.json');
1515

1616
// TODO: Re-enable after https://github.com/microsoft/vscode/issues/88415
17-
suite.skip('Webview tests', () => {
17+
('electron' in process.versions ? suite.skip : suite)('Webview tests', () => {
1818
const disposables: vscode.Disposable[] = [];
1919

2020
function _register<T extends vscode.Disposable>(disposable: T) {

src/vs/platform/log/browser/log.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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 { ILogService, DEFAULT_LOG_LEVEL, LogLevel, LogServiceAdapter } from 'vs/platform/log/common/log';
7+
8+
interface IAutomatedWindow {
9+
codeAutomationLog(type: string, args: any[]): void;
10+
}
11+
12+
/**
13+
* A logger that is used when VSCode is running in the web with
14+
* an automation such as playwright. We expect a global codeAutomationLog
15+
* to be defined that we can use to log to.
16+
*/
17+
export class ConsoleLogInAutomationService extends LogServiceAdapter implements ILogService {
18+
19+
declare codeAutomationLog: any;
20+
21+
_serviceBrand: undefined;
22+
23+
constructor(logLevel: LogLevel = DEFAULT_LOG_LEVEL) {
24+
super({ consoleLog: (type, args) => this.consoleLog(type, args) }, logLevel);
25+
}
26+
27+
private consoleLog(type: string, args: any[]): void {
28+
const automatedWindow = window as unknown as IAutomatedWindow;
29+
if (typeof automatedWindow.codeAutomationLog === 'function') {
30+
automatedWindow.codeAutomationLog(type, args);
31+
}
32+
}
33+
}

src/vs/platform/log/common/log.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -213,48 +213,48 @@ export class ConsoleLogService extends AbstractLogService implements ILogService
213213
}
214214
}
215215

216-
export class ConsoleLogInMainService extends AbstractLogService implements ILogService {
216+
export class LogServiceAdapter extends AbstractLogService implements ILogService {
217217

218218
_serviceBrand: undefined;
219219

220-
constructor(private readonly client: LoggerChannelClient, logLevel: LogLevel = DEFAULT_LOG_LEVEL) {
220+
constructor(private readonly adapter: { consoleLog: (type: string, args: any[]) => void }, logLevel: LogLevel = DEFAULT_LOG_LEVEL) {
221221
super();
222222
this.setLevel(logLevel);
223223
}
224224

225225
trace(message: string, ...args: any[]): void {
226226
if (this.getLevel() <= LogLevel.Trace) {
227-
this.client.consoleLog('trace', [this.extractMessage(message), ...args]);
227+
this.adapter.consoleLog('trace', [this.extractMessage(message), ...args]);
228228
}
229229
}
230230

231231
debug(message: string, ...args: any[]): void {
232232
if (this.getLevel() <= LogLevel.Debug) {
233-
this.client.consoleLog('debug', [this.extractMessage(message), ...args]);
233+
this.adapter.consoleLog('debug', [this.extractMessage(message), ...args]);
234234
}
235235
}
236236

237237
info(message: string, ...args: any[]): void {
238238
if (this.getLevel() <= LogLevel.Info) {
239-
this.client.consoleLog('info', [this.extractMessage(message), ...args]);
239+
this.adapter.consoleLog('info', [this.extractMessage(message), ...args]);
240240
}
241241
}
242242

243243
warn(message: string | Error, ...args: any[]): void {
244244
if (this.getLevel() <= LogLevel.Warning) {
245-
this.client.consoleLog('warn', [this.extractMessage(message), ...args]);
245+
this.adapter.consoleLog('warn', [this.extractMessage(message), ...args]);
246246
}
247247
}
248248

249249
error(message: string | Error, ...args: any[]): void {
250250
if (this.getLevel() <= LogLevel.Error) {
251-
this.client.consoleLog('error', [this.extractMessage(message), ...args]);
251+
this.adapter.consoleLog('error', [this.extractMessage(message), ...args]);
252252
}
253253
}
254254

255255
critical(message: string | Error, ...args: any[]): void {
256256
if (this.getLevel() <= LogLevel.Critical) {
257-
this.client.consoleLog('critical', [this.extractMessage(message), ...args]);
257+
this.adapter.consoleLog('critical', [this.extractMessage(message), ...args]);
258258
}
259259
}
260260

@@ -275,6 +275,15 @@ export class ConsoleLogInMainService extends AbstractLogService implements ILogS
275275
}
276276
}
277277

278+
export class ConsoleLogInMainService extends LogServiceAdapter implements ILogService {
279+
280+
_serviceBrand: undefined;
281+
282+
constructor(client: LoggerChannelClient, logLevel: LogLevel = DEFAULT_LOG_LEVEL) {
283+
super({ consoleLog: (type, args) => client.consoleLog(type, args) }, logLevel);
284+
}
285+
}
286+
278287
export class MultiplexLogService extends AbstractLogService implements ILogService {
279288
_serviceBrand: undefined;
280289

src/vs/workbench/browser/web.main.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { mark } from 'vs/base/common/performance';
77
import { domContentLoaded, addDisposableListener, EventType, addClass, EventHelper } from 'vs/base/browser/dom';
88
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
99
import { ILogService, ConsoleLogService, MultiplexLogService } from 'vs/platform/log/common/log';
10+
import { ConsoleLogInAutomationService } from 'vs/platform/log/browser/log';
1011
import { Disposable } from 'vs/base/common/lifecycle';
1112
import { BrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService';
1213
import { Workbench } from 'vs/workbench/browser/workbench';
@@ -49,6 +50,7 @@ import { IndexedDBLogProvider } from 'vs/workbench/services/log/browser/indexedD
4950
import { InMemoryLogProvider } from 'vs/workbench/services/log/common/inMemoryLogProvider';
5051
import { isWorkspaceToOpen, isFolderToOpen } from 'vs/platform/windows/common/windows';
5152
import { getWorkspaceIdentifier } from 'vs/workbench/services/workspaces/browser/workspaces';
53+
import { coalesce } from 'vs/base/common/arrays';
5254

5355
class BrowserMain extends Disposable {
5456

@@ -234,9 +236,12 @@ class BrowserMain extends Disposable {
234236
}
235237
}
236238

237-
const consoleLogService = new ConsoleLogService(logService.getLevel());
238-
const fileLogService = new FileLogService('window', environmentService.logFile, logService.getLevel(), fileService);
239-
logService.logger = new MultiplexLogService([consoleLogService, fileLogService]);
239+
logService.logger = new MultiplexLogService(coalesce([
240+
new ConsoleLogService(logService.getLevel()),
241+
new FileLogService('window', environmentService.logFile, logService.getLevel(), fileService),
242+
// Extension development test CLI: forward everything to test runner
243+
environmentService.isExtensionDevelopment && !!environmentService.extensionTestsLocationURI ? new ConsoleLogInAutomationService(logService.getLevel()) : undefined
244+
]));
240245
})();
241246

242247
const connection = remoteAgentService.getConnection();

test/automation/src/playwrightDriver.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ export async function launch(userDataDir: string, _workspacePath: string, codeSe
111111
['--browser', 'none', '--driver', 'web'],
112112
{ env }
113113
);
114-
server.stderr?.on('data', e => console.log('Server stderr: ' + e));
115-
server.stdout?.on('data', e => console.log('Server stdout: ' + e));
114+
server.stderr?.on('data', error => console.log(`Server stderr: ${error}`));
115+
server.stdout?.on('data', data => console.log(`Server stdout: ${data}`));
116116
process.on('exit', teardown);
117117
process.on('SIGINT', teardown);
118118
process.on('SIGTERM', teardown);
@@ -148,7 +148,7 @@ export function connect(headless: boolean, engine: 'chromium' | 'webkit' | 'fire
148148
await page.setViewport({ width, height });
149149
await page.goto(`${endpoint}&folder=vscode-remote://localhost:9888${URI.file(workspacePath!).path}`);
150150
const result = {
151-
client: { dispose: () => teardown() },
151+
client: { dispose: () => browser.close() && teardown() },
152152
driver: buildDriver(browser, page)
153153
};
154154
c(result);

test/integration/browser/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"@types/mkdirp": "0.5.1",
1111
"@types/node": "^12.11.7",
1212
"@types/rimraf": "2.0.2",
13+
"@types/tmp": "^0.1.0",
1314
"rimraf": "^2.6.1",
1415
"tmp": "0.0.33",
1516
"typescript": "3.7.5"

test/integration/browser/src/index.ts

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,13 @@ const optimist = require('optimist')
1515
.describe('browser', 'browser in which integration tests should run').string('browser').default('browser', 'chromium')
1616
.describe('help', 'show the help').alias('help', 'h');
1717

18-
let serverProcess: cp.ChildProcess | undefined = undefined;
19-
20-
function teardownServer() {
21-
if (serverProcess) {
22-
serverProcess.kill();
23-
serverProcess = undefined;
24-
}
25-
}
18+
const width = 1200;
19+
const height = 800;
2620

2721
async function runTestsInBrowser(browserType: string, endpoint: string): Promise<void> {
2822
const browser = await playwright[browserType].launch({ headless: !Boolean(optimist.argv.debug) });
2923
const page = (await browser.defaultContext().pages())[0];
24+
await page.setViewport({ width, height });
3025

3126
const host = url.parse(endpoint).host;
3227
const protocol = 'vscode-remote';
@@ -41,24 +36,22 @@ async function runTestsInBrowser(browserType: string, endpoint: string): Promise
4136

4237
await page.goto(`${endpoint}&folder=${folderParam}&payload=${payloadParam}`);
4338

44-
// const emitter = new events.EventEmitter();
45-
// await page.exposeFunction('mocha_report', (type, data1, data2) => {
46-
// emitter.emit(type, data1, data2)
47-
// });
39+
await page.exposeFunction('codeAutomationLog', (type: string, args: any[]) => {
40+
console[type](...args);
41+
});
4842

4943
page.on('console', async (msg: playwright.ConsoleMessage) => {
5044
const msgText = msg.text();
51-
console[msg.type()](msgText, await Promise.all(msg.args().map(async arg => await arg.jsonValue())));
52-
5345
if (msgText.indexOf('vscode:exit') >= 0) {
54-
browser.close();
55-
teardownServer();
56-
setTimeout(() => process.exit(msgText === 'vscode:exit 0' ? 0 : 1), 10);
46+
await browser.close();
47+
process.exit(msgText === 'vscode:exit 0' ? 0 : 1);
5748
}
5849
});
5950
}
6051

6152
async function launchServer(): Promise<string> {
53+
54+
// Ensure a tmp user-data-dir is used for the tests
6255
const tmpDir = tmp.dirSync({ prefix: 't' });
6356
const testDataPath = tmpDir.name;
6457
process.once('exit', () => rimraf.sync(testDataPath));
@@ -70,7 +63,7 @@ async function launchServer(): Promise<string> {
7063
...process.env
7164
};
7265

73-
let serverLocation;
66+
let serverLocation: string;
7467
if (process.env.VSCODE_REMOTE_SERVER_PATH) {
7568
serverLocation = path.join(process.env.VSCODE_REMOTE_SERVER_PATH, `server.${process.platform === 'win32' ? 'cmd' : 'sh'}`);
7669
} else {
@@ -79,24 +72,33 @@ async function launchServer(): Promise<string> {
7972
process.env.VSCODE_DEV = '1';
8073
}
8174

82-
serverProcess = cp.spawn(
75+
let serverProcess = cp.spawn(
8376
serverLocation,
8477
['--browser', 'none', '--driver', 'web'],
8578
{ env }
8679
);
8780

88-
serverProcess?.stderr?.on('data', e => console.log(`Server stderr: ${e}`));
89-
serverProcess?.stdout?.on('data', e => console.log(`Server stdout: ${e}`));
81+
serverProcess?.stderr?.on('data', error => console.log(`Server stderr: ${error}`));
82+
83+
if (optimist.argv.debug) {
84+
serverProcess?.stdout?.on('data', data => console.log(`Server stdout: ${data}`));
85+
}
86+
87+
function teardownServer() {
88+
if (serverProcess) {
89+
serverProcess.kill();
90+
}
91+
}
9092

9193
process.on('exit', teardownServer);
9294
process.on('SIGINT', teardownServer);
9395
process.on('SIGTERM', teardownServer);
9496

95-
return new Promise(r => {
96-
serverProcess?.stdout?.on('data', d => {
97-
const matches = d.toString('ascii').match(/Web UI available at (.+)/);
97+
return new Promise(c => {
98+
serverProcess?.stdout?.on('data', data => {
99+
const matches = data.toString('ascii').match(/Web UI available at (.+)/);
98100
if (matches !== null) {
99-
r(matches[1]);
101+
c(matches[1]);
100102
}
101103
});
102104
});

test/integration/browser/yarn.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@
4646
"@types/glob" "*"
4747
"@types/node" "*"
4848

49+
"@types/tmp@^0.1.0":
50+
version "0.1.0"
51+
resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.1.0.tgz#19cf73a7bcf641965485119726397a096f0049bd"
52+
integrity sha512-6IwZ9HzWbCq6XoQWhxLpDjuADodH/MKXRUIDFudvgjcVdjFknvmR+DNsoUeer4XPrEnrZs04Jj+kfV9pFsrhmA==
53+
4954
balanced-match@^1.0.0:
5055
version "1.0.0"
5156
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"

0 commit comments

Comments
 (0)