From 9d43802fd42f38036088a246c392d0296a52a05e Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 23 Jul 2019 17:35:11 -0700 Subject: [PATCH 1/4] Create CustomExecution2 test, make start fire after onDidOpenTerminal Part of #70978 --- .../workspace.tasks.test.ts | 63 +++++++++++++++++++ src/vs/workbench/api/node/extHostTask.ts | 2 +- .../api/node/extHostTerminalService.ts | 8 ++- 3 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts new file mode 100644 index 00000000000..67600f97cd6 --- /dev/null +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts @@ -0,0 +1,63 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import * as vscode from 'vscode'; + +suite.only('workspace-namespace', () => { + + suite('Tasks', () => { + + test('CustomExecution2 task should start and shutdown successfully', (done) => { + interface CustomTestingTaskDefinition extends vscode.TaskDefinition { + /** + * One of the task properties. This can be used to customize the task in the tasks.json + */ + customProp1: string; + } + const taskType: string = 'customTesting'; + const taskName = 'First custom task'; + const reg1 = vscode.window.onDidOpenTerminal(term => { + reg1.dispose(); + const reg2 = term.onDidWriteData(e => { + reg2.dispose(); + assert.equal(e, 'testing\r\n'); + term.dispose(); + }); + }); + const exitEmitter = new vscode.EventEmitter(); + const taskProvider = vscode.tasks.registerTaskProvider(taskType, { + provideTasks: () => { + let result: vscode.Task[] = []; + let kind: CustomTestingTaskDefinition = { + type: taskType, + customProp1: 'testing task one' + }; + const writeEmitter = new vscode.EventEmitter(); + let execution = new vscode.CustomExecution2((): Thenable => { + return Promise.resolve({ + onDidWrite: writeEmitter.event, + start: () => { + writeEmitter.fire('testing\r\n'); + }, + onDidExit: exitEmitter.event, + shutdown: () => { + taskProvider.dispose(); + done(); + } + }); + }); + let task = new vscode.Task2(kind, vscode.TaskScope.Workspace, taskName, taskType, execution); + result.push(task); + return result; + }, + resolveTask(_task: vscode.Task): vscode.Task | undefined { + return undefined; + } + }); + vscode.commands.executeCommand('workbench.action.tasks.runTask', `${taskType}: ${taskName}`); + }); + }); +}); diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index a1e82957b48..0e7f5f9dd7a 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -588,7 +588,7 @@ export class ExtHostTask implements ExtHostTaskShape { // Clone the custom execution to keep the original untouched. This is important for multiple runs of the same task. this._activeCustomExecutions2.set(execution.id, execution2); - this._terminalService.attachVirtualProcessToTerminal(terminalId, await execution2.callback()); + await this._terminalService.attachVirtualProcessToTerminal(terminalId, await execution2.callback()); } // Once a terminal is spun up for the custom execution task this event will be fired. diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 35884b08ba4..847bba891e8 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -337,8 +337,8 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { return terminal; } - public attachVirtualProcessToTerminal(id: number, virtualProcess: vscode.TerminalVirtualProcess) { - const terminal = this._getTerminalById(id); + public async attachVirtualProcessToTerminal(id: number, virtualProcess: vscode.TerminalVirtualProcess): Promise { + const terminal = this._getTerminalByIdEventually(id); if (!terminal) { throw new Error(`Cannot resolve terminal with id ${id} for virtual process`); } @@ -619,6 +619,10 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } public async $startVirtualProcess(id: number, initialDimensions: ITerminalDimensionsDto | undefined): Promise { + // Make sure the ExtHostTerminal exists so onDidOpenTerminal has fired before we call + // TerminalVirtualProcess.start + await this._getTerminalByIdEventually(id); + // Processes should be initialized here for normal virtual process terminals, however for // tasks they are responsible for attaching the virtual process to a terminal so this // function may be called before tasks is able to attach to the terminal. From 7be48949b76aefed2186fc39a9dbcf0b9d8d13f1 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 23 Jul 2019 17:36:56 -0700 Subject: [PATCH 2/4] Remove unused exit emitter --- .../src/singlefolder-tests/workspace.tasks.test.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts index 67600f97cd6..7060829f678 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts @@ -27,7 +27,6 @@ suite.only('workspace-namespace', () => { term.dispose(); }); }); - const exitEmitter = new vscode.EventEmitter(); const taskProvider = vscode.tasks.registerTaskProvider(taskType, { provideTasks: () => { let result: vscode.Task[] = []; @@ -42,7 +41,6 @@ suite.only('workspace-namespace', () => { start: () => { writeEmitter.fire('testing\r\n'); }, - onDidExit: exitEmitter.event, shutdown: () => { taskProvider.dispose(); done(); From 09505230699e617aeb977645855b225533493afb Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 23 Jul 2019 17:46:46 -0700 Subject: [PATCH 3/4] Use const --- .../src/singlefolder-tests/workspace.tasks.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts index 7060829f678..a101cfd7c5d 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts @@ -29,13 +29,13 @@ suite.only('workspace-namespace', () => { }); const taskProvider = vscode.tasks.registerTaskProvider(taskType, { provideTasks: () => { - let result: vscode.Task[] = []; - let kind: CustomTestingTaskDefinition = { + const result: vscode.Task[] = []; + const kind: CustomTestingTaskDefinition = { type: taskType, customProp1: 'testing task one' }; const writeEmitter = new vscode.EventEmitter(); - let execution = new vscode.CustomExecution2((): Thenable => { + const execution = new vscode.CustomExecution2((): Thenable => { return Promise.resolve({ onDidWrite: writeEmitter.event, start: () => { @@ -47,7 +47,7 @@ suite.only('workspace-namespace', () => { } }); }); - let task = new vscode.Task2(kind, vscode.TaskScope.Workspace, taskName, taskType, execution); + const task = new vscode.Task2(kind, vscode.TaskScope.Workspace, taskName, taskType, execution); result.push(task); return result; }, From b0603017ba79a11cbe687ea26c7543a51d0435d6 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 23 Jul 2019 17:47:38 -0700 Subject: [PATCH 4/4] Fail test if resolveTask is called --- .../src/singlefolder-tests/workspace.tasks.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts index a101cfd7c5d..43470d24e19 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts @@ -52,6 +52,7 @@ suite.only('workspace-namespace', () => { return result; }, resolveTask(_task: vscode.Task): vscode.Task | undefined { + assert.fail('resolveTask should not trigger during the test'); return undefined; } });