Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/platform/configuration/test/common/configurationService.test.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import assert from 'assert';
7
import { VSBuffer } from '../../../../base/common/buffer.js';
8
import { Event } from '../../../../base/common/event.js';
9
import { Schemas } from '../../../../base/common/network.js';
10
import { URI } from '../../../../base/common/uri.js';
11
import { runWithFakedTimers } from '../../../../base/test/common/timeTravelScheduler.js';
12
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';
13
import { ConfigurationTarget, isConfigured } from '../../common/configuration.js';
14
import { Extensions as ConfigurationExtensions, IConfigurationRegistry } from '../../common/configurationRegistry.js';
15
import { ConfigurationService } from '../../common/configurationService.js';
16
import { IFileService } from '../../../files/common/files.js';
17
import { FileService } from '../../../files/common/fileService.js';
18
import { InMemoryFileSystemProvider } from '../../../files/common/inMemoryFilesystemProvider.js';
19
import { NullLogService } from '../../../log/common/log.js';
20
import { FilePolicyService } from '../../../policy/common/filePolicyService.js';
21
import { NullPolicyService } from '../../../policy/common/policy.js';
22
import { Registry } from '../../../registry/common/platform.js';
23
24
suite('ConfigurationService.test.ts', () => {
25
26
const disposables = ensureNoDisposablesAreLeakedInTestSuite();
27
28
let fileService: IFileService;
29
let settingsResource: URI;
30
31
setup(async () => {
32
fileService = disposables.add(new FileService(new NullLogService()));
33
const diskFileSystemProvider = disposables.add(new InMemoryFileSystemProvider());
34
disposables.add(fileService.registerProvider(Schemas.file, diskFileSystemProvider));
35
settingsResource = URI.file('settings.json');
36
});
37
38
test('simple', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {
39
await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "foo": "bar" }'));
40
const testObject = disposables.add(new ConfigurationService(settingsResource, fileService, new NullPolicyService(), new NullLogService()));
41
await testObject.initialize();
42
const config = testObject.getValue<{
43
foo: string;
44
}>();
45
46
assert.ok(config);
47
assert.strictEqual(config.foo, 'bar');
48
}));
49
50
test('config gets flattened', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {
51
await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "testworkbench.editor.tabs": true }'));
52
53
const testObject = disposables.add(new ConfigurationService(settingsResource, fileService, new NullPolicyService(), new NullLogService()));
54
await testObject.initialize();
55
const config = testObject.getValue<{
56
testworkbench: {
57
editor: {
58
tabs: boolean;
59
};
60
};
61
}>();
62
63
assert.ok(config);
64
assert.ok(config.testworkbench);
65
assert.ok(config.testworkbench.editor);
66
assert.strictEqual(config.testworkbench.editor.tabs, true);
67
}));
68
69
test('error case does not explode', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {
70
await fileService.writeFile(settingsResource, VSBuffer.fromString(',,,,'));
71
72
const testObject = disposables.add(new ConfigurationService(settingsResource, fileService, new NullPolicyService(), new NullLogService()));
73
await testObject.initialize();
74
const config = testObject.getValue<{
75
foo: string;
76
}>();
77
78
assert.ok(config);
79
}));
80
81
test('missing file does not explode', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {
82
const testObject = disposables.add(new ConfigurationService(URI.file('__testFile'), fileService, new NullPolicyService(), new NullLogService()));
83
await testObject.initialize();
84
85
const config = testObject.getValue<{ foo: string }>();
86
87
assert.ok(config);
88
}));
89
90
test('trigger configuration change event when file does not exist', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {
91
const testObject = disposables.add(new ConfigurationService(settingsResource, fileService, new NullPolicyService(), new NullLogService()));
92
await testObject.initialize();
93
return new Promise<void>((c, e) => {
94
disposables.add(Event.filter(testObject.onDidChangeConfiguration, e => e.source === ConfigurationTarget.USER)(() => {
95
assert.strictEqual(testObject.getValue('foo'), 'bar');
96
c();
97
}));
98
fileService.writeFile(settingsResource, VSBuffer.fromString('{ "foo": "bar" }')).catch(e);
99
});
100
101
}));
102
103
test('trigger configuration change event when file exists', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {
104
const testObject = disposables.add(new ConfigurationService(settingsResource, fileService, new NullPolicyService(), new NullLogService()));
105
await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "foo": "bar" }'));
106
await testObject.initialize();
107
108
return new Promise<void>((c) => {
109
disposables.add(Event.filter(testObject.onDidChangeConfiguration, e => e.source === ConfigurationTarget.USER)(async (e) => {
110
assert.strictEqual(testObject.getValue('foo'), 'barz');
111
c();
112
}));
113
fileService.writeFile(settingsResource, VSBuffer.fromString('{ "foo": "barz" }'));
114
});
115
}));
116
117
test('reloadConfiguration', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {
118
await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "foo": "bar" }'));
119
120
const testObject = disposables.add(new ConfigurationService(settingsResource, fileService, new NullPolicyService(), new NullLogService()));
121
await testObject.initialize();
122
let config = testObject.getValue<{
123
foo: string;
124
}>();
125
assert.ok(config);
126
assert.strictEqual(config.foo, 'bar');
127
await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "foo": "changed" }'));
128
129
// force a reload to get latest
130
await testObject.reloadConfiguration();
131
config = testObject.getValue<{
132
foo: string;
133
}>();
134
assert.ok(config);
135
assert.strictEqual(config.foo, 'changed');
136
}));
137
138
test('model defaults', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {
139
interface ITestSetting {
140
configuration: {
141
service: {
142
testSetting: string;
143
};
144
};
145
}
146
147
const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);
148
configurationRegistry.registerConfiguration({
149
'id': '_test',
150
'type': 'object',
151
'properties': {
152
'configuration.service.testSetting': {
153
'type': 'string',
154
'default': 'isSet'
155
}
156
}
157
});
158
159
let testObject = disposables.add(new ConfigurationService(URI.file('__testFile'), fileService, new NullPolicyService(), new NullLogService()));
160
await testObject.initialize();
161
let setting = testObject.getValue<ITestSetting>();
162
163
assert.ok(setting);
164
assert.strictEqual(setting.configuration.service.testSetting, 'isSet');
165
166
await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "testworkbench.editor.tabs": true }'));
167
testObject = disposables.add(new ConfigurationService(settingsResource, fileService, new NullPolicyService(), new NullLogService()));
168
await testObject.initialize();
169
170
setting = testObject.getValue<ITestSetting>();
171
172
assert.ok(setting);
173
assert.strictEqual(setting.configuration.service.testSetting, 'isSet');
174
175
await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "configuration.service.testSetting": "isChanged" }'));
176
177
await testObject.reloadConfiguration();
178
setting = testObject.getValue<ITestSetting>();
179
assert.ok(setting);
180
assert.strictEqual(setting.configuration.service.testSetting, 'isChanged');
181
}));
182
183
test('lookup', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {
184
const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);
185
configurationRegistry.registerConfiguration({
186
'id': '_test',
187
'type': 'object',
188
'properties': {
189
'lookup.service.testSetting': {
190
'type': 'string',
191
'default': 'isSet'
192
}
193
}
194
});
195
196
const testObject = disposables.add(new ConfigurationService(settingsResource, fileService, new NullPolicyService(), new NullLogService()));
197
await testObject.initialize();
198
199
let res = testObject.inspect('something.missing');
200
assert.strictEqual(res.value, undefined);
201
assert.strictEqual(res.defaultValue, undefined);
202
assert.strictEqual(res.userValue, undefined);
203
assert.strictEqual(isConfigured(res), false);
204
205
res = testObject.inspect('lookup.service.testSetting');
206
assert.strictEqual(res.defaultValue, 'isSet');
207
assert.strictEqual(res.value, 'isSet');
208
assert.strictEqual(res.userValue, undefined);
209
assert.strictEqual(isConfigured(res), false);
210
211
await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "lookup.service.testSetting": "bar" }'));
212
213
await testObject.reloadConfiguration();
214
res = testObject.inspect('lookup.service.testSetting');
215
assert.strictEqual(res.defaultValue, 'isSet');
216
assert.strictEqual(res.userValue, 'bar');
217
assert.strictEqual(res.value, 'bar');
218
assert.strictEqual(isConfigured(res), true);
219
220
}));
221
222
test('lookup with null', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {
223
const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);
224
configurationRegistry.registerConfiguration({
225
'id': '_testNull',
226
'type': 'object',
227
'properties': {
228
'lookup.service.testNullSetting': {
229
'type': 'null',
230
}
231
}
232
});
233
234
const testObject = disposables.add(new ConfigurationService(settingsResource, fileService, new NullPolicyService(), new NullLogService()));
235
await testObject.initialize();
236
237
let res = testObject.inspect('lookup.service.testNullSetting');
238
assert.strictEqual(res.defaultValue, null);
239
assert.strictEqual(res.value, null);
240
assert.strictEqual(res.userValue, undefined);
241
242
await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "lookup.service.testNullSetting": null }'));
243
244
await testObject.reloadConfiguration();
245
246
res = testObject.inspect('lookup.service.testNullSetting');
247
assert.strictEqual(res.defaultValue, null);
248
assert.strictEqual(res.value, null);
249
assert.strictEqual(res.userValue, null);
250
}));
251
252
test('update configuration', async () => {
253
const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);
254
configurationRegistry.registerConfiguration({
255
'id': '_test',
256
'type': 'object',
257
'properties': {
258
'configurationService.testSetting': {
259
'type': 'string',
260
'default': 'isSet'
261
}
262
}
263
});
264
const testObject = disposables.add(new ConfigurationService(settingsResource, fileService, new NullPolicyService(), new NullLogService()));
265
await testObject.initialize();
266
267
await testObject.updateValue('configurationService.testSetting', 'value');
268
assert.strictEqual(testObject.getValue('configurationService.testSetting'), 'value');
269
});
270
271
test('update configuration when exist', async () => {
272
const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);
273
configurationRegistry.registerConfiguration({
274
'id': '_test',
275
'type': 'object',
276
'properties': {
277
'configurationService.testSetting': {
278
'type': 'string',
279
'default': 'isSet'
280
}
281
}
282
});
283
const testObject = disposables.add(new ConfigurationService(settingsResource, fileService, new NullPolicyService(), new NullLogService()));
284
await testObject.initialize();
285
286
await testObject.updateValue('configurationService.testSetting', 'value');
287
await testObject.updateValue('configurationService.testSetting', 'updatedValue');
288
assert.strictEqual(testObject.getValue('configurationService.testSetting'), 'updatedValue');
289
});
290
291
test('update configuration to default value should remove', async () => {
292
const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);
293
configurationRegistry.registerConfiguration({
294
'id': '_test',
295
'type': 'object',
296
'properties': {
297
'configurationService.testSetting': {
298
'type': 'string',
299
'default': 'isSet'
300
}
301
}
302
});
303
const testObject = disposables.add(new ConfigurationService(settingsResource, fileService, new NullPolicyService(), new NullLogService()));
304
await testObject.initialize();
305
306
await testObject.updateValue('configurationService.testSetting', 'value');
307
await testObject.updateValue('configurationService.testSetting', 'isSet');
308
const inspect = testObject.inspect('configurationService.testSetting');
309
310
assert.strictEqual(inspect.userValue, undefined);
311
});
312
313
test('update configuration should remove when undefined is passed', async () => {
314
const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);
315
configurationRegistry.registerConfiguration({
316
'id': '_test',
317
'type': 'object',
318
'properties': {
319
'configurationService.testSetting': {
320
'type': 'string',
321
'default': 'isSet'
322
}
323
}
324
});
325
const testObject = disposables.add(new ConfigurationService(settingsResource, fileService, new NullPolicyService(), new NullLogService()));
326
await testObject.initialize();
327
328
await testObject.updateValue('configurationService.testSetting', 'value');
329
await testObject.updateValue('configurationService.testSetting', undefined);
330
const inspect = testObject.inspect('configurationService.testSetting');
331
332
assert.strictEqual(inspect.userValue, undefined);
333
});
334
335
test('update unknown configuration', async () => {
336
const testObject = disposables.add(new ConfigurationService(settingsResource, fileService, new NullPolicyService(), new NullLogService()));
337
await testObject.initialize();
338
339
await testObject.updateValue('configurationService.unknownSetting', 'value');
340
assert.strictEqual(testObject.getValue('configurationService.unknownSetting'), 'value');
341
});
342
343
test('update configuration in non user target throws error', async () => {
344
const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);
345
configurationRegistry.registerConfiguration({
346
'id': '_test',
347
'type': 'object',
348
'properties': {
349
'configurationService.testSetting': {
350
'type': 'string',
351
'default': 'isSet'
352
}
353
}
354
});
355
const testObject = disposables.add(new ConfigurationService(settingsResource, fileService, new NullPolicyService(), new NullLogService()));
356
await testObject.initialize();
357
358
try {
359
await testObject.updateValue('configurationService.testSetting', 'value', ConfigurationTarget.WORKSPACE);
360
assert.fail('Should fail with error');
361
} catch (e) {
362
// succeess
363
}
364
});
365
366
test('update configuration throws error for policy setting', async () => {
367
const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);
368
configurationRegistry.registerConfiguration({
369
'id': '_test',
370
'type': 'object',
371
'properties': {
372
'configurationService.policySetting': {
373
'type': 'string',
374
'default': 'isSet',
375
policy: {
376
name: 'configurationService.policySetting',
377
minimumVersion: '1.0.0',
378
}
379
}
380
}
381
});
382
383
const logService = new NullLogService();
384
const policyFile = URI.file('policies.json');
385
await fileService.writeFile(policyFile, VSBuffer.fromString('{ "configurationService.policySetting": "policyValue" }'));
386
const policyService = disposables.add(new FilePolicyService(policyFile, fileService, logService));
387
const testObject = disposables.add(new ConfigurationService(settingsResource, fileService, policyService, logService));
388
await testObject.initialize();
389
390
try {
391
await testObject.updateValue('configurationService.policySetting', 'value');
392
assert.fail('Should throw error');
393
} catch (error) {
394
// succeess
395
}
396
});
397
});
398
399