Path: blob/main/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts
5267 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*--------------------------------------------------------------------------------------------*/4import assert from 'assert';5import * as sinon from 'sinon';6import { IExtensionManagementService, DidUninstallExtensionEvent, ILocalExtension, InstallExtensionEvent, InstallExtensionResult, UninstallExtensionEvent, DidUpdateExtensionMetadata, InstallOperation, IAllowedExtensionsService, AllowedExtensionsConfigKey, IExtensionsControlManifest } from '../../../../../platform/extensionManagement/common/extensionManagement.js';7import { EnablementState, IExtensionManagementServerService, IExtensionManagementServer, IWorkbenchExtensionManagementService, ExtensionInstallLocation, IProfileAwareExtensionManagementService, DidChangeProfileEvent } from '../../common/extensionManagement.js';8import { ExtensionEnablementService } from '../../browser/extensionEnablementService.js';9import { TestInstantiationService } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js';10import { Emitter, Event } from '../../../../../base/common/event.js';11import { IWorkspace, IWorkspaceContextService, WorkbenchState } from '../../../../../platform/workspace/common/workspace.js';12import { IWorkbenchEnvironmentService } from '../../../environment/common/environmentService.js';13import { IStorageService, InMemoryStorageService } from '../../../../../platform/storage/common/storage.js';14import { IExtensionContributions, ExtensionType, IExtension, IExtensionManifest, IExtensionIdentifier } from '../../../../../platform/extensions/common/extensions.js';15import { isUndefinedOrNull } from '../../../../../base/common/types.js';16import { areSameExtensions } from '../../../../../platform/extensionManagement/common/extensionManagementUtil.js';17import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';18import { URI } from '../../../../../base/common/uri.js';19import { Schemas } from '../../../../../base/common/network.js';20import { TestConfigurationService } from '../../../../../platform/configuration/test/common/testConfigurationService.js';21import { productService, TestLifecycleService } from '../../../../test/browser/workbenchTestServices.js';22import { GlobalExtensionEnablementService } from '../../../../../platform/extensionManagement/common/extensionEnablementService.js';23import { IUserDataSyncAccountService, UserDataSyncAccountService } from '../../../../../platform/userDataSync/common/userDataSyncAccount.js';24import { IUserDataSyncEnablementService } from '../../../../../platform/userDataSync/common/userDataSync.js';25import { ILifecycleService } from '../../../lifecycle/common/lifecycle.js';26import { INotificationService } from '../../../../../platform/notification/common/notification.js';27import { TestNotificationService } from '../../../../../platform/notification/test/common/testNotificationService.js';28import { IHostService } from '../../../host/browser/host.js';29import { mock } from '../../../../../base/test/common/mock.js';30import { IExtensionBisectService } from '../../browser/extensionBisect.js';31import { IWorkspaceTrustManagementService, IWorkspaceTrustRequestService, WorkspaceTrustRequestOptions } from '../../../../../platform/workspace/common/workspaceTrust.js';32import { ExtensionManifestPropertiesService, IExtensionManifestPropertiesService } from '../../../extensions/common/extensionManifestPropertiesService.js';33import { TestContextService, TestProductService, TestWorkspaceTrustEnablementService, TestWorkspaceTrustManagementService } from '../../../../test/common/workbenchTestServices.js';34import { TestWorkspace } from '../../../../../platform/workspace/test/common/testWorkspace.js';35import { ExtensionManagementService } from '../../common/extensionManagementService.js';36import { ILogService, NullLogService } from '../../../../../platform/log/common/log.js';37import { DisposableStore } from '../../../../../base/common/lifecycle.js';38import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';39import { IFileService } from '../../../../../platform/files/common/files.js';40import { FileService } from '../../../../../platform/files/common/fileService.js';41import { IProductService } from '../../../../../platform/product/common/productService.js';42import { AllowedExtensionsService } from '../../../../../platform/extensionManagement/common/allowedExtensionsService.js';43import { IStringDictionary } from '../../../../../base/common/collections.js';4445function createStorageService(instantiationService: TestInstantiationService, disposableStore: DisposableStore): IStorageService {46let service = instantiationService.get(IStorageService);47if (!service) {48let workspaceContextService = instantiationService.get(IWorkspaceContextService);49if (!workspaceContextService) {50workspaceContextService = instantiationService.stub(IWorkspaceContextService, <IWorkspaceContextService>{51getWorkbenchState: () => WorkbenchState.FOLDER,52getWorkspace: () => TestWorkspace as IWorkspace53});54}55service = instantiationService.stub(IStorageService, disposableStore.add(new InMemoryStorageService()));56}57return service;58}5960export class TestExtensionEnablementService extends ExtensionEnablementService {61constructor(instantiationService: TestInstantiationService) {62const disposables = new DisposableStore();63const storageService = createStorageService(instantiationService, disposables);64const extensionManagementServerService = instantiationService.get(IExtensionManagementServerService) ||65instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService({66id: 'local',67label: 'local',68extensionManagementService: <IProfileAwareExtensionManagementService>{69onInstallExtension: disposables.add(new Emitter<InstallExtensionEvent>()).event,70onDidInstallExtensions: disposables.add(new Emitter<readonly InstallExtensionResult[]>()).event,71onUninstallExtension: disposables.add(new Emitter<UninstallExtensionEvent>()).event,72onDidUninstallExtension: disposables.add(new Emitter<DidUninstallExtensionEvent>()).event,73onDidChangeProfile: disposables.add(new Emitter<DidChangeProfileEvent>()).event,74onDidUpdateExtensionMetadata: disposables.add(new Emitter<DidUpdateExtensionMetadata>()).event,75onProfileAwareDidInstallExtensions: Event.None,76},77}, null, null));78const extensionManagementService = disposables.add(instantiationService.createInstance(ExtensionManagementService));79const workbenchExtensionManagementService = instantiationService.get(IWorkbenchExtensionManagementService) || instantiationService.stub(IWorkbenchExtensionManagementService, extensionManagementService);80const workspaceTrustManagementService = instantiationService.get(IWorkspaceTrustManagementService) || instantiationService.stub(IWorkspaceTrustManagementService, disposables.add(new TestWorkspaceTrustManagementService()));81super(82storageService,83disposables.add(new GlobalExtensionEnablementService(storageService, extensionManagementService)),84instantiationService.get(IWorkspaceContextService) || new TestContextService(),85instantiationService.get(IWorkbenchEnvironmentService) || instantiationService.stub(IWorkbenchEnvironmentService, {}),86workbenchExtensionManagementService,87instantiationService.get(IConfigurationService),88extensionManagementServerService,89instantiationService.get(IUserDataSyncEnablementService) || instantiationService.stub(IUserDataSyncEnablementService, <Partial<IUserDataSyncEnablementService>>{ isEnabled() { return false; } }),90instantiationService.get(IUserDataSyncAccountService) || instantiationService.stub(IUserDataSyncAccountService, UserDataSyncAccountService),91instantiationService.get(ILifecycleService) || instantiationService.stub(ILifecycleService, disposables.add(new TestLifecycleService())),92instantiationService.get(INotificationService) || instantiationService.stub(INotificationService, new TestNotificationService()),93instantiationService.get(IHostService),94new class extends mock<IExtensionBisectService>() { override isDisabledByBisect() { return false; } },95instantiationService.stub(IAllowedExtensionsService, disposables.add(new AllowedExtensionsService(instantiationService.get(IProductService), instantiationService.get(IConfigurationService)))),96workspaceTrustManagementService,97new class extends mock<IWorkspaceTrustRequestService>() { override requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Promise<boolean> { return Promise.resolve(true); } },98instantiationService.get(IExtensionManifestPropertiesService) || instantiationService.stub(IExtensionManifestPropertiesService, disposables.add(new ExtensionManifestPropertiesService(TestProductService, new TestConfigurationService(), new TestWorkspaceTrustEnablementService(), new NullLogService()))),99instantiationService,100new NullLogService(),101productService102);103this._register(disposables);104}105106public async waitUntilInitialized(): Promise<void> {107await this.extensionsManager.whenInitialized();108}109110public reset(): void {111let extensions = this.globalExtensionEnablementService.getDisabledExtensions();112for (const e of this._getWorkspaceDisabledExtensions()) {113if (!extensions.some(r => areSameExtensions(r, e))) {114extensions.push(e);115}116}117const workspaceEnabledExtensions = this._getWorkspaceEnabledExtensions();118if (workspaceEnabledExtensions.length) {119extensions = extensions.filter(r => !workspaceEnabledExtensions.some(e => areSameExtensions(e, r)));120}121extensions.forEach(d => this.setEnablement([aLocalExtension(d.id)], EnablementState.EnabledGlobally));122}123}124125suite('ExtensionEnablementService Test', () => {126127const disposableStore = ensureNoDisposablesAreLeakedInTestSuite();128129let instantiationService: TestInstantiationService;130let testObject: TestExtensionEnablementService;131132const didInstallEvent = new Emitter<readonly InstallExtensionResult[]>();133const didUninstallEvent = new Emitter<DidUninstallExtensionEvent>();134const didChangeProfileExtensionsEvent = new Emitter<DidChangeProfileEvent>();135const installed: ILocalExtension[] = [];136const malicious: IExtensionIdentifier[] = [];137138setup(() => {139installed.splice(0, installed.length);140instantiationService = disposableStore.add(new TestInstantiationService());141instantiationService.stub(IFileService, disposableStore.add(new FileService(new NullLogService())));142instantiationService.stub(IProductService, TestProductService);143const testConfigurationService = new TestConfigurationService();144testConfigurationService.setUserConfiguration(AllowedExtensionsConfigKey, { '*': true, 'unallowed': false });145instantiationService.stub(IConfigurationService, testConfigurationService);146instantiationService.stub(IWorkspaceContextService, new TestContextService());147instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService({148id: 'local',149label: 'local',150extensionManagementService: <IProfileAwareExtensionManagementService>{151onDidInstallExtensions: didInstallEvent.event,152onDidUninstallExtension: didUninstallEvent.event,153onDidChangeProfile: didChangeProfileExtensionsEvent.event,154onProfileAwareDidInstallExtensions: Event.None,155getInstalled: () => Promise.resolve(installed),156async getExtensionsControlManifest(): Promise<IExtensionsControlManifest> {157return {158malicious: malicious.map(e => ({ extensionOrPublisher: e })),159deprecated: {},160search: []161};162}163},164}, null, null));165instantiationService.stub(ILogService, NullLogService);166instantiationService.stub(IWorkbenchExtensionManagementService, disposableStore.add(instantiationService.createInstance(ExtensionManagementService)));167testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));168});169170test('test disable an extension globally', async () => {171const extension = aLocalExtension('pub.a');172await testObject.setEnablement([extension], EnablementState.DisabledGlobally);173assert.ok(!testObject.isEnabled(extension));174assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledGlobally);175});176177test('test disable an extension globally should return truthy promise', () => {178return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)179.then(value => assert.ok(value));180});181182test('test disable an extension globally triggers the change event', async () => {183const target = sinon.spy();184disposableStore.add(testObject.onEnablementChanged(target));185await testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally);186assert.ok(target.calledOnce);187assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });188});189190test('test disable an extension globally again should return a falsy promise', () => {191return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)192.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally))193.then(value => assert.ok(!value[0]));194});195196test('test state of globally disabled extension', () => {197return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)198.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledGlobally));199});200201test('test state of globally enabled extension', () => {202return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)203.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally))204.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.EnabledGlobally));205});206207test('test disable an extension for workspace', async () => {208const extension = aLocalExtension('pub.a');209await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);210assert.ok(!testObject.isEnabled(extension));211assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledWorkspace);212});213214test('test disable an extension for workspace returns a truthy promise', () => {215return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)216.then(value => assert.ok(value));217});218219test('test disable an extension for workspace again should return a falsy promise', () => {220return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)221.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))222.then(value => assert.ok(!value[0]));223});224225test('test state of workspace disabled extension', () => {226return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)227.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledWorkspace));228});229230test('test state of workspace and globally disabled extension', () => {231return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)232.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))233.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledWorkspace));234});235236test('test state of workspace enabled extension', () => {237return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)238.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))239.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.EnabledWorkspace));240});241242test('test state of globally disabled and workspace enabled extension', () => {243return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)244.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))245.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))246.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.EnabledWorkspace));247});248249test('test state of an extension when disabled for workspace from workspace enabled', () => {250return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)251.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))252.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))253.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledWorkspace));254});255256test('test state of an extension when disabled globally from workspace enabled', () => {257return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)258.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))259.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally))260.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledGlobally));261});262263test('test state of an extension when disabled globally from workspace disabled', () => {264return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)265.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally))266.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledGlobally));267});268269test('test state of an extension when enabled globally from workspace enabled', () => {270return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)271.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))272.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally))273.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.EnabledGlobally));274});275276test('test state of an extension when enabled globally from workspace disabled', () => {277return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)278.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally))279.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.EnabledGlobally));280});281282test('test disable an extension for workspace and then globally', async () => {283const extension = aLocalExtension('pub.a');284await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);285await testObject.setEnablement([extension], EnablementState.DisabledGlobally);286assert.ok(!testObject.isEnabled(extension));287assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledGlobally);288});289290test('test disable an extension for workspace and then globally return a truthy promise', () => {291return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)292.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally))293.then(value => assert.ok(value));294});295296test('test disable an extension for workspace and then globally trigger the change event', () => {297const target = sinon.spy();298return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)299.then(() => disposableStore.add(testObject.onEnablementChanged(target)))300.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally))301.then(() => {302assert.ok(target.calledOnce);303assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });304});305});306307test('test disable an extension globally and then for workspace', async () => {308const extension = aLocalExtension('pub.a');309await testObject.setEnablement([extension], EnablementState.DisabledGlobally);310await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);311assert.ok(!testObject.isEnabled(extension));312assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledWorkspace);313});314315test('test disable an extension globally and then for workspace return a truthy promise', () => {316return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)317.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))318.then(value => assert.ok(value));319});320321test('test disable an extension globally and then for workspace triggers the change event', () => {322const target = sinon.spy();323return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)324.then(() => disposableStore.add(testObject.onEnablementChanged(target)))325.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))326.then(() => {327assert.ok(target.calledOnce);328assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });329});330});331332test('test disable an extension for workspace when there is no workspace throws error', () => {333instantiationService.stub(IWorkspaceContextService, 'getWorkbenchState', WorkbenchState.EMPTY);334return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)335.then(() => assert.fail('should throw an error'), error => assert.ok(error));336});337338test('test enable an extension globally', async () => {339const extension = aLocalExtension('pub.a');340await testObject.setEnablement([extension], EnablementState.DisabledGlobally);341await testObject.setEnablement([extension], EnablementState.EnabledGlobally);342assert.ok(testObject.isEnabled(extension));343assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);344});345346test('test enable an extension globally return truthy promise', async () => {347await testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally);348const value = await testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally);349assert.strictEqual(value[0], true);350});351352test('test enable an extension globally triggers change event', () => {353const target = sinon.spy();354return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)355.then(() => disposableStore.add(testObject.onEnablementChanged(target)))356.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally))357.then(() => {358assert.ok(target.calledOnce);359assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });360});361});362363test('test enable an extension globally when already enabled return falsy promise', () => {364return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally)365.then(value => assert.ok(!value[0]));366});367368test('test enable an extension for workspace', async () => {369const extension = aLocalExtension('pub.a');370await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);371await testObject.setEnablement([extension], EnablementState.EnabledWorkspace);372assert.ok(testObject.isEnabled(extension));373assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledWorkspace);374});375376test('test enable an extension for workspace return truthy promise', () => {377return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)378.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))379.then(value => assert.ok(value));380});381382test('test enable an extension for workspace triggers change event', () => {383const target = sinon.spy();384return testObject.setEnablement([aLocalExtension('pub.b')], EnablementState.DisabledWorkspace)385.then(() => disposableStore.add(testObject.onEnablementChanged(target)))386.then(() => testObject.setEnablement([aLocalExtension('pub.b')], EnablementState.EnabledWorkspace))387.then(() => {388assert.ok(target.calledOnce);389assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.b' });390});391});392393test('test enable an extension for workspace when already enabled return truthy promise', () => {394return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace)395.then(value => assert.ok(value));396});397398test('test enable an extension for workspace when disabled in workspace and gloablly', async () => {399const extension = aLocalExtension('pub.a');400await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);401await testObject.setEnablement([extension], EnablementState.DisabledGlobally);402await testObject.setEnablement([extension], EnablementState.EnabledWorkspace);403assert.ok(testObject.isEnabled(extension));404assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledWorkspace);405});406407test('test enable an extension globally when disabled in workspace and gloablly', async () => {408const extension = aLocalExtension('pub.a');409await testObject.setEnablement([extension], EnablementState.EnabledWorkspace);410await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);411await testObject.setEnablement([extension], EnablementState.DisabledGlobally);412await testObject.setEnablement([extension], EnablementState.EnabledGlobally);413assert.ok(testObject.isEnabled(extension));414assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);415});416417test('test enable an extension also enables dependencies', async () => {418installed.push(...[aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'] }), aLocalExtension('pub.b')]);419const target = installed[0];420const dep = installed[1];421await (<TestExtensionEnablementService>testObject).waitUntilInitialized();422await testObject.setEnablement([dep, target], EnablementState.DisabledGlobally);423await testObject.setEnablement([target], EnablementState.EnabledGlobally);424assert.ok(testObject.isEnabled(target));425assert.ok(testObject.isEnabled(dep));426assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);427assert.strictEqual(testObject.getEnablementState(dep), EnablementState.EnabledGlobally);428});429430test('test enable an extension in workspace with a dependency extension that has auth providers', async () => {431installed.push(...[aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'] }), aLocalExtension('pub.b', { authentication: [{ id: 'a', label: 'a' }] })]);432const target = installed[0];433await (<TestExtensionEnablementService>testObject).waitUntilInitialized();434await testObject.setEnablement([target], EnablementState.DisabledWorkspace);435await testObject.setEnablement([target], EnablementState.EnabledWorkspace);436assert.ok(testObject.isEnabled(target));437assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledWorkspace);438});439440test('test enable an extension with a dependency extension that cannot be enabled', async () => {441instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));442const localWorkspaceDepExtension = aLocalExtension2('pub.b', { extensionKind: ['workspace'] }, { location: URI.file(`pub.b`) });443const remoteWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace'], extensionDependencies: ['pub.b'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });444const remoteWorkspaceDepExtension = aLocalExtension2('pub.b', { extensionKind: ['workspace'] }, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });445installed.push(localWorkspaceDepExtension, remoteWorkspaceExtension, remoteWorkspaceDepExtension);446447testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));448await (<TestExtensionEnablementService>testObject).waitUntilInitialized();449450await testObject.setEnablement([remoteWorkspaceExtension], EnablementState.DisabledGlobally);451await testObject.setEnablement([remoteWorkspaceExtension], EnablementState.EnabledGlobally);452assert.ok(testObject.isEnabled(remoteWorkspaceExtension));453assert.strictEqual(testObject.getEnablementState(remoteWorkspaceExtension), EnablementState.EnabledGlobally);454});455456test('test enable an extension also enables packed extensions', async () => {457installed.push(...[aLocalExtension2('pub.a', { extensionPack: ['pub.b'] }), aLocalExtension('pub.b')]);458const target = installed[0];459const dep = installed[1];460await testObject.setEnablement([dep, target], EnablementState.DisabledGlobally);461await testObject.setEnablement([target], EnablementState.EnabledGlobally);462assert.ok(testObject.isEnabled(target));463assert.ok(testObject.isEnabled(dep));464assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);465assert.strictEqual(testObject.getEnablementState(dep), EnablementState.EnabledGlobally);466});467468test('test remove an extension from disablement list when uninstalled', async () => {469const extension = aLocalExtension('pub.a');470installed.push(extension);471testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));472473await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);474await testObject.setEnablement([extension], EnablementState.DisabledGlobally);475didUninstallEvent.fire({ identifier: { id: 'pub.a' }, profileLocation: null! });476477assert.ok(testObject.isEnabled(extension));478assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);479});480481test('test isEnabled return false extension is disabled globally', () => {482return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)483.then(() => assert.ok(!testObject.isEnabled(aLocalExtension('pub.a'))));484});485486test('test isEnabled return false extension is disabled in workspace', () => {487return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)488.then(() => assert.ok(!testObject.isEnabled(aLocalExtension('pub.a'))));489});490491test('test isEnabled return true extension is not disabled', () => {492return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)493.then(() => testObject.setEnablement([aLocalExtension('pub.c')], EnablementState.DisabledGlobally))494.then(() => assert.ok(testObject.isEnabled(aLocalExtension('pub.b'))));495});496497test('test canChangeEnablement return false for language packs', () => {498assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a', { localizations: [{ languageId: 'gr', translations: [{ id: 'vscode', path: 'path' }] }] })), false);499});500501test('test canChangeEnablement return true for auth extension', () => {502assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a', { authentication: [{ id: 'a', label: 'a' }] })), true);503});504505test('test canChangeEnablement return true for auth extension when user data sync account does not depends on it', () => {506instantiationService.stub(IUserDataSyncAccountService, <Partial<IUserDataSyncAccountService>>{507account: { authenticationProviderId: 'b' }508});509testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));510assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a', { authentication: [{ id: 'a', label: 'a' }] })), true);511});512513test('test canChangeEnablement return true for auth extension when user data sync account depends on it but auto sync is off', () => {514instantiationService.stub(IUserDataSyncAccountService, <Partial<IUserDataSyncAccountService>>{515account: { authenticationProviderId: 'a' }516});517testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));518assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a', { authentication: [{ id: 'a', label: 'a' }] })), true);519});520521test('test canChangeEnablement return false for auth extension and user data sync account depends on it and auto sync is on', () => {522instantiationService.stub(IUserDataSyncEnablementService, <Partial<IUserDataSyncEnablementService>>{ isEnabled() { return true; } });523instantiationService.stub(IUserDataSyncAccountService, <Partial<IUserDataSyncAccountService>>{524account: { authenticationProviderId: 'a' }525});526testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));527assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a', { authentication: [{ id: 'a', label: 'a' }] })), false);528});529530test('test canChangeWorkspaceEnablement return true', () => {531assert.strictEqual(testObject.canChangeWorkspaceEnablement(aLocalExtension('pub.a')), true);532});533534test('test canChangeWorkspaceEnablement return false if there is no workspace', () => {535instantiationService.stub(IWorkspaceContextService, 'getWorkbenchState', WorkbenchState.EMPTY);536assert.strictEqual(testObject.canChangeWorkspaceEnablement(aLocalExtension('pub.a')), false);537});538539test('test canChangeWorkspaceEnablement return false for auth extension', () => {540assert.strictEqual(testObject.canChangeWorkspaceEnablement(aLocalExtension('pub.a', { authentication: [{ id: 'a', label: 'a' }] })), false);541});542543test('test canChangeEnablement return false when extensions are disabled in environment', () => {544instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: true });545testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));546assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a')), false);547});548549test('test canChangeEnablement return false when the extension is disabled in environment', () => {550instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: ['pub.a'] });551testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));552assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a')), false);553});554555test('test canChangeEnablement return true for system extensions when extensions are disabled in environment', () => {556instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: true });557testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));558const extension = aLocalExtension('pub.a', undefined, ExtensionType.System);559assert.strictEqual(testObject.canChangeEnablement(extension), true);560});561562test('test canChangeEnablement return false for system extension when extension is disabled in environment', () => {563instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: ['pub.a'] });564testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));565const extension = aLocalExtension('pub.a', undefined, ExtensionType.System);566assert.ok(!testObject.canChangeEnablement(extension));567});568569test('test extension is disabled when disabled in environment', async () => {570const extension = aLocalExtension('pub.a');571installed.push(extension);572573instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: ['pub.a'] });574testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));575576assert.ok(!testObject.isEnabled(extension));577assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByEnvironment);578});579580test('test extension is enabled globally when enabled in environment', async () => {581const extension = aLocalExtension('pub.a');582installed.push(extension);583584instantiationService.stub(IWorkbenchEnvironmentService, { enableExtensions: <readonly string[]>['pub.a'] });585testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));586587assert.ok(testObject.isEnabled(extension));588assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);589});590591test('test extension is enabled workspace when enabled in environment', async () => {592const extension = aLocalExtension('pub.a');593installed.push(extension);594595await testObject.setEnablement([extension], EnablementState.EnabledWorkspace);596instantiationService.stub(IWorkbenchEnvironmentService, { enableExtensions: <readonly string[]>['pub.a'] });597testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));598599assert.ok(testObject.isEnabled(extension));600assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledWorkspace);601});602603test('test extension is enabled by environment when disabled globally', async () => {604const extension = aLocalExtension('pub.a');605installed.push(extension);606607await testObject.setEnablement([extension], EnablementState.DisabledGlobally);608instantiationService.stub(IWorkbenchEnvironmentService, { enableExtensions: <readonly string[]>['pub.a'] });609testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));610611assert.ok(testObject.isEnabled(extension));612assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledByEnvironment);613});614615test('test extension is enabled by environment when disabled workspace', async () => {616const extension = aLocalExtension('pub.a');617installed.push(extension);618619await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);620instantiationService.stub(IWorkbenchEnvironmentService, { enableExtensions: <readonly string[]>['pub.a'] });621testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));622623assert.ok(testObject.isEnabled(extension));624assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledByEnvironment);625});626627test('test extension is disabled by environment when also enabled in environment', async () => {628const extension = aLocalExtension('pub.a');629installed.push(extension);630631testObject.setEnablement([extension], EnablementState.DisabledWorkspace);632instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: true, enableExtensions: <readonly string[]>['pub.a'] });633testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));634635assert.ok(!testObject.isEnabled(extension));636assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByEnvironment);637});638639test('test canChangeEnablement return false when the extension is enabled in environment', () => {640instantiationService.stub(IWorkbenchEnvironmentService, { enableExtensions: <readonly string[]>['pub.a'] });641testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));642assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a')), false);643});644645test('test extension does not support vitrual workspace is not enabled in virtual workspace', async () => {646const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } });647instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });648testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));649assert.ok(!testObject.isEnabled(extension));650assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByVirtualWorkspace);651});652653test('test web extension from web extension management server and does not support vitrual workspace is enabled in virtual workspace', async () => {654instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, anExtensionManagementServer('vscode-remote', instantiationService), anExtensionManagementServer('web', instantiationService)));655const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false }, browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'web' }) });656instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });657testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));658assert.ok(testObject.isEnabled(extension));659assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);660});661662test('test web extension from remote extension management server and does not support vitrual workspace is disabled in virtual workspace', async () => {663instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, anExtensionManagementServer('vscode-remote', instantiationService), anExtensionManagementServer('web', instantiationService)));664const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false }, browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });665instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });666testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));667assert.ok(!testObject.isEnabled(extension));668assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByVirtualWorkspace);669});670671test('test enable a remote workspace extension and local ui extension that is a dependency of remote', async () => {672instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));673const localUIExtension = aLocalExtension2('pub.a', { main: 'main.js', extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });674const remoteUIExtension = aLocalExtension2('pub.a', { main: 'main.js', extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });675const target = aLocalExtension2('pub.b', { main: 'main.js', extensionDependencies: ['pub.a'] }, { location: URI.file(`pub.b`).with({ scheme: 'vscode-remote' }) });676testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));677678installed.push(localUIExtension, remoteUIExtension, target);679await testObject.setEnablement([target, localUIExtension], EnablementState.DisabledGlobally);680await testObject.setEnablement([target, localUIExtension], EnablementState.EnabledGlobally);681assert.ok(testObject.isEnabled(target));682assert.ok(testObject.isEnabled(localUIExtension));683assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);684assert.strictEqual(testObject.getEnablementState(localUIExtension), EnablementState.EnabledGlobally);685});686687test('test enable a remote workspace extension also enables its dependency in local', async () => {688instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));689const localUIExtension = aLocalExtension2('pub.a', { main: 'main.js', extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });690const remoteUIExtension = aLocalExtension2('pub.a', { main: 'main.js', extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });691const target = aLocalExtension2('pub.b', { main: 'main.js', extensionDependencies: ['pub.a'] }, { location: URI.file(`pub.b`).with({ scheme: 'vscode-remote' }) });692testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));693694installed.push(localUIExtension, remoteUIExtension, target);695await testObject.setEnablement([target, localUIExtension], EnablementState.DisabledGlobally);696await testObject.setEnablement([target], EnablementState.EnabledGlobally);697assert.ok(testObject.isEnabled(target));698assert.ok(testObject.isEnabled(localUIExtension));699assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);700assert.strictEqual(testObject.getEnablementState(localUIExtension), EnablementState.EnabledGlobally);701});702703test('test canChangeEnablement return false when extension is disabled in virtual workspace', () => {704const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } });705instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });706testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));707assert.ok(!testObject.canChangeEnablement(extension));708});709710test('test extension does not support vitrual workspace is enabled in normal workspace', async () => {711const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } });712instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA') }] });713testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));714assert.ok(testObject.isEnabled(extension));715assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);716});717718test('test extension supports virtual workspace is enabled in virtual workspace', async () => {719const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: true } });720instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });721testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));722assert.ok(testObject.isEnabled(extension));723assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);724});725726test('test extension does not support untrusted workspaces is disabled in untrusted workspace', () => {727const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } });728instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });729testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));730assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByTrustRequirement);731});732733test('test canChangeEnablement return true when extension is disabled by workspace trust', () => {734const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } });735instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });736testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));737assert.ok(testObject.canChangeEnablement(extension));738});739740test('test extension supports untrusted workspaces is enabled in untrusted workspace', () => {741const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: true } } });742instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });743testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));744assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);745});746747test('test extension does not support untrusted workspaces is enabled in trusted workspace', () => {748const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: '' } } });749instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return true; } });750testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));751assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);752});753754test('test extension supports untrusted workspaces is enabled in trusted workspace', () => {755const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: true } } });756instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return true; } });757testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));758assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);759});760761test('test extension without any value for virtual worksapce is enabled in virtual workspace', async () => {762const extension = aLocalExtension2('pub.a');763instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });764testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));765assert.ok(testObject.isEnabled(extension));766assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);767});768769test('test local workspace extension is disabled by kind', async () => {770instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));771const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });772testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));773assert.ok(!testObject.isEnabled(localWorkspaceExtension));774assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);775});776777test('test local workspace + ui extension is enabled by kind', async () => {778instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));779const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace', 'ui'] }, { location: URI.file(`pub.a`) });780testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));781assert.ok(testObject.isEnabled(localWorkspaceExtension));782assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);783});784785test('test local ui extension is not disabled by kind', async () => {786instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));787const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });788testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));789assert.ok(testObject.isEnabled(localWorkspaceExtension));790assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);791});792793test('test canChangeEnablement return true when the local workspace extension is disabled by kind', () => {794instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));795const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });796testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));797assert.strictEqual(testObject.canChangeEnablement(localWorkspaceExtension), false);798});799800test('test canChangeEnablement return true for local ui extension', () => {801instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));802const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });803testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));804assert.strictEqual(testObject.canChangeEnablement(localWorkspaceExtension), true);805});806807test('test remote ui extension is disabled by kind', async () => {808instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));809const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });810testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));811assert.ok(!testObject.isEnabled(localWorkspaceExtension));812assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);813});814815test('test remote ui+workspace extension is disabled by kind', async () => {816instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));817const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui', 'workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });818testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));819assert.ok(testObject.isEnabled(localWorkspaceExtension));820assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);821});822823test('test remote ui extension is disabled by kind when there is no local server', async () => {824instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, anExtensionManagementServer('vscode-remote', instantiationService), null));825const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });826testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));827assert.ok(!testObject.isEnabled(localWorkspaceExtension));828assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);829});830831test('test remote workspace extension is not disabled by kind', async () => {832instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));833const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });834testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));835assert.ok(testObject.isEnabled(localWorkspaceExtension));836assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);837});838839test('test canChangeEnablement return true when the remote ui extension is disabled by kind', () => {840instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));841const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });842testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));843assert.strictEqual(testObject.canChangeEnablement(localWorkspaceExtension), false);844});845846test('test canChangeEnablement return true for remote workspace extension', () => {847instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));848const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });849testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));850assert.strictEqual(testObject.canChangeEnablement(localWorkspaceExtension), true);851});852853test('test web extension on local server is disabled by kind when web worker is not enabled', async () => {854instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));855const localWorkspaceExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`) });856(<TestConfigurationService>instantiationService.get(IConfigurationService)).setUserConfiguration('extensions', { webWorker: false });857testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));858assert.strictEqual(testObject.isEnabled(localWorkspaceExtension), false);859assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);860});861862test('test web extension on local server is not disabled by kind when web worker is enabled', async () => {863instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));864const localWorkspaceExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`) });865(<TestConfigurationService>instantiationService.get(IConfigurationService)).setUserConfiguration('extensions', { webWorker: true });866testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));867assert.strictEqual(testObject.isEnabled(localWorkspaceExtension), true);868assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);869});870871test('test web extension on remote server is disabled by kind when web worker is not enabled', async () => {872instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));873const localWorkspaceExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });874(<TestConfigurationService>instantiationService.get(IConfigurationService)).setUserConfiguration('extensions', { webWorker: false });875testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));876assert.strictEqual(testObject.isEnabled(localWorkspaceExtension), false);877assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);878});879880test('test web extension on remote server is disabled by kind when web worker is enabled', async () => {881instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));882const localWorkspaceExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });883(<TestConfigurationService>instantiationService.get(IConfigurationService)).setUserConfiguration('extensions', { webWorker: true });884testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));885assert.strictEqual(testObject.isEnabled(localWorkspaceExtension), false);886assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);887});888889test('test web extension on remote server is enabled in web', async () => {890instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), anExtensionManagementServer('web', instantiationService)));891const localWorkspaceExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });892(<TestConfigurationService>instantiationService.get(IConfigurationService)).setUserConfiguration('extensions', { webWorker: false });893testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));894assert.strictEqual(testObject.isEnabled(localWorkspaceExtension), true);895assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);896});897898test('test web extension on web server is not disabled by kind', async () => {899instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), anExtensionManagementServer('web', instantiationService)));900const webExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'web' }) });901testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));902assert.strictEqual(testObject.isEnabled(webExtension), true);903assert.deepStrictEqual(testObject.getEnablementState(webExtension), EnablementState.EnabledGlobally);904});905906test('test state of multipe extensions', async () => {907installed.push(...[aLocalExtension('pub.a'), aLocalExtension('pub.b'), aLocalExtension('pub.c'), aLocalExtension('pub.d'), aLocalExtension('pub.e')]);908testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));909await (<TestExtensionEnablementService>testObject).waitUntilInitialized();910911await testObject.setEnablement([installed[0]], EnablementState.DisabledGlobally);912await testObject.setEnablement([installed[1]], EnablementState.DisabledWorkspace);913await testObject.setEnablement([installed[2]], EnablementState.EnabledWorkspace);914await testObject.setEnablement([installed[3]], EnablementState.EnabledGlobally);915916assert.deepStrictEqual(testObject.getEnablementStates(installed), [EnablementState.DisabledGlobally, EnablementState.DisabledWorkspace, EnablementState.EnabledWorkspace, EnablementState.EnabledGlobally, EnablementState.EnabledGlobally]);917});918919test('test extension is disabled by dependency if it has a dependency that is disabled', async () => {920installed.push(...[aLocalExtension2('pub.a'), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] })]);921testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));922await (<TestExtensionEnablementService>testObject).waitUntilInitialized();923924await testObject.setEnablement([installed[0]], EnablementState.DisabledGlobally);925926assert.strictEqual(testObject.getEnablementState(installed[1]), EnablementState.DisabledByExtensionDependency);927});928929test('test extension is disabled by dependency if it has a dependency that is disabled by virtual workspace', async () => {930installed.push(...[aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } }), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'], capabilities: { virtualWorkspaces: true } })]);931instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });932testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));933await (<TestExtensionEnablementService>testObject).waitUntilInitialized();934935assert.strictEqual(testObject.getEnablementState(installed[0]), EnablementState.DisabledByVirtualWorkspace);936assert.strictEqual(testObject.getEnablementState(installed[1]), EnablementState.DisabledByExtensionDependency);937});938939test('test canChangeEnablement return false when extension is disabled by dependency if it has a dependency that is disabled by virtual workspace', async () => {940installed.push(...[aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } }), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'], capabilities: { virtualWorkspaces: true } })]);941instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });942testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));943await (<TestExtensionEnablementService>testObject).waitUntilInitialized();944945assert.ok(!testObject.canChangeEnablement(installed[1]));946});947948test('test extension is disabled by dependency if it has a dependency that is disabled by workspace trust', async () => {949installed.push(...[aLocalExtension2('pub.a', { main: 'hello.js', capabilities: { untrustedWorkspaces: { supported: false, description: '' } } }), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'], capabilities: { untrustedWorkspaces: { supported: true } } })]);950instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });951testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));952await (<TestExtensionEnablementService>testObject).waitUntilInitialized();953954assert.strictEqual(testObject.getEnablementState(installed[0]), EnablementState.DisabledByTrustRequirement);955assert.strictEqual(testObject.getEnablementState(installed[1]), EnablementState.DisabledByExtensionDependency);956});957958test('test extension is not disabled by dependency if it has a dependency that is disabled by extension kind', async () => {959instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));960const localUIExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });961const remoteUIExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });962const remoteWorkspaceExtension = aLocalExtension2('pub.n', { extensionKind: ['workspace'], extensionDependencies: ['pub.a'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });963installed.push(localUIExtension, remoteUIExtension, remoteWorkspaceExtension);964965testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));966await (<TestExtensionEnablementService>testObject).waitUntilInitialized();967968assert.strictEqual(testObject.getEnablementState(localUIExtension), EnablementState.EnabledGlobally);969assert.strictEqual(testObject.getEnablementState(remoteUIExtension), EnablementState.DisabledByExtensionKind);970assert.strictEqual(testObject.getEnablementState(remoteWorkspaceExtension), EnablementState.EnabledGlobally);971});972973test('test canChangeEnablement return false when extension is disabled by dependency if it has a dependency that is disabled by workspace trust', async () => {974installed.push(...[aLocalExtension2('pub.a', { main: 'hello.js', capabilities: { untrustedWorkspaces: { supported: false, description: '' } } }), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'], capabilities: { untrustedWorkspaces: { supported: true } } })]);975instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });976testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));977await (<TestExtensionEnablementService>testObject).waitUntilInitialized();978979assert.deepEqual(testObject.canChangeEnablement(installed[1]), false);980});981982test('test canChangeEnablement return false when extension is disabled by dependency if it has a dependency that is disabled globally', async () => {983installed.push(...[aLocalExtension2('pub.a', {}), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] })]);984testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));985await (<TestExtensionEnablementService>testObject).waitUntilInitialized();986987await testObject.setEnablement([installed[0]], EnablementState.DisabledGlobally);988989assert.deepEqual(testObject.canChangeEnablement(installed[1]), false);990});991992test('test canChangeEnablement return false when extension is disabled by dependency if it has a dependency that is disabled workspace', async () => {993installed.push(...[aLocalExtension2('pub.a', {}), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] })]);994testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));995await (<TestExtensionEnablementService>testObject).waitUntilInitialized();996997await testObject.setEnablement([installed[0]], EnablementState.DisabledWorkspace);998999assert.deepEqual(testObject.canChangeEnablement(installed[1]), false);1000});10011002test('test extension is not disabled by dependency even if it has a dependency that is disabled when installed extensions are not set', async () => {1003await testObject.setEnablement([aLocalExtension2('pub.a')], EnablementState.DisabledGlobally);10041005assert.strictEqual(testObject.getEnablementState(aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] })), EnablementState.EnabledGlobally);1006});10071008test('test extension is disabled by dependency if it has a dependency that is disabled when all extensions are passed', async () => {1009installed.push(...[aLocalExtension2('pub.a'), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] })]);1010testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1011await (<TestExtensionEnablementService>testObject).waitUntilInitialized();10121013await testObject.setEnablement([installed[0]], EnablementState.DisabledGlobally);10141015assert.deepStrictEqual(testObject.getEnablementStates(installed), [EnablementState.DisabledGlobally, EnablementState.DisabledByExtensionDependency]);1016});10171018test('test extension is not disabled when it has a missing dependency', async () => {1019const target = aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] });1020installed.push(target);1021testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1022await (<TestExtensionEnablementService>testObject).waitUntilInitialized();10231024assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);1025});10261027test('test extension is not disabled when it has a dependency in another server', async () => {1028instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));1029const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'], extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });1030const depdencyOnAnotherServer = aLocalExtension2('pub.b', {}, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });1031installed.push(...[target, depdencyOnAnotherServer]);1032testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1033await (<TestExtensionEnablementService>testObject).waitUntilInitialized();10341035assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);1036});10371038test('test extension is enabled when it has a dependency in another server which is disabled', async () => {1039instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));1040const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'], extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });1041const depdencyOnAnotherServer = aLocalExtension2('pub.b', {}, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });1042installed.push(...[target, depdencyOnAnotherServer]);1043testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1044await (<TestExtensionEnablementService>testObject).waitUntilInitialized();1045await testObject.setEnablement([depdencyOnAnotherServer], EnablementState.DisabledGlobally);10461047assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);1048});10491050test('test extension is enabled when it has a dependency in another server which is disabled and with no exports and no main and no browser entrypoints', async () => {1051instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));1052const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'], extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });1053const depdencyOnAnotherServer = aLocalExtension2('pub.b', { api: 'none' }, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });1054installed.push(...[target, depdencyOnAnotherServer]);1055testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1056await (<TestExtensionEnablementService>testObject).waitUntilInitialized();1057await testObject.setEnablement([depdencyOnAnotherServer], EnablementState.DisabledGlobally);10581059assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);1060});10611062test('test extension is disabled by dependency when it has a dependency in another server which is disabled and with no exports and has main entry point', async () => {1063instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));1064const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'], extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });1065const depdencyOnAnotherServer = aLocalExtension2('pub.b', { api: 'none', main: 'main.js' }, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });1066installed.push(...[target, depdencyOnAnotherServer]);1067testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1068await (<TestExtensionEnablementService>testObject).waitUntilInitialized();1069await testObject.setEnablement([depdencyOnAnotherServer], EnablementState.DisabledGlobally);10701071assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByExtensionDependency);1072});10731074test('test extension is disabled by dependency when it has a dependency in another server which is disabled and with no exports and has browser entry point', async () => {1075instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));1076const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });1077const depdencyOnAnotherServer = aLocalExtension2('pub.b', { api: 'none', browser: 'browser.js', extensionKind: 'ui' }, { location: URI.file(`pub.b`) });1078installed.push(...[target, depdencyOnAnotherServer]);1079testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1080await (<TestExtensionEnablementService>testObject).waitUntilInitialized();1081await testObject.setEnablement([depdencyOnAnotherServer], EnablementState.DisabledGlobally);10821083assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByExtensionDependency);1084});10851086test('test extension is disabled by invalidity', async () => {1087const target = aLocalExtension2('pub.b', {}, { isValid: false });1088assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByInvalidExtension);1089});10901091test('test extension is disabled by dependency when it has a dependency that is invalid', async () => {1092const target = aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] });1093installed.push(...[target, aLocalExtension2('pub.a', {}, { isValid: false })]);1094testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1095await (<TestExtensionEnablementService>testObject).waitUntilInitialized();10961097assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByExtensionDependency);1098});10991100test('test extension is enabled when its dependency becomes valid', async () => {1101const extension = aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] });1102installed.push(...[extension, aLocalExtension2('pub.a', {}, { isValid: false })]);1103testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1104await (<TestExtensionEnablementService>testObject).waitUntilInitialized();11051106assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByExtensionDependency);11071108const target = sinon.spy();1109disposableStore.add(testObject.onEnablementChanged(target));11101111const validExtension = aLocalExtension2('pub.a');1112didInstallEvent.fire([{1113identifier: validExtension.identifier,1114operation: InstallOperation.Install,1115source: validExtension.location,1116profileLocation: validExtension.location,1117local: validExtension,1118}]);11191120assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);1121assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.b' });1122});11231124test('test override workspace to trusted when getting extensions enablements', async () => {1125const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } });1126instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });1127testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));11281129assert.strictEqual(testObject.getEnablementStates([extension], { trusted: true })[0], EnablementState.EnabledGlobally);1130});11311132test('test override workspace to not trusted when getting extensions enablements', async () => {1133const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } });1134instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return true; } });1135testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));11361137assert.strictEqual(testObject.getEnablementStates([extension], { trusted: false })[0], EnablementState.DisabledByTrustRequirement);1138});11391140test('test update extensions enablements on trust change triggers change events for extensions depending on workspace trust', async () => {1141installed.push(...[1142aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } }),1143aLocalExtension2('pub.b', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: true } } }),1144aLocalExtension2('pub.c', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } }),1145aLocalExtension2('pub.d', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: true } } }),1146]);1147testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1148const target = sinon.spy();1149disposableStore.add(testObject.onEnablementChanged(target));11501151await testObject.updateExtensionsEnablementsWhenWorkspaceTrustChanges();1152assert.strictEqual(target.args[0][0].length, 2);1153assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });1154assert.deepStrictEqual((<IExtension>target.args[0][0][1]).identifier, { id: 'pub.c' });1155});11561157test('test adding an extension that was disabled', async () => {1158const extension = aLocalExtension('pub.a');1159installed.push(extension);1160testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1161await testObject.setEnablement([extension], EnablementState.DisabledGlobally);11621163const target = sinon.spy();1164disposableStore.add(testObject.onEnablementChanged(target));1165didChangeProfileExtensionsEvent.fire({ added: [extension], removed: [] });11661167assert.ok(!testObject.isEnabled(extension));1168assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledGlobally);1169assert.strictEqual(target.args[0][0].length, 1);1170assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });1171});11721173test('test extension is disabled by allowed list', async () => {1174const target = aLocalExtension2('unallowed.extension');1175assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByAllowlist);1176});11771178test('test extension is disabled by malicious', async () => {1179malicious.push({ id: 'malicious.extensionA' });1180testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1181await (<TestExtensionEnablementService>testObject).waitUntilInitialized();1182const target = aLocalExtension2('malicious.extensionA');1183assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByMalicious);1184});11851186test('test installed malicious extension triggers change event', async () => {1187testObject.dispose();1188malicious.push({ id: 'malicious.extensionB' });1189const local = aLocalExtension2('malicious.extensionB');1190installed.push(local);1191testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1192assert.strictEqual(testObject.getEnablementState(local), EnablementState.EnabledGlobally);1193const promise = Event.toPromise(testObject.onEnablementChanged);11941195const result = await promise;1196assert.deepStrictEqual(result[0], local);1197assert.strictEqual(testObject.getEnablementState(local), EnablementState.DisabledByMalicious);1198});11991200});12011202function anExtensionManagementServer(authority: string, instantiationService: TestInstantiationService): IExtensionManagementServer {1203return {1204id: authority,1205label: authority,1206extensionManagementService: instantiationService.get(IExtensionManagementService) as IProfileAwareExtensionManagementService,1207};1208}12091210function aMultiExtensionManagementServerService(instantiationService: TestInstantiationService): IExtensionManagementServerService {1211const localExtensionManagementServer = anExtensionManagementServer('vscode-local', instantiationService);1212const remoteExtensionManagementServer = anExtensionManagementServer('vscode-remote', instantiationService);1213return anExtensionManagementServerService(localExtensionManagementServer, remoteExtensionManagementServer, null);1214}12151216export function anExtensionManagementServerService(localExtensionManagementServer: IExtensionManagementServer | null, remoteExtensionManagementServer: IExtensionManagementServer | null, webExtensionManagementServer: IExtensionManagementServer | null): IExtensionManagementServerService {1217return {1218_serviceBrand: undefined,1219localExtensionManagementServer,1220remoteExtensionManagementServer,1221webExtensionManagementServer,1222getExtensionManagementServer: (extension: IExtension) => {1223if (extension.location.scheme === Schemas.file) {1224return localExtensionManagementServer;1225}1226if (extension.location.scheme === Schemas.vscodeRemote) {1227return remoteExtensionManagementServer;1228}1229return webExtensionManagementServer;1230},1231getExtensionInstallLocation(extension: IExtension): ExtensionInstallLocation | null {1232const server = this.getExtensionManagementServer(extension);1233return server === remoteExtensionManagementServer ? ExtensionInstallLocation.Remote1234: server === webExtensionManagementServer ? ExtensionInstallLocation.Web1235: ExtensionInstallLocation.Local;1236}1237};1238}12391240function aLocalExtension(id: string, contributes?: IExtensionContributions, type?: ExtensionType): ILocalExtension {1241return aLocalExtension2(id, contributes ? { contributes } : {}, isUndefinedOrNull(type) ? {} : { type });1242}12431244function aLocalExtension2(id: string, manifest: Partial<IExtensionManifest> = {}, properties: IStringDictionary<unknown> = {}): ILocalExtension {1245const [publisher, name] = id.split('.');1246manifest = { name, publisher, ...manifest };1247properties = {1248identifier: { id },1249location: URI.file(`pub.${name}`),1250galleryIdentifier: { id, uuid: undefined },1251type: ExtensionType.User,1252...properties,1253isValid: properties.isValid ?? true,1254};1255properties.isBuiltin = properties.type === ExtensionType.System;1256return <ILocalExtension>Object.create({ manifest, ...properties });1257}125812591260