Path: blob/main/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts
3296 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 { IFileService } from '../../../../../platform/files/common/files.js';60import { FileService } from '../../../../../platform/files/common/fileService.js';61import { Mutable } from '../../../../../base/common/types.js';62import { IUserDataProfileService } from '../../../../services/userDataProfile/common/userDataProfile.js';63import { UserDataProfileService } from '../../../../services/userDataProfile/common/userDataProfileService.js';64import { toUserDataProfile } from '../../../../../platform/userDataProfile/common/userDataProfile.js';6566let instantiationService: TestInstantiationService;67let installEvent: Emitter<InstallExtensionEvent>,68didInstallEvent: Emitter<readonly InstallExtensionResult[]>,69uninstallEvent: Emitter<UninstallExtensionEvent>,70didUninstallEvent: Emitter<DidUninstallExtensionEvent>;7172function setupTest(disposables: Pick<DisposableStore, 'add'>) {73installEvent = disposables.add(new Emitter<InstallExtensionEvent>());74didInstallEvent = disposables.add(new Emitter<readonly InstallExtensionResult[]>());75uninstallEvent = disposables.add(new Emitter<UninstallExtensionEvent>());76didUninstallEvent = disposables.add(new Emitter<DidUninstallExtensionEvent>());7778instantiationService = disposables.add(new TestInstantiationService());7980instantiationService.stub(IEnvironmentService, TestEnvironmentService);81instantiationService.stub(IWorkbenchEnvironmentService, TestEnvironmentService);8283instantiationService.stub(ITelemetryService, NullTelemetryService);84instantiationService.stub(ILogService, NullLogService);8586instantiationService.stub(IWorkspaceContextService, new TestContextService());87instantiationService.stub(IFileService, disposables.add(new FileService(new NullLogService())));88instantiationService.stub(IConfigurationService, new TestConfigurationService());89instantiationService.stub(IProgressService, ProgressService);90instantiationService.stub(IProductService, {});91instantiationService.stub(IContextKeyService, new MockContextKeyService());9293instantiationService.stub(IExtensionGalleryService, ExtensionGalleryService);94instantiationService.stub(ISharedProcessService, TestSharedProcessService);9596instantiationService.stub(IWorkbenchExtensionManagementService, {97onDidInstallExtensions: didInstallEvent.event,98onInstallExtension: installEvent.event as any,99onUninstallExtension: uninstallEvent.event as any,100onDidUninstallExtension: didUninstallEvent.event as any,101onDidUpdateExtensionMetadata: Event.None,102onDidChangeProfile: Event.None,103onProfileAwareDidInstallExtensions: Event.None,104async getInstalled() { return []; },105async getInstalledWorkspaceExtensions() { return []; },106async getExtensionsControlManifest() { return { malicious: [], deprecated: {}, search: [], publisherMapping: {} }; },107async updateMetadata(local: Mutable<ILocalExtension>, metadata: Partial<Metadata>) {108local.identifier.uuid = metadata.id;109local.publisherDisplayName = metadata.publisherDisplayName!;110local.publisherId = metadata.publisherId!;111return local;112},113async canInstall() { return true; },114async getTargetPlatform() { return getTargetPlatform(platform, arch); },115});116117instantiationService.stub(IRemoteAgentService, RemoteAgentService);118119const localExtensionManagementServer = { extensionManagementService: instantiationService.get(IExtensionManagementService) as IProfileAwareExtensionManagementService, label: 'local', id: 'vscode-local' };120instantiationService.stub(IExtensionManagementServerService, {121get localExtensionManagementServer(): IExtensionManagementServer {122return localExtensionManagementServer;123},124getExtensionManagementServer(extension: IExtension): IExtensionManagementServer | null {125if (extension.location.scheme === Schemas.file) {126return localExtensionManagementServer;127}128throw new Error(`Invalid Extension ${extension.location}`);129}130});131132instantiationService.stub(IUserDataProfileService, disposables.add(new UserDataProfileService(toUserDataProfile('test', 'test', URI.file('foo'), URI.file('cache')))));133instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));134instantiationService.stub(ILabelService, { onDidChangeFormatters: disposables.add(new Emitter<IFormatterChangeEvent>()).event });135136instantiationService.stub(ILifecycleService, disposables.add(new TestLifecycleService()));137instantiationService.stub(IExtensionTipsService, disposables.add(instantiationService.createInstance(TestExtensionTipsService)));138instantiationService.stub(IExtensionRecommendationsService, {});139instantiationService.stub(IURLService, NativeURLService);140141instantiationService.stub(IExtensionGalleryService, 'isEnabled', true);142instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage());143instantiationService.stubPromise(IExtensionGalleryService, 'getExtensions', []);144instantiationService.stub(IExtensionService, { extensions: [], onDidChangeExtensions: Event.None, canAddExtension: (extension: IExtensionDescription) => false, canRemoveExtension: (extension: IExtensionDescription) => false, whenInstalledExtensionsRegistered: () => Promise.resolve(true) });145(<TestExtensionEnablementService>instantiationService.get(IWorkbenchExtensionEnablementService)).reset();146147instantiationService.stub(IUserDataSyncEnablementService, disposables.add(instantiationService.createInstance(UserDataSyncEnablementService)));148149instantiationService.stub(IUpdateService, { onStateChange: Event.None, state: State.Uninitialized });150instantiationService.set(IExtensionsWorkbenchService, disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService)));151instantiationService.stub(IWorkspaceTrustManagementService, disposables.add(new TestWorkspaceTrustManagementService()));152}153154155suite('ExtensionsActions', () => {156157const disposables = ensureNoDisposablesAreLeakedInTestSuite();158setup(() => setupTest(disposables));159160test('Install action is disabled when there is no extension', () => {161const testObject: ExtensionsActions.InstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.InstallAction, { installPreReleaseVersion: false }));162163assert.ok(!testObject.enabled);164});165166test('Test Install action when state is installed', () => {167const workbenchService = instantiationService.get(IExtensionsWorkbenchService);168const testObject: ExtensionsActions.InstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.InstallAction, { installPreReleaseVersion: false }));169disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));170const local = aLocalExtension('a');171instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);172return workbenchService.queryLocal()173.then(() => {174instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: local.identifier })));175return workbenchService.queryGallery(CancellationToken.None)176.then((paged) => {177testObject.extension = paged.firstPage[0];178assert.ok(!testObject.enabled);179assert.strictEqual('Install', testObject.label);180assert.strictEqual('extension-action label prominent install hide', testObject.class);181});182});183});184185test('Test InstallingLabelAction when state is installing', () => {186const workbenchService = instantiationService.get(IExtensionsWorkbenchService);187const testObject: ExtensionsActions.InstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.InstallingLabelAction));188disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));189const gallery = aGalleryExtension('a');190instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));191return workbenchService.queryGallery(CancellationToken.None)192.then((paged) => {193testObject.extension = paged.firstPage[0];194installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });195196assert.ok(!testObject.enabled);197assert.strictEqual('Installing', testObject.label);198assert.strictEqual('extension-action label install installing', testObject.class);199});200});201202test('Test Install action when state is uninstalled', async () => {203const workbenchService = instantiationService.get(IExtensionsWorkbenchService);204const testObject: ExtensionsActions.InstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.InstallAction, { installPreReleaseVersion: false }));205disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));206const gallery = aGalleryExtension('a');207instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));208const paged = await workbenchService.queryGallery(CancellationToken.None);209const promise = Event.toPromise(Event.filter(testObject.onDidChange, e => e.enabled === true));210testObject.extension = paged.firstPage[0];211await promise;212assert.ok(testObject.enabled);213assert.strictEqual('Install', testObject.label);214});215216test('Test Install action when extension is system action', () => {217const testObject: ExtensionsActions.InstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.InstallAction, { installPreReleaseVersion: false }));218disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));219const local = aLocalExtension('a', {}, { type: ExtensionType.System });220instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);221222return instantiationService.get(IExtensionsWorkbenchService).queryLocal()223.then(extensions => {224uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });225didUninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });226testObject.extension = extensions[0];227assert.ok(!testObject.enabled);228});229});230231test('Test Install action when extension doesnot has gallery', () => {232const testObject: ExtensionsActions.InstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.InstallAction, { installPreReleaseVersion: false }));233disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));234const local = aLocalExtension('a');235instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);236237return instantiationService.get(IExtensionsWorkbenchService).queryLocal()238.then(extensions => {239uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });240didUninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });241testObject.extension = extensions[0];242assert.ok(!testObject.enabled);243});244});245246test('Uninstall action is disabled when there is no extension', () => {247const testObject: ExtensionsActions.UninstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UninstallAction));248disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));249250assert.ok(!testObject.enabled);251});252253test('Test Uninstall action when state is uninstalling', () => {254const testObject: ExtensionsActions.UninstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UninstallAction));255disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));256const local = aLocalExtension('a');257instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);258259return instantiationService.get(IExtensionsWorkbenchService).queryLocal()260.then(extensions => {261testObject.extension = extensions[0];262uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });263assert.ok(!testObject.enabled);264assert.strictEqual('Uninstalling', testObject.label);265assert.strictEqual('extension-action label uninstall uninstalling', testObject.class);266});267});268269test('Test Uninstall action when state is installed and is user extension', () => {270const testObject: ExtensionsActions.UninstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UninstallAction));271disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));272const local = aLocalExtension('a');273instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);274275return instantiationService.get(IExtensionsWorkbenchService).queryLocal()276.then(extensions => {277testObject.extension = extensions[0];278assert.ok(testObject.enabled);279assert.strictEqual('Uninstall', testObject.label);280assert.strictEqual('extension-action label uninstall', testObject.class);281});282});283284test('Test Uninstall action when state is installed and is system extension', () => {285const testObject: ExtensionsActions.UninstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UninstallAction));286disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));287const local = aLocalExtension('a', {}, { type: ExtensionType.System });288instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);289290return instantiationService.get(IExtensionsWorkbenchService).queryLocal()291.then(extensions => {292testObject.extension = extensions[0];293assert.ok(!testObject.enabled);294assert.strictEqual('Uninstall', testObject.label);295assert.strictEqual('extension-action label uninstall', testObject.class);296});297});298299test('Test Uninstall action when state is installing and is user extension', () => {300const testObject: ExtensionsActions.UninstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UninstallAction));301disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));302const local = aLocalExtension('a');303instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);304305return instantiationService.get(IExtensionsWorkbenchService).queryLocal()306.then(extensions => {307const gallery = aGalleryExtension('a');308const extension = extensions[0];309extension.gallery = gallery;310installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });311testObject.extension = extension;312assert.ok(!testObject.enabled);313});314});315316test('Test Uninstall action after extension is installed', async () => {317const testObject: ExtensionsActions.UninstallAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UninstallAction));318disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));319const gallery = aGalleryExtension('a');320instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));321322const paged = await instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);323testObject.extension = paged.firstPage[0];324325installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });326const promise = Event.toPromise(testObject.onDidChange);327didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery), profileLocation: null! }]);328329await promise;330assert.ok(testObject.enabled);331assert.strictEqual('Uninstall', testObject.label);332assert.strictEqual('extension-action label uninstall', testObject.class);333});334335test('Test UpdateAction when there is no extension', () => {336const testObject: ExtensionsActions.UpdateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UpdateAction, false));337disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));338339assert.ok(!testObject.enabled);340});341342test('Test UpdateAction when extension is uninstalled', () => {343const testObject: ExtensionsActions.UpdateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UpdateAction, false));344disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));345const gallery = aGalleryExtension('a', { version: '1.0.0' });346instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));347return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)348.then((paged) => {349testObject.extension = paged.firstPage[0];350assert.ok(!testObject.enabled);351});352});353354test('Test UpdateAction when extension is installed and not outdated', () => {355const testObject: ExtensionsActions.UpdateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UpdateAction, false));356disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));357const local = aLocalExtension('a', { version: '1.0.0' });358instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);359360return instantiationService.get(IExtensionsWorkbenchService).queryLocal()361.then(extensions => {362testObject.extension = extensions[0];363instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: local.identifier, version: local.manifest.version })));364return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)365.then(extensions => assert.ok(!testObject.enabled));366});367});368369test('Test UpdateAction when extension is installed outdated and system extension', () => {370const testObject: ExtensionsActions.UpdateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UpdateAction, false));371disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));372const local = aLocalExtension('a', { version: '1.0.0' }, { type: ExtensionType.System });373instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);374375return instantiationService.get(IExtensionsWorkbenchService).queryLocal()376.then(extensions => {377testObject.extension = extensions[0];378instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: local.identifier, version: '1.0.1' })));379return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)380.then(extensions => assert.ok(!testObject.enabled));381});382});383384test('Test UpdateAction when extension is installed outdated and user extension', () => {385const testObject: ExtensionsActions.UpdateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UpdateAction, false));386disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));387const local = aLocalExtension('a', { version: '1.0.0' });388instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);389390const workbenchService = instantiationService.get(IExtensionsWorkbenchService);391return workbenchService.queryLocal()392.then(async extensions => {393testObject.extension = extensions[0];394const gallery = aGalleryExtension('a', { identifier: local.identifier, version: '1.0.1' });395instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));396instantiationService.stubPromise(IExtensionGalleryService, 'getCompatibleExtension', gallery);397instantiationService.stubPromise(IExtensionGalleryService, 'getExtensions', [gallery]);398assert.ok(!testObject.enabled);399return new Promise<void>(c => {400disposables.add(testObject.onDidChange(() => {401if (testObject.enabled) {402c();403}404}));405instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);406});407});408});409410test('Test UpdateAction when extension is installing and outdated and user extension', async () => {411const testObject: ExtensionsActions.UpdateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.UpdateAction, false));412disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));413const local = aLocalExtension('a', { version: '1.0.0' });414instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);415416const extensions = await instantiationService.get(IExtensionsWorkbenchService).queryLocal();417testObject.extension = extensions[0];418const gallery = aGalleryExtension('a', { identifier: local.identifier, version: '1.0.1' });419instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));420instantiationService.stubPromise(IExtensionGalleryService, 'getCompatibleExtension', gallery);421instantiationService.stubPromise(IExtensionGalleryService, 'getExtensions', [gallery]);422await new Promise<void>(c => {423disposables.add(testObject.onDidChange(() => {424if (testObject.enabled) {425c();426}427}));428instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);429});430await new Promise<void>(c => {431disposables.add(testObject.onDidChange(() => {432if (!testObject.enabled) {433c();434}435}));436installEvent.fire({ identifier: local.identifier, source: gallery, profileLocation: null! });437});438});439440test('Test ManageExtensionAction when there is no extension', () => {441const testObject: ExtensionsActions.ManageExtensionAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ManageExtensionAction));442disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));443444assert.ok(!testObject.enabled);445});446447test('Test ManageExtensionAction when extension is installed', () => {448const testObject: ExtensionsActions.ManageExtensionAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ManageExtensionAction));449disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));450const local = aLocalExtension('a');451instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);452453return instantiationService.get(IExtensionsWorkbenchService).queryLocal()454.then(extensions => {455testObject.extension = extensions[0];456assert.ok(testObject.enabled);457assert.strictEqual('extension-action icon manage codicon codicon-extensions-manage', testObject.class);458assert.strictEqual('Manage', testObject.tooltip);459});460});461462test('Test ManageExtensionAction when extension is uninstalled', () => {463const testObject: ExtensionsActions.ManageExtensionAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ManageExtensionAction));464disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));465const gallery = aGalleryExtension('a');466instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));467468return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)469.then(page => {470testObject.extension = page.firstPage[0];471assert.ok(!testObject.enabled);472assert.strictEqual('extension-action icon manage codicon codicon-extensions-manage hide', testObject.class);473assert.strictEqual('Manage', testObject.tooltip);474});475});476477test('Test ManageExtensionAction when extension is installing', () => {478const testObject: ExtensionsActions.ManageExtensionAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ManageExtensionAction));479disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));480const gallery = aGalleryExtension('a');481instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));482483return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)484.then(page => {485testObject.extension = page.firstPage[0];486487installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });488assert.ok(!testObject.enabled);489assert.strictEqual('extension-action icon manage codicon codicon-extensions-manage hide', testObject.class);490assert.strictEqual('Manage', testObject.tooltip);491});492});493494test('Test ManageExtensionAction when extension is queried from gallery and installed', async () => {495const testObject: ExtensionsActions.ManageExtensionAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ManageExtensionAction));496disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));497const gallery = aGalleryExtension('a');498instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));499500const paged = await instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);501testObject.extension = paged.firstPage[0];502installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });503const promise = Event.toPromise(testObject.onDidChange);504didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery), profileLocation: null! }]);505506await promise;507assert.ok(testObject.enabled);508assert.strictEqual('extension-action icon manage codicon codicon-extensions-manage', testObject.class);509assert.strictEqual('Manage', testObject.tooltip);510});511512test('Test ManageExtensionAction when extension is system extension', () => {513const testObject: ExtensionsActions.ManageExtensionAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ManageExtensionAction));514disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));515const local = aLocalExtension('a', {}, { type: ExtensionType.System });516instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);517518return instantiationService.get(IExtensionsWorkbenchService).queryLocal()519.then(extensions => {520testObject.extension = extensions[0];521assert.ok(testObject.enabled);522assert.strictEqual('extension-action icon manage codicon codicon-extensions-manage', testObject.class);523assert.strictEqual('Manage', testObject.tooltip);524});525});526527test('Test ManageExtensionAction when extension is uninstalling', () => {528const testObject: ExtensionsActions.ManageExtensionAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ManageExtensionAction));529disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));530const local = aLocalExtension('a');531instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);532533return instantiationService.get(IExtensionsWorkbenchService).queryLocal()534.then(extensions => {535testObject.extension = extensions[0];536uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });537538assert.ok(!testObject.enabled);539assert.strictEqual('extension-action icon manage codicon codicon-extensions-manage', testObject.class);540assert.strictEqual('Manage', testObject.tooltip);541});542});543544test('Test EnableForWorkspaceAction when there is no extension', () => {545const testObject: ExtensionsActions.EnableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction));546547assert.ok(!testObject.enabled);548});549550test('Test EnableForWorkspaceAction when there extension is not disabled', () => {551const local = aLocalExtension('a');552instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);553554return instantiationService.get(IExtensionsWorkbenchService).queryLocal()555.then(extensions => {556const testObject: ExtensionsActions.EnableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction));557testObject.extension = extensions[0];558assert.ok(!testObject.enabled);559});560});561562test('Test EnableForWorkspaceAction when the extension is disabled globally', () => {563const local = aLocalExtension('a');564return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)565.then(() => {566instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);567568return instantiationService.get(IExtensionsWorkbenchService).queryLocal()569.then(extensions => {570const testObject: ExtensionsActions.EnableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction));571testObject.extension = extensions[0];572assert.ok(testObject.enabled);573});574});575});576577test('Test EnableForWorkspaceAction when extension is disabled for workspace', () => {578const local = aLocalExtension('a');579return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledWorkspace)580.then(() => {581instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);582583return instantiationService.get(IExtensionsWorkbenchService).queryLocal()584.then(extensions => {585const testObject: ExtensionsActions.EnableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction));586testObject.extension = extensions[0];587assert.ok(testObject.enabled);588});589});590});591592test('Test EnableForWorkspaceAction when the extension is disabled globally and workspace', () => {593const local = aLocalExtension('a');594return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)595.then(() => instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledWorkspace))596.then(() => {597instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);598599return instantiationService.get(IExtensionsWorkbenchService).queryLocal()600.then(extensions => {601const testObject: ExtensionsActions.EnableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction));602testObject.extension = extensions[0];603assert.ok(testObject.enabled);604});605});606});607608test('Test EnableGloballyAction when there is no extension', () => {609const testObject: ExtensionsActions.EnableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableGloballyAction));610611assert.ok(!testObject.enabled);612});613614test('Test EnableGloballyAction when the extension is not disabled', () => {615const local = aLocalExtension('a');616instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);617618return instantiationService.get(IExtensionsWorkbenchService).queryLocal()619.then(extensions => {620const testObject: ExtensionsActions.EnableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableGloballyAction));621testObject.extension = extensions[0];622assert.ok(!testObject.enabled);623});624});625626test('Test EnableGloballyAction when the extension is disabled for workspace', () => {627const local = aLocalExtension('a');628return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledWorkspace)629.then(() => {630instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);631632return instantiationService.get(IExtensionsWorkbenchService).queryLocal()633.then(extensions => {634const testObject: ExtensionsActions.EnableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableGloballyAction));635testObject.extension = extensions[0];636assert.ok(!testObject.enabled);637});638});639});640641test('Test EnableGloballyAction when the extension is disabled globally', () => {642const local = aLocalExtension('a');643return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)644.then(() => {645instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);646647return instantiationService.get(IExtensionsWorkbenchService).queryLocal()648.then(extensions => {649const testObject: ExtensionsActions.EnableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableGloballyAction));650testObject.extension = extensions[0];651assert.ok(testObject.enabled);652});653});654});655656test('Test EnableGloballyAction when the extension is disabled in both', () => {657const local = aLocalExtension('a');658return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)659.then(() => instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledWorkspace))660.then(() => {661instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);662663return instantiationService.get(IExtensionsWorkbenchService).queryLocal()664.then(extensions => {665const testObject: ExtensionsActions.EnableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableGloballyAction));666testObject.extension = extensions[0];667assert.ok(testObject.enabled);668});669});670});671672test('Test EnableAction when there is no extension', () => {673const testObject: ExtensionsActions.EnableDropDownAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableDropDownAction));674675assert.ok(!testObject.enabled);676});677678test('Test EnableDropDownAction when extension is installed and enabled', () => {679const local = aLocalExtension('a');680instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);681682return instantiationService.get(IExtensionsWorkbenchService).queryLocal()683.then(extensions => {684const testObject: ExtensionsActions.EnableDropDownAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableDropDownAction));685testObject.extension = extensions[0];686assert.ok(!testObject.enabled);687});688});689690test('Test EnableDropDownAction when extension is installed and disabled globally', () => {691const local = aLocalExtension('a');692return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)693.then(() => {694instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);695696return instantiationService.get(IExtensionsWorkbenchService).queryLocal()697.then(extensions => {698const testObject: ExtensionsActions.EnableDropDownAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableDropDownAction));699testObject.extension = extensions[0];700assert.ok(testObject.enabled);701});702});703});704705test('Test EnableDropDownAction when extension is installed and disabled for workspace', () => {706const local = aLocalExtension('a');707return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledWorkspace)708.then(() => {709instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);710711return instantiationService.get(IExtensionsWorkbenchService).queryLocal()712.then(extensions => {713const testObject: ExtensionsActions.EnableDropDownAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableDropDownAction));714testObject.extension = extensions[0];715assert.ok(testObject.enabled);716});717});718});719720test('Test EnableDropDownAction when extension is uninstalled', () => {721const gallery = aGalleryExtension('a');722instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));723724return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)725.then(page => {726const testObject: ExtensionsActions.EnableDropDownAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableDropDownAction));727testObject.extension = page.firstPage[0];728assert.ok(!testObject.enabled);729});730});731732test('Test EnableDropDownAction when extension is installing', () => {733const gallery = aGalleryExtension('a');734instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));735736return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)737.then(page => {738const testObject: ExtensionsActions.EnableDropDownAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableDropDownAction));739testObject.extension = page.firstPage[0];740disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));741742installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });743assert.ok(!testObject.enabled);744});745});746747test('Test EnableDropDownAction when extension is uninstalling', () => {748const local = aLocalExtension('a');749instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);750751return instantiationService.get(IExtensionsWorkbenchService).queryLocal()752.then(extensions => {753const testObject: ExtensionsActions.EnableDropDownAction = disposables.add(instantiationService.createInstance(ExtensionsActions.EnableDropDownAction));754testObject.extension = extensions[0];755uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });756assert.ok(!testObject.enabled);757});758});759760test('Test DisableForWorkspaceAction when there is no extension', () => {761const testObject: ExtensionsActions.DisableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction));762763assert.ok(!testObject.enabled);764});765766test('Test DisableForWorkspaceAction when the extension is disabled globally', () => {767const local = aLocalExtension('a');768return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)769.then(() => {770instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);771772return instantiationService.get(IExtensionsWorkbenchService).queryLocal()773.then(extensions => {774const testObject: ExtensionsActions.DisableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction));775testObject.extension = extensions[0];776assert.ok(!testObject.enabled);777});778});779});780781test('Test DisableForWorkspaceAction when the extension is disabled workspace', () => {782const local = aLocalExtension('a');783return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)784.then(() => {785instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);786787return instantiationService.get(IExtensionsWorkbenchService).queryLocal()788.then(extensions => {789const testObject: ExtensionsActions.DisableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction));790testObject.extension = extensions[0];791assert.ok(!testObject.enabled);792});793});794});795796test('Test DisableForWorkspaceAction when extension is enabled', () => {797const local = aLocalExtension('a');798instantiationService.stub(IExtensionService, {799extensions: [toExtensionDescription(local)],800onDidChangeExtensions: Event.None,801whenInstalledExtensionsRegistered: () => Promise.resolve(true)802});803804instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);805806return instantiationService.get(IExtensionsWorkbenchService).queryLocal()807.then(extensions => {808const testObject: ExtensionsActions.DisableForWorkspaceAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction));809testObject.extension = extensions[0];810assert.ok(testObject.enabled);811});812});813814test('Test DisableGloballyAction when there is no extension', () => {815const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));816817assert.ok(!testObject.enabled);818});819820test('Test DisableGloballyAction when the extension is disabled globally', () => {821const local = aLocalExtension('a');822return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)823.then(() => {824instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);825826return instantiationService.get(IExtensionsWorkbenchService).queryLocal()827.then(extensions => {828const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));829testObject.extension = extensions[0];830assert.ok(!testObject.enabled);831});832});833});834835test('Test DisableGloballyAction when the extension is disabled for workspace', () => {836const local = aLocalExtension('a');837return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledWorkspace)838.then(() => {839instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);840841return instantiationService.get(IExtensionsWorkbenchService).queryLocal()842.then(extensions => {843const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));844testObject.extension = extensions[0];845assert.ok(!testObject.enabled);846});847});848});849850test('Test DisableGloballyAction when the extension is enabled', () => {851const local = aLocalExtension('a');852instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);853instantiationService.stub(IExtensionService, {854extensions: [toExtensionDescription(local)],855onDidChangeExtensions: Event.None,856whenInstalledExtensionsRegistered: () => Promise.resolve(true)857});858859return instantiationService.get(IExtensionsWorkbenchService).queryLocal()860.then(extensions => {861const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));862testObject.extension = extensions[0];863assert.ok(testObject.enabled);864});865});866867test('Test DisableGloballyAction when extension is installed and enabled', () => {868const local = aLocalExtension('a');869instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);870instantiationService.stub(IExtensionService, {871extensions: [toExtensionDescription(local)],872onDidChangeExtensions: Event.None,873whenInstalledExtensionsRegistered: () => Promise.resolve(true)874});875876return instantiationService.get(IExtensionsWorkbenchService).queryLocal()877.then(extensions => {878const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));879testObject.extension = extensions[0];880assert.ok(testObject.enabled);881});882});883884test('Test DisableGloballyAction when extension is installed and disabled globally', () => {885const local = aLocalExtension('a');886instantiationService.stub(IExtensionService, {887extensions: [toExtensionDescription(local)],888onDidChangeExtensions: Event.None,889whenInstalledExtensionsRegistered: () => Promise.resolve(true)890});891892return instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally)893.then(() => {894instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);895896return instantiationService.get(IExtensionsWorkbenchService).queryLocal()897.then(extensions => {898const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));899testObject.extension = extensions[0];900assert.ok(!testObject.enabled);901});902});903});904905test('Test DisableGloballyAction when extension is uninstalled', () => {906const gallery = aGalleryExtension('a');907instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));908instantiationService.stub(IExtensionService, {909extensions: [toExtensionDescription(aLocalExtension('a'))],910onDidChangeExtensions: Event.None,911whenInstalledExtensionsRegistered: () => Promise.resolve(true)912});913914return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)915.then(page => {916const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));917testObject.extension = page.firstPage[0];918assert.ok(!testObject.enabled);919});920});921922test('Test DisableGloballyAction when extension is installing', () => {923const gallery = aGalleryExtension('a');924instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));925instantiationService.stub(IExtensionService, {926extensions: [toExtensionDescription(aLocalExtension('a'))],927onDidChangeExtensions: Event.None,928whenInstalledExtensionsRegistered: () => Promise.resolve(true)929});930931return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)932.then(page => {933const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));934testObject.extension = page.firstPage[0];935disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));936installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });937assert.ok(!testObject.enabled);938});939});940941test('Test DisableGloballyAction when extension is uninstalling', () => {942const local = aLocalExtension('a');943instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);944instantiationService.stub(IExtensionService, {945extensions: [toExtensionDescription(local)],946onDidChangeExtensions: Event.None,947whenInstalledExtensionsRegistered: () => Promise.resolve(true)948});949950return instantiationService.get(IExtensionsWorkbenchService).queryLocal()951.then(extensions => {952const testObject: ExtensionsActions.DisableGloballyAction = disposables.add(instantiationService.createInstance(ExtensionsActions.DisableGloballyAction));953testObject.extension = extensions[0];954disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));955uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });956assert.ok(!testObject.enabled);957});958});959960});961962suite('ExtensionRuntimeStateAction', () => {963964const disposables = ensureNoDisposablesAreLeakedInTestSuite();965966setup(() => setupTest(disposables));967968test('Test Runtime State when there is no extension', () => {969const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));970disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));971972assert.ok(!testObject.enabled);973});974975test('Test Runtime State when extension state is installing', async () => {976const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));977disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));978const workbenchService = instantiationService.get(IExtensionsWorkbenchService);979const gallery = aGalleryExtension('a');980instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));981const paged = await workbenchService.queryGallery(CancellationToken.None);982testObject.extension = paged.firstPage[0];983installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });984985assert.ok(!testObject.enabled);986});987988test('Test Runtime State when extension state is uninstalling', async () => {989const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));990disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));991const local = aLocalExtension('a');992instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);993994const extensions = await instantiationService.get(IExtensionsWorkbenchService).queryLocal();995testObject.extension = extensions[0];996uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });997assert.ok(!testObject.enabled);998});9991000test('Test Runtime State when extension is newly installed', async () => {1001const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1002instantiationService.stub(IExtensionService, {1003extensions: [toExtensionDescription(aLocalExtension('b'))],1004onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1005canAddExtension: (extension) => false,1006whenInstalledExtensionsRegistered: () => Promise.resolve(true)1007});1008const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1009disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1010const gallery = aGalleryExtension('a');1011instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));10121013const paged = await instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);1014testObject.extension = paged.firstPage[0];1015assert.ok(!testObject.enabled);10161017installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });1018const promise = Event.toPromise(testObject.onDidChange);1019didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery), profileLocation: null! }]);1020await promise;1021assert.ok(testObject.enabled);1022assert.strictEqual(testObject.tooltip, `Please restart extensions to enable this extension.`);1023});10241025test('Test Runtime State when extension is newly installed and ext host restart is not required', async () => {1026const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1027instantiationService.stub(IExtensionService, {1028extensions: [toExtensionDescription(aLocalExtension('b'))],1029onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1030canAddExtension: (extension) => true,1031whenInstalledExtensionsRegistered: () => Promise.resolve(true)1032});1033instantiationService.set(IExtensionsWorkbenchService, disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService)));1034const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1035disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1036const gallery = aGalleryExtension('a');1037instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));10381039const paged = await instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);1040testObject.extension = paged.firstPage[0];1041assert.ok(!testObject.enabled);10421043installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });1044didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery), profileLocation: null! }]);1045assert.ok(!testObject.enabled);1046});10471048test('Test Runtime State when extension is installed and uninstalled', async () => {1049instantiationService.stub(IExtensionService, {1050extensions: [toExtensionDescription(aLocalExtension('b'))],1051onDidChangeExtensions: Event.None,1052canRemoveExtension: (extension) => false,1053canAddExtension: (extension) => false,1054whenInstalledExtensionsRegistered: () => Promise.resolve(true)1055});1056const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1057disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1058const gallery = aGalleryExtension('a');1059instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));1060const paged = await instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);10611062testObject.extension = paged.firstPage[0];1063const identifier = gallery.identifier;1064installEvent.fire({ identifier, source: gallery, profileLocation: null! });1065didInstallEvent.fire([{ identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, { identifier }), profileLocation: null! }]);1066uninstallEvent.fire({ identifier, profileLocation: null! });1067didUninstallEvent.fire({ identifier, profileLocation: null! });10681069assert.ok(!testObject.enabled);1070});10711072test('Test Runtime State when extension is uninstalled', async () => {1073instantiationService.stub(IExtensionService, {1074extensions: [toExtensionDescription(aLocalExtension('a', { version: '1.0.0' }))],1075onDidChangeExtensions: Event.None,1076canRemoveExtension: (extension) => false,1077canAddExtension: (extension) => false,1078whenInstalledExtensionsRegistered: () => Promise.resolve(true)1079});1080instantiationService.set(IExtensionsWorkbenchService, disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService)));1081const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1082disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1083const local = aLocalExtension('a');1084instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1085const extensions = await instantiationService.get(IExtensionsWorkbenchService).queryLocal();1086testObject.extension = extensions[0];10871088uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });1089didUninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });1090assert.ok(testObject.enabled);1091assert.strictEqual(testObject.tooltip, `Please restart extensions to complete the uninstallation of this extension.`);1092});10931094test('Test Runtime State when extension is uninstalled and can be removed', async () => {1095const local = aLocalExtension('a');1096instantiationService.stub(IExtensionService, {1097extensions: [toExtensionDescription(local)],1098onDidChangeExtensions: Event.None,1099canRemoveExtension: (extension) => true,1100canAddExtension: (extension) => true,1101whenInstalledExtensionsRegistered: () => Promise.resolve(true)1102});1103const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1104disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1105instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1106const extensions = await instantiationService.get(IExtensionsWorkbenchService).queryLocal();1107testObject.extension = extensions[0];11081109uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });1110didUninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });1111assert.ok(!testObject.enabled);1112});11131114test('Test Runtime State when extension is uninstalled and installed', async () => {1115instantiationService.stub(IExtensionService, {1116extensions: [toExtensionDescription(aLocalExtension('a', { version: '1.0.0' }))],1117onDidChangeExtensions: Event.None,1118canRemoveExtension: (extension) => false,1119canAddExtension: (extension) => false,1120whenInstalledExtensionsRegistered: () => Promise.resolve(true)1121});1122instantiationService.set(IExtensionsWorkbenchService, disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService)));1123const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1124disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1125const local = aLocalExtension('a');1126instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1127const extensions = await instantiationService.get(IExtensionsWorkbenchService).queryLocal();11281129testObject.extension = extensions[0];1130uninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });1131didUninstallEvent.fire({ identifier: local.identifier, profileLocation: null! });11321133const gallery = aGalleryExtension('a');1134const identifier = gallery.identifier;1135installEvent.fire({ identifier, source: gallery, profileLocation: null! });1136didInstallEvent.fire([{ identifier, source: gallery, operation: InstallOperation.Install, local, profileLocation: null! }]);11371138assert.ok(!testObject.enabled);1139});11401141test('Test Runtime State when extension is updated while running', async () => {1142instantiationService.stub(IExtensionService, {1143extensions: [toExtensionDescription(aLocalExtension('a', { version: '1.0.1' }))],1144onDidChangeExtensions: Event.None,1145canRemoveExtension: (extension) => true,1146canAddExtension: (extension) => false,1147whenInstalledExtensionsRegistered: () => Promise.resolve(true)1148});1149instantiationService.set(IExtensionsWorkbenchService, disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService)));1150const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1151disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1152const local = aLocalExtension('a', { version: '1.0.1' });1153const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1154instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1155const extensions = await workbenchService.queryLocal();1156testObject.extension = extensions[0];11571158return new Promise<void>(c => {1159disposables.add(testObject.onDidChange(() => {1160if (testObject.enabled && testObject.tooltip === `Please restart extensions to enable the updated extension.`) {1161c();1162}1163}));1164const gallery = aGalleryExtension('a', { uuid: local.identifier.id, version: '1.0.2' });1165installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });1166didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery), profileLocation: null! }]);1167});1168});11691170test('Test Runtime State when extension is updated when not running', async () => {1171instantiationService.stub(IExtensionService, {1172extensions: [toExtensionDescription(aLocalExtension('b'))],1173onDidChangeExtensions: Event.None,1174canRemoveExtension: (extension) => false,1175canAddExtension: (extension) => false,1176whenInstalledExtensionsRegistered: () => Promise.resolve(true)1177});1178const local = aLocalExtension('a', { version: '1.0.1' });1179await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally);1180const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1181disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1182const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1183instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1184const extensions = await workbenchService.queryLocal();1185testObject.extension = extensions[0];11861187const gallery = aGalleryExtension('a', { identifier: local.identifier, version: '1.0.2' });1188installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });1189didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Update, local: aLocalExtension('a', gallery, gallery), profileLocation: null! }]);11901191assert.ok(!testObject.enabled);1192});11931194test('Test Runtime State when extension is disabled when running', async () => {1195instantiationService.stub(IExtensionService, {1196extensions: [toExtensionDescription(aLocalExtension('a'))],1197onDidChangeExtensions: Event.None,1198canRemoveExtension: (extension) => false,1199canAddExtension: (extension) => false,1200whenInstalledExtensionsRegistered: () => Promise.resolve(true)1201});1202instantiationService.set(IExtensionsWorkbenchService, disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService)));1203const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1204disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1205const local = aLocalExtension('a');1206const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1207instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1208const extensions = await workbenchService.queryLocal();1209testObject.extension = extensions[0];1210await workbenchService.setEnablement(extensions[0], EnablementState.DisabledGlobally);1211await testObject.update();12121213assert.ok(testObject.enabled);1214assert.strictEqual(`Please restart extensions to disable this extension.`, testObject.tooltip);1215});12161217test('Test Runtime State when extension enablement is toggled when running', async () => {1218instantiationService.stub(IExtensionService, {1219extensions: [toExtensionDescription(aLocalExtension('a', { version: '1.0.0' }))],1220onDidChangeExtensions: Event.None,1221canRemoveExtension: (extension) => false,1222canAddExtension: (extension) => false,1223whenInstalledExtensionsRegistered: () => Promise.resolve(true)1224});1225instantiationService.set(IExtensionsWorkbenchService, disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService)));1226const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1227disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1228const local = aLocalExtension('a');1229const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1230instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1231const extensions = await workbenchService.queryLocal();1232testObject.extension = extensions[0];1233await workbenchService.setEnablement(extensions[0], EnablementState.DisabledGlobally);1234await workbenchService.setEnablement(extensions[0], EnablementState.EnabledGlobally);1235assert.ok(!testObject.enabled);1236});12371238test('Test Runtime State when extension is enabled when not running', async () => {1239instantiationService.stub(IExtensionService, {1240extensions: [toExtensionDescription(aLocalExtension('b'))],1241onDidChangeExtensions: Event.None,1242canRemoveExtension: (extension) => false,1243canAddExtension: (extension) => false,1244whenInstalledExtensionsRegistered: () => Promise.resolve(true)1245});1246const local = aLocalExtension('a');1247await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally);1248const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1249disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1250const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1251instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1252const extensions = await workbenchService.queryLocal();1253testObject.extension = extensions[0];1254await workbenchService.setEnablement(extensions[0], EnablementState.EnabledGlobally);1255await testObject.update();1256assert.ok(testObject.enabled);1257assert.strictEqual(`Please restart extensions to enable this extension.`, testObject.tooltip);1258});12591260test('Test Runtime State when extension enablement is toggled when not running', async () => {1261instantiationService.stub(IExtensionService, {1262extensions: [toExtensionDescription(aLocalExtension('b'))],1263onDidChangeExtensions: Event.None,1264canRemoveExtension: (extension) => false,1265canAddExtension: (extension) => false,1266whenInstalledExtensionsRegistered: () => Promise.resolve(true)1267});1268const local = aLocalExtension('a');1269await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally);1270const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1271disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1272const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1273instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1274const extensions = await workbenchService.queryLocal();1275testObject.extension = extensions[0];1276await workbenchService.setEnablement(extensions[0], EnablementState.EnabledGlobally);1277await workbenchService.setEnablement(extensions[0], EnablementState.DisabledGlobally);1278assert.ok(!testObject.enabled);1279});12801281test('Test Runtime State when extension is updated when not running and enabled', async () => {1282instantiationService.stub(IExtensionService, {1283extensions: [toExtensionDescription(aLocalExtension('a'))],1284onDidChangeExtensions: Event.None,1285canRemoveExtension: (extension) => false,1286canAddExtension: (extension) => false,1287whenInstalledExtensionsRegistered: () => Promise.resolve(true)1288});1289const local = aLocalExtension('a', { version: '1.0.1' });1290await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally);1291const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1292disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1293const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1294instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1295const extensions = await workbenchService.queryLocal();1296testObject.extension = extensions[0];12971298const gallery = aGalleryExtension('a', { identifier: local.identifier, version: '1.0.2' });1299installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });1300didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery), profileLocation: null! }]);1301await workbenchService.setEnablement(extensions[0], EnablementState.EnabledGlobally);1302await testObject.update();1303assert.ok(testObject.enabled);1304assert.strictEqual(`Please restart extensions to enable this extension.`, testObject.tooltip);1305});13061307test('Test Runtime State when a localization extension is newly installed', async () => {1308instantiationService.stub(IExtensionService, {1309extensions: [toExtensionDescription(aLocalExtension('b'))],1310onDidChangeExtensions: Event.None,1311canRemoveExtension: (extension) => false,1312canAddExtension: (extension) => false,1313whenInstalledExtensionsRegistered: () => Promise.resolve(true)1314});1315const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1316disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1317const gallery = aGalleryExtension('a');1318instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));13191320const paged = await instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);1321testObject.extension = paged.firstPage[0];1322assert.ok(!testObject.enabled);13231324installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });1325didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', { ...gallery, ...{ contributes: <IExtensionContributions>{ localizations: [{ languageId: 'de', translations: [] }] } } }, gallery), profileLocation: null! }]);1326assert.ok(!testObject.enabled);1327});13281329test('Test Runtime State when a localization extension is updated while running', async () => {1330instantiationService.stub(IExtensionService, {1331extensions: [toExtensionDescription(aLocalExtension('a', { version: '1.0.1' }))],1332onDidChangeExtensions: Event.None,1333canRemoveExtension: (extension) => false,1334canAddExtension: (extension) => false,1335whenInstalledExtensionsRegistered: () => Promise.resolve(true)1336});1337const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1338disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1339const local = aLocalExtension('a', { version: '1.0.1', contributes: <IExtensionContributions>{ localizations: [{ languageId: 'de', translations: [] }] } });1340const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1341instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);1342const extensions = await workbenchService.queryLocal();1343testObject.extension = extensions[0];13441345const gallery = aGalleryExtension('a', { uuid: local.identifier.id, version: '1.0.2' });1346installEvent.fire({ identifier: gallery.identifier, source: gallery, profileLocation: null! });1347didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', { ...gallery, ...{ contributes: <IExtensionContributions>{ localizations: [{ languageId: 'de', translations: [] }] } } }, gallery), profileLocation: null! }]);1348assert.ok(!testObject.enabled);1349});13501351test('Test Runtime State when extension is not installed but extension from different server is installed and running', async () => {1352// multi server setup1353const gallery = aGalleryExtension('a');1354const localExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file('pub.a') });1355const remoteExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1356const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), createExtensionManagementService([remoteExtension]));1357instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1358instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1359const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1360instantiationService.stub(IExtensionService, {1361extensions: [toExtensionDescription(remoteExtension)],1362onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1363canAddExtension: (extension) => false,1364whenInstalledExtensionsRegistered: () => Promise.resolve(true)1365});1366const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1367instantiationService.set(IExtensionsWorkbenchService, workbenchService);13681369const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1370disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1371instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));13721373await workbenchService.queryGallery(CancellationToken.None);1374const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1375testObject.extension = extensions[0];1376assert.ok(testObject.extension);1377assert.ok(!testObject.enabled);1378});13791380test('Test Runtime State when extension is uninstalled but extension from different server is installed and running', async () => {1381// multi server setup1382const gallery = aGalleryExtension('a');1383const localExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file('pub.a') });1384const remoteExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1385const localExtensionManagementService = createExtensionManagementService([localExtension]);1386const uninstallEvent = new Emitter<UninstallExtensionEvent>();1387const onDidUninstallEvent = new Emitter<{ identifier: IExtensionIdentifier; profileLocation: URI }>();1388localExtensionManagementService.onUninstallExtension = uninstallEvent.event;1389localExtensionManagementService.onDidUninstallExtension = onDidUninstallEvent.event;1390const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, localExtensionManagementService, createExtensionManagementService([remoteExtension]));1391instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1392instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1393const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1394instantiationService.stub(IExtensionService, {1395extensions: [toExtensionDescription(remoteExtension)],1396onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1397canAddExtension: (extension) => false,1398whenInstalledExtensionsRegistered: () => Promise.resolve(true)1399});1400const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1401instantiationService.set(IExtensionsWorkbenchService, workbenchService);14021403const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1404disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1405instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));14061407await workbenchService.queryGallery(CancellationToken.None);1408const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1409testObject.extension = extensions[0];1410assert.ok(testObject.extension);1411assert.ok(!testObject.enabled);14121413uninstallEvent.fire({ identifier: localExtension.identifier, profileLocation: null! });1414didUninstallEvent.fire({ identifier: localExtension.identifier, profileLocation: null! });14151416assert.ok(!testObject.enabled);1417});14181419test('Test Runtime State when workspace extension is disabled on local server and installed in remote server', async () => {1420// multi server setup1421const gallery = aGalleryExtension('a');1422const remoteExtensionManagementService = createExtensionManagementService([]);1423const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();1424remoteExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;1425const localExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file('pub.a') });1426const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), remoteExtensionManagementService);1427instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1428instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1429const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1430instantiationService.set(IExtensionsWorkbenchService, workbenchService);14311432const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1433instantiationService.stub(IExtensionService, {1434extensions: [],1435onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1436canAddExtension: (extension) => false,1437whenInstalledExtensionsRegistered: () => Promise.resolve(true)1438});1439const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1440disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1441instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));14421443await workbenchService.queryGallery(CancellationToken.None);1444const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1445testObject.extension = extensions[0];1446assert.ok(testObject.extension);1447assert.ok(!testObject.enabled);14481449const remoteExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1450const promise = Event.toPromise(testObject.onDidChange);1451onDidInstallEvent.fire([{ identifier: remoteExtension.identifier, local: remoteExtension, operation: InstallOperation.Install, profileLocation: null! }]);14521453await promise;1454assert.ok(testObject.enabled);1455assert.strictEqual(testObject.tooltip, `Please reload window to enable this extension.`);1456});14571458test('Test Runtime State when ui extension is disabled on remote server and installed in local server', async () => {1459// multi server setup1460const gallery = aGalleryExtension('a');1461const localExtensionManagementService = createExtensionManagementService([]);1462const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();1463localExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;1464const remoteExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1465const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, localExtensionManagementService, createExtensionManagementService([remoteExtension]));1466instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1467instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1468const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1469instantiationService.set(IExtensionsWorkbenchService, workbenchService);14701471const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1472instantiationService.stub(IExtensionService, {1473extensions: [],1474onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1475canAddExtension: (extension) => false,1476whenInstalledExtensionsRegistered: () => Promise.resolve(true)1477});1478const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1479disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1480instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));14811482await workbenchService.queryGallery(CancellationToken.None);1483const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);1484testObject.extension = extensions[0];1485assert.ok(testObject.extension);1486assert.ok(!testObject.enabled);14871488const localExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file('pub.a') });1489const promise = Event.toPromise(Event.filter(testObject.onDidChange, () => testObject.enabled));1490onDidInstallEvent.fire([{ identifier: localExtension.identifier, local: localExtension, operation: InstallOperation.Install, profileLocation: null! }]);14911492await promise;1493assert.ok(testObject.enabled);1494assert.strictEqual(testObject.tooltip, `Please reload window to enable this extension.`);1495});14961497test('Test Runtime State for remote ui extension is disabled when it is installed and enabled in local server', async () => {1498// multi server setup1499const gallery = aGalleryExtension('a');1500const localExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file('pub.a') });1501const localExtensionManagementService = createExtensionManagementService([localExtension]);1502const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();1503localExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;1504const remoteExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1505const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, localExtensionManagementService, createExtensionManagementService([remoteExtension]));1506instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1507instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1508const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1509instantiationService.stub(IExtensionService, {1510extensions: [toExtensionDescription(localExtension)],1511onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1512canAddExtension: (extension) => false,1513whenInstalledExtensionsRegistered: () => Promise.resolve(true)1514});1515const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1516instantiationService.set(IExtensionsWorkbenchService, workbenchService);15171518const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1519disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1520instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));15211522await workbenchService.queryGallery(CancellationToken.None);1523const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);1524testObject.extension = extensions[0];1525assert.ok(testObject.extension);1526assert.ok(!testObject.enabled);1527});15281529test('Test Runtime State for remote workspace+ui extension is enabled when it is installed and enabled in local server', async () => {1530// multi server setup1531const gallery = aGalleryExtension('a');1532const localExtension = aLocalExtension('a', { extensionKind: ['workspace', 'ui'] }, { location: URI.file('pub.a') });1533const localExtensionManagementService = createExtensionManagementService([localExtension]);1534const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();1535localExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;1536const remoteExtension = aLocalExtension('a', { extensionKind: ['workspace', 'ui'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1537const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, localExtensionManagementService, createExtensionManagementService([remoteExtension]));1538instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1539instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1540const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1541instantiationService.set(IExtensionsWorkbenchService, workbenchService);15421543const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1544instantiationService.stub(IExtensionService, {1545extensions: [toExtensionDescription(localExtension)],1546onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1547canAddExtension: (extension) => false,1548whenInstalledExtensionsRegistered: () => Promise.resolve(true)1549});1550const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1551disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1552instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));15531554await workbenchService.queryGallery(CancellationToken.None);1555const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);1556testObject.extension = extensions[0];1557assert.ok(testObject.extension);1558assert.ok(testObject.enabled);1559});15601561test('Test Runtime State for local ui+workspace extension is enabled when it is installed and enabled in remote server', async () => {1562// multi server setup1563const gallery = aGalleryExtension('a');1564const localExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'] }, { location: URI.file('pub.a') });1565const remoteExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1566const remoteExtensionManagementService = createExtensionManagementService([remoteExtension]);1567const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();1568remoteExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;1569const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), remoteExtensionManagementService);1570instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1571instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1572const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1573instantiationService.set(IExtensionsWorkbenchService, workbenchService);15741575const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1576instantiationService.stub(IExtensionService, {1577extensions: [toExtensionDescription(remoteExtension)],1578onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1579canAddExtension: (extension) => false,1580whenInstalledExtensionsRegistered: () => Promise.resolve(true)1581});1582const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1583disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1584instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));15851586await workbenchService.queryGallery(CancellationToken.None);1587const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1588testObject.extension = extensions[0];1589assert.ok(testObject.extension);1590assert.ok(testObject.enabled);1591});15921593test('Test Runtime State for local workspace+ui extension is enabled when it is installed in both servers but running in local server', async () => {1594// multi server setup1595const gallery = aGalleryExtension('a');1596const localExtension = aLocalExtension('a', { extensionKind: ['workspace', 'ui'] }, { location: URI.file('pub.a') });1597const localExtensionManagementService = createExtensionManagementService([localExtension]);1598const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();1599localExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;1600const remoteExtension = aLocalExtension('a', { extensionKind: ['workspace', 'ui'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1601const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, localExtensionManagementService, createExtensionManagementService([remoteExtension]));1602instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1603instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1604const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1605instantiationService.set(IExtensionsWorkbenchService, workbenchService);16061607const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1608instantiationService.stub(IExtensionService, {1609extensions: [toExtensionDescription(localExtension)],1610onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1611canAddExtension: (extension) => false,1612whenInstalledExtensionsRegistered: () => Promise.resolve(true)1613});1614const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1615disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1616instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));16171618await workbenchService.queryGallery(CancellationToken.None);1619const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1620testObject.extension = extensions[0];1621assert.ok(testObject.extension);1622assert.ok(testObject.enabled);1623});16241625test('Test Runtime State for remote ui+workspace extension is enabled when it is installed on both servers but running in remote server', async () => {1626// multi server setup1627const gallery = aGalleryExtension('a');1628const localExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'] }, { location: URI.file('pub.a') });1629const remoteExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1630const remoteExtensionManagementService = createExtensionManagementService([remoteExtension]);1631const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();1632remoteExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;1633const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), remoteExtensionManagementService);1634instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1635instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1636const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1637instantiationService.set(IExtensionsWorkbenchService, workbenchService);16381639const onDidChangeExtensionsEmitter = new Emitter<{ added: IExtensionDescription[]; removed: IExtensionDescription[] }>();1640instantiationService.stub(IExtensionService, {1641extensions: [toExtensionDescription(remoteExtension)],1642onDidChangeExtensions: onDidChangeExtensionsEmitter.event,1643canAddExtension: (extension) => false,1644whenInstalledExtensionsRegistered: () => Promise.resolve(true)1645});1646const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1647disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1648instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));16491650await workbenchService.queryGallery(CancellationToken.None);1651const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);1652testObject.extension = extensions[0];1653assert.ok(testObject.extension);1654assert.ok(testObject.enabled);1655});16561657test('Test Runtime State when ui+workspace+web extension is installed in web and remote and running in remote', async () => {1658// multi server setup1659const gallery = aGalleryExtension('a');1660const webExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'], 'browser': 'browser.js' }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeUserData }) });1661const remoteExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'], 'browser': 'browser.js' }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });1662const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, null, createExtensionManagementService([remoteExtension]), createExtensionManagementService([webExtension]));1663instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1664instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1665instantiationService.stub(IExtensionService, {1666extensions: [toExtensionDescription(remoteExtension)],1667onDidChangeExtensions: Event.None,1668canAddExtension: (extension) => false,1669whenInstalledExtensionsRegistered: () => Promise.resolve(true)1670});1671const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1672instantiationService.set(IExtensionsWorkbenchService, workbenchService);16731674const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1675disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1676instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));16771678await workbenchService.queryGallery(CancellationToken.None);1679const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);1680testObject.extension = extensions[0];1681assert.ok(testObject.extension);1682assert.ok(!testObject.enabled);1683});16841685test('Test Runtime State when workspace+ui+web extension is installed in web and local and running in local', async () => {1686// multi server setup1687const gallery = aGalleryExtension('a');1688const webExtension = aLocalExtension('a', { extensionKind: ['workspace', 'ui'], 'browser': 'browser.js' }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeUserData }) });1689const localExtension = aLocalExtension('a', { extensionKind: ['workspace', 'ui'], 'browser': 'browser.js' }, { location: URI.file('pub.a') });1690const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), null, createExtensionManagementService([webExtension]));1691instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1692instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1693instantiationService.stub(IExtensionService, {1694extensions: [toExtensionDescription(localExtension)],1695onDidChangeExtensions: Event.None,1696canAddExtension: (extension) => false,1697whenInstalledExtensionsRegistered: () => Promise.resolve(true)1698});1699const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1700instantiationService.set(IExtensionsWorkbenchService, workbenchService);17011702const testObject: ExtensionsActions.ExtensionRuntimeStateAction = disposables.add(instantiationService.createInstance(ExtensionsActions.ExtensionRuntimeStateAction));1703disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));1704instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));17051706await workbenchService.queryGallery(CancellationToken.None);1707const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);1708testObject.extension = extensions[0];1709assert.ok(testObject.extension);1710assert.ok(!testObject.enabled);1711});1712});17131714suite('RemoteInstallAction', () => {17151716const disposables = ensureNoDisposablesAreLeakedInTestSuite();17171718setup(() => setupTest(disposables));17191720test('Test remote install action is enabled for local workspace extension', async () => {1721// multi server setup1722const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });1723const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]));1724instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1725instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1726const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1727instantiationService.set(IExtensionsWorkbenchService, workbenchService);17281729instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1730const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1731disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));17321733const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1734await workbenchService.queryGallery(CancellationToken.None);1735testObject.extension = extensions[0];1736assert.ok(testObject.enabled);1737assert.strictEqual('Install in remote', testObject.label);1738assert.strictEqual('extension-action label prominent install-other-server', testObject.class);1739});17401741test('Test remote install action when installing local workspace extension', async () => {1742// multi server setup1743const remoteExtensionManagementService = createExtensionManagementService();1744const onInstallExtension = new Emitter<InstallExtensionEvent>();1745remoteExtensionManagementService.onInstallExtension = onInstallExtension.event;1746const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });1747const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]), remoteExtensionManagementService);1748instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1749instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1750const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1751instantiationService.stub(IExtensionsWorkbenchService, workbenchService, 'open', undefined);1752instantiationService.set(IExtensionsWorkbenchService, workbenchService);17531754const gallery = aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier });1755instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));1756const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1757disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));17581759const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1760await workbenchService.queryGallery(CancellationToken.None);1761testObject.extension = extensions[0];1762assert.ok(testObject.enabled);1763assert.strictEqual('Install in remote', testObject.label);1764assert.strictEqual('extension-action label prominent install-other-server', testObject.class);17651766onInstallExtension.fire({ identifier: localWorkspaceExtension.identifier, source: gallery, profileLocation: null! });1767assert.ok(testObject.enabled);1768assert.strictEqual('Installing', testObject.label);1769assert.strictEqual('extension-action label install-other-server installing', testObject.class);1770});17711772test('Test remote install action when installing local workspace extension is finished', async () => {1773// multi server setup1774const remoteExtensionManagementService = createExtensionManagementService();1775const onInstallExtension = new Emitter<InstallExtensionEvent>();1776remoteExtensionManagementService.onInstallExtension = onInstallExtension.event;1777const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();1778remoteExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;1779const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });1780const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]), remoteExtensionManagementService);1781instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1782instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1783const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1784instantiationService.stub(IExtensionsWorkbenchService, workbenchService, 'open', undefined);1785instantiationService.set(IExtensionsWorkbenchService, workbenchService);17861787const gallery = aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier });1788instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));1789const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1790disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));17911792const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1793await workbenchService.queryGallery(CancellationToken.None);1794testObject.extension = extensions[0];1795assert.ok(testObject.enabled);1796assert.strictEqual('Install in remote', testObject.label);1797assert.strictEqual('extension-action label prominent install-other-server', testObject.class);17981799onInstallExtension.fire({ identifier: localWorkspaceExtension.identifier, source: gallery, profileLocation: null! });1800assert.ok(testObject.enabled);1801assert.strictEqual('Installing', testObject.label);1802assert.strictEqual('extension-action label install-other-server installing', testObject.class);18031804const installedExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });1805const promise = Event.toPromise(testObject.onDidChange);1806onDidInstallEvent.fire([{ identifier: installedExtension.identifier, local: installedExtension, operation: InstallOperation.Install, profileLocation: null! }]);1807await promise;1808assert.ok(!testObject.enabled);1809});18101811test('Test remote install action is enabled for disabled local workspace extension', async () => {1812// multi server setup1813const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });1814const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]));1815instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1816instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1817const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1818instantiationService.set(IExtensionsWorkbenchService, workbenchService);18191820const remoteWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });1821await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([remoteWorkspaceExtension], EnablementState.DisabledGlobally);1822instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1823const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1824disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));18251826const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1827await workbenchService.queryGallery(CancellationToken.None);1828testObject.extension = extensions[0];1829assert.ok(testObject.enabled);1830assert.strictEqual('Install in remote', testObject.label);1831assert.strictEqual('extension-action label prominent install-other-server', testObject.class);1832});18331834test('Test remote install action is enabled local workspace+ui extension', async () => {1835// multi server setup1836const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace', 'ui'] }, { location: URI.file(`pub.a`) });1837const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]));1838instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1839instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1840const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1841instantiationService.set(IExtensionsWorkbenchService, workbenchService);18421843await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([localWorkspaceExtension], EnablementState.DisabledGlobally);1844instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1845const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1846disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));18471848const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1849await workbenchService.queryGallery(CancellationToken.None);1850testObject.extension = extensions[0];1851assert.ok(testObject.enabled);1852assert.strictEqual('Install in remote', testObject.label);1853assert.strictEqual('extension-action label prominent install-other-server', testObject.class);1854});18551856test('Test remote install action is enabled for local ui+workapace extension if can install is true', async () => {1857// multi server setup1858const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'] }, { location: URI.file(`pub.a`) });1859const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]));1860instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1861instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1862const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1863instantiationService.set(IExtensionsWorkbenchService, workbenchService);18641865await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([localWorkspaceExtension], EnablementState.DisabledGlobally);1866instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1867const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, true));1868disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));18691870const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1871await workbenchService.queryGallery(CancellationToken.None);1872testObject.extension = extensions[0];1873assert.ok(testObject.enabled);1874assert.strictEqual('Install in remote', testObject.label);1875assert.strictEqual('extension-action label prominent install-other-server', testObject.class);1876});18771878test('Test remote install action is disabled for local ui+workapace extension if can install is false', async () => {1879// multi server setup1880const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'] }, { location: URI.file(`pub.a`) });1881const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]));1882instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1883instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1884const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1885instantiationService.set(IExtensionsWorkbenchService, workbenchService);18861887await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([localWorkspaceExtension], EnablementState.DisabledGlobally);1888instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1889const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1890disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));18911892const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1893await workbenchService.queryGallery(CancellationToken.None);1894testObject.extension = extensions[0];1895assert.ok(!testObject.enabled);1896});18971898test('Test remote install action is disabled when extension is not set', async () => {1899// multi server setup1900const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });1901const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]));1902instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1903const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1904instantiationService.set(IExtensionsWorkbenchService, workbenchService);19051906instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1907const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1908disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));19091910await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1911await workbenchService.queryGallery(CancellationToken.None);1912assert.ok(!testObject.enabled);1913});19141915test('Test remote install action is disabled for extension which is not installed', async () => {1916// multi server setup1917const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService);1918instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1919instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1920const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1921instantiationService.set(IExtensionsWorkbenchService, workbenchService);19221923instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a')));1924const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1925disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));19261927const pager = await workbenchService.queryGallery(CancellationToken.None);1928testObject.extension = pager.firstPage[0];1929assert.ok(testObject.extension);1930assert.ok(!testObject.enabled);1931});19321933test('Test remote install action is disabled for local workspace extension which is disabled in env', async () => {1934// multi server setup1935const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });1936const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]));1937const environmentService = { disableExtensions: true } as INativeWorkbenchEnvironmentService;1938instantiationService.stub(IEnvironmentService, environmentService);1939instantiationService.stub(INativeEnvironmentService, environmentService);1940instantiationService.stub(IWorkbenchEnvironmentService, environmentService);1941instantiationService.stub(INativeWorkbenchEnvironmentService, environmentService);1942instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1943instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1944const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1945instantiationService.set(IExtensionsWorkbenchService, workbenchService);19461947instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1948const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1949disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));19501951const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1952await workbenchService.queryGallery(CancellationToken.None);1953testObject.extension = extensions[0];1954assert.ok(testObject.extension);1955assert.ok(!testObject.enabled);1956});19571958test('Test remote install action is disabled when remote server is not available', async () => {1959// single server setup1960const workbenchService = instantiationService.get(IExtensionsWorkbenchService);1961const extensionManagementServerService = instantiationService.get(IExtensionManagementServerService);1962const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });1963instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [localWorkspaceExtension]);1964instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1965const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1966disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));19671968const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1969await workbenchService.queryGallery(CancellationToken.None);1970testObject.extension = extensions[0];1971assert.ok(testObject.extension);1972assert.ok(!testObject.enabled);1973});19741975test('Test remote install action is disabled for local workspace extension if it is uninstalled locally', async () => {1976// multi server setup1977const extensionManagementService = instantiationService.get(IExtensionManagementService) as IProfileAwareExtensionManagementService;1978const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, extensionManagementService);1979instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);1980instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));1981const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });1982instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [localWorkspaceExtension]);1983const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));1984instantiationService.set(IExtensionsWorkbenchService, workbenchService);19851986instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));1987const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));1988disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));19891990const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);1991await workbenchService.queryGallery(CancellationToken.None);1992testObject.extension = extensions[0];1993assert.ok(testObject.enabled);1994assert.strictEqual('Install in remote', testObject.label);19951996uninstallEvent.fire({ identifier: localWorkspaceExtension.identifier, profileLocation: null! });1997assert.ok(!testObject.enabled);1998});19992000test('Test remote install action is disabled for local workspace extension if it is installed in remote', async () => {2001// multi server setup2002const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });2003const remoteWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2004const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]), createExtensionManagementService([remoteWorkspaceExtension]));2005instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2006instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2007const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2008instantiationService.set(IExtensionsWorkbenchService, workbenchService);20092010instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));2011const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));2012disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));20132014const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);2015await workbenchService.queryGallery(CancellationToken.None);2016testObject.extension = extensions[0];2017assert.ok(testObject.extension);2018assert.ok(!testObject.enabled);2019});20202021test('Test remote install action is enabled for local workspace extension if it has not gallery', async () => {2022// multi server setup2023const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });2024const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]));2025instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2026instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2027const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2028instantiationService.set(IExtensionsWorkbenchService, workbenchService);20292030instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));2031const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));2032disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));20332034const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);2035testObject.extension = extensions[0];2036assert.ok(testObject.extension);2037assert.ok(testObject.enabled);2038});20392040test('Test remote install action is disabled for local workspace system extension', async () => {2041// multi server setup2042const localWorkspaceSystemExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`), type: ExtensionType.System });2043const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceSystemExtension]));2044instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2045instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2046const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2047instantiationService.set(IExtensionsWorkbenchService, workbenchService);20482049instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceSystemExtension.identifier })));2050const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));2051disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));20522053const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);2054testObject.extension = extensions[0];2055assert.ok(testObject.extension);2056assert.ok(!testObject.enabled);2057});20582059test('Test remote install action is disabled for local ui extension if it is not installed in remote', async () => {2060// multi server setup2061const localUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });2062const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localUIExtension]));2063instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2064instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2065const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2066instantiationService.set(IExtensionsWorkbenchService, workbenchService);20672068instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localUIExtension.identifier })));2069const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));2070disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));20712072const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);2073testObject.extension = extensions[0];2074assert.ok(testObject.extension);2075assert.ok(!testObject.enabled);2076});20772078test('Test remote install action is disabled for local ui extension if it is also installed in remote', async () => {2079// multi server setup2080const localUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });2081const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2082const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localUIExtension]), createExtensionManagementService([remoteUIExtension]));2083instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2084instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2085const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2086instantiationService.set(IExtensionsWorkbenchService, workbenchService);20872088instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localUIExtension.identifier })));2089const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));2090disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));20912092const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);2093testObject.extension = extensions[0];2094assert.ok(testObject.extension);2095assert.ok(!testObject.enabled);2096});20972098test('Test remote install action is enabled for locally installed language pack extension', async () => {2099// multi server setup2100const languagePackExtension = aLocalExtension('a', { contributes: <IExtensionContributions>{ localizations: [{ languageId: 'de', translations: [] }] } }, { location: URI.file(`pub.a`) });2101const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([languagePackExtension]));2102instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2103instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2104const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2105instantiationService.set(IExtensionsWorkbenchService, workbenchService);21062107instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: languagePackExtension.identifier })));2108const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));2109disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));21102111const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);2112await workbenchService.queryGallery(CancellationToken.None);2113testObject.extension = extensions[0];2114assert.ok(testObject.enabled);2115assert.strictEqual('Install in remote', testObject.label);2116assert.strictEqual('extension-action label prominent install-other-server', testObject.class);2117});21182119test('Test remote install action is disabled if local language pack extension is uninstalled', async () => {2120// multi server setup2121const extensionManagementService = instantiationService.get(IExtensionManagementService) as IProfileAwareExtensionManagementService;2122const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, extensionManagementService);2123instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2124instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2125const languagePackExtension = aLocalExtension('a', { contributes: <IExtensionContributions>{ localizations: [{ languageId: 'de', translations: [] }] } }, { location: URI.file(`pub.a`) });2126instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [languagePackExtension]);2127const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2128instantiationService.set(IExtensionsWorkbenchService, workbenchService);21292130instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: languagePackExtension.identifier })));2131const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false));2132disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));21332134const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);2135await workbenchService.queryGallery(CancellationToken.None);2136testObject.extension = extensions[0];2137assert.ok(testObject.enabled);2138assert.strictEqual('Install in remote', testObject.label);21392140uninstallEvent.fire({ identifier: languagePackExtension.identifier, profileLocation: null! });2141assert.ok(!testObject.enabled);2142});2143});21442145suite('LocalInstallAction', () => {21462147const disposables = ensureNoDisposablesAreLeakedInTestSuite();21482149setup(() => setupTest(disposables));21502151test('Test local install action is enabled for remote ui extension', async () => {2152// multi server setup2153const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2154const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteUIExtension]));2155instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2156instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2157const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2158instantiationService.set(IExtensionsWorkbenchService, workbenchService);21592160instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier })));2161const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2162disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));21632164const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2165await workbenchService.queryGallery(CancellationToken.None);2166testObject.extension = extensions[0];2167assert.ok(testObject.enabled);2168assert.strictEqual('Install Locally', testObject.label);2169assert.strictEqual('extension-action label prominent install-other-server', testObject.class);2170});21712172test('Test local install action is enabled for remote ui+workspace extension', async () => {2173// multi server setup2174const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2175const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteUIExtension]));2176instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2177instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2178const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2179instantiationService.set(IExtensionsWorkbenchService, workbenchService);21802181instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier })));2182const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2183disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));21842185const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2186await workbenchService.queryGallery(CancellationToken.None);2187testObject.extension = extensions[0];2188assert.ok(testObject.enabled);2189assert.strictEqual('Install Locally', testObject.label);2190assert.strictEqual('extension-action label prominent install-other-server', testObject.class);2191});21922193test('Test local install action when installing remote ui extension', async () => {2194// multi server setup2195const localExtensionManagementService = createExtensionManagementService();2196const onInstallExtension = new Emitter<InstallExtensionEvent>();2197localExtensionManagementService.onInstallExtension = onInstallExtension.event;2198const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2199const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, localExtensionManagementService, createExtensionManagementService([remoteUIExtension]));2200instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2201instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2202const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2203instantiationService.stub(IExtensionsWorkbenchService, workbenchService, 'open', undefined);2204instantiationService.set(IExtensionsWorkbenchService, workbenchService);22052206const gallery = aGalleryExtension('a', { identifier: remoteUIExtension.identifier });2207instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));2208const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2209disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));22102211const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2212await workbenchService.queryGallery(CancellationToken.None);2213testObject.extension = extensions[0];2214assert.ok(testObject.enabled);2215assert.strictEqual('Install Locally', testObject.label);2216assert.strictEqual('extension-action label prominent install-other-server', testObject.class);22172218onInstallExtension.fire({ identifier: remoteUIExtension.identifier, source: gallery, profileLocation: null! });2219assert.ok(testObject.enabled);2220assert.strictEqual('Installing', testObject.label);2221assert.strictEqual('extension-action label install-other-server installing', testObject.class);2222});22232224test('Test local install action when installing remote ui extension is finished', async () => {2225// multi server setup2226const localExtensionManagementService = createExtensionManagementService();2227const onInstallExtension = new Emitter<InstallExtensionEvent>();2228localExtensionManagementService.onInstallExtension = onInstallExtension.event;2229const onDidInstallEvent = new Emitter<readonly InstallExtensionResult[]>();2230localExtensionManagementService.onDidInstallExtensions = onDidInstallEvent.event;2231const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2232const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, localExtensionManagementService, createExtensionManagementService([remoteUIExtension]));2233instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2234instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2235const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2236instantiationService.stub(IExtensionsWorkbenchService, workbenchService, 'open', undefined);2237instantiationService.set(IExtensionsWorkbenchService, workbenchService);22382239const gallery = aGalleryExtension('a', { identifier: remoteUIExtension.identifier });2240instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));2241const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2242disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));22432244const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2245await workbenchService.queryGallery(CancellationToken.None);2246testObject.extension = extensions[0];2247assert.ok(testObject.enabled);2248assert.strictEqual('Install Locally', testObject.label);2249assert.strictEqual('extension-action label prominent install-other-server', testObject.class);22502251onInstallExtension.fire({ identifier: remoteUIExtension.identifier, source: gallery, profileLocation: null! });2252assert.ok(testObject.enabled);2253assert.strictEqual('Installing', testObject.label);2254assert.strictEqual('extension-action label install-other-server installing', testObject.class);22552256const installedExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });2257const promise = Event.toPromise(testObject.onDidChange);2258onDidInstallEvent.fire([{ identifier: installedExtension.identifier, local: installedExtension, operation: InstallOperation.Install, profileLocation: null! }]);2259await promise;2260assert.ok(!testObject.enabled);2261});22622263test('Test local install action is enabled for disabled remote ui extension', async () => {2264// multi server setup2265const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2266const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteUIExtension]));2267instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2268instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2269const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2270instantiationService.set(IExtensionsWorkbenchService, workbenchService);22712272const localUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });2273await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([localUIExtension], EnablementState.DisabledGlobally);2274instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier })));2275const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2276disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));22772278const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2279await workbenchService.queryGallery(CancellationToken.None);2280testObject.extension = extensions[0];2281assert.ok(testObject.enabled);2282assert.strictEqual('Install Locally', testObject.label);2283assert.strictEqual('extension-action label prominent install-other-server', testObject.class);2284});22852286test('Test local install action is disabled when extension is not set', async () => {2287// multi server setup2288const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2289const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteUIExtension]));2290instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2291const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2292instantiationService.set(IExtensionsWorkbenchService, workbenchService);22932294instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier })));2295const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2296disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));22972298await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2299await workbenchService.queryGallery(CancellationToken.None);2300assert.ok(!testObject.enabled);2301});23022303test('Test local install action is disabled for extension which is not installed', async () => {2304// multi server setup2305const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService);2306instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2307instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2308const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2309instantiationService.set(IExtensionsWorkbenchService, workbenchService);23102311instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a')));2312const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2313disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));23142315const pager = await workbenchService.queryGallery(CancellationToken.None);2316testObject.extension = pager.firstPage[0];2317assert.ok(testObject.extension);2318assert.ok(!testObject.enabled);2319});23202321test('Test local install action is disabled for remote ui extension which is disabled in env', async () => {2322// multi server setup2323const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2324const environmentService = { disableExtensions: true } as INativeWorkbenchEnvironmentService;2325instantiationService.stub(IEnvironmentService, environmentService);2326instantiationService.stub(INativeEnvironmentService, environmentService);2327instantiationService.stub(IWorkbenchEnvironmentService, environmentService);2328instantiationService.stub(INativeWorkbenchEnvironmentService, environmentService);2329const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteUIExtension]));2330instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2331instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2332const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2333instantiationService.set(IExtensionsWorkbenchService, workbenchService);23342335instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier })));2336const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2337disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));23382339const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2340await workbenchService.queryGallery(CancellationToken.None);2341testObject.extension = extensions[0];2342assert.ok(testObject.extension);2343assert.ok(!testObject.enabled);2344});23452346test('Test local install action is disabled when local server is not available', async () => {2347// single server setup2348const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2349const extensionManagementServerService = aSingleRemoteExtensionManagementServerService(instantiationService, createExtensionManagementService([remoteUIExtension]));2350instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2351instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2352const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2353instantiationService.set(IExtensionsWorkbenchService, workbenchService);23542355instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier })));2356const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2357disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));23582359const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2360await workbenchService.queryGallery(CancellationToken.None);2361testObject.extension = extensions[0];2362assert.ok(testObject.extension);2363assert.ok(!testObject.enabled);2364});23652366test('Test local install action is disabled for remote ui extension if it is installed in local', async () => {2367// multi server setup2368const localUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });2369const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2370const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localUIExtension]), createExtensionManagementService([remoteUIExtension]));2371instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2372instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2373const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2374instantiationService.set(IExtensionsWorkbenchService, workbenchService);23752376instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localUIExtension.identifier })));2377const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2378disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));23792380const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2381await workbenchService.queryGallery(CancellationToken.None);2382testObject.extension = extensions[0];2383assert.ok(testObject.extension);2384assert.ok(!testObject.enabled);2385});23862387test('Test local install action is disabled for remoteUI extension if it is uninstalled locally', async () => {2388// multi server setup2389const extensionManagementService = instantiationService.get(IExtensionManagementService) as IProfileAwareExtensionManagementService;2390const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), extensionManagementService);2391instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2392instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2393const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2394instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [remoteUIExtension]);2395const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2396instantiationService.set(IExtensionsWorkbenchService, workbenchService);23972398instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier })));2399const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2400disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));24012402const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2403await workbenchService.queryGallery(CancellationToken.None);2404testObject.extension = extensions[0];2405assert.ok(testObject.enabled);2406assert.strictEqual('Install Locally', testObject.label);24072408uninstallEvent.fire({ identifier: remoteUIExtension.identifier, profileLocation: null! });2409assert.ok(!testObject.enabled);2410});24112412test('Test local install action is enabled for remote UI extension if it has gallery', async () => {2413// multi server setup2414const remoteUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2415const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteUIExtension]));2416instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2417instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2418const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2419instantiationService.set(IExtensionsWorkbenchService, workbenchService);24202421instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier })));2422const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2423disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));24242425const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2426testObject.extension = extensions[0];2427assert.ok(testObject.extension);2428assert.ok(testObject.enabled);2429});24302431test('Test local install action is disabled for remote UI system extension', async () => {2432// multi server setup2433const remoteUISystemExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }), type: ExtensionType.System });2434const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteUISystemExtension]));2435instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2436instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2437const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2438instantiationService.set(IExtensionsWorkbenchService, workbenchService);24392440instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUISystemExtension.identifier })));2441const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2442disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));24432444const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2445testObject.extension = extensions[0];2446assert.ok(testObject.extension);2447assert.ok(!testObject.enabled);2448});24492450test('Test local install action is disabled for remote workspace extension if it is not installed in local', async () => {2451// multi server setup2452const remoteWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2453const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteWorkspaceExtension]));2454instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2455instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2456const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2457instantiationService.set(IExtensionsWorkbenchService, workbenchService);24582459instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteWorkspaceExtension.identifier })));2460const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2461disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));24622463const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2464testObject.extension = extensions[0];2465assert.ok(testObject.extension);2466assert.ok(!testObject.enabled);2467});24682469test('Test local install action is disabled for remote workspace extension if it is also installed in local', async () => {2470// multi server setup2471const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspae'] }, { location: URI.file(`pub.a`) });2472const remoteWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2473const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localWorkspaceExtension]), createExtensionManagementService([remoteWorkspaceExtension]));2474instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2475instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2476const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2477instantiationService.set(IExtensionsWorkbenchService, workbenchService);24782479instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier })));2480const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2481disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));24822483const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2484testObject.extension = extensions[0];2485assert.ok(testObject.extension);2486assert.ok(!testObject.enabled);2487});24882489test('Test local install action is enabled for remotely installed language pack extension', async () => {2490// multi server setup2491const languagePackExtension = aLocalExtension('a', { contributes: <IExtensionContributions>{ localizations: [{ languageId: 'de', translations: [] }] } }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2492const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([languagePackExtension]));2493instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2494instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2495const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2496instantiationService.set(IExtensionsWorkbenchService, workbenchService);24972498instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: languagePackExtension.identifier })));2499const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2500disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));25012502const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2503await workbenchService.queryGallery(CancellationToken.None);2504testObject.extension = extensions[0];2505assert.ok(testObject.enabled);2506assert.strictEqual('Install Locally', testObject.label);2507assert.strictEqual('extension-action label prominent install-other-server', testObject.class);2508});25092510test('Test local install action is disabled if remote language pack extension is uninstalled', async () => {2511// multi server setup2512const extensionManagementService = instantiationService.get(IExtensionManagementService) as IProfileAwareExtensionManagementService;2513const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), extensionManagementService);2514instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);2515instantiationService.stub(IWorkbenchExtensionEnablementService, disposables.add(new TestExtensionEnablementService(instantiationService)));2516const languagePackExtension = aLocalExtension('a', { contributes: <IExtensionContributions>{ localizations: [{ languageId: 'de', translations: [] }] } }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });2517instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [languagePackExtension]);2518const workbenchService: IExtensionsWorkbenchService = disposables.add(instantiationService.createInstance(ExtensionsWorkbenchService));2519instantiationService.set(IExtensionsWorkbenchService, workbenchService);25202521instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: languagePackExtension.identifier })));2522const testObject = disposables.add(instantiationService.createInstance(ExtensionsActions.LocalInstallAction));2523disposables.add(instantiationService.createInstance(ExtensionContainers, [testObject]));25242525const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);2526await workbenchService.queryGallery(CancellationToken.None);2527testObject.extension = extensions[0];2528assert.ok(testObject.enabled);2529assert.strictEqual('Install Locally', testObject.label);25302531uninstallEvent.fire({ identifier: languagePackExtension.identifier, profileLocation: null! });2532assert.ok(!testObject.enabled);2533});25342535});25362537function aLocalExtension(name: string = 'someext', manifest: any = {}, properties: any = {}): ILocalExtension {2538manifest = { name, publisher: 'pub', version: '1.0.0', ...manifest };2539properties = {2540type: ExtensionType.User,2541location: URI.file(`pub.${name}`),2542identifier: { id: getGalleryExtensionId(manifest.publisher, manifest.name) },2543...properties,2544isValid: properties.isValid ?? true,2545};2546properties.isBuiltin = properties.type === ExtensionType.System;2547return <ILocalExtension>Object.create({ manifest, ...properties });2548}25492550function aGalleryExtension(name: string, properties: any = {}, galleryExtensionProperties: any = {}, assets: any = {}): IGalleryExtension {2551const targetPlatform = getTargetPlatform(platform, arch);2552const galleryExtension = <IGalleryExtension>Object.create({ name, publisher: 'pub', version: '1.0.0', allTargetPlatforms: [targetPlatform], properties: {}, assets: {}, isSigned: true, ...properties });2553galleryExtension.properties = { ...galleryExtension.properties, dependencies: [], targetPlatform, ...galleryExtensionProperties };2554galleryExtension.assets = { ...galleryExtension.assets, ...assets };2555galleryExtension.identifier = { id: getGalleryExtensionId(galleryExtension.publisher, galleryExtension.name), uuid: generateUuid() };2556galleryExtension.hasReleaseVersion = true;2557return <IGalleryExtension>galleryExtension;2558}25592560function aPage<T>(...objects: T[]): IPager<T> {2561return { firstPage: objects, total: objects.length, pageSize: objects.length, getPage: () => null! };2562}25632564function aSingleRemoteExtensionManagementServerService(instantiationService: TestInstantiationService, remoteExtensionManagementService?: IProfileAwareExtensionManagementService): IExtensionManagementServerService {2565const remoteExtensionManagementServer: IExtensionManagementServer = {2566id: 'vscode-remote',2567label: 'remote',2568extensionManagementService: remoteExtensionManagementService || createExtensionManagementService(),2569};2570return {2571_serviceBrand: undefined,2572localExtensionManagementServer: null,2573remoteExtensionManagementServer,2574webExtensionManagementServer: null,2575getExtensionManagementServer: (extension: IExtension) => {2576if (extension.location.scheme === Schemas.vscodeRemote) {2577return remoteExtensionManagementServer;2578}2579return null;2580},2581getExtensionInstallLocation(extension: IExtension): ExtensionInstallLocation | null {2582const server = this.getExtensionManagementServer(extension);2583return server === remoteExtensionManagementServer ? ExtensionInstallLocation.Remote : ExtensionInstallLocation.Local;2584}2585};2586}25872588function aMultiExtensionManagementServerService(instantiationService: TestInstantiationService, localExtensionManagementService?: IProfileAwareExtensionManagementService | null, remoteExtensionManagementService?: IProfileAwareExtensionManagementService | null, webExtensionManagementService?: IProfileAwareExtensionManagementService): IExtensionManagementServerService {2589const localExtensionManagementServer: IExtensionManagementServer | null = localExtensionManagementService === null ? null : {2590id: 'vscode-local',2591label: 'local',2592extensionManagementService: localExtensionManagementService || createExtensionManagementService(),2593};2594const remoteExtensionManagementServer: IExtensionManagementServer | null = remoteExtensionManagementService === null ? null : {2595id: 'vscode-remote',2596label: 'remote',2597extensionManagementService: remoteExtensionManagementService || createExtensionManagementService(),2598};2599const webExtensionManagementServer: IExtensionManagementServer | null = webExtensionManagementService ? {2600id: 'vscode-web',2601label: 'web',2602extensionManagementService: webExtensionManagementService,2603} : null;2604return {2605_serviceBrand: undefined,2606localExtensionManagementServer,2607remoteExtensionManagementServer,2608webExtensionManagementServer,2609getExtensionManagementServer: (extension: IExtension) => {2610if (extension.location.scheme === Schemas.file) {2611return localExtensionManagementServer;2612}2613if (extension.location.scheme === Schemas.vscodeRemote) {2614return remoteExtensionManagementServer;2615}2616if (extension.location.scheme === Schemas.vscodeUserData) {2617return webExtensionManagementServer;2618}2619throw new Error('');2620},2621getExtensionInstallLocation(extension: IExtension): ExtensionInstallLocation | null {2622const server = this.getExtensionManagementServer(extension);2623if (server === null) {2624return null;2625}2626if (server === remoteExtensionManagementServer) {2627return ExtensionInstallLocation.Remote;2628}2629if (server === webExtensionManagementServer) {2630return ExtensionInstallLocation.Web;2631}2632return ExtensionInstallLocation.Local;2633}2634};2635}26362637function createExtensionManagementService(installed: ILocalExtension[] = []): IProfileAwareExtensionManagementService {2638return <IProfileAwareExtensionManagementService>{2639onInstallExtension: Event.None,2640onDidInstallExtensions: Event.None,2641onUninstallExtension: Event.None,2642onDidUninstallExtension: Event.None,2643onDidChangeProfile: Event.None,2644onDidUpdateExtensionMetadata: Event.None,2645onProfileAwareDidInstallExtensions: Event.None,2646getInstalled: () => Promise.resolve<ILocalExtension[]>(installed),2647canInstall: async (extension: IGalleryExtension) => { return true; },2648installFromGallery: (extension: IGalleryExtension) => Promise.reject(new Error('not supported')),2649updateMetadata: async (local: Mutable<ILocalExtension>, metadata: Partial<Metadata>, profileLocation: URI) => {2650local.identifier.uuid = metadata.id;2651local.publisherDisplayName = metadata.publisherDisplayName!;2652local.publisherId = metadata.publisherId!;2653return local;2654},2655async getTargetPlatform() { return getTargetPlatform(platform, arch); },2656async getExtensionsControlManifest() { return <IExtensionsControlManifest>{ malicious: [], deprecated: {}, search: [], publisherMapping: {} }; },2657};2658}265926602661