Path: blob/main/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.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*--------------------------------------------------------------------------------------------*/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 { 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';4344function createStorageService(instantiationService: TestInstantiationService, disposableStore: DisposableStore): IStorageService {45let service = instantiationService.get(IStorageService);46if (!service) {47let workspaceContextService = instantiationService.get(IWorkspaceContextService);48if (!workspaceContextService) {49workspaceContextService = instantiationService.stub(IWorkspaceContextService, <IWorkspaceContextService>{50getWorkbenchState: () => WorkbenchState.FOLDER,51getWorkspace: () => TestWorkspace as IWorkspace52});53}54service = instantiationService.stub(IStorageService, disposableStore.add(new InMemoryStorageService()));55}56return service;57}5859export class TestExtensionEnablementService extends ExtensionEnablementService {60constructor(instantiationService: TestInstantiationService) {61const disposables = new DisposableStore();62const storageService = createStorageService(instantiationService, disposables);63const extensionManagementServerService = instantiationService.get(IExtensionManagementServerService) ||64instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService({65id: 'local',66label: 'local',67extensionManagementService: <IProfileAwareExtensionManagementService>{68onInstallExtension: disposables.add(new Emitter<InstallExtensionEvent>()).event,69onDidInstallExtensions: disposables.add(new Emitter<readonly InstallExtensionResult[]>()).event,70onUninstallExtension: disposables.add(new Emitter<UninstallExtensionEvent>()).event,71onDidUninstallExtension: disposables.add(new Emitter<DidUninstallExtensionEvent>()).event,72onDidChangeProfile: disposables.add(new Emitter<DidChangeProfileEvent>()).event,73onDidUpdateExtensionMetadata: disposables.add(new Emitter<DidUpdateExtensionMetadata>()).event,74onProfileAwareDidInstallExtensions: Event.None,75},76}, null, null));77const extensionManagementService = disposables.add(instantiationService.createInstance(ExtensionManagementService));78const workbenchExtensionManagementService = instantiationService.get(IWorkbenchExtensionManagementService) || instantiationService.stub(IWorkbenchExtensionManagementService, extensionManagementService);79const workspaceTrustManagementService = instantiationService.get(IWorkspaceTrustManagementService) || instantiationService.stub(IWorkspaceTrustManagementService, disposables.add(new TestWorkspaceTrustManagementService()));80super(81storageService,82disposables.add(new GlobalExtensionEnablementService(storageService, extensionManagementService)),83instantiationService.get(IWorkspaceContextService) || new TestContextService(),84instantiationService.get(IWorkbenchEnvironmentService) || instantiationService.stub(IWorkbenchEnvironmentService, {}),85workbenchExtensionManagementService,86instantiationService.get(IConfigurationService),87extensionManagementServerService,88instantiationService.get(IUserDataSyncEnablementService) || instantiationService.stub(IUserDataSyncEnablementService, <Partial<IUserDataSyncEnablementService>>{ isEnabled() { return false; } }),89instantiationService.get(IUserDataSyncAccountService) || instantiationService.stub(IUserDataSyncAccountService, UserDataSyncAccountService),90instantiationService.get(ILifecycleService) || instantiationService.stub(ILifecycleService, disposables.add(new TestLifecycleService())),91instantiationService.get(INotificationService) || instantiationService.stub(INotificationService, new TestNotificationService()),92instantiationService.get(IHostService),93new class extends mock<IExtensionBisectService>() { override isDisabledByBisect() { return false; } },94instantiationService.stub(IAllowedExtensionsService, disposables.add(new AllowedExtensionsService(instantiationService.get(IProductService), instantiationService.get(IConfigurationService)))),95workspaceTrustManagementService,96new class extends mock<IWorkspaceTrustRequestService>() { override requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Promise<boolean> { return Promise.resolve(true); } },97instantiationService.get(IExtensionManifestPropertiesService) || instantiationService.stub(IExtensionManifestPropertiesService, disposables.add(new ExtensionManifestPropertiesService(TestProductService, new TestConfigurationService(), new TestWorkspaceTrustEnablementService(), new NullLogService()))),98instantiationService,99new NullLogService()100);101this._register(disposables);102}103104public async waitUntilInitialized(): Promise<void> {105await this.extensionsManager.whenInitialized();106}107108public reset(): void {109let extensions = this.globalExtensionEnablementService.getDisabledExtensions();110for (const e of this._getWorkspaceDisabledExtensions()) {111if (!extensions.some(r => areSameExtensions(r, e))) {112extensions.push(e);113}114}115const workspaceEnabledExtensions = this._getWorkspaceEnabledExtensions();116if (workspaceEnabledExtensions.length) {117extensions = extensions.filter(r => !workspaceEnabledExtensions.some(e => areSameExtensions(e, r)));118}119extensions.forEach(d => this.setEnablement([aLocalExtension(d.id)], EnablementState.EnabledGlobally));120}121}122123suite('ExtensionEnablementService Test', () => {124125const disposableStore = ensureNoDisposablesAreLeakedInTestSuite();126127let instantiationService: TestInstantiationService;128let testObject: TestExtensionEnablementService;129130const didInstallEvent = new Emitter<readonly InstallExtensionResult[]>();131const didUninstallEvent = new Emitter<DidUninstallExtensionEvent>();132const didChangeProfileExtensionsEvent = new Emitter<DidChangeProfileEvent>();133const installed: ILocalExtension[] = [];134const malicious: IExtensionIdentifier[] = [];135136setup(() => {137installed.splice(0, installed.length);138instantiationService = disposableStore.add(new TestInstantiationService());139instantiationService.stub(IFileService, disposableStore.add(new FileService(new NullLogService())));140instantiationService.stub(IProductService, TestProductService);141const testConfigurationService = new TestConfigurationService();142testConfigurationService.setUserConfiguration(AllowedExtensionsConfigKey, { '*': true, 'unallowed': false });143instantiationService.stub(IConfigurationService, testConfigurationService);144instantiationService.stub(IWorkspaceContextService, new TestContextService());145instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService({146id: 'local',147label: 'local',148extensionManagementService: <IProfileAwareExtensionManagementService>{149onDidInstallExtensions: didInstallEvent.event,150onDidUninstallExtension: didUninstallEvent.event,151onDidChangeProfile: didChangeProfileExtensionsEvent.event,152onProfileAwareDidInstallExtensions: Event.None,153getInstalled: () => Promise.resolve(installed),154async getExtensionsControlManifest(): Promise<IExtensionsControlManifest> {155return {156malicious: malicious.map(e => ({ extensionOrPublisher: e })),157deprecated: {},158search: []159};160}161},162}, null, null));163instantiationService.stub(ILogService, NullLogService);164instantiationService.stub(IWorkbenchExtensionManagementService, disposableStore.add(instantiationService.createInstance(ExtensionManagementService)));165testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));166});167168test('test disable an extension globally', async () => {169const extension = aLocalExtension('pub.a');170await testObject.setEnablement([extension], EnablementState.DisabledGlobally);171assert.ok(!testObject.isEnabled(extension));172assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledGlobally);173});174175test('test disable an extension globally should return truthy promise', () => {176return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)177.then(value => assert.ok(value));178});179180test('test disable an extension globally triggers the change event', async () => {181const target = sinon.spy();182disposableStore.add(testObject.onEnablementChanged(target));183await testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally);184assert.ok(target.calledOnce);185assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });186});187188test('test disable an extension globally again should return a falsy promise', () => {189return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)190.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally))191.then(value => assert.ok(!value[0]));192});193194test('test state of globally disabled extension', () => {195return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)196.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledGlobally));197});198199test('test state of globally enabled extension', () => {200return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)201.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally))202.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.EnabledGlobally));203});204205test('test disable an extension for workspace', async () => {206const extension = aLocalExtension('pub.a');207await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);208assert.ok(!testObject.isEnabled(extension));209assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledWorkspace);210});211212test('test disable an extension for workspace returns a truthy promise', () => {213return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)214.then(value => assert.ok(value));215});216217test('test disable an extension for workspace again should return a falsy promise', () => {218return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)219.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))220.then(value => assert.ok(!value[0]));221});222223test('test state of workspace disabled extension', () => {224return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)225.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledWorkspace));226});227228test('test state of workspace and globally disabled extension', () => {229return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)230.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))231.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledWorkspace));232});233234test('test state of workspace enabled extension', () => {235return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)236.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))237.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.EnabledWorkspace));238});239240test('test state of globally disabled and workspace enabled extension', () => {241return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)242.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))243.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))244.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.EnabledWorkspace));245});246247test('test state of an extension when disabled for workspace from workspace enabled', () => {248return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)249.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))250.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))251.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledWorkspace));252});253254test('test state of an extension when disabled globally from workspace enabled', () => {255return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)256.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))257.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally))258.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledGlobally));259});260261test('test state of an extension when disabled globally from workspace disabled', () => {262return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)263.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally))264.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledGlobally));265});266267test('test state of an extension when enabled globally from workspace enabled', () => {268return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)269.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))270.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally))271.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.EnabledGlobally));272});273274test('test state of an extension when enabled globally from workspace disabled', () => {275return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)276.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally))277.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.EnabledGlobally));278});279280test('test disable an extension for workspace and then globally', async () => {281const extension = aLocalExtension('pub.a');282await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);283await testObject.setEnablement([extension], EnablementState.DisabledGlobally);284assert.ok(!testObject.isEnabled(extension));285assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledGlobally);286});287288test('test disable an extension for workspace and then globally return a truthy promise', () => {289return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)290.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally))291.then(value => assert.ok(value));292});293294test('test disable an extension for workspace and then globally trigger the change event', () => {295const target = sinon.spy();296return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)297.then(() => disposableStore.add(testObject.onEnablementChanged(target)))298.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally))299.then(() => {300assert.ok(target.calledOnce);301assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });302});303});304305test('test disable an extension globally and then for workspace', async () => {306const extension = aLocalExtension('pub.a');307await testObject.setEnablement([extension], EnablementState.DisabledGlobally);308await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);309assert.ok(!testObject.isEnabled(extension));310assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledWorkspace);311});312313test('test disable an extension globally and then for workspace return a truthy promise', () => {314return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)315.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))316.then(value => assert.ok(value));317});318319test('test disable an extension globally and then for workspace triggers the change event', () => {320const target = sinon.spy();321return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)322.then(() => disposableStore.add(testObject.onEnablementChanged(target)))323.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))324.then(() => {325assert.ok(target.calledOnce);326assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });327});328});329330test('test disable an extension for workspace when there is no workspace throws error', () => {331instantiationService.stub(IWorkspaceContextService, 'getWorkbenchState', WorkbenchState.EMPTY);332return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)333.then(() => assert.fail('should throw an error'), error => assert.ok(error));334});335336test('test enable an extension globally', async () => {337const extension = aLocalExtension('pub.a');338await testObject.setEnablement([extension], EnablementState.DisabledGlobally);339await testObject.setEnablement([extension], EnablementState.EnabledGlobally);340assert.ok(testObject.isEnabled(extension));341assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);342});343344test('test enable an extension globally return truthy promise', async () => {345await testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally);346const value = await testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally);347assert.strictEqual(value[0], true);348});349350test('test enable an extension globally triggers change event', () => {351const target = sinon.spy();352return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)353.then(() => disposableStore.add(testObject.onEnablementChanged(target)))354.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally))355.then(() => {356assert.ok(target.calledOnce);357assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });358});359});360361test('test enable an extension globally when already enabled return falsy promise', () => {362return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally)363.then(value => assert.ok(!value[0]));364});365366test('test enable an extension for workspace', async () => {367const extension = aLocalExtension('pub.a');368await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);369await testObject.setEnablement([extension], EnablementState.EnabledWorkspace);370assert.ok(testObject.isEnabled(extension));371assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledWorkspace);372});373374test('test enable an extension for workspace return truthy promise', () => {375return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)376.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))377.then(value => assert.ok(value));378});379380test('test enable an extension for workspace triggers change event', () => {381const target = sinon.spy();382return testObject.setEnablement([aLocalExtension('pub.b')], EnablementState.DisabledWorkspace)383.then(() => disposableStore.add(testObject.onEnablementChanged(target)))384.then(() => testObject.setEnablement([aLocalExtension('pub.b')], EnablementState.EnabledWorkspace))385.then(() => {386assert.ok(target.calledOnce);387assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.b' });388});389});390391test('test enable an extension for workspace when already enabled return truthy promise', () => {392return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace)393.then(value => assert.ok(value));394});395396test('test enable an extension for workspace when disabled in workspace and gloablly', async () => {397const extension = aLocalExtension('pub.a');398await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);399await testObject.setEnablement([extension], EnablementState.DisabledGlobally);400await testObject.setEnablement([extension], EnablementState.EnabledWorkspace);401assert.ok(testObject.isEnabled(extension));402assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledWorkspace);403});404405test('test enable an extension globally when disabled in workspace and gloablly', async () => {406const extension = aLocalExtension('pub.a');407await testObject.setEnablement([extension], EnablementState.EnabledWorkspace);408await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);409await testObject.setEnablement([extension], EnablementState.DisabledGlobally);410await testObject.setEnablement([extension], EnablementState.EnabledGlobally);411assert.ok(testObject.isEnabled(extension));412assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);413});414415test('test enable an extension also enables dependencies', async () => {416installed.push(...[aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'] }), aLocalExtension('pub.b')]);417const target = installed[0];418const dep = installed[1];419await (<TestExtensionEnablementService>testObject).waitUntilInitialized();420await testObject.setEnablement([dep, target], EnablementState.DisabledGlobally);421await testObject.setEnablement([target], EnablementState.EnabledGlobally);422assert.ok(testObject.isEnabled(target));423assert.ok(testObject.isEnabled(dep));424assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);425assert.strictEqual(testObject.getEnablementState(dep), EnablementState.EnabledGlobally);426});427428test('test enable an extension in workspace with a dependency extension that has auth providers', async () => {429installed.push(...[aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'] }), aLocalExtension('pub.b', { authentication: [{ id: 'a', label: 'a' }] })]);430const target = installed[0];431await (<TestExtensionEnablementService>testObject).waitUntilInitialized();432await testObject.setEnablement([target], EnablementState.DisabledWorkspace);433await testObject.setEnablement([target], EnablementState.EnabledWorkspace);434assert.ok(testObject.isEnabled(target));435assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledWorkspace);436});437438test('test enable an extension with a dependency extension that cannot be enabled', async () => {439instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));440const localWorkspaceDepExtension = aLocalExtension2('pub.b', { extensionKind: ['workspace'] }, { location: URI.file(`pub.b`) });441const remoteWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace'], extensionDependencies: ['pub.b'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });442const remoteWorkspaceDepExtension = aLocalExtension2('pub.b', { extensionKind: ['workspace'] }, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });443installed.push(localWorkspaceDepExtension, remoteWorkspaceExtension, remoteWorkspaceDepExtension);444445testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));446await (<TestExtensionEnablementService>testObject).waitUntilInitialized();447448await testObject.setEnablement([remoteWorkspaceExtension], EnablementState.DisabledGlobally);449await testObject.setEnablement([remoteWorkspaceExtension], EnablementState.EnabledGlobally);450assert.ok(testObject.isEnabled(remoteWorkspaceExtension));451assert.strictEqual(testObject.getEnablementState(remoteWorkspaceExtension), EnablementState.EnabledGlobally);452});453454test('test enable an extension also enables packed extensions', async () => {455installed.push(...[aLocalExtension2('pub.a', { extensionPack: ['pub.b'] }), aLocalExtension('pub.b')]);456const target = installed[0];457const dep = installed[1];458await testObject.setEnablement([dep, target], EnablementState.DisabledGlobally);459await testObject.setEnablement([target], EnablementState.EnabledGlobally);460assert.ok(testObject.isEnabled(target));461assert.ok(testObject.isEnabled(dep));462assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);463assert.strictEqual(testObject.getEnablementState(dep), EnablementState.EnabledGlobally);464});465466test('test remove an extension from disablement list when uninstalled', async () => {467const extension = aLocalExtension('pub.a');468installed.push(extension);469testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));470471await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);472await testObject.setEnablement([extension], EnablementState.DisabledGlobally);473didUninstallEvent.fire({ identifier: { id: 'pub.a' }, profileLocation: null! });474475assert.ok(testObject.isEnabled(extension));476assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);477});478479test('test isEnabled return false extension is disabled globally', () => {480return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)481.then(() => assert.ok(!testObject.isEnabled(aLocalExtension('pub.a'))));482});483484test('test isEnabled return false extension is disabled in workspace', () => {485return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)486.then(() => assert.ok(!testObject.isEnabled(aLocalExtension('pub.a'))));487});488489test('test isEnabled return true extension is not disabled', () => {490return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)491.then(() => testObject.setEnablement([aLocalExtension('pub.c')], EnablementState.DisabledGlobally))492.then(() => assert.ok(testObject.isEnabled(aLocalExtension('pub.b'))));493});494495test('test canChangeEnablement return false for language packs', () => {496assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a', { localizations: [{ languageId: 'gr', translations: [{ id: 'vscode', path: 'path' }] }] })), false);497});498499test('test canChangeEnablement return true for auth extension', () => {500assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a', { authentication: [{ id: 'a', label: 'a' }] })), true);501});502503test('test canChangeEnablement return true for auth extension when user data sync account does not depends on it', () => {504instantiationService.stub(IUserDataSyncAccountService, <Partial<IUserDataSyncAccountService>>{505account: { authenticationProviderId: 'b' }506});507testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));508assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a', { authentication: [{ id: 'a', label: 'a' }] })), true);509});510511test('test canChangeEnablement return true for auth extension when user data sync account depends on it but auto sync is off', () => {512instantiationService.stub(IUserDataSyncAccountService, <Partial<IUserDataSyncAccountService>>{513account: { authenticationProviderId: 'a' }514});515testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));516assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a', { authentication: [{ id: 'a', label: 'a' }] })), true);517});518519test('test canChangeEnablement return false for auth extension and user data sync account depends on it and auto sync is on', () => {520instantiationService.stub(IUserDataSyncEnablementService, <Partial<IUserDataSyncEnablementService>>{ isEnabled() { return true; } });521instantiationService.stub(IUserDataSyncAccountService, <Partial<IUserDataSyncAccountService>>{522account: { authenticationProviderId: 'a' }523});524testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));525assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a', { authentication: [{ id: 'a', label: 'a' }] })), false);526});527528test('test canChangeWorkspaceEnablement return true', () => {529assert.strictEqual(testObject.canChangeWorkspaceEnablement(aLocalExtension('pub.a')), true);530});531532test('test canChangeWorkspaceEnablement return false if there is no workspace', () => {533instantiationService.stub(IWorkspaceContextService, 'getWorkbenchState', WorkbenchState.EMPTY);534assert.strictEqual(testObject.canChangeWorkspaceEnablement(aLocalExtension('pub.a')), false);535});536537test('test canChangeWorkspaceEnablement return false for auth extension', () => {538assert.strictEqual(testObject.canChangeWorkspaceEnablement(aLocalExtension('pub.a', { authentication: [{ id: 'a', label: 'a' }] })), false);539});540541test('test canChangeEnablement return false when extensions are disabled in environment', () => {542instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: true });543testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));544assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a')), false);545});546547test('test canChangeEnablement return false when the extension is disabled in environment', () => {548instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: ['pub.a'] });549testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));550assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a')), false);551});552553test('test canChangeEnablement return true for system extensions when extensions are disabled in environment', () => {554instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: true });555testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));556const extension = aLocalExtension('pub.a', undefined, ExtensionType.System);557assert.strictEqual(testObject.canChangeEnablement(extension), true);558});559560test('test canChangeEnablement return false for system extension when extension is disabled in environment', () => {561instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: ['pub.a'] });562testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));563const extension = aLocalExtension('pub.a', undefined, ExtensionType.System);564assert.ok(!testObject.canChangeEnablement(extension));565});566567test('test extension is disabled when disabled in environment', async () => {568const extension = aLocalExtension('pub.a');569installed.push(extension);570571instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: ['pub.a'] });572testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));573574assert.ok(!testObject.isEnabled(extension));575assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByEnvironment);576});577578test('test extension is enabled globally when enabled in environment', async () => {579const extension = aLocalExtension('pub.a');580installed.push(extension);581582instantiationService.stub(IWorkbenchEnvironmentService, { enableExtensions: <readonly string[]>['pub.a'] });583testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));584585assert.ok(testObject.isEnabled(extension));586assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);587});588589test('test extension is enabled workspace when enabled in environment', async () => {590const extension = aLocalExtension('pub.a');591installed.push(extension);592593await testObject.setEnablement([extension], EnablementState.EnabledWorkspace);594instantiationService.stub(IWorkbenchEnvironmentService, { enableExtensions: <readonly string[]>['pub.a'] });595testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));596597assert.ok(testObject.isEnabled(extension));598assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledWorkspace);599});600601test('test extension is enabled by environment when disabled globally', async () => {602const extension = aLocalExtension('pub.a');603installed.push(extension);604605await testObject.setEnablement([extension], EnablementState.DisabledGlobally);606instantiationService.stub(IWorkbenchEnvironmentService, { enableExtensions: <readonly string[]>['pub.a'] });607testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));608609assert.ok(testObject.isEnabled(extension));610assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledByEnvironment);611});612613test('test extension is enabled by environment when disabled workspace', async () => {614const extension = aLocalExtension('pub.a');615installed.push(extension);616617await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);618instantiationService.stub(IWorkbenchEnvironmentService, { enableExtensions: <readonly string[]>['pub.a'] });619testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));620621assert.ok(testObject.isEnabled(extension));622assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledByEnvironment);623});624625test('test extension is disabled by environment when also enabled in environment', async () => {626const extension = aLocalExtension('pub.a');627installed.push(extension);628629testObject.setEnablement([extension], EnablementState.DisabledWorkspace);630instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: true, enableExtensions: <readonly string[]>['pub.a'] });631testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));632633assert.ok(!testObject.isEnabled(extension));634assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByEnvironment);635});636637test('test canChangeEnablement return false when the extension is enabled in environment', () => {638instantiationService.stub(IWorkbenchEnvironmentService, { enableExtensions: <readonly string[]>['pub.a'] });639testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));640assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a')), false);641});642643test('test extension does not support vitrual workspace is not enabled in virtual workspace', async () => {644const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } });645instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });646testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));647assert.ok(!testObject.isEnabled(extension));648assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByVirtualWorkspace);649});650651test('test web extension from web extension management server and does not support vitrual workspace is enabled in virtual workspace', async () => {652instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, anExtensionManagementServer('vscode-remote', instantiationService), anExtensionManagementServer('web', instantiationService)));653const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false }, browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'web' }) });654instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });655testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));656assert.ok(testObject.isEnabled(extension));657assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);658});659660test('test web extension from remote extension management server and does not support vitrual workspace is disabled in virtual workspace', async () => {661instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, anExtensionManagementServer('vscode-remote', instantiationService), anExtensionManagementServer('web', instantiationService)));662const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false }, browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });663instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });664testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));665assert.ok(!testObject.isEnabled(extension));666assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByVirtualWorkspace);667});668669test('test enable a remote workspace extension and local ui extension that is a dependency of remote', async () => {670instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));671const localUIExtension = aLocalExtension2('pub.a', { main: 'main.js', extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });672const remoteUIExtension = aLocalExtension2('pub.a', { main: 'main.js', extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });673const target = aLocalExtension2('pub.b', { main: 'main.js', extensionDependencies: ['pub.a'] }, { location: URI.file(`pub.b`).with({ scheme: 'vscode-remote' }) });674testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));675676installed.push(localUIExtension, remoteUIExtension, target);677await testObject.setEnablement([target, localUIExtension], EnablementState.DisabledGlobally);678await testObject.setEnablement([target, localUIExtension], EnablementState.EnabledGlobally);679assert.ok(testObject.isEnabled(target));680assert.ok(testObject.isEnabled(localUIExtension));681assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);682assert.strictEqual(testObject.getEnablementState(localUIExtension), EnablementState.EnabledGlobally);683});684685test('test enable a remote workspace extension also enables its dependency in local', async () => {686instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));687const localUIExtension = aLocalExtension2('pub.a', { main: 'main.js', extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });688const remoteUIExtension = aLocalExtension2('pub.a', { main: 'main.js', extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });689const target = aLocalExtension2('pub.b', { main: 'main.js', extensionDependencies: ['pub.a'] }, { location: URI.file(`pub.b`).with({ scheme: 'vscode-remote' }) });690testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));691692installed.push(localUIExtension, remoteUIExtension, target);693await testObject.setEnablement([target, localUIExtension], EnablementState.DisabledGlobally);694await testObject.setEnablement([target], EnablementState.EnabledGlobally);695assert.ok(testObject.isEnabled(target));696assert.ok(testObject.isEnabled(localUIExtension));697assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);698assert.strictEqual(testObject.getEnablementState(localUIExtension), EnablementState.EnabledGlobally);699});700701test('test canChangeEnablement return false when extension is disabled in virtual workspace', () => {702const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } });703instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });704testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));705assert.ok(!testObject.canChangeEnablement(extension));706});707708test('test extension does not support vitrual workspace is enabled in normal workspace', async () => {709const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } });710instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA') }] });711testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));712assert.ok(testObject.isEnabled(extension));713assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);714});715716test('test extension supports virtual workspace is enabled in virtual workspace', async () => {717const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: true } });718instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });719testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));720assert.ok(testObject.isEnabled(extension));721assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);722});723724test('test extension does not support untrusted workspaces is disabled in untrusted workspace', () => {725const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } });726instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });727testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));728assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByTrustRequirement);729});730731test('test canChangeEnablement return true when extension is disabled by workspace trust', () => {732const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } });733instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });734testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));735assert.ok(testObject.canChangeEnablement(extension));736});737738test('test extension supports untrusted workspaces is enabled in untrusted workspace', () => {739const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: true } } });740instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });741testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));742assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);743});744745test('test extension does not support untrusted workspaces is enabled in trusted workspace', () => {746const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: '' } } });747instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return true; } });748testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));749assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);750});751752test('test extension supports untrusted workspaces is enabled in trusted workspace', () => {753const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: true } } });754instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return true; } });755testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));756assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);757});758759test('test extension without any value for virtual worksapce is enabled in virtual workspace', async () => {760const extension = aLocalExtension2('pub.a');761instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });762testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));763assert.ok(testObject.isEnabled(extension));764assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);765});766767test('test local workspace extension is disabled by kind', async () => {768instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));769const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });770testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));771assert.ok(!testObject.isEnabled(localWorkspaceExtension));772assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);773});774775test('test local workspace + ui extension is enabled by kind', async () => {776instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));777const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace', 'ui'] }, { location: URI.file(`pub.a`) });778testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));779assert.ok(testObject.isEnabled(localWorkspaceExtension));780assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);781});782783test('test local ui extension is not disabled by kind', async () => {784instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));785const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });786testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));787assert.ok(testObject.isEnabled(localWorkspaceExtension));788assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);789});790791test('test canChangeEnablement return true when the local workspace extension is disabled by kind', () => {792instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));793const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });794testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));795assert.strictEqual(testObject.canChangeEnablement(localWorkspaceExtension), false);796});797798test('test canChangeEnablement return true for local ui extension', () => {799instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));800const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });801testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));802assert.strictEqual(testObject.canChangeEnablement(localWorkspaceExtension), true);803});804805test('test remote ui extension is disabled by kind', async () => {806instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));807const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });808testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));809assert.ok(!testObject.isEnabled(localWorkspaceExtension));810assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);811});812813test('test remote ui+workspace extension is disabled by kind', async () => {814instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));815const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui', 'workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });816testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));817assert.ok(testObject.isEnabled(localWorkspaceExtension));818assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);819});820821test('test remote ui extension is disabled by kind when there is no local server', async () => {822instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, anExtensionManagementServer('vscode-remote', instantiationService), null));823const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });824testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));825assert.ok(!testObject.isEnabled(localWorkspaceExtension));826assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);827});828829test('test remote workspace extension is not disabled by kind', async () => {830instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));831const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });832testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));833assert.ok(testObject.isEnabled(localWorkspaceExtension));834assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);835});836837test('test canChangeEnablement return true when the remote ui extension is disabled by kind', () => {838instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));839const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });840testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));841assert.strictEqual(testObject.canChangeEnablement(localWorkspaceExtension), false);842});843844test('test canChangeEnablement return true for remote workspace extension', () => {845instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));846const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });847testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));848assert.strictEqual(testObject.canChangeEnablement(localWorkspaceExtension), true);849});850851test('test web extension on local server is disabled by kind when web worker is not enabled', async () => {852instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));853const localWorkspaceExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`) });854(<TestConfigurationService>instantiationService.get(IConfigurationService)).setUserConfiguration('extensions', { webWorker: false });855testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));856assert.strictEqual(testObject.isEnabled(localWorkspaceExtension), false);857assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);858});859860test('test web extension on local server is not disabled by kind when web worker is enabled', async () => {861instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));862const localWorkspaceExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`) });863(<TestConfigurationService>instantiationService.get(IConfigurationService)).setUserConfiguration('extensions', { webWorker: true });864testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));865assert.strictEqual(testObject.isEnabled(localWorkspaceExtension), true);866assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);867});868869test('test web extension on remote server is disabled by kind when web worker is not enabled', async () => {870instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));871const localWorkspaceExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });872(<TestConfigurationService>instantiationService.get(IConfigurationService)).setUserConfiguration('extensions', { webWorker: false });873testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));874assert.strictEqual(testObject.isEnabled(localWorkspaceExtension), false);875assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);876});877878test('test web extension on remote server is disabled by kind when web worker is enabled', async () => {879instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));880const localWorkspaceExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });881(<TestConfigurationService>instantiationService.get(IConfigurationService)).setUserConfiguration('extensions', { webWorker: true });882testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));883assert.strictEqual(testObject.isEnabled(localWorkspaceExtension), false);884assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);885});886887test('test web extension on remote server is enabled in web', async () => {888instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), anExtensionManagementServer('web', instantiationService)));889const localWorkspaceExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });890(<TestConfigurationService>instantiationService.get(IConfigurationService)).setUserConfiguration('extensions', { webWorker: false });891testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));892assert.strictEqual(testObject.isEnabled(localWorkspaceExtension), true);893assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);894});895896test('test web extension on web server is not disabled by kind', async () => {897instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), anExtensionManagementServer('web', instantiationService)));898const webExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'web' }) });899testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));900assert.strictEqual(testObject.isEnabled(webExtension), true);901assert.deepStrictEqual(testObject.getEnablementState(webExtension), EnablementState.EnabledGlobally);902});903904test('test state of multipe extensions', async () => {905installed.push(...[aLocalExtension('pub.a'), aLocalExtension('pub.b'), aLocalExtension('pub.c'), aLocalExtension('pub.d'), aLocalExtension('pub.e')]);906testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));907await (<TestExtensionEnablementService>testObject).waitUntilInitialized();908909await testObject.setEnablement([installed[0]], EnablementState.DisabledGlobally);910await testObject.setEnablement([installed[1]], EnablementState.DisabledWorkspace);911await testObject.setEnablement([installed[2]], EnablementState.EnabledWorkspace);912await testObject.setEnablement([installed[3]], EnablementState.EnabledGlobally);913914assert.deepStrictEqual(testObject.getEnablementStates(installed), [EnablementState.DisabledGlobally, EnablementState.DisabledWorkspace, EnablementState.EnabledWorkspace, EnablementState.EnabledGlobally, EnablementState.EnabledGlobally]);915});916917test('test extension is disabled by dependency if it has a dependency that is disabled', async () => {918installed.push(...[aLocalExtension2('pub.a'), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] })]);919testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));920await (<TestExtensionEnablementService>testObject).waitUntilInitialized();921922await testObject.setEnablement([installed[0]], EnablementState.DisabledGlobally);923924assert.strictEqual(testObject.getEnablementState(installed[1]), EnablementState.DisabledByExtensionDependency);925});926927test('test extension is disabled by dependency if it has a dependency that is disabled by virtual workspace', async () => {928installed.push(...[aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } }), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'], capabilities: { virtualWorkspaces: true } })]);929instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });930testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));931await (<TestExtensionEnablementService>testObject).waitUntilInitialized();932933assert.strictEqual(testObject.getEnablementState(installed[0]), EnablementState.DisabledByVirtualWorkspace);934assert.strictEqual(testObject.getEnablementState(installed[1]), EnablementState.DisabledByExtensionDependency);935});936937test('test canChangeEnablement return false when extension is disabled by dependency if it has a dependency that is disabled by virtual workspace', async () => {938installed.push(...[aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } }), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'], capabilities: { virtualWorkspaces: true } })]);939instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });940testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));941await (<TestExtensionEnablementService>testObject).waitUntilInitialized();942943assert.ok(!testObject.canChangeEnablement(installed[1]));944});945946test('test extension is disabled by dependency if it has a dependency that is disabled by workspace trust', async () => {947installed.push(...[aLocalExtension2('pub.a', { main: 'hello.js', capabilities: { untrustedWorkspaces: { supported: false, description: '' } } }), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'], capabilities: { untrustedWorkspaces: { supported: true } } })]);948instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });949testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));950await (<TestExtensionEnablementService>testObject).waitUntilInitialized();951952assert.strictEqual(testObject.getEnablementState(installed[0]), EnablementState.DisabledByTrustRequirement);953assert.strictEqual(testObject.getEnablementState(installed[1]), EnablementState.DisabledByExtensionDependency);954});955956test('test extension is not disabled by dependency if it has a dependency that is disabled by extension kind', async () => {957instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));958const localUIExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });959const remoteUIExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });960const remoteWorkspaceExtension = aLocalExtension2('pub.n', { extensionKind: ['workspace'], extensionDependencies: ['pub.a'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });961installed.push(localUIExtension, remoteUIExtension, remoteWorkspaceExtension);962963testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));964await (<TestExtensionEnablementService>testObject).waitUntilInitialized();965966assert.strictEqual(testObject.getEnablementState(localUIExtension), EnablementState.EnabledGlobally);967assert.strictEqual(testObject.getEnablementState(remoteUIExtension), EnablementState.DisabledByExtensionKind);968assert.strictEqual(testObject.getEnablementState(remoteWorkspaceExtension), EnablementState.EnabledGlobally);969});970971test('test canChangeEnablement return false when extension is disabled by dependency if it has a dependency that is disabled by workspace trust', async () => {972installed.push(...[aLocalExtension2('pub.a', { main: 'hello.js', capabilities: { untrustedWorkspaces: { supported: false, description: '' } } }), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'], capabilities: { untrustedWorkspaces: { supported: true } } })]);973instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });974testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));975await (<TestExtensionEnablementService>testObject).waitUntilInitialized();976977assert.deepEqual(testObject.canChangeEnablement(installed[1]), false);978});979980test('test canChangeEnablement return false when extension is disabled by dependency if it has a dependency that is disabled globally', async () => {981installed.push(...[aLocalExtension2('pub.a', {}), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] })]);982testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));983await (<TestExtensionEnablementService>testObject).waitUntilInitialized();984985await testObject.setEnablement([installed[0]], EnablementState.DisabledGlobally);986987assert.deepEqual(testObject.canChangeEnablement(installed[1]), false);988});989990test('test canChangeEnablement return false when extension is disabled by dependency if it has a dependency that is disabled workspace', async () => {991installed.push(...[aLocalExtension2('pub.a', {}), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] })]);992testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));993await (<TestExtensionEnablementService>testObject).waitUntilInitialized();994995await testObject.setEnablement([installed[0]], EnablementState.DisabledWorkspace);996997assert.deepEqual(testObject.canChangeEnablement(installed[1]), false);998});9991000test('test extension is not disabled by dependency even if it has a dependency that is disabled when installed extensions are not set', async () => {1001await testObject.setEnablement([aLocalExtension2('pub.a')], EnablementState.DisabledGlobally);10021003assert.strictEqual(testObject.getEnablementState(aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] })), EnablementState.EnabledGlobally);1004});10051006test('test extension is disabled by dependency if it has a dependency that is disabled when all extensions are passed', async () => {1007installed.push(...[aLocalExtension2('pub.a'), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] })]);1008testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1009await (<TestExtensionEnablementService>testObject).waitUntilInitialized();10101011await testObject.setEnablement([installed[0]], EnablementState.DisabledGlobally);10121013assert.deepStrictEqual(testObject.getEnablementStates(installed), [EnablementState.DisabledGlobally, EnablementState.DisabledByExtensionDependency]);1014});10151016test('test extension is not disabled when it has a missing dependency', async () => {1017const target = aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] });1018installed.push(target);1019testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1020await (<TestExtensionEnablementService>testObject).waitUntilInitialized();10211022assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);1023});10241025test('test extension is not disabled when it has a dependency in another server', async () => {1026instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));1027const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'], extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });1028const depdencyOnAnotherServer = aLocalExtension2('pub.b', {}, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });1029installed.push(...[target, depdencyOnAnotherServer]);1030testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1031await (<TestExtensionEnablementService>testObject).waitUntilInitialized();10321033assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);1034});10351036test('test extension is enabled when it has a dependency in another server which is disabled', async () => {1037instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));1038const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'], extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });1039const depdencyOnAnotherServer = aLocalExtension2('pub.b', {}, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });1040installed.push(...[target, depdencyOnAnotherServer]);1041testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1042await (<TestExtensionEnablementService>testObject).waitUntilInitialized();1043await testObject.setEnablement([depdencyOnAnotherServer], EnablementState.DisabledGlobally);10441045assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);1046});10471048test('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 () => {1049instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));1050const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'], extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });1051const depdencyOnAnotherServer = aLocalExtension2('pub.b', { api: 'none' }, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });1052installed.push(...[target, depdencyOnAnotherServer]);1053testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1054await (<TestExtensionEnablementService>testObject).waitUntilInitialized();1055await testObject.setEnablement([depdencyOnAnotherServer], EnablementState.DisabledGlobally);10561057assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);1058});10591060test('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 () => {1061instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));1062const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'], extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });1063const depdencyOnAnotherServer = aLocalExtension2('pub.b', { api: 'none', main: 'main.js' }, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });1064installed.push(...[target, depdencyOnAnotherServer]);1065testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1066await (<TestExtensionEnablementService>testObject).waitUntilInitialized();1067await testObject.setEnablement([depdencyOnAnotherServer], EnablementState.DisabledGlobally);10681069assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByExtensionDependency);1070});10711072test('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 () => {1073instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));1074const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });1075const depdencyOnAnotherServer = aLocalExtension2('pub.b', { api: 'none', browser: 'browser.js', extensionKind: 'ui' }, { location: URI.file(`pub.b`) });1076installed.push(...[target, depdencyOnAnotherServer]);1077testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1078await (<TestExtensionEnablementService>testObject).waitUntilInitialized();1079await testObject.setEnablement([depdencyOnAnotherServer], EnablementState.DisabledGlobally);10801081assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByExtensionDependency);1082});10831084test('test extension is disabled by invalidity', async () => {1085const target = aLocalExtension2('pub.b', {}, { isValid: false });1086assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByInvalidExtension);1087});10881089test('test extension is disabled by dependency when it has a dependency that is invalid', async () => {1090const target = aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] });1091installed.push(...[target, aLocalExtension2('pub.a', {}, { isValid: false })]);1092testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1093await (<TestExtensionEnablementService>testObject).waitUntilInitialized();10941095assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByExtensionDependency);1096});10971098test('test extension is enabled when its dependency becomes valid', async () => {1099const extension = aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] });1100installed.push(...[extension, aLocalExtension2('pub.a', {}, { isValid: false })]);1101testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1102await (<TestExtensionEnablementService>testObject).waitUntilInitialized();11031104assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByExtensionDependency);11051106const target = sinon.spy();1107disposableStore.add(testObject.onEnablementChanged(target));11081109const validExtension = aLocalExtension2('pub.a');1110didInstallEvent.fire([{1111identifier: validExtension.identifier,1112operation: InstallOperation.Install,1113source: validExtension.location,1114profileLocation: validExtension.location,1115local: validExtension,1116}]);11171118assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);1119assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.b' });1120});11211122test('test override workspace to trusted when getting extensions enablements', async () => {1123const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } });1124instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });1125testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));11261127assert.strictEqual(testObject.getEnablementStates([extension], { trusted: true })[0], EnablementState.EnabledGlobally);1128});11291130test('test override workspace to not trusted when getting extensions enablements', async () => {1131const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } });1132instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return true; } });1133testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));11341135assert.strictEqual(testObject.getEnablementStates([extension], { trusted: false })[0], EnablementState.DisabledByTrustRequirement);1136});11371138test('test update extensions enablements on trust change triggers change events for extensions depending on workspace trust', async () => {1139installed.push(...[1140aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } }),1141aLocalExtension2('pub.b', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: true } } }),1142aLocalExtension2('pub.c', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } }),1143aLocalExtension2('pub.d', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: true } } }),1144]);1145testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1146const target = sinon.spy();1147disposableStore.add(testObject.onEnablementChanged(target));11481149await testObject.updateExtensionsEnablementsWhenWorkspaceTrustChanges();1150assert.strictEqual(target.args[0][0].length, 2);1151assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });1152assert.deepStrictEqual((<IExtension>target.args[0][0][1]).identifier, { id: 'pub.c' });1153});11541155test('test adding an extension that was disabled', async () => {1156const extension = aLocalExtension('pub.a');1157installed.push(extension);1158testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1159await testObject.setEnablement([extension], EnablementState.DisabledGlobally);11601161const target = sinon.spy();1162disposableStore.add(testObject.onEnablementChanged(target));1163didChangeProfileExtensionsEvent.fire({ added: [extension], removed: [] });11641165assert.ok(!testObject.isEnabled(extension));1166assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledGlobally);1167assert.strictEqual(target.args[0][0].length, 1);1168assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });1169});11701171test('test extension is disabled by allowed list', async () => {1172const target = aLocalExtension2('unallowed.extension');1173assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByAllowlist);1174});11751176test('test extension is disabled by malicious', async () => {1177malicious.push({ id: 'malicious.extensionA' });1178testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1179await (<TestExtensionEnablementService>testObject).waitUntilInitialized();1180const target = aLocalExtension2('malicious.extensionA');1181assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByMalicious);1182});11831184test('test installed malicious extension triggers change event', async () => {1185testObject.dispose();1186malicious.push({ id: 'malicious.extensionB' });1187const local = aLocalExtension2('malicious.extensionB');1188installed.push(local);1189testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));1190assert.strictEqual(testObject.getEnablementState(local), EnablementState.EnabledGlobally);1191const promise = Event.toPromise(testObject.onEnablementChanged);11921193const result = await promise;1194assert.deepStrictEqual(result[0], local);1195assert.strictEqual(testObject.getEnablementState(local), EnablementState.DisabledByMalicious);1196});11971198});11991200function anExtensionManagementServer(authority: string, instantiationService: TestInstantiationService): IExtensionManagementServer {1201return {1202id: authority,1203label: authority,1204extensionManagementService: instantiationService.get(IExtensionManagementService) as IProfileAwareExtensionManagementService,1205};1206}12071208function aMultiExtensionManagementServerService(instantiationService: TestInstantiationService): IExtensionManagementServerService {1209const localExtensionManagementServer = anExtensionManagementServer('vscode-local', instantiationService);1210const remoteExtensionManagementServer = anExtensionManagementServer('vscode-remote', instantiationService);1211return anExtensionManagementServerService(localExtensionManagementServer, remoteExtensionManagementServer, null);1212}12131214export function anExtensionManagementServerService(localExtensionManagementServer: IExtensionManagementServer | null, remoteExtensionManagementServer: IExtensionManagementServer | null, webExtensionManagementServer: IExtensionManagementServer | null): IExtensionManagementServerService {1215return {1216_serviceBrand: undefined,1217localExtensionManagementServer,1218remoteExtensionManagementServer,1219webExtensionManagementServer,1220getExtensionManagementServer: (extension: IExtension) => {1221if (extension.location.scheme === Schemas.file) {1222return localExtensionManagementServer;1223}1224if (extension.location.scheme === Schemas.vscodeRemote) {1225return remoteExtensionManagementServer;1226}1227return webExtensionManagementServer;1228},1229getExtensionInstallLocation(extension: IExtension): ExtensionInstallLocation | null {1230const server = this.getExtensionManagementServer(extension);1231return server === remoteExtensionManagementServer ? ExtensionInstallLocation.Remote1232: server === webExtensionManagementServer ? ExtensionInstallLocation.Web1233: ExtensionInstallLocation.Local;1234}1235};1236}12371238function aLocalExtension(id: string, contributes?: IExtensionContributions, type?: ExtensionType): ILocalExtension {1239return aLocalExtension2(id, contributes ? { contributes } : {}, isUndefinedOrNull(type) ? {} : { type });1240}12411242function aLocalExtension2(id: string, manifest: Partial<IExtensionManifest> = {}, properties: any = {}): ILocalExtension {1243const [publisher, name] = id.split('.');1244manifest = { name, publisher, ...manifest };1245properties = {1246identifier: { id },1247location: URI.file(`pub.${name}`),1248galleryIdentifier: { id, uuid: undefined },1249type: ExtensionType.User,1250...properties,1251isValid: properties.isValid ?? true,1252};1253properties.isBuiltin = properties.type === ExtensionType.System;1254return <ILocalExtension>Object.create({ manifest, ...properties });1255}125612571258