/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { ContextKeyService } from 'vs/platform/contextkey/browser/contextKeyService'; import { FileService } from 'vs/platform/files/common/fileService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { NullLogService } from 'vs/platform/log/common/log'; import { UriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentityService'; import { ConfigurationManager } from 'vs/workbench/contrib/debug/browser/debugConfigurationManager'; import { DebugConfigurationProviderTriggerKind, IAdapterManager, IConfig, IDebugAdapterExecutable, IDebugSession } from 'vs/workbench/contrib/debug/common/debug'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { TestQuickInputService } from 'vs/workbench/test/browser/workbenchTestServices'; import { TestHistoryService, TestContextService, TestExtensionService, TestStorageService } from 'vs/workbench/test/common/workbenchTestServices'; suite('debugConfigurationManager', () => { const configurationProviderType = 'custom-type'; let _debugConfigurationManager: ConfigurationManager; let disposables: DisposableStore; const adapterManager = { getDebugAdapterDescriptor(session: IDebugSession, config: IConfig): Promise { return Promise.resolve(undefined); }, activateDebuggers(activationEvent: string, debugType?: string): Promise { return Promise.resolve(); }, get onDidDebuggersExtPointRead(): Event { return Event.None; } }; const preferencesService = { userSettingsResource: URI.file('/tmp/settings.json') }; const configurationService = new TestConfigurationService(); setup(() => { disposables = new DisposableStore(); const fileService = disposables.add(new FileService(new NullLogService())); const instantiationService = disposables.add(new TestInstantiationService(new ServiceCollection([IPreferencesService, preferencesService], [IConfigurationService, configurationService]))); _debugConfigurationManager = new ConfigurationManager( adapterManager, new TestContextService(), configurationService, new TestQuickInputService(), instantiationService, new TestStorageService(), new TestExtensionService(), new TestHistoryService(), new UriIdentityService(fileService), new ContextKeyService(configurationService), new NullLogService()); }); teardown(() => disposables.dispose()); ensureNoDisposablesAreLeakedInTestSuite(); test('resolves configuration based on type', async () => { disposables.add(_debugConfigurationManager.registerDebugConfigurationProvider({ type: configurationProviderType, resolveDebugConfiguration: (folderUri, config, token) => { assert.strictEqual(config.type, configurationProviderType); return Promise.resolve({ ...config, configurationResolved: true }); }, triggerKind: DebugConfigurationProviderTriggerKind.Initial })); const initialConfig: IConfig = { type: configurationProviderType, request: 'launch', name: 'configName', }; const resultConfig = await _debugConfigurationManager.resolveConfigurationByProviders(undefined, configurationProviderType, initialConfig, CancellationToken.None); assert.strictEqual((resultConfig as any).configurationResolved, true, 'Configuration should be updated by test provider'); }); test('resolves configuration from second provider if type changes', async () => { const secondProviderType = 'second-provider'; disposables.add(_debugConfigurationManager.registerDebugConfigurationProvider({ type: configurationProviderType, resolveDebugConfiguration: (folderUri, config, token) => { assert.strictEqual(config.type, configurationProviderType); return Promise.resolve({ ...config, type: secondProviderType }); }, triggerKind: DebugConfigurationProviderTriggerKind.Initial })); disposables.add(_debugConfigurationManager.registerDebugConfigurationProvider({ type: secondProviderType, resolveDebugConfiguration: (folderUri, config, token) => { assert.strictEqual(config.type, secondProviderType); return Promise.resolve({ ...config, configurationResolved: true }); }, triggerKind: DebugConfigurationProviderTriggerKind.Initial })); const initialConfig: IConfig = { type: configurationProviderType, request: 'launch', name: 'configName', }; const resultConfig = await _debugConfigurationManager.resolveConfigurationByProviders(undefined, configurationProviderType, initialConfig, CancellationToken.None); assert.strictEqual(resultConfig!.type, secondProviderType); assert.strictEqual((resultConfig as any).configurationResolved, true, 'Configuration should be updated by test provider'); }); teardown(() => disposables.clear()); });