diff --git a/extensions/vscode-test-resolver/src/extension.ts b/extensions/vscode-test-resolver/src/extension.ts index e137e7c9696..da2a277dcd4 100644 --- a/extensions/vscode-test-resolver/src/extension.ts +++ b/extensions/vscode-test-resolver/src/extension.ts @@ -65,7 +65,7 @@ export function activate(context: vscode.ExtensionContext) { return; } - const { updateUrl, commit, quality } = getProductConfiguration(); + const { updateUrl, commit, quality, serverDataFolderName, dataFolderName } = getProductConfiguration(); if (!commit) { // dev mode const vscodePath = path.resolve(path.join(context.extensionPath, '..', '..')); const nodeExec = process.platform === 'win32' ? 'node.exe' : 'node'; @@ -86,7 +86,10 @@ export function activate(context: vscode.ExtensionContext) { const env = getNewEnv(); extHostProcess = cp.spawn(nodePath, [path.join('out', 'remoteExtensionHostAgent'), '--port=0'], { cwd: vscodePath, env }); } else { - const serverBin = path.resolve(os.homedir(), '.vscode-remote', 'bin'); + const remoteDataDir = process.env['TESTRESOLVER_DATA_FOLDER'] || path.join(os.homedir(), serverDataFolderName || `${dataFolderName}-testresolver`); + outputChannel.appendLine(`Using data folder at ${remoteDataDir}`); + + const serverBin = path.join(remoteDataDir, 'bin'); progress.report({ message: 'Installing VSCode Server' }); const serverLocation = await downloadAndUnzipVSCodeServer(updateUrl, commit, quality, serverBin); outputChannel.appendLine(`Using server build at ${serverLocation}`); @@ -95,8 +98,10 @@ export function activate(context: vscode.ExtensionContext) { const env = getNewEnv(); env['PATH'] = path.join(serverLocation, 'bin') + path.delimiter + env['PATH']; // code command for the terminal + env['VSCODE_AGENT_FOLDER'] = remoteDataDir; - extHostProcess = cp.spawn(path.join(serverLocation, 'server.sh'), commandArgs, { env, cwd: serverLocation }); + const serverCommand = process.platform === 'win32' ? 'server.bat' : 'server.sh'; + extHostProcess = cp.spawn(path.join(serverLocation, serverCommand), commandArgs, { env, cwd: serverLocation }); } extHostProcess.stdout.on('data', (data: Buffer) => processOutput(data.toString())); extHostProcess.stderr.on('data', (data: Buffer) => processOutput(data.toString())); @@ -166,6 +171,8 @@ export interface IProductConfiguration { updateUrl: string; commit: string; quality: string; + dataFolderName: string; + serverDataFolderName?: string; } function getProductConfiguration(): IProductConfiguration { diff --git a/test/smoke/src/application.ts b/test/smoke/src/application.ts index 58e5b301a2c..62cae10a137 100644 --- a/test/smoke/src/application.ts +++ b/test/smoke/src/application.ts @@ -47,6 +47,10 @@ export class Application { return this.options.logger; } + get remote(): boolean { + return !!this.options.remote; + } + private _workspacePathOrFolder: string; get workspacePathOrFolder(): string { return this._workspacePathOrFolder; @@ -135,6 +139,10 @@ export class Application { await this.code.waitForWindowIds(ids => ids.length > 0); await this.code.waitForElement('.monaco-workbench'); + if (this.remote) { + await this.code.waitForElement('.monaco-workbench .statusbar-item.statusbar-entry a[title="Editing on TestResolver"]'); + } + // wait a bit, since focus might be stolen off widgets // as soon as they open (eg quick open) await new Promise(c => setTimeout(c, 1000)); diff --git a/test/smoke/src/areas/extensions/extensions.test.ts b/test/smoke/src/areas/extensions/extensions.test.ts index 4215a7fe247..1ff6dce2df3 100644 --- a/test/smoke/src/areas/extensions/extensions.test.ts +++ b/test/smoke/src/areas/extensions/extensions.test.ts @@ -20,6 +20,10 @@ export function setup() { await app.workbench.extensions.installExtension('michelkaporin.vscode-smoketest-check', 'vscode-smoketest-check'); await app.workbench.extensions.waitForExtensionsViewlet(); + + if (app.remote) { + await app.reload(); + } await app.workbench.quickopen.runCommand('Smoke Test Check'); await app.workbench.statusbar.waitForStatusbarText('smoke test', 'VS Code Smoke Test Check'); }); diff --git a/test/smoke/src/areas/multiroot/multiroot.test.ts b/test/smoke/src/areas/multiroot/multiroot.test.ts index f3ca92b8868..2e0caea1123 100644 --- a/test/smoke/src/areas/multiroot/multiroot.test.ts +++ b/test/smoke/src/areas/multiroot/multiroot.test.ts @@ -47,7 +47,9 @@ export function setup() { const app = this.app as Application; await app.workbench.quickopen.openQuickOpen('*.*'); - await app.workbench.quickopen.waitForQuickOpenElements(names => names.length === 6); + const numResultsExpected = this.app.remote ? 7 : 6; + + await app.workbench.quickopen.waitForQuickOpenElements(names => names.length === numResultsExpected); await app.workbench.quickopen.closeQuickOpen(); }); diff --git a/test/smoke/src/vscode/code.ts b/test/smoke/src/vscode/code.ts index b50e1caa847..0b9c739cb69 100644 --- a/test/smoke/src/vscode/code.ts +++ b/test/smoke/src/vscode/code.ts @@ -7,6 +7,7 @@ import * as path from 'path'; import * as cp from 'child_process'; import * as os from 'os'; import * as fs from 'fs'; +import * as mkdirp from 'mkdirp'; import { tmpName } from 'tmp'; import { IDriver, connect as connectDriver, IDisposable, IElement, Thenable } from './driver'; import { Logger } from '../logger'; @@ -123,6 +124,8 @@ export async function spawn(options: SpawnOptions): Promise { '--driver', handle ]; + const env = process.env; + if (options.remote) { // Replace workspace path with URI args.shift(); @@ -139,6 +142,9 @@ export async function spawn(options: SpawnOptions): Promise { } } args.push('--enable-proposed-api=vscode.vscode-test-resolver'); + const remoteDataDir = `${options.userDataDir}-server`; + mkdirp.sync(remoteDataDir); + env['TESTRESOLVER_DATA_FOLDER'] = remoteDataDir; } if (!codePath) { @@ -157,7 +163,7 @@ export async function spawn(options: SpawnOptions): Promise { args.push(...options.extraArgs); } - const spawnOptions: cp.SpawnOptions = {}; + const spawnOptions: cp.SpawnOptions = { env }; const child = cp.spawn(electronPath, args, spawnOptions);