Path: blob/main/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts
5343 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { generateUuid } from '../../../../../base/common/uuid.js';7import { IExtensionsWorkbenchService, ExtensionContainers } from '../../common/extensions.js';8import * as ExtensionsActions from '../../browser/extensionsActions.js';9import { ExtensionsWorkbenchService } from '../../browser/extensionsWorkbenchService.js';10import {11IExtensionManagementService, IExtensionGalleryService, ILocalExtension, IGalleryExtension,12DidUninstallExtensionEvent, InstallExtensionEvent, IExtensionIdentifier, InstallOperation, IExtensionTipsService, InstallExtensionResult, getTargetPlatform, IExtensionsControlManifest, UninstallExtensionEvent, Metadata13} from '../../../../../platform/extensionManagement/common/extensionManagement.js';14import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer, ExtensionInstallLocation, IProfileAwareExtensionManagementService, IWorkbenchExtensionManagementService } from '../../../../services/extensionManagement/common/extensionManagement.js';15import { IExtensionRecommendationsService } from '../../../../services/extensionRecommendations/common/extensionRecommendations.js';16import { getGalleryExtensionId } from '../../../../../platform/extensionManagement/common/extensionManagementUtil.js';17import { TestExtensionEnablementService } from '../../../../services/extensionManagement/test/browser/extensionEnablementService.test.js';18import { ExtensionGalleryService } from '../../../../../platform/extensionManagement/common/extensionGalleryService.js';19import { IURLService } from '../../../../../platform/url/common/url.js';20import { TestInstantiationService } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js';21import { Emitter, Event } from '../../../../../base/common/event.js';22import { IPager } from '../../../../../base/common/paging.js';23import { ITelemetryService } from '../../../../../platform/telemetry/common/telemetry.js';24import { NullTelemetryService } from '../../../../../platform/telemetry/common/telemetryUtils.js';25import { IExtensionService, toExtensionDescription } from '../../../../services/extensions/common/extensions.js';26import { IWorkspaceContextService } from '../../../../../platform/workspace/common/workspace.js';27import { TestContextService, TestWorkspaceTrustManagementService } from '../../../../test/common/workbenchTestServices.js';28import { TestExtensionTipsService, TestSharedProcessService } from '../../../../test/electron-browser/workbenchTestServices.js';29import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';30import { ILogService, NullLogService } from '../../../../../platform/log/common/log.js';31import { NativeURLService } from '../../../../../platform/url/common/urlService.js';32import { URI } from '../../../../../base/common/uri.js';33import { TestConfigurationService } from '../../../../../platform/configuration/test/common/testConfigurationService.js';34import { IRemoteAgentService } from '../../../../services/remote/common/remoteAgentService.js';35import { RemoteAgentService } from '../../../../services/remote/electron-browser/remoteAgentService.js';36import { IExtensionContributions, ExtensionType, IExtensionDescription, IExtension } from '../../../../../platform/extensions/common/extensions.js';37import { ISharedProcessService } from '../../../../../platform/ipc/electron-browser/services.js';38import { CancellationToken } from '../../../../../base/common/cancellation.js';39import { ILabelService, IFormatterChangeEvent } from '../../../../../platform/label/common/label.js';40import { IProductService } from '../../../../../platform/product/common/productService.js';41import { Schemas } from '../../../../../base/common/network.js';42import { IProgressService } from '../../../../../platform/progress/common/progress.js';43import { ProgressService } from '../../../../services/progress/browser/progressService.js';44import { ILifecycleService } from '../../../../services/lifecycle/common/lifecycle.js';45import { TestEnvironmentService, TestLifecycleService } from '../../../../test/browser/workbenchTestServices.js';46import { DisposableStore } from '../../../../../base/common/lifecycle.js';47import { INativeWorkbenchEnvironmentService } from '../../../../services/environment/electron-browser/environmentService.js';48import { IWorkbenchEnvironmentService } from '../../../../services/environment/common/environmentService.js';49import { IUserDataSyncEnablementService } from '../../../../../platform/userDataSync/common/userDataSync.js';50import { UserDataSyncEnablementService } from '../../../../../platform/userDataSync/common/userDataSyncEnablementService.js';51import { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';52import { MockContextKeyService } from '../../../../../platform/keybinding/test/common/mockKeybindingService.js';53import { IWorkspaceTrustManagementService } from '../../../../../platform/workspace/common/workspaceTrust.js';54import { IEnvironmentService, INativeEnvironmentService } from '../../../../../platform/environment/common/environment.js';55import { platform } from '../../../../../base/common/platform.js';56import { arch } from '../../../../../base/common/process.js';57import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';58import { IUpdateService, State } from '../../../../../platform/update/common/update.js';59import { IMeteredConnectionService } from '../../../../../platform/meteredConnection/common/meteredConnection.js';60import { IFileService } from '../../../../../platform/files/common/files.js';61import { FileService } from '../../../../../platform/files/common/fileService.js';62import { Mutable } from '../../../../../base/common/types.js';63import { IUserDataProfileService } from '../../../../services/userDataProfile/common/userDataProfile.js';64import { UserDataProfileService } from '../../../../services/userDataProfile/common/userDataProfileService.js';65import { toUserDataProfile } from '../../../../../platform/userDataProfile/common/userDataProfile.js';6667let instantiationService: TestInstantiationService;68let installEvent: Emitter<InstallExtensionEvent>,69didInstallEvent: Emitter<readonly InstallExtensionResult[]>,70uninstallEvent: Emitter<UninstallExtensionEvent>,71didUninstallEvent: Emitter<DidUninstallExtensionEvent>;7273function setupTest(disposables: Pick<DisposableStore, 'add'>) {74installEvent = disposables.add(new Emitter<InstallExtensionEvent>());75didInstallEvent = disposables.add(new Emitter<readonly InstallExtensionResult[]>());76uninstallEvent = disposables.add(new Emitter<UninstallExtensionEvent>());77didUninstallEvent = disposables.add(new Emitter<DidUninstallExtensionEvent>());7879instantiationService = disposables.add(new TestInstantiationService());8081instantiationService.stub(IEnvironmentService, TestEnvironmentService);82instantiationService.stub(IWorkbenchEnvironmentService, TestEnvironmentService);8384instantiationService.stub(ITelemetryService, NullTelemetryService);85instantiationService.stub(ILogService, NullLogService);8687instantiationService.stub(IWorkspaceContextService, new TestContextService());88instantiationService.stub(IFileService, disposables.add(new FileService(new NullLogService())));89instantiationService.stub(IConfigurationService, new TestConfigurationService());90instantiationService.stub(IProgressService, ProgressService);91instantiationService.stub(IProductService, {});92instantiationService.stub(IContextKeyService, new MockContextKeyService());9394instantiationService.stub(IExtensionGalleryService, ExtensionGalleryService);95instantiationService.stub(ISharedProcessService, TestSharedProcessService);9697instantiationService.stub(IWorkbenchExtensionManagementService, {98onDidInstallExtensions: didInstallEvent.event,99// eslint-disable-next-line local/code-no-any-casts100onInstallExtension: installEvent.event as any,101// eslint-disable-next-line local/code-no-any-casts102onUninstallExtension: uninstallEvent.event as any,103// eslint-disable-next-line local/code-no-any-casts104onDidUninstallExtension: didUninstallEvent.event as any,105onDidUpdateExtensionMetadata: Event.None,106onDidChangeProfile: Event.None,107onProfileAwareDidInstallExtensions: Event.None,108async getInstalled() { return []; },109async getInstalledWorkspaceExtensions() { return []; },110async getExtensionsControlManifest() { return { malicious: [], deprecated: {}, search: [], publisherMapping: {} }; },111async updateMetadata(local: Mutable<ILocalExtension>, metadata: Partial<Metadata>) {112local.identifier.uuid = metadata.id;113local.publisherDisplayName = metadata.publisherDisplayName!;114local.publisherId = metadata.publisherId!;115return local;116},117async canInstall() { return true; },118async getTargetPlatform() { return getTargetPlatform(platform, arch); },119});120121instantiationService.stub(IRemoteAgentService, RemoteAgentService);122123const localExtensionManagementServer = { extensionManagementService: instantiationService.get(IExtensionManagementService) as IProfileAwareExtensionManagementService, label: 'local', id: 'vscode-local' };124instantiationService.stub(IExtensionManagementServerService, {125get localExtensionManagementServer(): IExtensionManagementServer {126return localExtensionManagementServer;127},128getExtensionManagementServer(extension: IExtension): IExtensionManagementServer | null {129if (extension.location.scheme === Schemas.file) {130return localExtensionManagementServer;131}132throw new Error(`Invalid Extension ${extension.location}`);133}134});135136instantiationService.stub(IUserDataProfileService, disposables.add(new UserDataProfileService(toUserDataProfile('test', 'test', URI.file('foo'), URI.file('cache')))));137instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));138instantiationService.stub(ILabelService, { onDidChangeFormatters: disposables.add(new Emitter<IFormatterChangeEvent>()).event });139140instantiationService.stub(ILifecycleService, disposables.add(new TestLifecycleService()));141instantiationService.stub(IExtensionTipsService, disposables.add(instantiationService.createInstance(TestExtensionTipsService)));142instantiationService.stub(IExtensionRecommendationsService, {});143instantiationService.stub(IURLService, NativeURLService);144145instantiationService.stub(IExtensionGalleryService, 'isEnabled', true);146instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage());147instantiationService.stubPromise(IExtensionGalleryService, 'getExtensions', []);148instantiationService.stub(IExtensionService, { extensions: [], onDidChangeExtensions: Event.None, canAddExtension: (extension: IExtensionDescription) => false, canRemoveExtension: (extension: IExtensionDescription) => false, whenInstalledExtensionsRegistered: () => Promise.resolve(true) });149(<TestExtensionEnablementService>instantiationService.get(IWorkbenchExtensionEnablementService)).reset();150151instantiationService.stub(IUserDataSyncEnablementService, disposables.add(instantiationService.createInstance(UserDataSyncEnablementService)));152153instantiationService.stub(IUpdateService, { onStateChange: Event.None, state: State.Uninitialized });154instantiationService.stub(IMeteredConnectionService, { isConnectionMetered: false, onDidChangeIsConnectionMetered: Event.None });155instantiationService.set(IExtensionsWorkbenchService, disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService)));156instantiationService.stub(IWorkspaceTrustManagementService, disposables.add(new TestWorkspaceTrustManagementService()));157}158159160suite('ExtensionsActions', () => {161162const disposables = ensureNoDisposablesAreLeakedInTestSuite();163setup(() => setupTest(disposables));164165test('Install action is disabled when there is no extension', () => {166const testObject: ExtensionsActions.InstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.InstallAction, { installPreReleaseVersion: false }));167168assert.ok(!testObject.enabled);169});170171test('Test Install action when state is installed', () => {172const workbenchService = instantiationService.get(IExtensionsWorkbenchService);173const testObject: ExtensionsActions.InstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.InstallAction, { installPreReleaseVersion: false }));174disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));175const local = aLocalExtension('a');176instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);177return workbenchService.queryLocal()178.then(() => {179instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: local.identifier })));180return workbenchService.queryGallery(CancellationToken.None)181.then((paged) => {182testObject.extension = paged.firstPage[0];183assert.ok(!testObject.enabled);184assert.strictEqual('Install', testObject.label);185assert.strictEqual('extension-action label prominent install hide', testObject.class);186});187});188});189190test('Test InstallingLabelAction when state is installing', () => {191const workbenchService = instantiationService.get(IExtensionsWorkbenchService);192const testObject: ExtensionsActions.InstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.InstallingLabelAction));193disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));194const gallery = aGalleryExtension('a');195instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));196return workbenchService.queryGallery(CancellationToken.None)197.then((paged) => {198testObject.extension = paged.firstPage[0];199installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });200201assert.ok(!testObject.enabled);202assert.strictEqual('Installing', testObject.label);203assert.strictEqual('extension-action label install installing', testObject.class);204});205});206207test('Test Install action when state is uninstalled', async () => {208const workbenchService = instantiationService.get(IExtensionsWorkbenchService);209const testObject: ExtensionsActions.InstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.InstallAction, { installPreReleaseVersion: false }));210disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));211const gallery = aGalleryExtension('a');212instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));213const paged = await workbenchService.queryGallery(CancellationToken.None);214const promise = Event.toPromise(Event.filter(testObject.onDidChange, e => e.enabled === true));215testObject.extension = paged.firstPage[0];216await promise;217assert.ok(testObject.enabled);218assert.strictEqual('Install', testObject.label);219});220221test('Test Install action when extension is system action', () => {222const testObject: ExtensionsActions.InstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.InstallAction, { installPreReleaseVersion: false }));223disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));224const local = aLocalExtension('a', {}, { type: ExtensionType.System });225instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);226227return instantiationService.get(IExtensionsWorkbenchService).queryLocal()228.then(extensions => {229uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });230didUninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });231testObject.extension = extensions[0];232assert.ok(!testObject.enabled);233});234});235236test('Test Install action when extension doesnot has gallery', () => {237const testObject: ExtensionsActions.InstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.InstallAction, { installPreReleaseVersion: false }));238disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));239const local = aLocalExtension('a');240instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);241242return instantiationService.get(IExtensionsWorkbenchService).queryLocal()243.then(extensions => {244uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });245didUninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });246testObject.extension = extensions[0];247assert.ok(!testObject.enabled);248});249});250251test('Uninstall action is disabled when there is no extension', () => {252const testObject: ExtensionsActions.UninstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UninstallAction));253disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));254255assert.ok(!testObject.enabled);256});257258test('Test Uninstall action when state is uninstalling', () => {259const testObject: ExtensionsActions.UninstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UninstallAction));260disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));261const local = aLocalExtension('a');262instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);263264return instantiationService.get(IExtensionsWorkbenchService).queryLocal()265.then(extensions => {266testObject.extension = extensions[0];267uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });268assert.ok(!testObject.enabled);269assert.strictEqual('Uninstalling', testObject.label);270assert.strictEqual('extension-action label uninstall uninstalling', testObject.class);271});272});273274test('Test Uninstall action when state is installed and is user extension', () => {275const testObject: ExtensionsActions.UninstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UninstallAction));276disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));277const local = aLocalExtension('a');278instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);279280return instantiationService.get(IExtensionsWorkbenchService).queryLocal()281.then(extensions => {282testObject.extension = extensions[0];283assert.ok(testObject.enabled);284assert.strictEqual('Uninstall', testObject.label);285assert.strictEqual('extension-action label uninstall', testObject.class);286});287});288289test('Test Uninstall action when state is installed and is system extension', () => {290const testObject: ExtensionsActions.UninstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UninstallAction));291disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));292const local = aLocalExtension('a', {}, { type: ExtensionType.System });293instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);294295return instantiationService.get(IExtensionsWorkbenchService).queryLocal()296.then(extensions => {297testObject.extension = extensions[0];298assert.ok(!testObject.enabled);299assert.strictEqual('Uninstall', testObject.label);300assert.strictEqual('extension-action label uninstall', testObject.class);301});302});303304test('Test Uninstall action when state is installing and is user extension', () => {305const testObject: ExtensionsActions.UninstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UninstallAction));306disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));307const local = aLocalExtension('a');308instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);309310return instantiationService.get(IExtensionsWorkbenchService).queryLocal()311.then(extensions => {312const gallery = aGalleryExtension('a');313const extension = extensions[0];314extension.gallery = gallery;315installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });316testObject.extension = extension;317assert.ok(!testObject.enabled);318});319});320321test('Test Uninstall action after extension is installed', async () => {322const testObject: ExtensionsActions.UninstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UninstallAction));323disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));324const gallery = aGalleryExtension('a');325instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));326327const paged = await instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);328testObject.extension = paged.firstPage[0];329330installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });331const promise = Event.toPromise(testObject.onDidChange);332didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery), profileLocation: null! }]);333334await promise;335assert.ok(testObject.enabled);336assert.strictEqual('Uninstall', testObject.label);337assert.strictEqual('extension-action label uninstall', testObject.class);338});339340test('Test UpdateAction when there is no extension', () => {341const testObject: ExtensionsActions.UpdateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UpdateAction, false));342disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));343344assert.ok(!testObject.enabled);345});346347test('Test UpdateAction when extension is uninstalled', () => {348const testObject: ExtensionsActions.UpdateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UpdateAction, false));349disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));350const gallery = aGalleryExtension('a', { version: '1.0.0' });351instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));352return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)353.then((paged) => {354testObject.extension = paged.firstPage[0];355assert.ok(!testObject.enabled);356});357});358359test('Test UpdateAction when extension is installed and not outdated', () => {360const testObject: ExtensionsActions.UpdateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UpdateAction, false));361disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));362const local = aLocalExtension('a', { version: '1.0.0' });363instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);364365return instantiationService.get(IExtensionsWorkbenchService).queryLocal()366.then(extensions => {367testObject.extension = extensions[0];368instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: local.identifier, version: local.manifest.version })));369return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)370.then(extensions => assert.ok(!testObject.enabled));371});372});373374test('Test UpdateAction when extension is installed outdated and system extension', () => {375const testObject: ExtensionsActions.UpdateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UpdateAction, false));376disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));377const local = aLocalExtension('a', { version: '1.0.0' }, { type: ExtensionType.System });378instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);379380return instantiationService.get(IExtensionsWorkbenchService).queryLocal()381.then(extensions => {382testObject.extension = extensions[0];383instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: local.identifier, version: '1.0.1' })));384return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)385.then(extensions => assert.ok(!testObject.enabled));386});387});388389test('Test UpdateAction when extension is installed outdated and user extension', () => {390const testObject: ExtensionsActions.UpdateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UpdateAction, false));391disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));392const local = aLocalExtension('a', { version: '1.0.0' });393instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);394395const workbenchService = instantiationService.get(IExtensionsWorkbenchService);396return workbenchService.queryLocal()397.then(async extensions => {398testObject.extension = extensions[0];399const gallery = aGalleryExtension('a', { identifier: local.identifier, version: '1.0.1' });400instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));401instantiationService.stubPromise(IExtensionGalleryService, 'getCompatibleExtension', gallery);402instantiationService.stubPromise(IExtensionGalleryService, 'getExtensions', [gallery]);403assert.ok(!testObject.enabled);404return new Promise<void>(c => {405disposables.add(testObject.onDidChange(() => {406if (testObject.enabled) {407c();408}409}));410instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);411});412});413});414415test('Test UpdateAction when extension is installing and outdated and user extension', async () => {416const testObject: ExtensionsActions.UpdateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UpdateAction, false));417disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));418const local = aLocalExtension('a', { version: '1.0.0' });419instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);420421const extensions = await instantiationService.get(IExtensionsWorkbenchService).queryLocal();422testObject.extension = extensions[0];423const gallery = aGalleryExtension('a', { identifier: local.identifier, version: '1.0.1' });424instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));425instantiationService.stubPromise(IExtensionGalleryService, 'getCompatibleExtension', gallery);426instantiationService.stubPromise(IExtensionGalleryService, 'getExtensions', [gallery]);427await new Promise<void>(c => {428disposables.add(testObject.onDidChange(() => {429if (testObject.enabled) {430c();431}432}));433instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);434});435await new Promise<void>(c => {436disposables.add(testObject.onDidChange(() => {437if (!testObject.enabled) {438c();439}440}));441installEvent.fire({ identifier: local.identifier, source: gallery, profileLocation: null! });442});443});444445test('Test ManageExtensionAction when there is no extension', () => {446const testObject: ExtensionsActions.ManageExtensionAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ManageExtensionAction));447disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));448449assert.ok(!testObject.enabled);450});451452test('Test ManageExtensionAction when extension is installed', () => {453const testObject: ExtensionsActions.ManageExtensionAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ManageExtensionAction));454disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));455const local = aLocalExtension('a');456instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);457458return instantiationService.get(IExtensionsWorkbenchService).queryLocal()459.then(extensions => {460testObject.extension = extensions[0];461assert.ok(testObject.enabled);462assert.strictEqual('extension-action icon manage codicon codicon-extensions-manage', testObject.class);463assert.strictEqual('Manage', testObject.tooltip);464});465});466467test('Test ManageExtensionAction when extension is uninstalled', () => {468const testObject: ExtensionsActions.ManageExtensionAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ManageExtensionAction));469disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));470const gallery = aGalleryExtension('a');471instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));472473return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)474.then(page => {475testObject.extension = page.firstPage[0];476assert.ok(!testObject.enabled);477assert.strictEqual('extension-action icon manage codicon codicon-extensions-manage hide', testObject.class);478assert.strictEqual('Manage', testObject.tooltip);479});480});481482test('Test ManageExtensionAction when extension is installing', () => {483const testObject: ExtensionsActions.ManageExtensionAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ManageExtensionAction));484disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));485const gallery = aGalleryExtension('a');486instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));487488return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)489.then(page => {490testObject.extension = page.firstPage[0];491492installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });493assert.ok(!testObject.enabled);494assert.strictEqual('extension-action icon manage codicon codicon-extensions-manage hide', testObject.class);495assert.strictEqual('Manage', testObject.tooltip);496});497});498499test('Test ManageExtensionAction when extension is queried from gallery and installed', async () => {500const testObject: ExtensionsActions.ManageExtensionAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ManageExtensionAction));501disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));502const gallery = aGalleryExtension('a');503instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));504505const paged = await instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);506testObject.extension = paged.firstPage[0];507installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });508const promise = Event.toPromise(testObject.onDidChange);509didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery), profileLocation: null! }]);510511await promise;512assert.ok(testObject.enabled);513assert.strictEqual('extension-action icon manage codicon codicon-extensions-manage', testObject.class);514assert.strictEqual('Manage', testObject.tooltip);515});516517test('Test ManageExtensionAction when extension is system extension', () => {518const testObject: ExtensionsActions.ManageExtensionAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ManageExtensionAction));519disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));520const local = aLocalExtension('a', {}, { type: ExtensionType.System });521instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);522523return instantiationService.get(IExtensionsWorkbenchService).queryLocal()524.then(extensions => {525testObject.extension = extensions[0];526assert.ok(testObject.enabled);527assert.strictEqual('extension-action icon manage codicon codicon-extensions-manage', testObject.class);528assert.strictEqual('Manage', testObject.tooltip);529});530});531532test('Test ManageExtensionAction when extension is uninstalling', () => {533const testObject: ExtensionsActions.ManageExtensionAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ManageExtensionAction));534disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));535const local = aLocalExtension('a');536instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);537538return instantiationService.get(IExtensionsWorkbenchService).queryLocal()539.then(extensions => {540testObject.extension = extensions[0];541uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });542543assert.ok(!testObject.enabled);544assert.strictEqual('extension-action icon manage codicon codicon-extensions-manage', testObject.class);545assert.strictEqual('Manage', testObject.tooltip);546});547});548549test('Test EnableForWorkspaceAction when there is no extension', () => {550const testObject: ExtensionsActions.EnableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction));551552assert.ok(!testObject.enabled);553});554555test('Test EnableForWorkspaceAction when there extension is not disabled', () => {556const local = aLocalExtension('a');557instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);558559return instantiationService.get(IExtensionsWorkbenchService).queryLocal()560.then(extensions => {561const testObject: ExtensionsActions.EnableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction));562testObject.extension = extensions[0];563assert.ok(!testObject.enabled);564});565});566567test('Test EnableForWorkspaceAction when the extension is disabled globally', () => {568const local = aLocalExtension('a');569return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)570.then(() => {571instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);572573return instantiationService.get(IExtensionsWorkbenchService).queryLocal()574.then(extensions => {575const testObject: ExtensionsActions.EnableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction));576testObject.extension = extensions[0];577assert.ok(testObject.enabled);578});579});580});581582test('Test EnableForWorkspaceAction when extension is disabled for workspace', () => {583const local = aLocalExtension('a');584return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledWorkspace)585.then(() => {586instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);587588return instantiationService.get(IExtensionsWorkbenchService).queryLocal()589.then(extensions => {590const testObject: ExtensionsActions.EnableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction));591testObject.extension = extensions[0];592assert.ok(testObject.enabled);593});594});595});596597test('Test EnableForWorkspaceAction when the extension is disabled globally and workspace', () => {598const local = aLocalExtension('a');599return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)600.then(() => instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledWorkspace))601.then(() => {602instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);603604return instantiationService.get(IExtensionsWorkbenchService).queryLocal()605.then(extensions => {606const testObject: ExtensionsActions.EnableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction));607testObject.extension = extensions[0];608assert.ok(testObject.enabled);609});610});611});612613test('Test EnableGloballyAction when there is no extension', () => {614const testObject: ExtensionsActions.EnableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableGloballyAction));615616assert.ok(!testObject.enabled);617});618619test('Test EnableGloballyAction when the extension is not disabled', () => {620const local = aLocalExtension('a');621instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);622623return instantiationService.get(IExtensionsWorkbenchService).queryLocal()624.then(extensions => {625const testObject: ExtensionsActions.EnableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableGloballyAction));626testObject.extension = extensions[0];627assert.ok(!testObject.enabled);628});629});630631test('Test EnableGloballyAction when the extension is disabled for workspace', () => {632const local = aLocalExtension('a');633return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledWorkspace)634.then(() => {635instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);636637return instantiationService.get(IExtensionsWorkbenchService).queryLocal()638.then(extensions => {639const testObject: ExtensionsActions.EnableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableGloballyAction));640testObject.extension = extensions[0];641assert.ok(!testObject.enabled);642});643});644});645646test('Test EnableGloballyAction when the extension is disabled globally', () => {647const local = aLocalExtension('a');648return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)649.then(() => {650instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);651652return instantiationService.get(IExtensionsWorkbenchService).queryLocal()653.then(extensions => {654const testObject: ExtensionsActions.EnableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableGloballyAction));655testObject.extension = extensions[0];656assert.ok(testObject.enabled);657});658});659});660661test('Test EnableGloballyAction when the extension is disabled in both', () => {662const local = aLocalExtension('a');663return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)664.then(() => instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledWorkspace))665.then(() => {666instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);667668return instantiationService.get(IExtensionsWorkbenchService).queryLocal()669.then(extensions => {670const testObject: ExtensionsActions.EnableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableGloballyAction));671testObject.extension = extensions[0];672assert.ok(testObject.enabled);673});674});675});676677test('Test EnableAction when there is no extension', () => {678const testObject: ExtensionsActions.EnableDropDownAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableDropDownAction));679680assert.ok(!testObject.enabled);681});682683test('Test EnableDropDownAction when extension is installed and enabled', () => {684const local = aLocalExtension('a');685instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);686687return instantiationService.get(IExtensionsWorkbenchService).queryLocal()688.then(extensions => {689const testObject: ExtensionsActions.EnableDropDownAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableDropDownAction));690testObject.extension = extensions[0];691assert.ok(!testObject.enabled);692});693});694695test('Test EnableDropDownAction when extension is installed and disabled globally', () => {696const local = aLocalExtension('a');697return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)698.then(() => {699instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);700701return instantiationService.get(IExtensionsWorkbenchService).queryLocal()702.then(extensions => {703const testObject: ExtensionsActions.EnableDropDownAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableDropDownAction));704testObject.extension = extensions[0];705assert.ok(testObject.enabled);706});707});708});709710test('Test EnableDropDownAction when extension is installed and disabled for workspace', () => {711const local = aLocalExtension('a');712return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledWorkspace)713.then(() => {714instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);715716return instantiationService.get(IExtensionsWorkbenchService).queryLocal()717.then(extensions => {718const testObject: ExtensionsActions.EnableDropDownAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableDropDownAction));719testObject.extension = extensions[0];720assert.ok(testObject.enabled);721});722});723});724725test('Test EnableDropDownAction when extension is uninstalled', () => {726const gallery = aGalleryExtension('a');727instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));728729return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)730.then(page => {731const testObject: ExtensionsActions.EnableDropDownAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableDropDownAction));732testObject.extension = page.firstPage[0];733assert.ok(!testObject.enabled);734});735});736737test('Test EnableDropDownAction when extension is installing', () => {738const gallery = aGalleryExtension('a');739instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));740741return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)742.then(page => {743const testObject: ExtensionsActions.EnableDropDownAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableDropDownAction));744testObject.extension = page.firstPage[0];745disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));746747installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });748assert.ok(!testObject.enabled);749});750});751752test('Test EnableDropDownAction when extension is uninstalling', () => {753const local = aLocalExtension('a');754instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);755756return instantiationService.get(IExtensionsWorkbenchService).queryLocal()757.then(extensions => {758const testObject: ExtensionsActions.EnableDropDownAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableDropDownAction));759testObject.extension = extensions[0];760uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });761assert.ok(!testObject.enabled);762});763});764765test('Test DisableForWorkspaceAction when there is no extension', () => {766const testObject: ExtensionsActions.DisableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction));767768assert.ok(!testObject.enabled);769});770771test('Test DisableForWorkspaceAction when the extension is disabled globally', () => {772const local = aLocalExtension('a');773return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)774.then(() => {775instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);776777return instantiationService.get(IExtensionsWorkbenchService).queryLocal()778.then(extensions => {779const testObject: ExtensionsActions.DisableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction));780testObject.extension = extensions[0];781assert.ok(!testObject.enabled);782});783});784});785786test('Test DisableForWorkspaceAction when the extension is disabled workspace', () => {787const local = aLocalExtension('a');788return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)789.then(() => {790instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);791792return instantiationService.get(IExtensionsWorkbenchService).queryLocal()793.then(extensions => {794const testObject: ExtensionsActions.DisableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction));795testObject.extension = extensions[0];796assert.ok(!testObject.enabled);797});798});799});800801test('Test DisableForWorkspaceAction when extension is enabled', () => {802const local = aLocalExtension('a');803instantiationService.stub(IExtensionService, {804extensions: [toExtensionDescription(local)],805onDidChangeExtensions: Event.None,806whenInstalledExtensionsRegistered: () => Promise.resolve(true)807});808809instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);810811return instantiationService.get(IExtensionsWorkbenchService).queryLocal()812.then(extensions => {813const testObject: ExtensionsActions.DisableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction));814testObject.extension = extensions[0];815assert.ok(testObject.enabled);816});817});818819test('Test DisableGloballyAction when there is no extension', () => {820const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));821822assert.ok(!testObject.enabled);823});824825test('Test DisableGloballyAction when the extension is disabled globally', () => {826const local = aLocalExtension('a');827return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)828.then(() => {829instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);830831return instantiationService.get(IExtensionsWorkbenchService).queryLocal()832.then(extensions => {833const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));834testObject.extension = extensions[0];835assert.ok(!testObject.enabled);836});837});838});839840test('Test DisableGloballyAction when the extension is disabled for workspace', () => {841const local = aLocalExtension('a');842return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledWorkspace)843.then(() => {844instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);845846return instantiationService.get(IExtensionsWorkbenchService).queryLocal()847.then(extensions => {848const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));849testObject.extension = extensions[0];850assert.ok(!testObject.enabled);851});852});853});854855test('Test DisableGloballyAction when the extension is enabled', () => {856const local = aLocalExtension('a');857instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);858instantiationService.stub(IExtensionService, {859extensions: [toExtensionDescription(local)],860onDidChangeExtensions: Event.None,861whenInstalledExtensionsRegistered: () => Promise.resolve(true)862});863864return instantiationService.get(IExtensionsWorkbenchService).queryLocal()865.then(extensions => {866const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));867testObject.extension = extensions[0];868assert.ok(testObject.enabled);869});870});871872test('Test DisableGloballyAction when extension is installed and enabled', () => {873const local = aLocalExtension('a');874instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);875instantiationService.stub(IExtensionService, {876extensions: [toExtensionDescription(local)],877onDidChangeExtensions: Event.None,878whenInstalledExtensionsRegistered: () => Promise.resolve(true)879});880881return instantiationService.get(IExtensionsWorkbenchService).queryLocal()882.then(extensions => {883const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));884testObject.extension = extensions[0];885assert.ok(testObject.enabled);886});887});888889test('Test DisableGloballyAction when extension is installed and disabled globally', () => {890const local = aLocalExtension('a');891instantiationService.stub(IExtensionService, {892extensions: [toExtensionDescription(local)],893onDidChangeExtensions: Event.None,894whenInstalledExtensionsRegistered: () => Promise.resolve(true)895});896897return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)898.then(() => {899instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);900901return instantiationService.get(IExtensionsWorkbenchService).queryLocal()902.then(extensions => {903const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));904testObject.extension = extensions[0];905assert.ok(!testObject.enabled);906});907});908});909910test('Test DisableGloballyAction when extension is uninstalled', () => {911const gallery = aGalleryExtension('a');912instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));913instantiationService.stub(IExtensionService, {914extensions: [toExtensionDescription(aLocalExtension('a'))],915onDidChangeExtensions: Event.None,916whenInstalledExtensionsRegistered: () => Promise.resolve(true)917});918919return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)920.then(page => {921const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));922testObject.extension = page.firstPage[0];923assert.ok(!testObject.enabled);924});925});926927test('Test DisableGloballyAction when extension is installing', () => {928const gallery = aGalleryExtension('a');929instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));930instantiationService.stub(IExtensionService, {931extensions: [toExtensionDescription(aLocalExtension('a'))],932onDidChangeExtensions: Event.None,933whenInstalledExtensionsRegistered: () => Promise.resolve(true)934});935936return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)937.then(page => {938const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));939testObject.extension = page.firstPage[0];940disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));941installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });942assert.ok(!testObject.enabled);943});944});945946test('Test DisableGloballyAction when extension is uninstalling', () => {947const local = aLocalExtension('a');948instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);949instantiationService.stub(IExtensionService, {950extensions: [toExtensionDescription(local)],951onDidChangeExtensions: Event.None,952whenInstalledExtensionsRegistered: () => Promise.resolve(true)953});954955return instantiationService.get(IExtensionsWorkbenchService).queryLocal()956.then(extensions => {957const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));958testObject.extension = extensions[0];959disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));960uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });961assert.ok(!testObject.enabled);962});963});964965});966967suite('ExtensionRuntimeStateAction', () => {968969const disposables = ensureNoDisposablesAreLeakedInTestSuite();970971setup(() => setupTest(disposables));972973test('Test Runtime State when there is no extension', () => {974const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));975disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));976977assert.ok(!testObject.enabled);978});979980test('Test Runtime State when extension state is installing', async () => {981const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));982disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));983const workbenchService = instantiationService.get(IExtensionsWorkbenchService);984const gallery = aGalleryExtension('a');985instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));986const paged = await workbenchService.queryGallery(CancellationToken.None);987testObject.extension = paged.firstPage[0];988installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });989990assert.ok(!testObject.enabled);991});992993test('Test Runtime State when extension state is uninstalling', async () => {994const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));995disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));996const local = aLocalExtension('a');997instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);998999const extensions = await instantiationService.get(IExtensionsWorkbenchService).queryLocal();1000testObject.extension = extensions[0];1001uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });1002assert.ok(!testObject.enabled);1003});10041005test('Test Runtime State when extension is newly installed', async () => {1006const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1007instantiationService.stub(IExtensionService, {1008extensions: [toExtensionDescription(aLocalExtension('b'))],1009onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1010canAddExtension: (extension) => false,1011whenInstalledExtensionsRegistered: () => Promise.resolve(true)1012});1013const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1014disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1015const gallery = aGalleryExtension('a');1016instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));10171018const paged = await instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);1019testObject.extension = paged.firstPage[0];1020assert.ok(!testObject.enabled);10211022installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });1023const promise = Event.toPromise(testObject.onDidChange);1024didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery), profileLocation: null! }]);1025await promise;1026assert.ok(testObject.enabled);1027assert.strictEqual(testObject.tooltip, `Please restart extensions to enable this extension.`);1028});10291030test('Test Runtime State when extension is newly installed and ext host restart is not required', async () => {1031const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1032instantiationService.stub(IExtensionService, {1033extensions: [toExtensionDescription(aLocalExtension('b'))],1034onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1035canAddExtension: (extension) => true,1036whenInstalledExtensionsRegistered: () => Promise.resolve(true)1037});1038instantiationService.set(IExtensionsWorkbenchService, disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService)));1039const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1040disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1041const gallery = aGalleryExtension('a');1042instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));10431044const paged = await instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);1045testObject.extension = paged.firstPage[0];1046assert.ok(!testObject.enabled);10471048installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });1049didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery), profileLocation: null! }]);1050assert.ok(!testObject.enabled);1051});10521053test('Test Runtime State when extension is installed and uninstalled', async () => {1054instantiationService.stub(IExtensionService, {1055extensions: [toExtensionDescription(aLocalExtension('b'))],1056onDidChangeExtensions: Event.None,1057canRemoveExtension: (extension) => false,1058canAddExtension: (extension) => false,1059whenInstalledExtensionsRegistered: () => Promise.resolve(true)1060});1061const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1062disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1063const gallery = aGalleryExtension('a');1064instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));1065const paged = await instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);10661067testObject.extension = paged.firstPage[0];1068const identifier = gallery.identifier;1069installEvent.fire({ identifier, source: gallery, profileLocation: null! });1070didInstallEvent.fire([{ identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, { identifier }), profileLocation: null! }]);1071uninstallEvent.fire({ identifier, profileLocation: null! });1072didUninstallEvent.fire({ identifier, profileLocation: null! });10731074assert.ok(!testObject.enabled);1075});10761077test('Test Runtime State when extension is uninstalled', async () => {1078instantiationService.stub(IExtensionService, {1079extensions: [toExtensionDescription(aLocalExtension('a', { version: '1.0.0' }))],1080onDidChangeExtensions: Event.None,1081canRemoveExtension: (extension) => false,1082canAddExtension: (extension) => false,1083whenInstalledExtensionsRegistered: () => Promise.resolve(true)1084});1085instantiationService.set(IExtensionsWorkbenchService, disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService)));1086const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1087disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1088const local = aLocalExtension('a');1089instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1090const extensions = await instantiationService.get(IExtensionsWorkbenchService).queryLocal();1091testObject.extension = extensions[0];10921093uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });1094didUninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });1095assert.ok(testObject.enabled);1096assert.strictEqual(testObject.tooltip, `Please restart extensions to complete the uninstallation of this extension.`);1097});10981099test('Test Runtime State when extension is uninstalled and can be removed', async () => {1100const local = aLocalExtension('a');1101instantiationService.stub(IExtensionService, {1102extensions: [toExtensionDescription(local)],1103onDidChangeExtensions: Event.None,1104canRemoveExtension: (extension) => true,1105canAddExtension: (extension) => true,1106whenInstalledExtensionsRegistered: () => Promise.resolve(true)1107});1108const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1109disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1110instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1111const extensions = await instantiationService.get(IExtensionsWorkbenchService).queryLocal();1112testObject.extension = extensions[0];11131114uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });1115didUninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });1116assert.ok(!testObject.enabled);1117});11181119test('Test Runtime State when extension is uninstalled and installed', async () => {1120instantiationService.stub(IExtensionService, {1121extensions: [toExtensionDescription(aLocalExtension('a', { version: '1.0.0' }))],1122onDidChangeExtensions: Event.None,1123canRemoveExtension: (extension) => false,1124canAddExtension: (extension) => false,1125whenInstalledExtensionsRegistered: () => Promise.resolve(true)1126});1127instantiationService.set(IExtensionsWorkbenchService, disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService)));1128const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1129disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1130const local = aLocalExtension('a');1131instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1132const extensions = await instantiationService.get(IExtensionsWorkbenchService).queryLocal();11331134testObject.extension = extensions[0];1135uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });1136didUninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });11371138const gallery = aGalleryExtension('a');1139const identifier = gallery.identifier;1140installEvent.fire({ identifier, source: gallery, profileLocation: null! });1141didInstallEvent.fire([{ identifier, source: gallery, operation: InstallOperation.Install, local, profileLocation: null! }]);11421143assert.ok(!testObject.enabled);1144});11451146test('Test Runtime State when extension is updated while running', async () => {1147instantiationService.stub(IExtensionService, {1148extensions: [toExtensionDescription(aLocalExtension('a', { version: '1.0.1' }))],1149onDidChangeExtensions: Event.None,1150canRemoveExtension: (extension) => true,1151canAddExtension: (extension) => false,1152whenInstalledExtensionsRegistered: () => Promise.resolve(true)1153});1154instantiationService.set(IExtensionsWorkbenchService, disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService)));1155const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1156disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1157const local = aLocalExtension('a', { version: '1.0.1' });1158const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1159instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1160const extensions = await workbenchService.queryLocal();1161testObject.extension = extensions[0];11621163return new Promise<void>(c => {1164disposables.add(testObject.onDidChange(() => {1165if (testObject.enabled && testObject.tooltip === `Please restart extensions to enable the updated extension.`) {1166c();1167}1168}));1169const gallery = aGalleryExtension('a', { uuid: local.identifier.id, version: '1.0.2' });1170installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });1171didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery), profileLocation: null! }]);1172});1173});11741175test('Test Runtime State when extension is updated when not running', async () => {1176instantiationService.stub(IExtensionService, {1177extensions: [toExtensionDescription(aLocalExtension('b'))],1178onDidChangeExtensions: Event.None,1179canRemoveExtension: (extension) => false,1180canAddExtension: (extension) => false,1181whenInstalledExtensionsRegistered: () => Promise.resolve(true)1182});1183const local = aLocalExtension('a', { version: '1.0.1' });1184await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally);1185const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1186disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1187const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1188instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1189const extensions = await workbenchService.queryLocal();1190testObject.extension = extensions[0];11911192const gallery = aGalleryExtension('a', { identifier: local.identifier, version: '1.0.2' });1193installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });1194didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Update, local: aLocalExtension('a', gallery, gallery), profileLocation: null! }]);11951196assert.ok(!testObject.enabled);1197});11981199test('Test Runtime State when extension is disabled when running', async () => {1200instantiationService.stub(IExtensionService, {1201extensions: [toExtensionDescription(aLocalExtension('a'))],1202onDidChangeExtensions: Event.None,1203canRemoveExtension: (extension) => false,1204canAddExtension: (extension) => false,1205whenInstalledExtensionsRegistered: () => Promise.resolve(true)1206});1207instantiationService.set(IExtensionsWorkbenchService, disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService)));1208const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1209disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1210const local = aLocalExtension('a');1211const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1212instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1213const extensions = await workbenchService.queryLocal();1214testObject.extension = extensions[0];1215await workbenchService.setEnablement(extensions[0], EnablementState.DisabledGlobally);1216await testObject.update();12171218assert.ok(testObject.enabled);1219assert.strictEqual(`Please restart extensions to disable this extension.`, testObject.tooltip);1220});12211222test('Test Runtime State when extension enablement is toggled when running', async () => {1223instantiationService.stub(IExtensionService, {1224extensions: [toExtensionDescription(aLocalExtension('a', { version: '1.0.0' }))],1225onDidChangeExtensions: Event.None,1226canRemoveExtension: (extension) => false,1227canAddExtension: (extension) => false,1228whenInstalledExtensionsRegistered: () => Promise.resolve(true)1229});1230instantiationService.set(IExtensionsWorkbenchService, disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService)));1231const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1232disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1233const local = aLocalExtension('a');1234const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1235instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1236const extensions = await workbenchService.queryLocal();1237testObject.extension = extensions[0];1238await workbenchService.setEnablement(extensions[0], EnablementState.DisabledGlobally);1239await workbenchService.setEnablement(extensions[0], EnablementState.EnabledGlobally);1240assert.ok(!testObject.enabled);1241});12421243test('Test Runtime State when extension is enabled when not running', async () => {1244instantiationService.stub(IExtensionService, {1245extensions: [toExtensionDescription(aLocalExtension('b'))],1246onDidChangeExtensions: Event.None,1247canRemoveExtension: (extension) => false,1248canAddExtension: (extension) => false,1249whenInstalledExtensionsRegistered: () => Promise.resolve(true)1250});1251const local = aLocalExtension('a');1252await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally);1253const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1254disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1255const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1256instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1257const extensions = await workbenchService.queryLocal();1258testObject.extension = extensions[0];1259await workbenchService.setEnablement(extensions[0], EnablementState.EnabledGlobally);1260await testObject.update();1261assert.ok(testObject.enabled);1262assert.strictEqual(`Please restart extensions to enable this extension.`, testObject.tooltip);1263});12641265test('Test Runtime State when extension enablement is toggled when not running', async () => {1266instantiationService.stub(IExtensionService, {1267extensions: [toExtensionDescription(aLocalExtension('b'))],1268onDidChangeExtensions: Event.None,1269canRemoveExtension: (extension) => false,1270canAddExtension: (extension) => false,1271whenInstalledExtensionsRegistered: () => Promise.resolve(true)1272});1273const local = aLocalExtension('a');1274await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally);1275const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1276disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1277const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1278instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1279const extensions = await workbenchService.queryLocal();1280testObject.extension = extensions[0];1281await workbenchService.setEnablement(extensions[0], EnablementState.EnabledGlobally);1282await workbenchService.setEnablement(extensions[0], EnablementState.DisabledGlobally);1283assert.ok(!testObject.enabled);1284});12851286test('Test Runtime State when extension is updated when not running and enabled', async () => {1287instantiationService.stub(IExtensionService, {1288extensions: [toExtensionDescription(aLocalExtension('a'))],1289onDidChangeExtensions: Event.None,1290canRemoveExtension: (extension) => false,1291canAddExtension: (extension) => false,1292whenInstalledExtensionsRegistered: () => Promise.resolve(true)1293});1294const local = aLocalExtension('a', { version: '1.0.1' });1295await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally);1296const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1297disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1298const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1299instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1300const extensions = await workbenchService.queryLocal();1301testObject.extension = extensions[0];13021303const gallery = aGalleryExtension('a', { identifier: local.identifier, version: '1.0.2' });1304installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });1305didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery), profileLocation: null! }]);1306await workbenchService.setEnablement(extensions[0], EnablementState.EnabledGlobally);1307await testObject.update();1308assert.ok(testObject.enabled);1309assert.strictEqual(`Please restart extensions to enable this extension.`, testObject.tooltip);1310});13111312test('Test Runtime State when a localization extension is newly installed', async () => {1313instantiationService.stub(IExtensionService, {1314extensions: [toExtensionDescription(aLocalExtension('b'))],1315onDidChangeExtensions: Event.None,1316canRemoveExtension: (extension) => false,1317canAddExtension: (extension) => false,1318whenInstalledExtensionsRegistered: () => Promise.resolve(true)1319});1320const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1321disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1322const gallery = aGalleryExtension('a');1323instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));13241325const paged = await instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);1326testObject.extension = paged.firstPage[0];1327assert.ok(!testObject.enabled);13281329installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });1330didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', { ...gallery, ...{ contributes: <IExtensionContributions>{ localizations: [{ languageId: 'de', translations: [] }] } } }, gallery), profileLocation: null! }]);1331assert.ok(!testObject.enabled);1332});13331334test('Test Runtime State when a localization extension is updated while running', async () => {1335instantiationService.stub(IExtensionService, {1336extensions: [toExtensionDescription(aLocalExtension('a', { version: '1.0.1' }))],1337onDidChangeExtensions: Event.None,1338canRemoveExtension: (extension) => false,1339canAddExtension: (extension) => false,1340whenInstalledExtensionsRegistered: () => Promise.resolve(true)1341});1342const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1343disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1344const local = aLocalExtension('a', { version: '1.0.1', contributes: <IExtensionContributions>{ localizations: [{ languageId: 'de', translations: [] }] } });1345const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1346instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1347const extensions = await workbenchService.queryLocal();1348testObject.extension = extensions[0];13491350const gallery = aGalleryExtension('a', { uuid: local.identifier.id, version: '1.0.2' });1351installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });1352didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', { ...gallery, ...{ contributes: <IExtensionContributions>{ localizations: [{ languageId: 'de', translations: [] }] } } }, gallery), profileLocation: null! }]);1353assert.ok(!testObject.enabled);1354});13551356test('Test Runtime State when extension is not installed but extension from different server is installed and running', async () => {1357// multi server setup1358const gallery = aGalleryExtension('a');1359const localExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file('pub.a') });1360const remoteExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1361const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([remoteExtension]));1362instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1363instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1364const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1365instantiationService.stub(IExtensionService, {1366extensions: [toExtensionDescription(remoteExtension)],1367onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1368canAddExtension: (extension) => false,1369whenInstalledExtensionsRegistered: () => Promise.resolve(true)1370});1371const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1372instantiationService.set(IExtensionsWorkbenchService, workbenchService);13731374const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1375disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1376instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));13771378await workbenchService.queryGallery(CancellationToken.None);1379const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1380testObject.extension = extensions[0];1381assert.ok(testObject.extension);1382assert.ok(!testObject.enabled);1383});13841385test('Test Runtime State when extension is uninstalled but extension from different server is installed and running', async () => {1386// multi server setup1387const gallery = aGalleryExtension('a');1388const localExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file('pub.a') });1389const remoteExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1390const localExtensionManagementService = createExtensionManagementService([localExtension]);1391const uninstallEvent = new Emitter<UninstallExtensionEvent>();1392const onDidUninstallEvent = new Emitter<{ identifier: IExtensionIdentifier; profileLocation: URI }>();1393localExtensionManagementService.onUninstallExtension = uninstallEvent.event;1394localExtensionManagementService.onDidUninstallExtension = onDidUninstallEvent.event;1395const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, localExtensionManagementService, createExtensionManagementService([remoteExtension]));1396instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1397instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1398const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1399instantiationService.stub(IExtensionService, {1400extensions: [toExtensionDescription(remoteExtension)],1401onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1402canAddExtension: (extension) => false,1403whenInstalledExtensionsRegistered: () => Promise.resolve(true)1404});1405const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1406instantiationService.set(IExtensionsWorkbenchService, workbenchService);14071408const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1409disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1410instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));14111412await workbenchService.queryGallery(CancellationToken.None);1413const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1414testObject.extension = extensions[0];1415assert.ok(testObject.extension);1416assert.ok(!testObject.enabled);14171418uninstallEvent.fire({ identifier: localExtension.identifier, profileLocation: null! });1419didUninstallEvent.fire({ identifier: localExtension.identifier, profileLocation: null! });14201421assert.ok(!testObject.enabled);1422});14231424test('Test Runtime State when workspace extension is disabled on local server and installed in remote server', async () => {1425// multi server setup1426const gallery = aGalleryExtension('a');1427const remoteExtensionManagementService = createExtensionManagementService([]);1428const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();1429remoteExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;1430const localExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file('pub.a') });1431const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), remoteExtensionManagementService);1432instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1433instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1434const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1435instantiationService.set(IExtensionsWorkbenchService, workbenchService);14361437const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1438instantiationService.stub(IExtensionService, {1439extensions: [],1440onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1441canAddExtension: (extension) => false,1442whenInstalledExtensionsRegistered: () => Promise.resolve(true)1443});1444const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1445disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1446instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));14471448await workbenchService.queryGallery(CancellationToken.None);1449const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1450testObject.extension = extensions[0];1451assert.ok(testObject.extension);1452assert.ok(!testObject.enabled);14531454const remoteExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1455const promise = Event.toPromise(testObject.onDidChange);1456onDidInstallEvent.fire([{ identifier: remoteExtension.identifier, local: remoteExtension, operation: InstallOperation.Install, profileLocation: null! }]);14571458await promise;1459assert.ok(testObject.enabled);1460assert.strictEqual(testObject.tooltip, `Please reload window to enable this extension.`);1461});14621463test('Test Runtime State when ui extension is disabled on remote server and installed in local server', async () => {1464// multi server setup1465const gallery = aGalleryExtension('a');1466const localExtensionManagementService = createExtensionManagementService([]);1467const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();1468localExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;1469const remoteExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1470const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, localExtensionManagementService, createExtensionManagementService([remoteExtension]));1471instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1472instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1473const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1474instantiationService.set(IExtensionsWorkbenchService, workbenchService);14751476const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1477instantiationService.stub(IExtensionService, {1478extensions: [],1479onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1480canAddExtension: (extension) => false,1481whenInstalledExtensionsRegistered: () => Promise.resolve(true)1482});1483const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1484disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1485instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));14861487await workbenchService.queryGallery(CancellationToken.None);1488const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);1489testObject.extension = extensions[0];1490assert.ok(testObject.extension);1491assert.ok(!testObject.enabled);14921493const localExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file('pub.a') });1494const promise = Event.toPromise(Event.filter(testObject.onDidChange, () => testObject.enabled));1495onDidInstallEvent.fire([{ identifier: localExtension.identifier, local: localExtension, operation: InstallOperation.Install, profileLocation: null! }]);14961497await promise;1498assert.ok(testObject.enabled);1499assert.strictEqual(testObject.tooltip, `Please reload window to enable this extension.`);1500});15011502test('Test Runtime State for remote ui extension is disabled when it is installed and enabled in local server', async () => {1503// multi server setup1504const gallery = aGalleryExtension('a');1505const localExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file('pub.a') });1506const localExtensionManagementService = createExtensionManagementService([localExtension]);1507const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();1508localExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;1509const remoteExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1510const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, localExtensionManagementService, createExtensionManagementService([remoteExtension]));1511instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1512instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1513const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1514instantiationService.stub(IExtensionService, {1515extensions: [toExtensionDescription(localExtension)],1516onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1517canAddExtension: (extension) => false,1518whenInstalledExtensionsRegistered: () => Promise.resolve(true)1519});1520const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1521instantiationService.set(IExtensionsWorkbenchService, workbenchService);15221523const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1524disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1525instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));15261527await workbenchService.queryGallery(CancellationToken.None);1528const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);1529testObject.extension = extensions[0];1530assert.ok(testObject.extension);1531assert.ok(!testObject.enabled);1532});15331534test('Test Runtime State for remote workspace+ui extension is enabled when it is installed and enabled in local server', async () => {1535// multi server setup1536const gallery = aGalleryExtension('a');1537const localExtension = aLocalExtension('a', { extensionKind: ['workspace', 'ui'] }, { location: URI.file('pub.a') });1538const localExtensionManagementService = createExtensionManagementService([localExtension]);1539const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();1540localExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;1541const remoteExtension = aLocalExtension('a', { extensionKind: ['workspace', 'ui'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1542const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, localExtensionManagementService, createExtensionManagementService([remoteExtension]));1543instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1544instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1545const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1546instantiationService.set(IExtensionsWorkbenchService, workbenchService);15471548const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1549instantiationService.stub(IExtensionService, {1550extensions: [toExtensionDescription(localExtension)],1551onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1552canAddExtension: (extension) => false,1553whenInstalledExtensionsRegistered: () => Promise.resolve(true)1554});1555const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1556disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1557instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));15581559await workbenchService.queryGallery(CancellationToken.None);1560const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);1561testObject.extension = extensions[0];1562assert.ok(testObject.extension);1563assert.ok(testObject.enabled);1564});15651566test('Test Runtime State for local ui+workspace extension is enabled when it is installed and enabled in remote server', async () => {1567// multi server setup1568const gallery = aGalleryExtension('a');1569const localExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'] }, { location: URI.file('pub.a') });1570const remoteExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1571const remoteExtensionManagementService = createExtensionManagementService([remoteExtension]);1572const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();1573remoteExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;1574const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), remoteExtensionManagementService);1575instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1576instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1577const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1578instantiationService.set(IExtensionsWorkbenchService, workbenchService);15791580const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1581instantiationService.stub(IExtensionService, {1582extensions: [toExtensionDescription(remoteExtension)],1583onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1584canAddExtension: (extension) => false,1585whenInstalledExtensionsRegistered: () => Promise.resolve(true)1586});1587const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1588disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1589instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));15901591await workbenchService.queryGallery(CancellationToken.None);1592const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1593testObject.extension = extensions[0];1594assert.ok(testObject.extension);1595assert.ok(testObject.enabled);1596});15971598test('Test Runtime State for local workspace+ui extension is enabled when it is installed in both servers but running in local server', async () => {1599// multi server setup1600const gallery = aGalleryExtension('a');1601const localExtension = aLocalExtension('a', { extensionKind: ['workspace', 'ui'] }, { location: URI.file('pub.a') });1602const localExtensionManagementService = createExtensionManagementService([localExtension]);1603const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();1604localExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;1605const remoteExtension = aLocalExtension('a', { extensionKind: ['workspace', 'ui'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1606const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, localExtensionManagementService, createExtensionManagementService([remoteExtension]));1607instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1608instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1609const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1610instantiationService.set(IExtensionsWorkbenchService, workbenchService);16111612const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1613instantiationService.stub(IExtensionService, {1614extensions: [toExtensionDescription(localExtension)],1615onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1616canAddExtension: (extension) => false,1617whenInstalledExtensionsRegistered: () => Promise.resolve(true)1618});1619const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1620disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1621instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));16221623await workbenchService.queryGallery(CancellationToken.None);1624const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1625testObject.extension = extensions[0];1626assert.ok(testObject.extension);1627assert.ok(testObject.enabled);1628});16291630test('Test Runtime State for remote ui+workspace extension is enabled when it is installed on both servers but running in remote server', async () => {1631// multi server setup1632const gallery = aGalleryExtension('a');1633const localExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'] }, { location: URI.file('pub.a') });1634const remoteExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1635const remoteExtensionManagementService = createExtensionManagementService([remoteExtension]);1636const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();1637remoteExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;1638const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), remoteExtensionManagementService);1639instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1640instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1641const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1642instantiationService.set(IExtensionsWorkbenchService, workbenchService);16431644const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1645instantiationService.stub(IExtensionService, {1646extensions: [toExtensionDescription(remoteExtension)],1647onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1648canAddExtension: (extension) => false,1649whenInstalledExtensionsRegistered: () => Promise.resolve(true)1650});1651const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1652disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1653instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));16541655await workbenchService.queryGallery(CancellationToken.None);1656const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);1657testObject.extension = extensions[0];1658assert.ok(testObject.extension);1659assert.ok(testObject.enabled);1660});16611662test('Test Runtime State when ui+workspace+web extension is installed in web and remote and running in remote', async () => {1663// multi server setup1664const gallery = aGalleryExtension('a');1665const webExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'], 'browser': 'browser.js' }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeUserData }) });1666const remoteExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'], 'browser': 'browser.js' }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1667const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, null, createExtensionManagementService([remoteExtension]), createExtensionManagementService([webExtension]));1668instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1669instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1670instantiationService.stub(IExtensionService, {1671extensions: [toExtensionDescription(remoteExtension)],1672onDidChangeExtensions: Event.None,1673canAddExtension: (extension) => false,1674whenInstalledExtensionsRegistered: () => Promise.resolve(true)1675});1676const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1677instantiationService.set(IExtensionsWorkbenchService, workbenchService);16781679const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1680disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1681instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));16821683await workbenchService.queryGallery(CancellationToken.None);1684const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);1685testObject.extension = extensions[0];1686assert.ok(testObject.extension);1687assert.ok(!testObject.enabled);1688});16891690test('Test Runtime State when workspace+ui+web extension is installed in web and local and running in local', async () => {1691// multi server setup1692const gallery = aGalleryExtension('a');1693const webExtension = aLocalExtension('a', { extensionKind: ['workspace', 'ui'], 'browser': 'browser.js' }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeUserData }) });1694const localExtension = aLocalExtension('a', { extensionKind: ['workspace', 'ui'], 'browser': 'browser.js' }, { location: URI.file('pub.a') });1695const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), null, createExtensionManagementService([webExtension]));1696instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1697instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1698instantiationService.stub(IExtensionService, {1699extensions: [toExtensionDescription(localExtension)],1700onDidChangeExtensions: Event.None,1701canAddExtension: (extension) => false,1702whenInstalledExtensionsRegistered: () => Promise.resolve(true)1703});1704const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1705instantiationService.set(IExtensionsWorkbenchService, workbenchService);17061707const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1708disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1709instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));17101711await workbenchService.queryGallery(CancellationToken.None);1712const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);1713testObject.extension = extensions[0];1714assert.ok(testObject.extension);1715assert.ok(!testObject.enabled);1716});1717});17181719suite('RemoteInstallAction', () => {17201721const disposables = ensureNoDisposablesAreLeakedInTestSuite();17221723setup(() => setupTest(disposables));17241725test('Test remote install action is enabled for local workspace extension', async () => {1726// multi server setup1727const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });1728const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]));1729instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1730instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1731const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1732instantiationService.set(IExtensionsWorkbenchService, workbenchService);17331734instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1735const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1736disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));17371738const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1739await workbenchService.queryGallery(CancellationToken.None);1740testObject.extension = extensions[0];1741assert.ok(testObject.enabled);1742assert.strictEqual('Install in remote', testObject.label);1743assert.strictEqual('extension-action label prominent install-other-server', testObject.class);1744});17451746test('Test remote install action when installing local workspace extension', async () => {1747// multi server setup1748const remoteExtensionManagementService = createExtensionManagementService();1749const onInstallExtension = new Emitter<InstallExtensionEvent>();1750remoteExtensionManagementService.onInstallExtension = onInstallExtension.event;1751const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });1752const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]), remoteExtensionManagementService);1753instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1754instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1755const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1756instantiationService.stub(IExtensionsWorkbenchService, workbenchService, 'open', undefined);1757instantiationService.set(IExtensionsWorkbenchService, workbenchService);17581759const gallery = aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier });1760instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));1761const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1762disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));17631764const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1765await workbenchService.queryGallery(CancellationToken.None);1766testObject.extension = extensions[0];1767assert.ok(testObject.enabled);1768assert.strictEqual('Install in remote', testObject.label);1769assert.strictEqual('extension-action label prominent install-other-server', testObject.class);17701771onInstallExtension.fire({ identifier: localWorkspaceExtension.identifier, source: gallery, profileLocation: null! });1772assert.ok(testObject.enabled);1773assert.strictEqual('Installing', testObject.label);1774assert.strictEqual('extension-action label install-other-server installing', testObject.class);1775});17761777test('Test remote install action when installing local workspace extension is finished', async () => {1778// multi server setup1779const remoteExtensionManagementService = createExtensionManagementService();1780const onInstallExtension = new Emitter<InstallExtensionEvent>();1781remoteExtensionManagementService.onInstallExtension = onInstallExtension.event;1782const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();1783remoteExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;1784const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });1785const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]), remoteExtensionManagementService);1786instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1787instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1788const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1789instantiationService.stub(IExtensionsWorkbenchService, workbenchService, 'open', undefined);1790instantiationService.set(IExtensionsWorkbenchService, workbenchService);17911792const gallery = aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier });1793instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));1794const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1795disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));17961797const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1798await workbenchService.queryGallery(CancellationToken.None);1799testObject.extension = extensions[0];1800assert.ok(testObject.enabled);1801assert.strictEqual('Install in remote', testObject.label);1802assert.strictEqual('extension-action label prominent install-other-server', testObject.class);18031804onInstallExtension.fire({ identifier: localWorkspaceExtension.identifier, source: gallery, profileLocation: null! });1805assert.ok(testObject.enabled);1806assert.strictEqual('Installing', testObject.label);1807assert.strictEqual('extension-action label install-other-server installing', testObject.class);18081809const installedExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });1810const promise = Event.toPromise(testObject.onDidChange);1811onDidInstallEvent.fire([{ identifier: installedExtension.identifier, local: installedExtension, operation: InstallOperation.Install, profileLocation: null! }]);1812await promise;1813assert.ok(!testObject.enabled);1814});18151816test('Test remote install action is enabled for disabled local workspace extension', async () => {1817// multi server setup1818const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });1819const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]));1820instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1821instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1822const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1823instantiationService.set(IExtensionsWorkbenchService, workbenchService);18241825const remoteWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });1826await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([remoteWorkspaceExtension], EnablementState.DisabledGlobally);1827instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1828const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1829disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));18301831const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1832await workbenchService.queryGallery(CancellationToken.None);1833testObject.extension = extensions[0];1834assert.ok(testObject.enabled);1835assert.strictEqual('Install in remote', testObject.label);1836assert.strictEqual('extension-action label prominent install-other-server', testObject.class);1837});18381839test('Test remote install action is enabled local workspace+ui extension', async () => {1840// multi server setup1841const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace', 'ui'] }, { location: URI.file(`pub.a`) });1842const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]));1843instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1844instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1845const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1846instantiationService.set(IExtensionsWorkbenchService, workbenchService);18471848await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([localWorkspaceExtension], EnablementState.DisabledGlobally);1849instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1850const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1851disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));18521853const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1854await workbenchService.queryGallery(CancellationToken.None);1855testObject.extension = extensions[0];1856assert.ok(testObject.enabled);1857assert.strictEqual('Install in remote', testObject.label);1858assert.strictEqual('extension-action label prominent install-other-server', testObject.class);1859});18601861test('Test remote install action is enabled for local ui+workapace extension if can install is true', async () => {1862// multi server setup1863const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'] }, { location: URI.file(`pub.a`) });1864const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]));1865instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1866instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1867const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1868instantiationService.set(IExtensionsWorkbenchService, workbenchService);18691870await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([localWorkspaceExtension], EnablementState.DisabledGlobally);1871instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1872const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, true));1873disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));18741875const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1876await workbenchService.queryGallery(CancellationToken.None);1877testObject.extension = extensions[0];1878assert.ok(testObject.enabled);1879assert.strictEqual('Install in remote', testObject.label);1880assert.strictEqual('extension-action label prominent install-other-server', testObject.class);1881});18821883test('Test remote install action is disabled for local ui+workapace extension if can install is false', async () => {1884// multi server setup1885const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'] }, { location: URI.file(`pub.a`) });1886const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]));1887instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1888instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1889const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1890instantiationService.set(IExtensionsWorkbenchService, workbenchService);18911892await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([localWorkspaceExtension], EnablementState.DisabledGlobally);1893instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1894const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1895disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));18961897const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1898await workbenchService.queryGallery(CancellationToken.None);1899testObject.extension = extensions[0];1900assert.ok(!testObject.enabled);1901});19021903test('Test remote install action is disabled when extension is not set', async () => {1904// multi server setup1905const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });1906const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]));1907instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1908const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1909instantiationService.set(IExtensionsWorkbenchService, workbenchService);19101911instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1912const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1913disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));19141915await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1916await workbenchService.queryGallery(CancellationToken.None);1917assert.ok(!testObject.enabled);1918});19191920test('Test remote install action is disabled for extension which is not installed', async () => {1921// multi server setup1922const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService);1923instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1924instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1925const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1926instantiationService.set(IExtensionsWorkbenchService, workbenchService);19271928instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a')));1929const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1930disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));19311932const pager = await workbenchService.queryGallery(CancellationToken.None);1933testObject.extension = pager.firstPage[0];1934assert.ok(testObject.extension);1935assert.ok(!testObject.enabled);1936});19371938test('Test remote install action is disabled for local workspace extension which is disabled in env', async () => {1939// multi server setup1940const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });1941const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]));1942const environmentService = { disableExtensions: true } as INativeWorkbenchEnvironmentService;1943instantiationService.stub(IEnvironmentService, environmentService);1944instantiationService.stub(INativeEnvironmentService, environmentService);1945instantiationService.stub(IWorkbenchEnvironmentService, environmentService);1946instantiationService.stub(INativeWorkbenchEnvironmentService, environmentService);1947instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1948instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1949const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1950instantiationService.set(IExtensionsWorkbenchService, workbenchService);19511952instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1953const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1954disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));19551956const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1957await workbenchService.queryGallery(CancellationToken.None);1958testObject.extension = extensions[0];1959assert.ok(testObject.extension);1960assert.ok(!testObject.enabled);1961});19621963test('Test remote install action is disabled when remote server is not available', async () => {1964// single server setup1965const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1966const extensionManagementServerService = instantiationService.get(IExtensionManagementServerService);1967const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });1968instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [localWorkspaceExtension]);1969instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1970const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1971disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));19721973const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1974await workbenchService.queryGallery(CancellationToken.None);1975testObject.extension = extensions[0];1976assert.ok(testObject.extension);1977assert.ok(!testObject.enabled);1978});19791980test('Test remote install action is disabled for local workspace extension if it is uninstalled locally', async () => {1981// multi server setup1982const extensionManagementService = instantiationService.get(IExtensionManagementService) as IProfileAwareExtensionManagementService;1983const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, extensionManagementService);1984instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1985instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1986const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });1987instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [localWorkspaceExtension]);1988const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1989instantiationService.set(IExtensionsWorkbenchService, workbenchService);19901991instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1992const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1993disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));19941995const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1996await workbenchService.queryGallery(CancellationToken.None);1997testObject.extension = extensions[0];1998assert.ok(testObject.enabled);1999assert.strictEqual('Install in remote', testObject.label);20002001uninstallEvent.fire({ identifier: localWorkspaceExtension.identifier, profileLocation: null! });2002assert.ok(!testObject.enabled);2003});20042005test('Test remote install action is disabled for local workspace extension if it is installed in remote', async () => {2006// multi server setup2007const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });2008const remoteWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2009const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]), createExtensionManagementService([remoteWorkspaceExtension]));2010instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2011instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2012const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2013instantiationService.set(IExtensionsWorkbenchService, workbenchService);20142015instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));2016const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));2017disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));20182019const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);2020await workbenchService.queryGallery(CancellationToken.None);2021testObject.extension = extensions[0];2022assert.ok(testObject.extension);2023assert.ok(!testObject.enabled);2024});20252026test('Test remote install action is enabled for local workspace extension if it has not gallery', async () => {2027// multi server setup2028const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });2029const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]));2030instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2031instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2032const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2033instantiationService.set(IExtensionsWorkbenchService, workbenchService);20342035instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));2036const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));2037disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));20382039const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);2040testObject.extension = extensions[0];2041assert.ok(testObject.extension);2042assert.ok(testObject.enabled);2043});20442045test('Test remote install action is disabled for local workspace system extension', async () => {2046// multi server setup2047const localWorkspaceSystemExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`), type: ExtensionType.System });2048const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceSystemExtension]));2049instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2050instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2051const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2052instantiationService.set(IExtensionsWorkbenchService, workbenchService);20532054instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceSystemExtension.identifier })));2055const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));2056disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));20572058const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);2059testObject.extension = extensions[0];2060assert.ok(testObject.extension);2061assert.ok(!testObject.enabled);2062});20632064test('Test remote install action is disabled for local ui extension if it is not installed in remote', async () => {2065// multi server setup2066const localUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });2067const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localUIExtension]));2068instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2069instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2070const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2071instantiationService.set(IExtensionsWorkbenchService, workbenchService);20722073instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localUIExtension.identifier })));2074const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));2075disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));20762077const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);2078testObject.extension = extensions[0];2079assert.ok(testObject.extension);2080assert.ok(!testObject.enabled);2081});20822083test('Test remote install action is disabled for local ui extension if it is also installed in remote', async () => {2084// multi server setup2085const localUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });2086const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2087const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localUIExtension]), createExtensionManagementService([remoteUIExtension]));2088instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2089instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2090const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2091instantiationService.set(IExtensionsWorkbenchService, workbenchService);20922093instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localUIExtension.identifier })));2094const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));2095disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));20962097const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);2098testObject.extension = extensions[0];2099assert.ok(testObject.extension);2100assert.ok(!testObject.enabled);2101});21022103test('Test remote install action is enabled for locally installed language pack extension', async () => {2104// multi server setup2105const languagePackExtension = aLocalExtension('a', { contributes: <IExtensionContributions>{ localizations: [{ languageId: 'de', translations: [] }] } }, { location: URI.file(`pub.a`) });2106const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([languagePackExtension]));2107instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2108instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2109const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2110instantiationService.set(IExtensionsWorkbenchService, workbenchService);21112112instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: languagePackExtension.identifier })));2113const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));2114disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));21152116const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);2117await workbenchService.queryGallery(CancellationToken.None);2118testObject.extension = extensions[0];2119assert.ok(testObject.enabled);2120assert.strictEqual('Install in remote', testObject.label);2121assert.strictEqual('extension-action label prominent install-other-server', testObject.class);2122});21232124test('Test remote install action is disabled if local language pack extension is uninstalled', async () => {2125// multi server setup2126const extensionManagementService = instantiationService.get(IExtensionManagementService) as IProfileAwareExtensionManagementService;2127const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, extensionManagementService);2128instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2129instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2130const languagePackExtension = aLocalExtension('a', { contributes: <IExtensionContributions>{ localizations: [{ languageId: 'de', translations: [] }] } }, { location: URI.file(`pub.a`) });2131instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [languagePackExtension]);2132const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2133instantiationService.set(IExtensionsWorkbenchService, workbenchService);21342135instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: languagePackExtension.identifier })));2136const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));2137disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));21382139const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);2140await workbenchService.queryGallery(CancellationToken.None);2141testObject.extension = extensions[0];2142assert.ok(testObject.enabled);2143assert.strictEqual('Install in remote', testObject.label);21442145uninstallEvent.fire({ identifier: languagePackExtension.identifier, profileLocation: null! });2146assert.ok(!testObject.enabled);2147});2148});21492150suite('LocalInstallAction', () => {21512152const disposables = ensureNoDisposablesAreLeakedInTestSuite();21532154setup(() => setupTest(disposables));21552156test('Test local install action is enabled for remote ui extension', async () => {2157// multi server setup2158const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2159const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteUIExtension]));2160instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2161instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2162const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2163instantiationService.set(IExtensionsWorkbenchService, workbenchService);21642165instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier })));2166const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2167disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));21682169const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2170await workbenchService.queryGallery(CancellationToken.None);2171testObject.extension = extensions[0];2172assert.ok(testObject.enabled);2173assert.strictEqual('Install Locally', testObject.label);2174assert.strictEqual('extension-action label prominent install-other-server', testObject.class);2175});21762177test('Test local install action is enabled for remote ui+workspace extension', async () => {2178// multi server setup2179const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2180const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteUIExtension]));2181instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2182instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2183const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2184instantiationService.set(IExtensionsWorkbenchService, workbenchService);21852186instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier })));2187const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2188disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));21892190const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2191await workbenchService.queryGallery(CancellationToken.None);2192testObject.extension = extensions[0];2193assert.ok(testObject.enabled);2194assert.strictEqual('Install Locally', testObject.label);2195assert.strictEqual('extension-action label prominent install-other-server', testObject.class);2196});21972198test('Test local install action when installing remote ui extension', async () => {2199// multi server setup2200const localExtensionManagementService = createExtensionManagementService();2201const onInstallExtension = new Emitter<InstallExtensionEvent>();2202localExtensionManagementService.onInstallExtension = onInstallExtension.event;2203const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2204const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, localExtensionManagementService, createExtensionManagementService([remoteUIExtension]));2205instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2206instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2207const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2208instantiationService.stub(IExtensionsWorkbenchService, workbenchService, 'open', undefined);2209instantiationService.set(IExtensionsWorkbenchService, workbenchService);22102211const gallery = aGalleryExtension('a', { identifier: remoteUIExtension.identifier });2212instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));2213const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2214disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));22152216const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2217await workbenchService.queryGallery(CancellationToken.None);2218testObject.extension = extensions[0];2219assert.ok(testObject.enabled);2220assert.strictEqual('Install Locally', testObject.label);2221assert.strictEqual('extension-action label prominent install-other-server', testObject.class);22222223onInstallExtension.fire({ identifier: remoteUIExtension.identifier, source: gallery, profileLocation: null! });2224assert.ok(testObject.enabled);2225assert.strictEqual('Installing', testObject.label);2226assert.strictEqual('extension-action label install-other-server installing', testObject.class);2227});22282229test('Test local install action when installing remote ui extension is finished', async () => {2230// multi server setup2231const localExtensionManagementService = createExtensionManagementService();2232const onInstallExtension = new Emitter<InstallExtensionEvent>();2233localExtensionManagementService.onInstallExtension = onInstallExtension.event;2234const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();2235localExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;2236const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2237const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, localExtensionManagementService, createExtensionManagementService([remoteUIExtension]));2238instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2239instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2240const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2241instantiationService.stub(IExtensionsWorkbenchService, workbenchService, 'open', undefined);2242instantiationService.set(IExtensionsWorkbenchService, workbenchService);22432244const gallery = aGalleryExtension('a', { identifier: remoteUIExtension.identifier });2245instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));2246const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2247disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));22482249const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2250await workbenchService.queryGallery(CancellationToken.None);2251testObject.extension = extensions[0];2252assert.ok(testObject.enabled);2253assert.strictEqual('Install Locally', testObject.label);2254assert.strictEqual('extension-action label prominent install-other-server', testObject.class);22552256onInstallExtension.fire({ identifier: remoteUIExtension.identifier, source: gallery, profileLocation: null! });2257assert.ok(testObject.enabled);2258assert.strictEqual('Installing', testObject.label);2259assert.strictEqual('extension-action label install-other-server installing', testObject.class);22602261const installedExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });2262const promise = Event.toPromise(testObject.onDidChange);2263onDidInstallEvent.fire([{ identifier: installedExtension.identifier, local: installedExtension, operation: InstallOperation.Install, profileLocation: null! }]);2264await promise;2265assert.ok(!testObject.enabled);2266});22672268test('Test local install action is enabled for disabled remote ui extension', async () => {2269// multi server setup2270const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2271const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteUIExtension]));2272instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2273instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2274const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2275instantiationService.set(IExtensionsWorkbenchService, workbenchService);22762277const localUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });2278await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([localUIExtension], EnablementState.DisabledGlobally);2279instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier })));2280const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2281disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));22822283const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2284await workbenchService.queryGallery(CancellationToken.None);2285testObject.extension = extensions[0];2286assert.ok(testObject.enabled);2287assert.strictEqual('Install Locally', testObject.label);2288assert.strictEqual('extension-action label prominent install-other-server', testObject.class);2289});22902291test('Test local install action is disabled when extension is not set', async () => {2292// multi server setup2293const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2294const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteUIExtension]));2295instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2296const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2297instantiationService.set(IExtensionsWorkbenchService, workbenchService);22982299instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier })));2300const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2301disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));23022303await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2304await workbenchService.queryGallery(CancellationToken.None);2305assert.ok(!testObject.enabled);2306});23072308test('Test local install action is disabled for extension which is not installed', async () => {2309// multi server setup2310const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService);2311instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2312instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2313const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2314instantiationService.set(IExtensionsWorkbenchService, workbenchService);23152316instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a')));2317const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2318disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));23192320const pager = await workbenchService.queryGallery(CancellationToken.None);2321testObject.extension = pager.firstPage[0];2322assert.ok(testObject.extension);2323assert.ok(!testObject.enabled);2324});23252326test('Test local install action is disabled for remote ui extension which is disabled in env', async () => {2327// multi server setup2328const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2329const environmentService = { disableExtensions: true } as INativeWorkbenchEnvironmentService;2330instantiationService.stub(IEnvironmentService, environmentService);2331instantiationService.stub(INativeEnvironmentService, environmentService);2332instantiationService.stub(IWorkbenchEnvironmentService, environmentService);2333instantiationService.stub(INativeWorkbenchEnvironmentService, environmentService);2334const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteUIExtension]));2335instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2336instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2337const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2338instantiationService.set(IExtensionsWorkbenchService, workbenchService);23392340instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier })));2341const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2342disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));23432344const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2345await workbenchService.queryGallery(CancellationToken.None);2346testObject.extension = extensions[0];2347assert.ok(testObject.extension);2348assert.ok(!testObject.enabled);2349});23502351test('Test local install action is disabled when local server is not available', async () => {2352// single server setup2353const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2354const extensionManagementServerService = aSingleRemoteExtensionManagementServerService(instantiationService, createExtensionManagementService([remoteUIExtension]));2355instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2356instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2357const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2358instantiationService.set(IExtensionsWorkbenchService, workbenchService);23592360instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier })));2361const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2362disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));23632364const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2365await workbenchService.queryGallery(CancellationToken.None);2366testObject.extension = extensions[0];2367assert.ok(testObject.extension);2368assert.ok(!testObject.enabled);2369});23702371test('Test local install action is disabled for remote ui extension if it is installed in local', async () => {2372// multi server setup2373const localUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });2374const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2375const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localUIExtension]), createExtensionManagementService([remoteUIExtension]));2376instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2377instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2378const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2379instantiationService.set(IExtensionsWorkbenchService, workbenchService);23802381instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localUIExtension.identifier })));2382const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2383disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));23842385const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2386await workbenchService.queryGallery(CancellationToken.None);2387testObject.extension = extensions[0];2388assert.ok(testObject.extension);2389assert.ok(!testObject.enabled);2390});23912392test('Test local install action is disabled for remoteUI extension if it is uninstalled locally', async () => {2393// multi server setup2394const extensionManagementService = instantiationService.get(IExtensionManagementService) as IProfileAwareExtensionManagementService;2395const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), extensionManagementService);2396instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2397instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2398const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2399instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [remoteUIExtension]);2400const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2401instantiationService.set(IExtensionsWorkbenchService, workbenchService);24022403instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier })));2404const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2405disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));24062407const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2408await workbenchService.queryGallery(CancellationToken.None);2409testObject.extension = extensions[0];2410assert.ok(testObject.enabled);2411assert.strictEqual('Install Locally', testObject.label);24122413uninstallEvent.fire({ identifier: remoteUIExtension.identifier, profileLocation: null! });2414assert.ok(!testObject.enabled);2415});24162417test('Test local install action is enabled for remote UI extension if it has gallery', async () => {2418// multi server setup2419const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2420const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteUIExtension]));2421instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2422instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2423const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2424instantiationService.set(IExtensionsWorkbenchService, workbenchService);24252426instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier })));2427const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2428disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));24292430const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2431testObject.extension = extensions[0];2432assert.ok(testObject.extension);2433assert.ok(testObject.enabled);2434});24352436test('Test local install action is disabled for remote UI system extension', async () => {2437// multi server setup2438const remoteUISystemExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }), type: ExtensionType.System });2439const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteUISystemExtension]));2440instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2441instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2442const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2443instantiationService.set(IExtensionsWorkbenchService, workbenchService);24442445instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUISystemExtension.identifier })));2446const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2447disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));24482449const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2450testObject.extension = extensions[0];2451assert.ok(testObject.extension);2452assert.ok(!testObject.enabled);2453});24542455test('Test local install action is disabled for remote workspace extension if it is not installed in local', async () => {2456// multi server setup2457const remoteWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2458const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteWorkspaceExtension]));2459instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2460instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2461const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2462instantiationService.set(IExtensionsWorkbenchService, workbenchService);24632464instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteWorkspaceExtension.identifier })));2465const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2466disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));24672468const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2469testObject.extension = extensions[0];2470assert.ok(testObject.extension);2471assert.ok(!testObject.enabled);2472});24732474test('Test local install action is disabled for remote workspace extension if it is also installed in local', async () => {2475// multi server setup2476const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspae'] }, { location: URI.file(`pub.a`) });2477const remoteWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2478const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]), createExtensionManagementService([remoteWorkspaceExtension]));2479instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2480instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2481const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2482instantiationService.set(IExtensionsWorkbenchService, workbenchService);24832484instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));2485const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2486disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));24872488const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2489testObject.extension = extensions[0];2490assert.ok(testObject.extension);2491assert.ok(!testObject.enabled);2492});24932494test('Test local install action is enabled for remotely installed language pack extension', async () => {2495// multi server setup2496const languagePackExtension = aLocalExtension('a', { contributes: <IExtensionContributions>{ localizations: [{ languageId: 'de', translations: [] }] } }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2497const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([languagePackExtension]));2498instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2499instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2500const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2501instantiationService.set(IExtensionsWorkbenchService, workbenchService);25022503instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: languagePackExtension.identifier })));2504const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2505disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));25062507const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2508await workbenchService.queryGallery(CancellationToken.None);2509testObject.extension = extensions[0];2510assert.ok(testObject.enabled);2511assert.strictEqual('Install Locally', testObject.label);2512assert.strictEqual('extension-action label prominent install-other-server', testObject.class);2513});25142515test('Test local install action is disabled if remote language pack extension is uninstalled', async () => {2516// multi server setup2517const extensionManagementService = instantiationService.get(IExtensionManagementService) as IProfileAwareExtensionManagementService;2518const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), extensionManagementService);2519instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2520instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2521const languagePackExtension = aLocalExtension('a', { contributes: <IExtensionContributions>{ localizations: [{ languageId: 'de', translations: [] }] } }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2522instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [languagePackExtension]);2523const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2524instantiationService.set(IExtensionsWorkbenchService, workbenchService);25252526instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: languagePackExtension.identifier })));2527const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2528disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));25292530const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2531await workbenchService.queryGallery(CancellationToken.None);2532testObject.extension = extensions[0];2533assert.ok(testObject.enabled);2534assert.strictEqual('Install Locally', testObject.label);25352536uninstallEvent.fire({ identifier: languagePackExtension.identifier, profileLocation: null! });2537assert.ok(!testObject.enabled);2538});25392540});25412542function aLocalExtension(name: string = 'someext', manifest: any = {}, properties: any = {}): ILocalExtension {2543manifest = { name, publisher: 'pub', version: '1.0.0', ...manifest };2544properties = {2545type: ExtensionType.User,2546location: URI.file(`pub.${name}`),2547identifier: { id: getGalleryExtensionId(manifest.publisher, manifest.name) },2548...properties,2549isValid: properties.isValid ?? true,2550};2551properties.isBuiltin = properties.type === ExtensionType.System;2552return <ILocalExtension>Object.create({ manifest, ...properties });2553}25542555function aGalleryExtension(name: string, properties: any = {}, galleryExtensionProperties: any = {}, assets: any = {}): IGalleryExtension {2556const targetPlatform = getTargetPlatform(platform, arch);2557const galleryExtension = <IGalleryExtension>Object.create({ name, publisher: 'pub', version: '1.0.0', allTargetPlatforms: [targetPlatform], properties: {}, assets: {}, isSigned: true, ...properties });2558galleryExtension.properties = { ...galleryExtension.properties, dependencies: [], targetPlatform, ...galleryExtensionProperties };2559galleryExtension.assets = { ...galleryExtension.assets, ...assets };2560galleryExtension.identifier = { id: getGalleryExtensionId(galleryExtension.publisher, galleryExtension.name), uuid: generateUuid() };2561galleryExtension.hasReleaseVersion = true;2562return <IGalleryExtension>galleryExtension;2563}25642565function aPage<T>(...objects: T[]): IPager<T> {2566return { firstPage: objects, total: objects.length, pageSize: objects.length, getPage: () => null! };2567}25682569function aSingleRemoteExtensionManagementServerService(instantiationService: TestInstantiationService, remoteExtensionManagementService?: IProfileAwareExtensionManagementService): IExtensionManagementServerService {2570const remoteExtensionManagementServer: IExtensionManagementServer = {2571id: 'vscode-remote',2572label: 'remote',2573extensionManagementService: remoteExtensionManagementService || createExtensionManagementService(),2574};2575return {2576_serviceBrand: undefined,2577localExtensionManagementServer: null,2578remoteExtensionManagementServer,2579webExtensionManagementServer: null,2580getExtensionManagementServer: (extension: IExtension) => {2581if (extension.location.scheme === Schemas.vscodeRemote) {2582return remoteExtensionManagementServer;2583}2584return null;2585},2586getExtensionInstallLocation(extension: IExtension): ExtensionInstallLocation | null {2587const server = this.getExtensionManagementServer(extension);2588return server === remoteExtensionManagementServer ? ExtensionInstallLocation.Remote : ExtensionInstallLocation.Local;2589}2590};2591}25922593function aMultiExtensionManagementServerService(instantiationService: TestInstantiationService, localExtensionManagementService?: IProfileAwareExtensionManagementService | null, remoteExtensionManagementService?: IProfileAwareExtensionManagementService | null, webExtensionManagementService?: IProfileAwareExtensionManagementService): IExtensionManagementServerService {2594const localExtensionManagementServer: IExtensionManagementServer | null = localExtensionManagementService === null ? null : {2595id: 'vscode-local',2596label: 'local',2597extensionManagementService: localExtensionManagementService || createExtensionManagementService(),2598};2599const remoteExtensionManagementServer: IExtensionManagementServer | null = remoteExtensionManagementService === null ? null : {2600id: 'vscode-remote',2601label: 'remote',2602extensionManagementService: remoteExtensionManagementService || createExtensionManagementService(),2603};2604const webExtensionManagementServer: IExtensionManagementServer | null = webExtensionManagementService ? {2605id: 'vscode-web',2606label: 'web',2607extensionManagementService: webExtensionManagementService,2608} : null;2609return {2610_serviceBrand: undefined,2611localExtensionManagementServer,2612remoteExtensionManagementServer,2613webExtensionManagementServer,2614getExtensionManagementServer: (extension: IExtension) => {2615if (extension.location.scheme === Schemas.file) {2616return localExtensionManagementServer;2617}2618if (extension.location.scheme === Schemas.vscodeRemote) {2619return remoteExtensionManagementServer;2620}2621if (extension.location.scheme === Schemas.vscodeUserData) {2622return webExtensionManagementServer;2623}2624throw new Error('');2625},2626getExtensionInstallLocation(extension: IExtension): ExtensionInstallLocation | null {2627const server = this.getExtensionManagementServer(extension);2628if (server === null) {2629return null;2630}2631if (server === remoteExtensionManagementServer) {2632return ExtensionInstallLocation.Remote;2633}2634if (server === webExtensionManagementServer) {2635return ExtensionInstallLocation.Web;2636}2637return ExtensionInstallLocation.Local;2638}2639};2640}26412642function createExtensionManagementService(installed: ILocalExtension[] = []): IProfileAwareExtensionManagementService {2643return <IProfileAwareExtensionManagementService>{2644onInstallExtension: Event.None,2645onDidInstallExtensions: Event.None,2646onUninstallExtension: Event.None,2647onDidUninstallExtension: Event.None,2648onDidChangeProfile: Event.None,2649onDidUpdateExtensionMetadata: Event.None,2650onProfileAwareDidInstallExtensions: Event.None,2651getInstalled: () => Promise.resolve<ILocalExtension[]>(installed),2652canInstall: async (extension: IGalleryExtension) => { return true; },2653installFromGallery: (extension: IGalleryExtension) => Promise.reject(new Error('not supported')),2654updateMetadata: async (local: Mutable<ILocalExtension>, metadata: Partial<Metadata>, profileLocation: URI) => {2655local.identifier.uuid = metadata.id;2656local.publisherDisplayName = metadata.publisherDisplayName!;2657local.publisherId = metadata.publisherId!;2658return local;2659},2660async getTargetPlatform() { return getTargetPlatform(platform, arch); },2661async getExtensionsControlManifest() { return <IExtensionsControlManifest>{ malicious: [], deprecated: {}, search: [], publisherMapping: {} }; },2662};2663}266426652666