Path: blob/main/src/vs/workbench/services/extensions/test/browser/extensionService.test.ts
5251 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 { ActivationKind, IExtensionHost, IExtensionService, IWillActivateEvent } 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, TestLifecycleService, TestRemoteAgentService, TestRemoteExtensionsScannerService, TestWebExtensionsScannerService, TestWorkbenchExtensionEnablementService, TestWorkbenchExtensionManagementService } from '../../../../test/browser/workbenchTestServices.js';49import { TestContextService, TestFileService, 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);187188this._initializeIfNeeded();189}190191private _extHostId = 0;192public readonly order: string[] = [];193public readonly activationEvents: { event: string; activationKind: ActivationKind; kind: ExtensionHostKind }[] = [];194protected _pickExtensionHostKind(extensionId: ExtensionIdentifier, extensionKinds: ExtensionKind[], isInstalledLocally: boolean, isInstalledRemotely: boolean, preference: ExtensionRunningPreference): ExtensionHostKind | null {195throw new Error('Method not implemented.');196}197protected override _doCreateExtensionHostManager(extensionHost: IExtensionHost, initialActivationEvents: string[]): IExtensionHostManager {198const order = this.order;199const activationEvents = this.activationEvents;200const extensionHostId = ++this._extHostId;201const extHostKind = extensionHost.runningLocation.kind;202order.push(`create ${extensionHostId}`);203return new class extends mock<IExtensionHostManager>() {204override onDidExit = Event.None;205override onDidChangeResponsiveState = Event.None;206override kind = extHostKind;207override disconnect() {208return Promise.resolve();209}210override start(): Promise<void> {211return Promise.resolve();212}213override dispose(): void {214order.push(`dispose ${extensionHostId}`);215}216override representsRunningLocation(runningLocation: ExtensionRunningLocation): boolean {217return extensionHost.runningLocation.equals(runningLocation);218}219override activateByEvent(event: string, activationKind: ActivationKind): Promise<void> {220activationEvents.push({ event, activationKind, kind: extHostKind });221return Promise.resolve();222}223override ready(): Promise<void> {224return Promise.resolve();225}226};227}228protected async *_resolveExtensions(): AsyncIterable<ResolvedExtensions> {229// Return empty iterable - no extensions to resolve in tests230}231protected _scanSingleExtension(extension: IExtension): Promise<IExtensionDescription | null> {232throw new Error('Method not implemented.');233}234protected _onExtensionHostExit(code: number): Promise<void> {235throw new Error('Method not implemented.');236}237protected _resolveAuthority(remoteAuthority: string): Promise<ResolverResult> {238throw new Error('Method not implemented.');239}240}241242let disposables: DisposableStore;243let instantiationService: TestInstantiationService;244let extService: MyTestExtensionService;245246setup(() => {247disposables = new DisposableStore();248const testProductService = { _serviceBrand: undefined, ...product };249disposables.add(instantiationService = createServices(disposables, [250// custom251[IExtensionService, MyTestExtensionService],252// default253[ILifecycleService, TestLifecycleService],254[IWorkbenchExtensionManagementService, TestWorkbenchExtensionManagementService],255[INotificationService, TestNotificationService],256[IRemoteAgentService, TestRemoteAgentService],257[ILogService, NullLogService],258[IWebExtensionsScannerService, TestWebExtensionsScannerService],259[IExtensionManifestPropertiesService, ExtensionManifestPropertiesService],260[IConfigurationService, TestConfigurationService],261[IWorkspaceContextService, TestContextService],262[IProductService, testProductService],263[IFileService, TestFileService],264[IWorkbenchExtensionEnablementService, TestWorkbenchExtensionEnablementService],265[ITelemetryService, NullTelemetryService],266[IEnvironmentService, TestEnvironmentService],267[IWorkspaceTrustEnablementService, WorkspaceTrustEnablementService],268[IUserDataProfilesService, UserDataProfilesService],269[IUserDataProfileService, TestUserDataProfileService],270[IUriIdentityService, UriIdentityService],271[IRemoteExtensionsScannerService, TestRemoteExtensionsScannerService],272[IRemoteAuthorityResolverService, new RemoteAuthorityResolverService(false, undefined, undefined, undefined, testProductService, new NullLogService())]273]));274extService = <MyTestExtensionService>instantiationService.get(IExtensionService);275});276277teardown(async () => {278disposables.dispose();279});280281ensureNoDisposablesAreLeakedInTestSuite();282283test('issue #152204: Remote extension host not disposed after closing vscode client', async () => {284await extService.stopExtensionHosts('foo');285assert.deepStrictEqual(extService.order, (['create 1', 'create 2', 'create 3', 'dispose 3', 'dispose 2', 'dispose 1']));286});287288test('Extension host disposed when awaited', async () => {289await extService.stopExtensionHosts('foo');290assert.deepStrictEqual(extService.order, (['create 1', 'create 2', 'create 3', 'dispose 3', 'dispose 2', 'dispose 1']));291});292293test('Extension host not disposed when vetoed (sync)', async () => {294295disposables.add(extService.onWillStop(e => e.veto(true, 'test 1')));296disposables.add(extService.onWillStop(e => e.veto(false, 'test 2')));297298await extService.stopExtensionHosts('foo');299assert.deepStrictEqual(extService.order, (['create 1', 'create 2', 'create 3']));300});301302test('Extension host not disposed when vetoed (async)', async () => {303304disposables.add(extService.onWillStop(e => e.veto(false, 'test 1')));305disposables.add(extService.onWillStop(e => e.veto(Promise.resolve(true), 'test 2')));306disposables.add(extService.onWillStop(e => e.veto(Promise.resolve(false), 'test 3')));307308await extService.stopExtensionHosts('foo');309assert.deepStrictEqual(extService.order, (['create 1', 'create 2', 'create 3']));310});311312test('onWillActivateByEvent includes activationKind for Normal activation', async () => {313314const events: IWillActivateEvent[] = [];315disposables.add(extService.onWillActivateByEvent(e => events.push(e)));316317await extService.activateByEvent('onTest', ActivationKind.Normal);318319assert.strictEqual(events.length, 1);320assert.strictEqual(events[0].event, 'onTest');321assert.strictEqual(events[0].activationKind, ActivationKind.Normal);322});323324test('onWillActivateByEvent includes activationKind for Immediate activation', async () => {325326const events: IWillActivateEvent[] = [];327disposables.add(extService.onWillActivateByEvent(e => events.push(e)));328329await extService.activateByEvent('onTest', ActivationKind.Immediate);330331assert.strictEqual(events.length, 1);332assert.strictEqual(events[0].event, 'onTest');333assert.strictEqual(events[0].activationKind, ActivationKind.Immediate);334});335336test('Immediate activation only activates local extension hosts', async () => {337extService.activationEvents.length = 0; // Clear any initial activations338339await extService.activateByEvent('onTest', ActivationKind.Immediate);340341// Should only activate on local hosts (LocalProcess and LocalWebWorker), not Remote342const activatedKinds = extService.activationEvents.map(e => e.kind);343assert.ok(activatedKinds.includes(ExtensionHostKind.LocalProcess), 'Should activate on LocalProcess');344assert.ok(activatedKinds.includes(ExtensionHostKind.LocalWebWorker), 'Should activate on LocalWebWorker');345assert.ok(!activatedKinds.includes(ExtensionHostKind.Remote), 'Should NOT activate on Remote');346});347348test('Normal activation activates all extension hosts', async () => {349extService.activationEvents.length = 0; // Clear any initial activations350351await extService.activateByEvent('onTest', ActivationKind.Normal);352353// Should activate on all hosts354const activatedKinds = extService.activationEvents.map(e => e.kind);355assert.ok(activatedKinds.includes(ExtensionHostKind.LocalProcess), 'Should activate on LocalProcess');356assert.ok(activatedKinds.includes(ExtensionHostKind.LocalWebWorker), 'Should activate on LocalWebWorker');357assert.ok(activatedKinds.includes(ExtensionHostKind.Remote), 'Should activate on Remote');358});359});360361362