diff --git a/src/service.ts b/src/service.ts index 44f31a18..cf46d452 100644 --- a/src/service.ts +++ b/src/service.ts @@ -55,6 +55,12 @@ export default class VSCodeWorkerService implements Services.ServiceInstance { } } + private _handleSocketClose (code: number, reason: Buffer) { + const msg = `Connection closed. Code: ${code}, reason: ${reason.toString()}` + this._promisedSocket = Promise.reject(new Error(msg)) + this._pendingMessages.forEach((resolver) => resolver(msg, null)) + } + async beforeSession (option: Options.Testrunner, capabilities: VSCodeCapabilities) { this._isWebSession = capabilities.browserName !== 'vscode' @@ -103,9 +109,11 @@ export default class VSCodeWorkerService implements Services.ServiceInstance { ) wss.on('connection', (socket) => { log.info('Connected with VSCode workbench') + this._promisedSocket = Promise.resolve(socket) resolve(socket) clearTimeout(socketTimeout) socket.on('message', this._handleIncoming.bind(this)) + socket.once('close', this._handleSocketClose.bind(this)) }) }) } diff --git a/test/specs/workbench.e2e.ts b/test/specs/workbench.e2e.ts index 9f0cf157..31accdb3 100644 --- a/test/specs/workbench.e2e.ts +++ b/test/specs/workbench.e2e.ts @@ -3,6 +3,7 @@ // eslint-disable-next-line @typescript-eslint/triple-slash-reference /// +import path from 'node:path' import { browser, expect } from '@wdio/globals' import { skip } from './utils.js' @@ -85,6 +86,20 @@ describe('workbench', () => { }) }) + it('can access the VSCode API after a new folder is opened @skipWeb', async () => { + const workspaceRoot = await browser.executeWorkbench((vscode) => vscode.workspace.rootPath) + expect(workspaceRoot).not.toBe(undefined) + const newWorkspaceRoot = path.join(workspaceRoot!, 'test') + await browser.executeWorkbench((vscode, newRoot) => { + const uri = vscode.Uri.file(newRoot) + vscode.commands.executeCommand('vscode.openFolder', uri) + }, newWorkspaceRoot) + await browser.waitUntil(async () => { + const root = await browser.executeWorkbench((vscode) => vscode.workspace.rootPath) + return root === newWorkspaceRoot + }) + }) + it('can send parameters to VSCode API invocation @skipWeb', async () => { const workbench = await browser.getWorkbench() const message = 'I passed this message as a parameter!'