Path: blob/main/src/vs/workbench/contrib/debug/test/browser/debugConfigurationManager.test.ts
5241 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 { CancellationToken } from '../../../../../base/common/cancellation.js';7import { Event } from '../../../../../base/common/event.js';8import { DisposableStore } from '../../../../../base/common/lifecycle.js';9import { URI } from '../../../../../base/common/uri.js';10import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';11import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';12import { TestConfigurationService } from '../../../../../platform/configuration/test/common/testConfigurationService.js';13import { ContextKeyService } from '../../../../../platform/contextkey/browser/contextKeyService.js';14import { FileService } from '../../../../../platform/files/common/fileService.js';15import { ServiceCollection } from '../../../../../platform/instantiation/common/serviceCollection.js';16import { TestInstantiationService } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js';17import { NullLogService } from '../../../../../platform/log/common/log.js';18import { UriIdentityService } from '../../../../../platform/uriIdentity/common/uriIdentityService.js';19import { ConfigurationManager } from '../../browser/debugConfigurationManager.js';20import { DebugConfigurationProviderTriggerKind, IAdapterManager, IConfig, IDebugAdapterExecutable, IDebugSession } from '../../common/debug.js';21import { IPreferencesService } from '../../../../services/preferences/common/preferences.js';22import { TestQuickInputService } from '../../../../test/browser/workbenchTestServices.js';23import { TestHistoryService, TestContextService, TestExtensionService, TestStorageService } from '../../../../test/common/workbenchTestServices.js';2425suite('debugConfigurationManager', () => {26const configurationProviderType = 'custom-type';27let _debugConfigurationManager: ConfigurationManager;28let disposables: DisposableStore;2930const adapterManager = <IAdapterManager>{31getDebugAdapterDescriptor(session: IDebugSession, config: IConfig): Promise<IDebugAdapterExecutable | undefined> {32return Promise.resolve(undefined);33},3435activateDebuggers(activationEvent: string, debugType?: string): Promise<void> {36return Promise.resolve();37},3839get onDidDebuggersExtPointRead(): Event<void> {40return Event.None;41}42};4344const preferencesService = <IPreferencesService>{45userSettingsResource: URI.file('/tmp/settings.json')46};4748const configurationService = new TestConfigurationService();49setup(() => {50disposables = new DisposableStore();51const fileService = disposables.add(new FileService(new NullLogService()));52const instantiationService = disposables.add(new TestInstantiationService(new ServiceCollection([IPreferencesService, preferencesService], [IConfigurationService, configurationService])));53_debugConfigurationManager = new ConfigurationManager(54adapterManager,55new TestContextService(),56configurationService,57new TestQuickInputService(),58instantiationService,59new TestStorageService(),60new TestExtensionService(),61new TestHistoryService(),62new UriIdentityService(fileService),63disposables.add(new ContextKeyService(configurationService)),64new NullLogService());65});6667teardown(() => disposables.dispose());6869ensureNoDisposablesAreLeakedInTestSuite();7071test('resolves configuration based on type', async () => {72disposables.add(_debugConfigurationManager.registerDebugConfigurationProvider({73type: configurationProviderType,74resolveDebugConfiguration: (folderUri, config, token) => {75assert.strictEqual(config.type, configurationProviderType);76return Promise.resolve({77...config,78configurationResolved: true79});80},81triggerKind: DebugConfigurationProviderTriggerKind.Initial82}));8384const initialConfig: IConfig = {85type: configurationProviderType,86request: 'launch',87name: 'configName',88};8990const resultConfig = await _debugConfigurationManager.resolveConfigurationByProviders(undefined, configurationProviderType, initialConfig, CancellationToken.None);91// eslint-disable-next-line local/code-no-any-casts92assert.strictEqual((resultConfig as any).configurationResolved, true, 'Configuration should be updated by test provider');93});9495test('resolves configuration from second provider if type changes', async () => {96const secondProviderType = 'second-provider';97disposables.add(_debugConfigurationManager.registerDebugConfigurationProvider({98type: configurationProviderType,99resolveDebugConfiguration: (folderUri, config, token) => {100assert.strictEqual(config.type, configurationProviderType);101return Promise.resolve({102...config,103type: secondProviderType104});105},106triggerKind: DebugConfigurationProviderTriggerKind.Initial107}));108disposables.add(_debugConfigurationManager.registerDebugConfigurationProvider({109type: secondProviderType,110resolveDebugConfiguration: (folderUri, config, token) => {111assert.strictEqual(config.type, secondProviderType);112return Promise.resolve({113...config,114configurationResolved: true115});116},117triggerKind: DebugConfigurationProviderTriggerKind.Initial118}));119120const initialConfig: IConfig = {121type: configurationProviderType,122request: 'launch',123name: 'configName',124};125126const resultConfig = await _debugConfigurationManager.resolveConfigurationByProviders(undefined, configurationProviderType, initialConfig, CancellationToken.None);127assert.strictEqual(resultConfig!.type, secondProviderType);128// eslint-disable-next-line local/code-no-any-casts129assert.strictEqual((resultConfig as any).configurationResolved, true, 'Configuration should be updated by test provider');130});131132teardown(() => disposables.clear());133});134135136