Path: blob/main/src/vs/workbench/services/extensions/test/browser/extensionService.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 { Event } from '../../../../../base/common/event.js';7import { DisposableStore } from '../../../../../base/common/lifecycle.js';8import { mock } from '../../../../../base/test/common/mock.js';9import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';10import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';11import { TestConfigurationService } from '../../../../../platform/configuration/test/common/testConfigurationService.js';12import { TestDialogService } from '../../../../../platform/dialogs/test/common/testDialogService.js';13import { ExtensionKind, IEnvironmentService } from '../../../../../platform/environment/common/environment.js';14import { ExtensionIdentifier, IExtension, IExtensionDescription } from '../../../../../platform/extensions/common/extensions.js';15import { IFileService } from '../../../../../platform/files/common/files.js';16import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';17import { TestInstantiationService, createServices } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js';18import { ILogService, NullLogService } from '../../../../../platform/log/common/log.js';19import { INotificationService } from '../../../../../platform/notification/common/notification.js';20import { TestNotificationService } from '../../../../../platform/notification/test/common/testNotificationService.js';21import product from '../../../../../platform/product/common/product.js';22import { IProductService } from '../../../../../platform/product/common/productService.js';23import { RemoteAuthorityResolverService } from '../../../../../platform/remote/browser/remoteAuthorityResolverService.js';24import { IRemoteAuthorityResolverService, ResolverResult } from '../../../../../platform/remote/common/remoteAuthorityResolver.js';25import { IRemoteExtensionsScannerService } from '../../../../../platform/remote/common/remoteExtensionsScanner.js';26import { ITelemetryService } from '../../../../../platform/telemetry/common/telemetry.js';27import { NullTelemetryService } from '../../../../../platform/telemetry/common/telemetryUtils.js';28import { IUriIdentityService } from '../../../../../platform/uriIdentity/common/uriIdentity.js';29import { UriIdentityService } from '../../../../../platform/uriIdentity/common/uriIdentityService.js';30import { IUserDataProfilesService, UserDataProfilesService } from '../../../../../platform/userDataProfile/common/userDataProfile.js';31import { IWorkspaceContextService } from '../../../../../platform/workspace/common/workspace.js';32import { IWorkspaceTrustEnablementService } from '../../../../../platform/workspace/common/workspaceTrust.js';33import { IWorkbenchEnvironmentService } from '../../../environment/common/environmentService.js';34import { IWebExtensionsScannerService, IWorkbenchExtensionEnablementService, IWorkbenchExtensionManagementService } from '../../../extensionManagement/common/extensionManagement.js';35import { BrowserExtensionHostKindPicker } from '../../browser/extensionService.js';36import { AbstractExtensionService, IExtensionHostFactory, ResolvedExtensions } from '../../common/abstractExtensionService.js';37import { ExtensionHostKind, ExtensionRunningPreference } from '../../common/extensionHostKind.js';38import { IExtensionHostManager } from '../../common/extensionHostManagers.js';39import { ExtensionManifestPropertiesService, IExtensionManifestPropertiesService } from '../../common/extensionManifestPropertiesService.js';40import { ExtensionRunningLocation } from '../../common/extensionRunningLocation.js';41import { ExtensionRunningLocationTracker } from '../../common/extensionRunningLocationTracker.js';42import { IExtensionHost, IExtensionService } from '../../common/extensions.js';43import { ExtensionsProposedApi } from '../../common/extensionsProposedApi.js';44import { ILifecycleService } from '../../../lifecycle/common/lifecycle.js';45import { IRemoteAgentService } from '../../../remote/common/remoteAgentService.js';46import { IUserDataProfileService } from '../../../userDataProfile/common/userDataProfile.js';47import { WorkspaceTrustEnablementService } from '../../../workspaces/common/workspaceTrust.js';48import { TestEnvironmentService, TestFileService, TestLifecycleService, TestRemoteAgentService, TestRemoteExtensionsScannerService, TestWebExtensionsScannerService, TestWorkbenchExtensionEnablementService, TestWorkbenchExtensionManagementService } from '../../../../test/browser/workbenchTestServices.js';49import { TestContextService, TestUserDataProfileService } from '../../../../test/common/workbenchTestServices.js';5051suite('BrowserExtensionService', () => {5253ensureNoDisposablesAreLeakedInTestSuite();5455test('pickRunningLocation', () => {56assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation([], false, false, ExtensionRunningPreference.None), null);57assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation([], false, true, ExtensionRunningPreference.None), null);58assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation([], true, false, ExtensionRunningPreference.None), null);59assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation([], true, true, ExtensionRunningPreference.None), null);6061assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui'], false, false, ExtensionRunningPreference.None), null);62assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);63assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui'], true, false, ExtensionRunningPreference.None), null);64assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);6566assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace'], false, false, ExtensionRunningPreference.None), null);67assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);68assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace'], true, false, ExtensionRunningPreference.None), null);69assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);7071assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web'], false, false, ExtensionRunningPreference.None), null);72assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);73assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);74assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);757677assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'workspace'], false, false, ExtensionRunningPreference.None), null);78assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'workspace'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);79assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'workspace'], true, false, ExtensionRunningPreference.None), null);80assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'workspace'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);81assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'ui'], false, false, ExtensionRunningPreference.None), null);82assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'ui'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);83assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'ui'], true, false, ExtensionRunningPreference.None), null);84assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'ui'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);8586assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'workspace'], false, false, ExtensionRunningPreference.None), null);87assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'workspace'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);88assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'workspace'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);89assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'workspace'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);90assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'web'], false, false, ExtensionRunningPreference.None), null);91assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'web'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);92assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'web'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);93assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'web'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);9495assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'web'], false, false, ExtensionRunningPreference.None), null);96assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'web'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);97assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'web'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);98assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'web'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);99assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'ui'], false, false, ExtensionRunningPreference.None), null);100assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'ui'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);101assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'ui'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);102assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'ui'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);103104105assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'web', 'workspace'], false, false, ExtensionRunningPreference.None), null);106assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'web', 'workspace'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);107assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'web', 'workspace'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);108assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'web', 'workspace'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);109assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'workspace', 'web'], false, false, ExtensionRunningPreference.None), null);110assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'workspace', 'web'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);111assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'workspace', 'web'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);112assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'workspace', 'web'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);113114assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'ui', 'workspace'], false, false, ExtensionRunningPreference.None), null);115assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'ui', 'workspace'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);116assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'ui', 'workspace'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);117assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'ui', 'workspace'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);118assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'workspace', 'ui'], false, false, ExtensionRunningPreference.None), null);119assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'workspace', 'ui'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);120assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'workspace', 'ui'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);121assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'workspace', 'ui'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);122123assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'ui', 'web'], false, false, ExtensionRunningPreference.None), null);124assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'ui', 'web'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);125assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'ui', 'web'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);126assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'ui', 'web'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);127assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'web', 'ui'], false, false, ExtensionRunningPreference.None), null);128assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'web', 'ui'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);129assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'web', 'ui'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);130assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'web', 'ui'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);131});132});133134suite('ExtensionService', () => {135136class MyTestExtensionService extends AbstractExtensionService {137138constructor(139@IInstantiationService instantiationService: IInstantiationService,140@INotificationService notificationService: INotificationService,141@IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService,142@ITelemetryService telemetryService: ITelemetryService,143@IWorkbenchExtensionEnablementService extensionEnablementService: IWorkbenchExtensionEnablementService,144@IFileService fileService: IFileService,145@IProductService productService: IProductService,146@IWorkbenchExtensionManagementService extensionManagementService: IWorkbenchExtensionManagementService,147@IWorkspaceContextService contextService: IWorkspaceContextService,148@IConfigurationService configurationService: IConfigurationService,149@IExtensionManifestPropertiesService extensionManifestPropertiesService: IExtensionManifestPropertiesService,150@ILogService logService: ILogService,151@IRemoteAgentService remoteAgentService: IRemoteAgentService,152@IRemoteExtensionsScannerService remoteExtensionsScannerService: IRemoteExtensionsScannerService,153@ILifecycleService lifecycleService: ILifecycleService,154@IRemoteAuthorityResolverService remoteAuthorityResolverService: IRemoteAuthorityResolverService,155) {156const extensionsProposedApi = instantiationService.createInstance(ExtensionsProposedApi);157const extensionHostFactory = new class implements IExtensionHostFactory {158createExtensionHost(runningLocations: ExtensionRunningLocationTracker, runningLocation: ExtensionRunningLocation, isInitialStart: boolean): IExtensionHost | null {159return new class extends mock<IExtensionHost>() {160override runningLocation = runningLocation;161};162}163};164super(165{ allowRemoteExtensionsInLocalWebWorker: false, hasLocalProcess: true },166extensionsProposedApi,167extensionHostFactory,168null!,169instantiationService,170notificationService,171environmentService,172telemetryService,173extensionEnablementService,174fileService,175productService,176extensionManagementService,177contextService,178configurationService,179extensionManifestPropertiesService,180logService,181remoteAgentService,182remoteExtensionsScannerService,183lifecycleService,184remoteAuthorityResolverService,185new TestDialogService()186);187}188189private _extHostId = 0;190public readonly order: string[] = [];191protected _pickExtensionHostKind(extensionId: ExtensionIdentifier, extensionKinds: ExtensionKind[], isInstalledLocally: boolean, isInstalledRemotely: boolean, preference: ExtensionRunningPreference): ExtensionHostKind | null {192throw new Error('Method not implemented.');193}194protected override _doCreateExtensionHostManager(extensionHost: IExtensionHost, initialActivationEvents: string[]): IExtensionHostManager {195const order = this.order;196const extensionHostId = ++this._extHostId;197order.push(`create ${extensionHostId}`);198return new class extends mock<IExtensionHostManager>() {199override onDidExit = Event.None;200override onDidChangeResponsiveState = Event.None;201override disconnect() {202return Promise.resolve();203}204override start(): Promise<void> {205return Promise.resolve();206}207override dispose(): void {208order.push(`dispose ${extensionHostId}`);209}210override representsRunningLocation(runningLocation: ExtensionRunningLocation): boolean {211return extensionHost.runningLocation.equals(runningLocation);212}213};214}215protected _resolveExtensions(): AsyncIterable<ResolvedExtensions> {216throw new Error('Method not implemented.');217}218protected _scanSingleExtension(extension: IExtension): Promise<IExtensionDescription | null> {219throw new Error('Method not implemented.');220}221protected _onExtensionHostExit(code: number): Promise<void> {222throw new Error('Method not implemented.');223}224protected _resolveAuthority(remoteAuthority: string): Promise<ResolverResult> {225throw new Error('Method not implemented.');226}227}228229let disposables: DisposableStore;230let instantiationService: TestInstantiationService;231let extService: MyTestExtensionService;232233setup(() => {234disposables = new DisposableStore();235const testProductService = { _serviceBrand: undefined, ...product };236disposables.add(instantiationService = createServices(disposables, [237// custom238[IExtensionService, MyTestExtensionService],239// default240[ILifecycleService, TestLifecycleService],241[IWorkbenchExtensionManagementService, TestWorkbenchExtensionManagementService],242[INotificationService, TestNotificationService],243[IRemoteAgentService, TestRemoteAgentService],244[ILogService, NullLogService],245[IWebExtensionsScannerService, TestWebExtensionsScannerService],246[IExtensionManifestPropertiesService, ExtensionManifestPropertiesService],247[IConfigurationService, TestConfigurationService],248[IWorkspaceContextService, TestContextService],249[IProductService, testProductService],250[IFileService, TestFileService],251[IWorkbenchExtensionEnablementService, TestWorkbenchExtensionEnablementService],252[ITelemetryService, NullTelemetryService],253[IEnvironmentService, TestEnvironmentService],254[IWorkspaceTrustEnablementService, WorkspaceTrustEnablementService],255[IUserDataProfilesService, UserDataProfilesService],256[IUserDataProfileService, TestUserDataProfileService],257[IUriIdentityService, UriIdentityService],258[IRemoteExtensionsScannerService, TestRemoteExtensionsScannerService],259[IRemoteAuthorityResolverService, new RemoteAuthorityResolverService(false, undefined, undefined, undefined, testProductService, new NullLogService())]260]));261extService = <MyTestExtensionService>instantiationService.get(IExtensionService);262});263264teardown(async () => {265disposables.dispose();266});267268ensureNoDisposablesAreLeakedInTestSuite();269270test('issue #152204: Remote extension host not disposed after closing vscode client', async () => {271await extService.startExtensionHosts();272await extService.stopExtensionHosts('foo');273assert.deepStrictEqual(extService.order, (['create 1', 'create 2', 'create 3', 'dispose 3', 'dispose 2', 'dispose 1']));274});275276test('Extension host disposed when awaited', async () => {277await extService.startExtensionHosts();278await extService.stopExtensionHosts('foo');279assert.deepStrictEqual(extService.order, (['create 1', 'create 2', 'create 3', 'dispose 3', 'dispose 2', 'dispose 1']));280});281282test('Extension host not disposed when vetoed (sync)', async () => {283await extService.startExtensionHosts();284285disposables.add(extService.onWillStop(e => e.veto(true, 'test 1')));286disposables.add(extService.onWillStop(e => e.veto(false, 'test 2')));287288await extService.stopExtensionHosts('foo');289assert.deepStrictEqual(extService.order, (['create 1', 'create 2', 'create 3']));290});291292test('Extension host not disposed when vetoed (async)', async () => {293await extService.startExtensionHosts();294295disposables.add(extService.onWillStop(e => e.veto(false, 'test 1')));296disposables.add(extService.onWillStop(e => e.veto(Promise.resolve(true), 'test 2')));297disposables.add(extService.onWillStop(e => e.veto(Promise.resolve(false), 'test 3')));298299await extService.stopExtensionHosts('foo');300assert.deepStrictEqual(extService.order, (['create 1', 'create 2', 'create 3']));301});302});303304305