Path: blob/main/src/vs/workbench/services/extensions/test/common/extensionManifestPropertiesService.test.ts
5272 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', () => {48// eslint-disable-next-line local/code-no-any-casts49assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ contributes: <any>{ 'unknownPoint': { something: true } } }), isWeb ? ['workspace', 'web'] : ['workspace']);50});5152test('declarative extension pack with unknown contribution point', () => {53// eslint-disable-next-line local/code-no-any-casts54assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ extensionPack: ['ext1', 'ext2'], contributes: <any>{ 'unknownPoint': { something: true } } }), isWeb ? ['workspace', 'web'] : ['workspace']);55});5657test('simple declarative => ui, workspace, web', () => {58assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{}), ['ui', 'workspace', 'web']);59});6061test('only browser => web', () => {62assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ browser: 'main.browser.js' }), ['web']);63});6465test('only main => workspace', () => {66assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ main: 'main.js' }), ['workspace']);67});6869test('main and browser => workspace, web in web and workspace in desktop', () => {70assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ main: 'main.js', browser: 'main.browser.js' }), isWeb ? ['workspace', 'web'] : ['workspace']);71});7273test('browser entry point with workspace extensionKind => workspace, web in web and workspace in desktop', () => {74assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ main: 'main.js', browser: 'main.browser.js', extensionKind: ['workspace'] }), isWeb ? ['workspace', 'web'] : ['workspace']);75});7677test('only browser entry point with out extensionKind => web', () => {78assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ browser: 'main.browser.js' }), ['web']);79});8081test('simple descriptive with workspace, ui extensionKind => workspace, ui, web in web and workspace, ui in desktop', () => {82assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ extensionKind: ['workspace', 'ui'] }), isWeb ? ['workspace', 'ui', 'web'] : ['workspace', 'ui']);83});8485test('opt out from web through settings even if it can run in web', () => {86testObject = disposables.add(new ExtensionManifestPropertiesService(TestProductService, new TestConfigurationService({ remote: { extensionKind: { 'pub.a': ['-web'] } } }), new TestWorkspaceTrustEnablementService(), new NullLogService()));87assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ browser: 'main.browser.js', publisher: 'pub', name: 'a' }), ['ui', 'workspace']);88});8990test('opt out from web and include only workspace through settings even if it can run in web', () => {91testObject = disposables.add(new ExtensionManifestPropertiesService(TestProductService, new TestConfigurationService({ remote: { extensionKind: { 'pub.a': ['-web', 'workspace'] } } }), new TestWorkspaceTrustEnablementService(), new NullLogService()));92assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ browser: 'main.browser.js', publisher: 'pub', name: 'a' }), ['workspace']);93});9495test('extension cannot opt out from web', () => {96// eslint-disable-next-line local/code-no-any-casts97assert.deepStrictEqual(testObject.getExtensionKind(<any>{ browser: 'main.browser.js', extensionKind: ['-web'] }), ['web']);98});99100test('extension cannot opt into web', () => {101// eslint-disable-next-line local/code-no-any-casts102assert.deepStrictEqual(testObject.getExtensionKind(<any>{ main: 'main.js', extensionKind: ['web', 'workspace', 'ui'] }), ['workspace', 'ui']);103});104105test('extension cannot opt into web only', () => {106// eslint-disable-next-line local/code-no-any-casts107assert.deepStrictEqual(testObject.getExtensionKind(<any>{ main: 'main.js', extensionKind: ['web'] }), ['workspace']);108});109});110111112// Workspace Trust is disabled in web at the moment113if (!isWeb) {114suite('ExtensionManifestPropertiesService - ExtensionUntrustedWorkspaceSupportType', () => {115let testObject: ExtensionManifestPropertiesService;116let instantiationService: TestInstantiationService;117let testConfigurationService: TestConfigurationService;118119setup(async () => {120instantiationService = new TestInstantiationService();121122testConfigurationService = new TestConfigurationService();123instantiationService.stub(IConfigurationService, testConfigurationService);124});125126teardown(() => {127testObject.dispose();128instantiationService.dispose();129});130131function assertUntrustedWorkspaceSupport(extensionManifest: IExtensionManifest, expected: ExtensionUntrustedWorkspaceSupportType): void {132testObject = instantiationService.createInstance(ExtensionManifestPropertiesService);133const untrustedWorkspaceSupport = testObject.getExtensionUntrustedWorkspaceSupportType(extensionManifest);134135assert.strictEqual(untrustedWorkspaceSupport, expected);136}137138function getExtensionManifest(properties: any = {}): IExtensionManifest {139return Object.create({ name: 'a', publisher: 'pub', version: '1.0.0', ...properties }) as IExtensionManifest;140}141142test('test extension workspace trust request when main entry point is missing', () => {143instantiationService.stub(IProductService, {});144instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());145146const extensionManifest = getExtensionManifest();147assertUntrustedWorkspaceSupport(extensionManifest, true);148});149150test('test extension workspace trust request when workspace trust is disabled', async () => {151instantiationService.stub(IProductService, {});152instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService(false));153154const extensionManifest = getExtensionManifest({ main: './out/extension.js' });155assertUntrustedWorkspaceSupport(extensionManifest, true);156});157158test('test extension workspace trust request when "true" override exists in settings.json', async () => {159instantiationService.stub(IProductService, {});160instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());161162await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: true } } });163const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });164assertUntrustedWorkspaceSupport(extensionManifest, true);165});166167test('test extension workspace trust request when override (false) exists in settings.json', async () => {168instantiationService.stub(IProductService, {});169instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());170171await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: false } } });172const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });173assertUntrustedWorkspaceSupport(extensionManifest, false);174});175176test('test extension workspace trust request when override (true) for the version exists in settings.json', async () => {177instantiationService.stub(IProductService, {});178instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());179180await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: true, version: '1.0.0' } } });181const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });182assertUntrustedWorkspaceSupport(extensionManifest, true);183});184185test('test extension workspace trust request when override (false) for the version exists in settings.json', async () => {186instantiationService.stub(IProductService, {});187instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());188189await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: false, version: '1.0.0' } } });190const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });191assertUntrustedWorkspaceSupport(extensionManifest, false);192});193194test('test extension workspace trust request when override for a different version exists in settings.json', async () => {195instantiationService.stub(IProductService, {});196instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());197198await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: true, version: '2.0.0' } } });199const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });200assertUntrustedWorkspaceSupport(extensionManifest, 'limited');201});202203test('test extension workspace trust request when default (true) exists in product.json', () => {204instantiationService.stub(IProductService, { extensionUntrustedWorkspaceSupport: { 'pub.a': { default: true } } });205instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());206207const extensionManifest = getExtensionManifest({ main: './out/extension.js' });208assertUntrustedWorkspaceSupport(extensionManifest, true);209});210211test('test extension workspace trust request when default (false) exists in product.json', () => {212instantiationService.stub(IProductService, { extensionUntrustedWorkspaceSupport: { 'pub.a': { default: false } } });213instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());214215const extensionManifest = getExtensionManifest({ main: './out/extension.js' });216assertUntrustedWorkspaceSupport(extensionManifest, false);217});218219test('test extension workspace trust request when override (limited) exists in product.json', () => {220instantiationService.stub(IProductService, { extensionUntrustedWorkspaceSupport: { 'pub.a': { override: 'limited' } } });221instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());222223const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: true } } });224assertUntrustedWorkspaceSupport(extensionManifest, 'limited');225});226227test('test extension workspace trust request when override (false) exists in product.json', () => {228instantiationService.stub(IProductService, { extensionUntrustedWorkspaceSupport: { 'pub.a': { override: false } } });229instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());230231const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: true } } });232assertUntrustedWorkspaceSupport(extensionManifest, false);233});234235test('test extension workspace trust request when value exists in package.json', () => {236instantiationService.stub(IProductService, {});237instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());238239const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });240assertUntrustedWorkspaceSupport(extensionManifest, 'limited');241});242243test('test extension workspace trust request when no value exists in package.json', () => {244instantiationService.stub(IProductService, {});245instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());246247const extensionManifest = getExtensionManifest({ main: './out/extension.js' });248assertUntrustedWorkspaceSupport(extensionManifest, false);249});250});251}252253254