Path: blob/main/src/vs/workbench/services/configuration/test/browser/configuration.test.ts
5262 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 { joinPath } from '../../../../../base/common/resources.js';8import { URI } from '../../../../../base/common/uri.js';9import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';10import { Extensions, IConfigurationRegistry } from '../../../../../platform/configuration/common/configurationRegistry.js';11import { NullLogService } from '../../../../../platform/log/common/log.js';12import { Registry } from '../../../../../platform/registry/common/platform.js';13import { DefaultConfiguration } from '../../browser/configuration.js';14import { ConfigurationKey, IConfigurationCache } from '../../common/configuration.js';15import { BrowserWorkbenchEnvironmentService } from '../../../environment/browser/environmentService.js';16import { TestEnvironmentService } from '../../../../test/browser/workbenchTestServices.js';17import { TestProductService } from '../../../../test/common/workbenchTestServices.js';1819class ConfigurationCache implements IConfigurationCache {20private readonly cache = new Map<string, string>();21needsCaching(resource: URI): boolean { return false; }22async read({ type, key }: ConfigurationKey): Promise<string> { return this.cache.get(`${type}:${key}`) || ''; }23async write({ type, key }: ConfigurationKey, content: string): Promise<void> { this.cache.set(`${type}:${key}`, content); }24async remove({ type, key }: ConfigurationKey): Promise<void> { this.cache.delete(`${type}:${key}`); }25}2627suite('DefaultConfiguration', () => {2829const disposables = ensureNoDisposablesAreLeakedInTestSuite();30const configurationRegistry = Registry.as<IConfigurationRegistry>(Extensions.Configuration);31const cacheKey: ConfigurationKey = { type: 'defaults', key: 'default-configurationDefaultsOverrides' };32let configurationCache: ConfigurationCache;3334setup(() => {35configurationCache = new ConfigurationCache();36configurationRegistry.registerConfiguration({37'id': 'test.configurationDefaultsOverride',38'type': 'object',39'properties': {40'test.configurationDefaultsOverride': {41'type': 'string',42'default': 'defaultValue',43}44}45});46});4748teardown(() => {49configurationRegistry.deregisterConfigurations(configurationRegistry.getConfigurations());50configurationRegistry.deregisterDefaultConfigurations(configurationRegistry.getRegisteredDefaultConfigurations());51});5253test('configuration default overrides are read from environment', async () => {54const environmentService = new BrowserWorkbenchEnvironmentService('', joinPath(URI.file('tests').with({ scheme: 'vscode-tests' }), 'logs'), { configurationDefaults: { 'test.configurationDefaultsOverride': 'envOverrideValue' } }, TestProductService);55const testObject = disposables.add(new DefaultConfiguration('default', configurationCache, environmentService, new NullLogService()));56await testObject.initialize();57assert.deepStrictEqual(testObject.configurationModel.getValue('test.configurationDefaultsOverride'), 'envOverrideValue');58});5960test('configuration default overrides are read from cache', async () => {61localStorage.setItem(DefaultConfiguration.DEFAULT_OVERRIDES_CACHE_EXISTS_KEY, 'yes');62await configurationCache.write(cacheKey, JSON.stringify({ 'test.configurationDefaultsOverride': 'overrideValue' }));63const testObject = disposables.add(new DefaultConfiguration('default', configurationCache, TestEnvironmentService, new NullLogService()));6465const actual = await testObject.initialize();6667assert.deepStrictEqual(actual.getValue('test.configurationDefaultsOverride'), 'overrideValue');68assert.deepStrictEqual(testObject.configurationModel.getValue('test.configurationDefaultsOverride'), 'overrideValue');69});7071test('configuration default overrides are not read from cache when model is read before initialize', async () => {72localStorage.setItem(DefaultConfiguration.DEFAULT_OVERRIDES_CACHE_EXISTS_KEY, 'yes');73await configurationCache.write(cacheKey, JSON.stringify({ 'test.configurationDefaultsOverride': 'overrideValue' }));74const testObject = disposables.add(new DefaultConfiguration('default', configurationCache, TestEnvironmentService, new NullLogService()));75assert.deepStrictEqual(testObject.configurationModel.getValue('test.configurationDefaultsOverride'), undefined);76});7778test('configuration default overrides read from cache override environment', async () => {79const environmentService = new BrowserWorkbenchEnvironmentService('', joinPath(URI.file('tests').with({ scheme: 'vscode-tests' }), 'logs'), { configurationDefaults: { 'test.configurationDefaultsOverride': 'envOverrideValue' } }, TestProductService);80localStorage.setItem(DefaultConfiguration.DEFAULT_OVERRIDES_CACHE_EXISTS_KEY, 'yes');81await configurationCache.write(cacheKey, JSON.stringify({ 'test.configurationDefaultsOverride': 'overrideValue' }));82const testObject = disposables.add(new DefaultConfiguration('default', configurationCache, environmentService, new NullLogService()));8384const actual = await testObject.initialize();8586assert.deepStrictEqual(actual.getValue('test.configurationDefaultsOverride'), 'overrideValue');87});8889test('configuration default overrides are read from cache when default configuration changed', async () => {90localStorage.setItem(DefaultConfiguration.DEFAULT_OVERRIDES_CACHE_EXISTS_KEY, 'yes');91await configurationCache.write(cacheKey, JSON.stringify({ 'test.configurationDefaultsOverride': 'overrideValue' }));92const testObject = disposables.add(new DefaultConfiguration('default', configurationCache, TestEnvironmentService, new NullLogService()));93await testObject.initialize();9495const promise = Event.toPromise(testObject.onDidChangeConfiguration);96configurationRegistry.registerConfiguration({97'id': 'test.configurationDefaultsOverride',98'type': 'object',99'properties': {100'test.configurationDefaultsOverride1': {101'type': 'string',102'default': 'defaultValue',103}104}105});106107const { defaults: actual } = await promise;108assert.deepStrictEqual(actual.getValue('test.configurationDefaultsOverride'), 'overrideValue');109});110111test('configuration default overrides are not read from cache after reload', async () => {112localStorage.setItem(DefaultConfiguration.DEFAULT_OVERRIDES_CACHE_EXISTS_KEY, 'yes');113await configurationCache.write(cacheKey, JSON.stringify({ 'test.configurationDefaultsOverride': 'overrideValue' }));114const testObject = disposables.add(new DefaultConfiguration('default', configurationCache, TestEnvironmentService, new NullLogService()));115116await testObject.initialize();117const actual = testObject.reload();118119assert.deepStrictEqual(actual.getValue('test.configurationDefaultsOverride'), 'defaultValue');120});121122test('cache is reset after reload', async () => {123localStorage.setItem(DefaultConfiguration.DEFAULT_OVERRIDES_CACHE_EXISTS_KEY, 'yes');124await configurationCache.write(cacheKey, JSON.stringify({ 'test.configurationDefaultsOverride': 'overrideValue' }));125const testObject = disposables.add(new DefaultConfiguration('default', configurationCache, TestEnvironmentService, new NullLogService()));126127await testObject.initialize();128testObject.reload();129130assert.deepStrictEqual(await configurationCache.read(cacheKey), '');131});132133test('configuration default overrides are written in cache', async () => {134const testObject = disposables.add(new DefaultConfiguration('default', configurationCache, TestEnvironmentService, new NullLogService()));135await testObject.initialize();136testObject.reload();137const promise = Event.toPromise(testObject.onDidChangeConfiguration);138configurationRegistry.registerDefaultConfigurations([{ overrides: { 'test.configurationDefaultsOverride': 'newoverrideValue' } }]);139await promise;140141const actual = JSON.parse(await configurationCache.read(cacheKey));142assert.deepStrictEqual(actual, { 'test.configurationDefaultsOverride': 'newoverrideValue' });143});144145test('configuration default overrides are removed from cache if there are no overrides', async () => {146const testObject = disposables.add(new DefaultConfiguration('default', configurationCache, TestEnvironmentService, new NullLogService()));147await testObject.initialize();148const promise = Event.toPromise(testObject.onDidChangeConfiguration);149configurationRegistry.registerConfiguration({150'id': 'test.configurationDefaultsOverride',151'type': 'object',152'properties': {153'test.configurationDefaultsOverride1': {154'type': 'string',155'default': 'defaultValue',156}157}158});159await promise;160161assert.deepStrictEqual(await configurationCache.read(cacheKey), '');162});163164});165166167