Path: blob/main/src/vs/platform/configuration/test/common/policyConfiguration.test.ts
5252 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 { URI } from '../../../../base/common/uri.js';8import { DefaultConfiguration, PolicyConfiguration } from '../../common/configurations.js';9import { IFileService } from '../../../files/common/files.js';10import { FileService } from '../../../files/common/fileService.js';11import { InMemoryFileSystemProvider } from '../../../files/common/inMemoryFilesystemProvider.js';12import { NullLogService } from '../../../log/common/log.js';13import { Extensions, IConfigurationNode, IConfigurationRegistry } from '../../common/configurationRegistry.js';14import { Registry } from '../../../registry/common/platform.js';15import { VSBuffer } from '../../../../base/common/buffer.js';16import { deepClone } from '../../../../base/common/objects.js';17import { IPolicyService } from '../../../policy/common/policy.js';18import { FilePolicyService } from '../../../policy/common/filePolicyService.js';19import { runWithFakedTimers } from '../../../../base/test/common/timeTravelScheduler.js';20import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';21import { PolicyCategory } from '../../../../base/common/policy.js';2223suite('PolicyConfiguration', () => {2425const disposables = ensureNoDisposablesAreLeakedInTestSuite();2627let testObject: PolicyConfiguration;28let fileService: IFileService;29let policyService: IPolicyService;30const policyFile = URI.file('policyFile').with({ scheme: 'vscode-tests' });31const policyConfigurationNode: IConfigurationNode = {32'id': 'policyConfiguration',33'order': 1,34'title': 'a',35'type': 'object',36'properties': {37'policy.settingA': {38'type': 'string',39'default': 'defaultValueA',40policy: {41name: 'PolicySettingA',42category: PolicyCategory.Extensions,43minimumVersion: '1.0.0',44localization: { description: { key: '', value: '' }, }45}46},47'policy.settingB': {48'type': 'string',49'default': 'defaultValueB',50policy: {51name: 'PolicySettingB',52category: PolicyCategory.Extensions,53minimumVersion: '1.0.0',54localization: { description: { key: '', value: '' }, }55}56},57'policy.objectSetting': {58'type': 'object',59'default': {},60policy: {61name: 'PolicyObjectSetting',62category: PolicyCategory.Extensions,63minimumVersion: '1.0.0',64localization: { description: { key: '', value: '' }, }65}66},67'policy.arraySetting': {68'type': 'object',69'default': [],70policy: {71name: 'PolicyArraySetting',72category: PolicyCategory.Extensions,73minimumVersion: '1.0.0',74localization: { description: { key: '', value: '' }, }75}76},77'policy.booleanSetting': {78'type': 'boolean',79'default': true,80policy: {81name: 'PolicyBooleanSetting',82category: PolicyCategory.Extensions,83minimumVersion: '1.0.0',84localization: { description: { key: '', value: '' }, }85}86},87'policy.internalSetting': {88'type': 'string',89'default': 'defaultInternalValue',90included: false,91policy: {92name: 'PolicyInternalSetting',93category: PolicyCategory.Extensions,94minimumVersion: '1.0.0',95localization: { description: { key: '', value: '' }, }96}97},98'nonPolicy.setting': {99'type': 'boolean',100'default': true101}102}103};104105suiteSetup(() => Registry.as<IConfigurationRegistry>(Extensions.Configuration).registerConfiguration(policyConfigurationNode));106suiteTeardown(() => Registry.as<IConfigurationRegistry>(Extensions.Configuration).deregisterConfigurations([policyConfigurationNode]));107108setup(async () => {109const defaultConfiguration = disposables.add(new DefaultConfiguration(new NullLogService()));110await defaultConfiguration.initialize();111fileService = disposables.add(new FileService(new NullLogService()));112const diskFileSystemProvider = disposables.add(new InMemoryFileSystemProvider());113disposables.add(fileService.registerProvider(policyFile.scheme, diskFileSystemProvider));114policyService = disposables.add(new FilePolicyService(policyFile, fileService, new NullLogService()));115testObject = disposables.add(new PolicyConfiguration(defaultConfiguration, policyService, new NullLogService()));116});117118test('initialize: with policies', async () => {119await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingA': 'policyValueA' })));120121await testObject.initialize();122const acutal = testObject.configurationModel;123124assert.strictEqual(acutal.getValue('policy.settingA'), 'policyValueA');125assert.strictEqual(acutal.getValue('policy.settingB'), undefined);126assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);127assert.deepStrictEqual(acutal.keys, ['policy.settingA']);128assert.deepStrictEqual(acutal.overrides, []);129});130131test('initialize: no policies', async () => {132await testObject.initialize();133const acutal = testObject.configurationModel;134135assert.deepStrictEqual(acutal.keys, []);136assert.deepStrictEqual(acutal.overrides, []);137assert.strictEqual(acutal.getValue('policy.settingA'), undefined);138assert.strictEqual(acutal.getValue('policy.settingB'), undefined);139assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);140});141142test('initialize: with policies but not registered', async () => {143await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingA': 'policyValueA', 'PolicySettingB': 'policyValueB', 'PolicySettingC': 'policyValueC' })));144145await testObject.initialize();146const acutal = testObject.configurationModel;147148assert.strictEqual(acutal.getValue('policy.settingA'), 'policyValueA');149assert.strictEqual(acutal.getValue('policy.settingB'), 'policyValueB');150assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);151assert.deepStrictEqual(acutal.keys, ['policy.settingA', 'policy.settingB']);152assert.deepStrictEqual(acutal.overrides, []);153});154155test('initialize: with object type policy', async () => {156const expected = {157'microsoft': true,158'github': 'stable',159'other': 1,160'complex': {161'key': 'value'162},163'array': [1, 2, 3]164};165await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicyObjectSetting': JSON.stringify(expected) })));166167await testObject.initialize();168const acutal = testObject.configurationModel;169170assert.deepStrictEqual(acutal.getValue('policy.objectSetting'), expected);171});172173test('initialize: with array type policy', async () => {174await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicyArraySetting': JSON.stringify([1]) })));175176await testObject.initialize();177const acutal = testObject.configurationModel;178179assert.deepStrictEqual(acutal.getValue('policy.arraySetting'), [1]);180});181182test('initialize: with boolean type policy as false', async () => {183await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicyBooleanSetting': false })));184185await testObject.initialize();186const acutal = testObject.configurationModel;187188assert.deepStrictEqual(acutal.getValue('policy.booleanSetting'), false);189});190191test('initialize: with boolean type policy as true', async () => {192await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicyBooleanSetting': true })));193194await testObject.initialize();195const acutal = testObject.configurationModel;196197assert.deepStrictEqual(acutal.getValue('policy.booleanSetting'), true);198});199200test('initialize: with object type policy ignores policy if value is not valid', async () => {201await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicyObjectSetting': '{"a": "b", "hello": }' })));202203await testObject.initialize();204const acutal = testObject.configurationModel;205206assert.deepStrictEqual(acutal.getValue('policy.objectSetting'), undefined);207});208209test('initialize: with object type policy ignores policy if there are duplicate keys', async () => {210await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicyObjectSetting': '{"microsoft": true, "microsoft": false }' })));211212await testObject.initialize();213const acutal = testObject.configurationModel;214215assert.deepStrictEqual(acutal.getValue('policy.objectSetting'), undefined);216});217218test('change: when policy is added', async () => {219await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingA': 'policyValueA' })));220await testObject.initialize();221222await runWithFakedTimers({ useFakeTimers: true }, async () => {223const promise = Event.toPromise(testObject.onDidChangeConfiguration);224await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingA': 'policyValueA', 'PolicySettingB': 'policyValueB', 'PolicySettingC': 'policyValueC' })));225await promise;226});227228const acutal = testObject.configurationModel;229assert.strictEqual(acutal.getValue('policy.settingA'), 'policyValueA');230assert.strictEqual(acutal.getValue('policy.settingB'), 'policyValueB');231assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);232assert.deepStrictEqual(acutal.keys, ['policy.settingA', 'policy.settingB']);233assert.deepStrictEqual(acutal.overrides, []);234});235236test('change: when policy is updated', async () => {237await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingA': 'policyValueA' })));238await testObject.initialize();239240await runWithFakedTimers({ useFakeTimers: true }, async () => {241const promise = Event.toPromise(testObject.onDidChangeConfiguration);242await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingA': 'policyValueAChanged' })));243await promise;244});245246const acutal = testObject.configurationModel;247assert.strictEqual(acutal.getValue('policy.settingA'), 'policyValueAChanged');248assert.strictEqual(acutal.getValue('policy.settingB'), undefined);249assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);250assert.deepStrictEqual(acutal.keys, ['policy.settingA']);251assert.deepStrictEqual(acutal.overrides, []);252});253254test('change: when policy is removed', async () => {255await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingA': 'policyValueA' })));256await testObject.initialize();257258await runWithFakedTimers({ useFakeTimers: true }, async () => {259const promise = Event.toPromise(testObject.onDidChangeConfiguration);260await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({})));261await promise;262});263264const acutal = testObject.configurationModel;265assert.strictEqual(acutal.getValue('policy.settingA'), undefined);266assert.strictEqual(acutal.getValue('policy.settingB'), undefined);267assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);268assert.deepStrictEqual(acutal.keys, []);269assert.deepStrictEqual(acutal.overrides, []);270});271272test('change: when policy setting is registered', async () => {273await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingC': 'policyValueC' })));274await testObject.initialize();275276const promise = Event.toPromise(testObject.onDidChangeConfiguration);277policyConfigurationNode.properties!['policy.settingC'] = {278'type': 'string',279'default': 'defaultValueC',280policy: {281name: 'PolicySettingC',282category: PolicyCategory.Extensions,283minimumVersion: '1.0.0',284localization: { description: { key: '', value: '' }, },285}286};287Registry.as<IConfigurationRegistry>(Extensions.Configuration).registerConfiguration(deepClone(policyConfigurationNode));288await promise;289290const acutal = testObject.configurationModel;291assert.strictEqual(acutal.getValue('policy.settingC'), 'policyValueC');292assert.strictEqual(acutal.getValue('policy.settingA'), undefined);293assert.strictEqual(acutal.getValue('policy.settingB'), undefined);294assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);295assert.deepStrictEqual(acutal.keys, ['policy.settingC']);296assert.deepStrictEqual(acutal.overrides, []);297});298299test('change: when policy setting is deregistered', async () => {300await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingA': 'policyValueA' })));301await testObject.initialize();302303const promise = Event.toPromise(testObject.onDidChangeConfiguration);304Registry.as<IConfigurationRegistry>(Extensions.Configuration).deregisterConfigurations([policyConfigurationNode]);305await promise;306307const acutal = testObject.configurationModel;308assert.strictEqual(acutal.getValue('policy.settingA'), undefined);309assert.strictEqual(acutal.getValue('policy.settingB'), undefined);310assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);311assert.deepStrictEqual(acutal.keys, []);312assert.deepStrictEqual(acutal.overrides, []);313});314315test('initialize: with internal policies', async () => {316await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicyInternalSetting': 'internalValue' })));317318await testObject.initialize();319const acutal = testObject.configurationModel;320321assert.strictEqual(acutal.getValue('policy.settingA'), undefined);322assert.strictEqual(acutal.getValue('policy.settingB'), undefined);323assert.strictEqual(acutal.getValue('policy.internalSetting'), 'internalValue');324assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);325assert.deepStrictEqual(acutal.keys, ['policy.internalSetting']);326assert.deepStrictEqual(acutal.overrides, []);327});328329});330331332