Path: blob/main/src/vs/workbench/services/extensions/test/common/extensionManifestPropertiesService.test.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { DisposableStore } from '../../../../../base/common/lifecycle.js';7import { isWeb } from '../../../../../base/common/platform.js';8import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';9import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';10import { TestConfigurationService } from '../../../../../platform/configuration/test/common/testConfigurationService.js';11import { ExtensionUntrustedWorkspaceSupportType, IExtensionManifest } from '../../../../../platform/extensions/common/extensions.js';12import { TestInstantiationService } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js';13import { NullLogService } from '../../../../../platform/log/common/log.js';14import { IProductService } from '../../../../../platform/product/common/productService.js';15import { IWorkspaceTrustEnablementService } from '../../../../../platform/workspace/common/workspaceTrust.js';16import { ExtensionManifestPropertiesService } from '../../common/extensionManifestPropertiesService.js';17import { TestProductService, TestWorkspaceTrustEnablementService } from '../../../../test/common/workbenchTestServices.js';1819suite('ExtensionManifestPropertiesService - ExtensionKind', () => {2021let disposables: DisposableStore;22let testObject: ExtensionManifestPropertiesService;2324setup(() => {25disposables = new DisposableStore();26testObject = disposables.add(new ExtensionManifestPropertiesService(TestProductService, new TestConfigurationService(), new TestWorkspaceTrustEnablementService(), new NullLogService()));27});2829teardown(() => {30disposables.dispose();31});3233ensureNoDisposablesAreLeakedInTestSuite();3435test('declarative with extension dependencies', () => {36assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ extensionDependencies: ['ext1'] }), isWeb ? ['workspace', 'web'] : ['workspace']);37});3839test('declarative extension pack', () => {40assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ extensionPack: ['ext1', 'ext2'] }), isWeb ? ['workspace', 'web'] : ['workspace']);41});4243test('declarative extension pack and extension dependencies', () => {44assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ extensionPack: ['ext1', 'ext2'], extensionDependencies: ['ext1', 'ext2'] }), isWeb ? ['workspace', 'web'] : ['workspace']);45});4647test('declarative with unknown contribution point => workspace, web in web and => workspace in desktop', () => {48assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ contributes: <any>{ 'unknownPoint': { something: true } } }), isWeb ? ['workspace', 'web'] : ['workspace']);49});5051test('declarative extension pack with unknown contribution point', () => {52assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ extensionPack: ['ext1', 'ext2'], contributes: <any>{ 'unknownPoint': { something: true } } }), isWeb ? ['workspace', 'web'] : ['workspace']);53});5455test('simple declarative => ui, workspace, web', () => {56assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{}), ['ui', 'workspace', 'web']);57});5859test('only browser => web', () => {60assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ browser: 'main.browser.js' }), ['web']);61});6263test('only main => workspace', () => {64assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ main: 'main.js' }), ['workspace']);65});6667test('main and browser => workspace, web in web and workspace in desktop', () => {68assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ main: 'main.js', browser: 'main.browser.js' }), isWeb ? ['workspace', 'web'] : ['workspace']);69});7071test('browser entry point with workspace extensionKind => workspace, web in web and workspace in desktop', () => {72assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ main: 'main.js', browser: 'main.browser.js', extensionKind: ['workspace'] }), isWeb ? ['workspace', 'web'] : ['workspace']);73});7475test('only browser entry point with out extensionKind => web', () => {76assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ browser: 'main.browser.js' }), ['web']);77});7879test('simple descriptive with workspace, ui extensionKind => workspace, ui, web in web and workspace, ui in desktop', () => {80assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ extensionKind: ['workspace', 'ui'] }), isWeb ? ['workspace', 'ui', 'web'] : ['workspace', 'ui']);81});8283test('opt out from web through settings even if it can run in web', () => {84testObject = disposables.add(new ExtensionManifestPropertiesService(TestProductService, new TestConfigurationService({ remote: { extensionKind: { 'pub.a': ['-web'] } } }), new TestWorkspaceTrustEnablementService(), new NullLogService()));85assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ browser: 'main.browser.js', publisher: 'pub', name: 'a' }), ['ui', 'workspace']);86});8788test('opt out from web and include only workspace through settings even if it can run in web', () => {89testObject = disposables.add(new ExtensionManifestPropertiesService(TestProductService, new TestConfigurationService({ remote: { extensionKind: { 'pub.a': ['-web', 'workspace'] } } }), new TestWorkspaceTrustEnablementService(), new NullLogService()));90assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ browser: 'main.browser.js', publisher: 'pub', name: 'a' }), ['workspace']);91});9293test('extension cannot opt out from web', () => {94assert.deepStrictEqual(testObject.getExtensionKind(<any>{ browser: 'main.browser.js', extensionKind: ['-web'] }), ['web']);95});9697test('extension cannot opt into web', () => {98assert.deepStrictEqual(testObject.getExtensionKind(<any>{ main: 'main.js', extensionKind: ['web', 'workspace', 'ui'] }), ['workspace', 'ui']);99});100101test('extension cannot opt into web only', () => {102assert.deepStrictEqual(testObject.getExtensionKind(<any>{ main: 'main.js', extensionKind: ['web'] }), ['workspace']);103});104});105106107// Workspace Trust is disabled in web at the moment108if (!isWeb) {109suite('ExtensionManifestPropertiesService - ExtensionUntrustedWorkspaceSupportType', () => {110let testObject: ExtensionManifestPropertiesService;111let instantiationService: TestInstantiationService;112let testConfigurationService: TestConfigurationService;113114setup(async () => {115instantiationService = new TestInstantiationService();116117testConfigurationService = new TestConfigurationService();118instantiationService.stub(IConfigurationService, testConfigurationService);119});120121teardown(() => {122testObject.dispose();123instantiationService.dispose();124});125126function assertUntrustedWorkspaceSupport(extensionManifest: IExtensionManifest, expected: ExtensionUntrustedWorkspaceSupportType): void {127testObject = instantiationService.createInstance(ExtensionManifestPropertiesService);128const untrustedWorkspaceSupport = testObject.getExtensionUntrustedWorkspaceSupportType(extensionManifest);129130assert.strictEqual(untrustedWorkspaceSupport, expected);131}132133function getExtensionManifest(properties: any = {}): IExtensionManifest {134return Object.create({ name: 'a', publisher: 'pub', version: '1.0.0', ...properties }) as IExtensionManifest;135}136137test('test extension workspace trust request when main entry point is missing', () => {138instantiationService.stub(IProductService, {});139instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());140141const extensionManifest = getExtensionManifest();142assertUntrustedWorkspaceSupport(extensionManifest, true);143});144145test('test extension workspace trust request when workspace trust is disabled', async () => {146instantiationService.stub(IProductService, {});147instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService(false));148149const extensionManifest = getExtensionManifest({ main: './out/extension.js' });150assertUntrustedWorkspaceSupport(extensionManifest, true);151});152153test('test extension workspace trust request when "true" override exists in settings.json', async () => {154instantiationService.stub(IProductService, {});155instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());156157await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: true } } });158const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });159assertUntrustedWorkspaceSupport(extensionManifest, true);160});161162test('test extension workspace trust request when override (false) exists in settings.json', async () => {163instantiationService.stub(IProductService, {});164instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());165166await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: false } } });167const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });168assertUntrustedWorkspaceSupport(extensionManifest, false);169});170171test('test extension workspace trust request when override (true) for the version exists in settings.json', async () => {172instantiationService.stub(IProductService, {});173instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());174175await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: true, version: '1.0.0' } } });176const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });177assertUntrustedWorkspaceSupport(extensionManifest, true);178});179180test('test extension workspace trust request when override (false) for the version exists in settings.json', async () => {181instantiationService.stub(IProductService, {});182instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());183184await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: false, version: '1.0.0' } } });185const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });186assertUntrustedWorkspaceSupport(extensionManifest, false);187});188189test('test extension workspace trust request when override for a different version exists in settings.json', async () => {190instantiationService.stub(IProductService, {});191instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());192193await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: true, version: '2.0.0' } } });194const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });195assertUntrustedWorkspaceSupport(extensionManifest, 'limited');196});197198test('test extension workspace trust request when default (true) exists in product.json', () => {199instantiationService.stub(IProductService, { extensionUntrustedWorkspaceSupport: { 'pub.a': { default: true } } });200instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());201202const extensionManifest = getExtensionManifest({ main: './out/extension.js' });203assertUntrustedWorkspaceSupport(extensionManifest, true);204});205206test('test extension workspace trust request when default (false) exists in product.json', () => {207instantiationService.stub(IProductService, { extensionUntrustedWorkspaceSupport: { 'pub.a': { default: false } } });208instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());209210const extensionManifest = getExtensionManifest({ main: './out/extension.js' });211assertUntrustedWorkspaceSupport(extensionManifest, false);212});213214test('test extension workspace trust request when override (limited) exists in product.json', () => {215instantiationService.stub(IProductService, { extensionUntrustedWorkspaceSupport: { 'pub.a': { override: 'limited' } } });216instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());217218const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: true } } });219assertUntrustedWorkspaceSupport(extensionManifest, 'limited');220});221222test('test extension workspace trust request when override (false) exists in product.json', () => {223instantiationService.stub(IProductService, { extensionUntrustedWorkspaceSupport: { 'pub.a': { override: false } } });224instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());225226const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: true } } });227assertUntrustedWorkspaceSupport(extensionManifest, false);228});229230test('test extension workspace trust request when value exists in package.json', () => {231instantiationService.stub(IProductService, {});232instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());233234const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });235assertUntrustedWorkspaceSupport(extensionManifest, 'limited');236});237238test('test extension workspace trust request when no value exists in package.json', () => {239instantiationService.stub(IProductService, {});240instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());241242const extensionManifest = getExtensionManifest({ main: './out/extension.js' });243assertUntrustedWorkspaceSupport(extensionManifest, false);244});245});246}247248249