Path: blob/main/src/vs/workbench/contrib/debug/test/browser/debugConfigurationManager.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 { 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),63new 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);91assert.strictEqual((resultConfig as any).configurationResolved, true, 'Configuration should be updated by test provider');92});9394test('resolves configuration from second provider if type changes', async () => {95const secondProviderType = 'second-provider';96disposables.add(_debugConfigurationManager.registerDebugConfigurationProvider({97type: configurationProviderType,98resolveDebugConfiguration: (folderUri, config, token) => {99assert.strictEqual(config.type, configurationProviderType);100return Promise.resolve({101...config,102type: secondProviderType103});104},105triggerKind: DebugConfigurationProviderTriggerKind.Initial106}));107disposables.add(_debugConfigurationManager.registerDebugConfigurationProvider({108type: secondProviderType,109resolveDebugConfiguration: (folderUri, config, token) => {110assert.strictEqual(config.type, secondProviderType);111return Promise.resolve({112...config,113configurationResolved: true114});115},116triggerKind: DebugConfigurationProviderTriggerKind.Initial117}));118119const initialConfig: IConfig = {120type: configurationProviderType,121request: 'launch',122name: 'configName',123};124125const resultConfig = await _debugConfigurationManager.resolveConfigurationByProviders(undefined, configurationProviderType, initialConfig, CancellationToken.None);126assert.strictEqual(resultConfig!.type, secondProviderType);127assert.strictEqual((resultConfig as any).configurationResolved, true, 'Configuration should be updated by test provider');128});129130teardown(() => disposables.clear());131});132133134