Path: blob/main/src/vs/platform/configuration/test/common/policyConfiguration.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 { 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';2122suite('PolicyConfiguration', () => {2324const disposables = ensureNoDisposablesAreLeakedInTestSuite();2526let testObject: PolicyConfiguration;27let fileService: IFileService;28let policyService: IPolicyService;29const policyFile = URI.file('policyFile').with({ scheme: 'vscode-tests' });30const policyConfigurationNode: IConfigurationNode = {31'id': 'policyConfiguration',32'order': 1,33'title': 'a',34'type': 'object',35'properties': {36'policy.settingA': {37'type': 'string',38'default': 'defaultValueA',39policy: {40name: 'PolicySettingA',41minimumVersion: '1.0.0',42}43},44'policy.settingB': {45'type': 'string',46'default': 'defaultValueB',47policy: {48name: 'PolicySettingB',49minimumVersion: '1.0.0',50}51},52'policy.objectSetting': {53'type': 'object',54'default': {},55policy: {56name: 'PolicyObjectSetting',57minimumVersion: '1.0.0',58}59},60'policy.arraySetting': {61'type': 'object',62'default': [],63policy: {64name: 'PolicyArraySetting',65minimumVersion: '1.0.0',66}67},68'policy.booleanSetting': {69'type': 'boolean',70'default': true,71policy: {72name: 'PolicyBooleanSetting',73minimumVersion: '1.0.0',74}75},76'policy.internalSetting': {77'type': 'string',78'default': 'defaultInternalValue',79included: false,80policy: {81name: 'PolicyInternalSetting',82minimumVersion: '1.0.0',83}84},85'nonPolicy.setting': {86'type': 'boolean',87'default': true88}89}90};9192suiteSetup(() => Registry.as<IConfigurationRegistry>(Extensions.Configuration).registerConfiguration(policyConfigurationNode));93suiteTeardown(() => Registry.as<IConfigurationRegistry>(Extensions.Configuration).deregisterConfigurations([policyConfigurationNode]));9495setup(async () => {96const defaultConfiguration = disposables.add(new DefaultConfiguration(new NullLogService()));97await defaultConfiguration.initialize();98fileService = disposables.add(new FileService(new NullLogService()));99const diskFileSystemProvider = disposables.add(new InMemoryFileSystemProvider());100disposables.add(fileService.registerProvider(policyFile.scheme, diskFileSystemProvider));101policyService = disposables.add(new FilePolicyService(policyFile, fileService, new NullLogService()));102testObject = disposables.add(new PolicyConfiguration(defaultConfiguration, policyService, new NullLogService()));103});104105test('initialize: with policies', async () => {106await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingA': 'policyValueA' })));107108await testObject.initialize();109const acutal = testObject.configurationModel;110111assert.strictEqual(acutal.getValue('policy.settingA'), 'policyValueA');112assert.strictEqual(acutal.getValue('policy.settingB'), undefined);113assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);114assert.deepStrictEqual(acutal.keys, ['policy.settingA']);115assert.deepStrictEqual(acutal.overrides, []);116});117118test('initialize: no policies', async () => {119await testObject.initialize();120const acutal = testObject.configurationModel;121122assert.deepStrictEqual(acutal.keys, []);123assert.deepStrictEqual(acutal.overrides, []);124assert.strictEqual(acutal.getValue('policy.settingA'), undefined);125assert.strictEqual(acutal.getValue('policy.settingB'), undefined);126assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);127});128129test('initialize: with policies but not registered', async () => {130await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingA': 'policyValueA', 'PolicySettingB': 'policyValueB', 'PolicySettingC': 'policyValueC' })));131132await testObject.initialize();133const acutal = testObject.configurationModel;134135assert.strictEqual(acutal.getValue('policy.settingA'), 'policyValueA');136assert.strictEqual(acutal.getValue('policy.settingB'), 'policyValueB');137assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);138assert.deepStrictEqual(acutal.keys, ['policy.settingA', 'policy.settingB']);139assert.deepStrictEqual(acutal.overrides, []);140});141142test('initialize: with object type policy', async () => {143const expected = {144'microsoft': true,145'github': 'stable',146'other': 1,147'complex': {148'key': 'value'149},150'array': [1, 2, 3]151};152await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicyObjectSetting': JSON.stringify(expected) })));153154await testObject.initialize();155const acutal = testObject.configurationModel;156157assert.deepStrictEqual(acutal.getValue('policy.objectSetting'), expected);158});159160test('initialize: with array type policy', async () => {161await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicyArraySetting': JSON.stringify([1]) })));162163await testObject.initialize();164const acutal = testObject.configurationModel;165166assert.deepStrictEqual(acutal.getValue('policy.arraySetting'), [1]);167});168169test('initialize: with boolean type policy as false', async () => {170await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicyBooleanSetting': false })));171172await testObject.initialize();173const acutal = testObject.configurationModel;174175assert.deepStrictEqual(acutal.getValue('policy.booleanSetting'), false);176});177178test('initialize: with boolean type policy as true', async () => {179await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicyBooleanSetting': true })));180181await testObject.initialize();182const acutal = testObject.configurationModel;183184assert.deepStrictEqual(acutal.getValue('policy.booleanSetting'), true);185});186187test('initialize: with object type policy ignores policy if value is not valid', async () => {188await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicyObjectSetting': '{"a": "b", "hello": }' })));189190await testObject.initialize();191const acutal = testObject.configurationModel;192193assert.deepStrictEqual(acutal.getValue('policy.objectSetting'), undefined);194});195196test('initialize: with object type policy ignores policy if there are duplicate keys', async () => {197await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicyObjectSetting': '{"microsoft": true, "microsoft": false }' })));198199await testObject.initialize();200const acutal = testObject.configurationModel;201202assert.deepStrictEqual(acutal.getValue('policy.objectSetting'), undefined);203});204205test('change: when policy is added', async () => {206await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingA': 'policyValueA' })));207await testObject.initialize();208209await runWithFakedTimers({ useFakeTimers: true }, async () => {210const promise = Event.toPromise(testObject.onDidChangeConfiguration);211await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingA': 'policyValueA', 'PolicySettingB': 'policyValueB', 'PolicySettingC': 'policyValueC' })));212await promise;213});214215const acutal = testObject.configurationModel;216assert.strictEqual(acutal.getValue('policy.settingA'), 'policyValueA');217assert.strictEqual(acutal.getValue('policy.settingB'), 'policyValueB');218assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);219assert.deepStrictEqual(acutal.keys, ['policy.settingA', 'policy.settingB']);220assert.deepStrictEqual(acutal.overrides, []);221});222223test('change: when policy is updated', async () => {224await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingA': 'policyValueA' })));225await testObject.initialize();226227await runWithFakedTimers({ useFakeTimers: true }, async () => {228const promise = Event.toPromise(testObject.onDidChangeConfiguration);229await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingA': 'policyValueAChanged' })));230await promise;231});232233const acutal = testObject.configurationModel;234assert.strictEqual(acutal.getValue('policy.settingA'), 'policyValueAChanged');235assert.strictEqual(acutal.getValue('policy.settingB'), undefined);236assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);237assert.deepStrictEqual(acutal.keys, ['policy.settingA']);238assert.deepStrictEqual(acutal.overrides, []);239});240241test('change: when policy is removed', async () => {242await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingA': 'policyValueA' })));243await testObject.initialize();244245await runWithFakedTimers({ useFakeTimers: true }, async () => {246const promise = Event.toPromise(testObject.onDidChangeConfiguration);247await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({})));248await promise;249});250251const acutal = testObject.configurationModel;252assert.strictEqual(acutal.getValue('policy.settingA'), undefined);253assert.strictEqual(acutal.getValue('policy.settingB'), undefined);254assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);255assert.deepStrictEqual(acutal.keys, []);256assert.deepStrictEqual(acutal.overrides, []);257});258259test('change: when policy setting is registered', async () => {260await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingC': 'policyValueC' })));261await testObject.initialize();262263const promise = Event.toPromise(testObject.onDidChangeConfiguration);264policyConfigurationNode.properties!['policy.settingC'] = {265'type': 'string',266'default': 'defaultValueC',267policy: {268name: 'PolicySettingC',269minimumVersion: '1.0.0',270}271};272Registry.as<IConfigurationRegistry>(Extensions.Configuration).registerConfiguration(deepClone(policyConfigurationNode));273await promise;274275const acutal = testObject.configurationModel;276assert.strictEqual(acutal.getValue('policy.settingC'), 'policyValueC');277assert.strictEqual(acutal.getValue('policy.settingA'), undefined);278assert.strictEqual(acutal.getValue('policy.settingB'), undefined);279assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);280assert.deepStrictEqual(acutal.keys, ['policy.settingC']);281assert.deepStrictEqual(acutal.overrides, []);282});283284test('change: when policy setting is deregistered', async () => {285await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicySettingA': 'policyValueA' })));286await testObject.initialize();287288const promise = Event.toPromise(testObject.onDidChangeConfiguration);289Registry.as<IConfigurationRegistry>(Extensions.Configuration).deregisterConfigurations([policyConfigurationNode]);290await promise;291292const acutal = testObject.configurationModel;293assert.strictEqual(acutal.getValue('policy.settingA'), undefined);294assert.strictEqual(acutal.getValue('policy.settingB'), undefined);295assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);296assert.deepStrictEqual(acutal.keys, []);297assert.deepStrictEqual(acutal.overrides, []);298});299300test('initialize: with internal policies', async () => {301await fileService.writeFile(policyFile, VSBuffer.fromString(JSON.stringify({ 'PolicyInternalSetting': 'internalValue' })));302303await testObject.initialize();304const acutal = testObject.configurationModel;305306assert.strictEqual(acutal.getValue('policy.settingA'), undefined);307assert.strictEqual(acutal.getValue('policy.settingB'), undefined);308assert.strictEqual(acutal.getValue('policy.internalSetting'), 'internalValue');309assert.strictEqual(acutal.getValue('nonPolicy.setting'), undefined);310assert.deepStrictEqual(acutal.keys, ['policy.internalSetting']);311assert.deepStrictEqual(acutal.overrides, []);312});313314});315316317