Path: blob/main/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts
4780 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 * as sinon from 'sinon';7import { URI } from '../../../../../base/common/uri.js';8import { Registry } from '../../../../../platform/registry/common/platform.js';9import { IEnvironmentService } from '../../../../../platform/environment/common/environment.js';10import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope, keyFromOverrideIdentifiers } from '../../../../../platform/configuration/common/configurationRegistry.js';11import { WorkspaceService } from '../../browser/configurationService.js';12import { ConfigurationEditingErrorCode } from '../../common/configurationEditing.js';13import { IFileService } from '../../../../../platform/files/common/files.js';14import { IWorkspaceContextService, WorkbenchState, IWorkspaceFoldersChangeEvent, ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from '../../../../../platform/workspace/common/workspace.js';15import { ConfigurationTarget, IConfigurationService, IConfigurationChangeEvent } from '../../../../../platform/configuration/common/configuration.js';16import { workbenchInstantiationService, RemoteFileSystemProvider, TestEnvironmentService, TestTextFileService } from '../../../../test/browser/workbenchTestServices.js';17import { TestInstantiationService } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js';18import { ITextFileService } from '../../../textfile/common/textfiles.js';19import { ITextModelService } from '../../../../../editor/common/services/resolverService.js';20import { TextModelResolverService } from '../../../textmodelResolver/common/textModelResolverService.js';21import { IJSONEditingService } from '../../common/jsonEditing.js';22import { JSONEditingService } from '../../common/jsonEditingService.js';23import { Schemas } from '../../../../../base/common/network.js';24import { joinPath, dirname, basename } from '../../../../../base/common/resources.js';25import { isLinux, isMacintosh } from '../../../../../base/common/platform.js';26import { IRemoteAgentService } from '../../../remote/common/remoteAgentService.js';27import { FileService } from '../../../../../platform/files/common/fileService.js';28import { NullLogService } from '../../../../../platform/log/common/log.js';29import { IRemoteAgentEnvironment } from '../../../../../platform/remote/common/remoteAgentEnvironment.js';30import { APPLY_ALL_PROFILES_SETTING, IConfigurationCache } from '../../common/configuration.js';31import { SignService } from '../../../../../platform/sign/browser/signService.js';32import { FileUserDataProvider } from '../../../../../platform/userData/common/fileUserDataProvider.js';33import { IKeybindingEditingService, KeybindingsEditingService } from '../../../keybinding/common/keybindingEditing.js';34import { IWorkbenchEnvironmentService } from '../../../environment/common/environmentService.js';35import { timeout } from '../../../../../base/common/async.js';36import { VSBuffer } from '../../../../../base/common/buffer.js';37import { Event } from '../../../../../base/common/event.js';38import { UriIdentityService } from '../../../../../platform/uriIdentity/common/uriIdentityService.js';39import { InMemoryFileSystemProvider } from '../../../../../platform/files/common/inMemoryFilesystemProvider.js';40import { BrowserWorkbenchEnvironmentService, IBrowserWorkbenchEnvironmentService } from '../../../environment/browser/environmentService.js';41import { RemoteAgentService } from '../../../remote/browser/remoteAgentService.js';42import { RemoteAuthorityResolverService } from '../../../../../platform/remote/browser/remoteAuthorityResolverService.js';43import { hash } from '../../../../../base/common/hash.js';44import { TestProductService } from '../../../../test/common/workbenchTestServices.js';45import { IUserDataProfilesService, toUserDataProfile, UserDataProfilesService } from '../../../../../platform/userDataProfile/common/userDataProfile.js';46import { NullPolicyService } from '../../../../../platform/policy/common/policy.js';47import { FilePolicyService } from '../../../../../platform/policy/common/filePolicyService.js';48import { runWithFakedTimers } from '../../../../../base/test/common/timeTravelScheduler.js';49import { UserDataProfileService } from '../../../userDataProfile/common/userDataProfileService.js';50import { IUserDataProfileService } from '../../../userDataProfile/common/userDataProfile.js';51import { TasksSchemaProperties } from '../../../../contrib/tasks/common/tasks.js';52import { RemoteSocketFactoryService } from '../../../../../platform/remote/common/remoteSocketFactoryService.js';53import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';54import { PolicyCategory } from '../../../../../base/common/policy.js';5556function convertToWorkspacePayload(folder: URI): ISingleFolderWorkspaceIdentifier {57return {58id: hash(folder.toString()).toString(16),59uri: folder60};61}6263class ConfigurationCache implements IConfigurationCache {64needsCaching(resource: URI): boolean { return false; }65async read(): Promise<string> { return ''; }66async write(): Promise<void> { }67async remove(): Promise<void> { }68}6970const ROOT = URI.file('tests').with({ scheme: 'vscode-tests' });7172suite('WorkspaceContextService - Folder', () => {7374const folderName = 'Folder A';75let folder: URI;76let testObject: WorkspaceService;77const disposables = ensureNoDisposablesAreLeakedInTestSuite();7879setup(async () => {80const logService = new NullLogService();81const fileService = disposables.add(new FileService(logService));82const fileSystemProvider = disposables.add(new InMemoryFileSystemProvider());83disposables.add(fileService.registerProvider(ROOT.scheme, fileSystemProvider));8485folder = joinPath(ROOT, folderName);86await fileService.createFolder(folder);8788const environmentService = TestEnvironmentService;89const uriIdentityService = disposables.add(new UriIdentityService(fileService));90const userDataProfilesService = disposables.add(new UserDataProfilesService(environmentService, fileService, uriIdentityService, logService));91disposables.add(fileService.registerProvider(Schemas.vscodeUserData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.vscodeUserData, userDataProfilesService, uriIdentityService, new NullLogService()))));92const userDataProfileService = disposables.add(new UserDataProfileService(userDataProfilesService.defaultProfile));93testObject = disposables.add(new WorkspaceService(94{ configurationCache: new ConfigurationCache() },95environmentService,96userDataProfileService,97userDataProfilesService,98fileService,99disposables.add(new RemoteAgentService(100new RemoteSocketFactoryService(),101userDataProfileService,102environmentService,103TestProductService,104disposables.add(new RemoteAuthorityResolverService(false, undefined, undefined, undefined, TestProductService, logService)),105new SignService(TestProductService), new NullLogService())),106uriIdentityService,107new NullLogService(),108new NullPolicyService()));109await (<WorkspaceService>testObject).initialize(convertToWorkspacePayload(folder));110});111112test('getWorkspace()', () => {113const actual = testObject.getWorkspace();114115assert.strictEqual(actual.folders.length, 1);116assert.strictEqual(actual.folders[0].uri.path, folder.path);117assert.strictEqual(actual.folders[0].name, folderName);118assert.strictEqual(actual.folders[0].index, 0);119assert.ok(!actual.configuration);120});121122test('getWorkbenchState()', () => {123const actual = testObject.getWorkbenchState();124125assert.strictEqual(actual, WorkbenchState.FOLDER);126});127128test('getWorkspaceFolder()', () => {129const actual = testObject.getWorkspaceFolder(joinPath(folder, 'a'));130131assert.strictEqual(actual, testObject.getWorkspace().folders[0]);132});133134test('getWorkspaceFolder() - queries in workspace folder', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {135136const logService = new NullLogService();137const fileService = disposables.add(new FileService(logService));138const fileSystemProvider = disposables.add(new InMemoryFileSystemProvider());139disposables.add(fileService.registerProvider(ROOT.scheme, fileSystemProvider));140141const folder = joinPath(ROOT, folderName).with({ query: 'myquery=1' });142await fileService.createFolder(folder);143144const environmentService = TestEnvironmentService;145const uriIdentityService = disposables.add(new UriIdentityService(fileService));146const userDataProfilesService = disposables.add(new UserDataProfilesService(environmentService, fileService, uriIdentityService, logService));147disposables.add(fileService.registerProvider(Schemas.vscodeUserData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.vscodeUserData, userDataProfilesService, uriIdentityService, new NullLogService()))));148const userDataProfileService = disposables.add(new UserDataProfileService(userDataProfilesService.defaultProfile));149const testObject = disposables.add(new WorkspaceService(150{ configurationCache: new ConfigurationCache() },151environmentService,152userDataProfileService,153userDataProfilesService,154fileService,155disposables.add(new RemoteAgentService(new RemoteSocketFactoryService(), userDataProfileService, environmentService, TestProductService, disposables.add(new RemoteAuthorityResolverService(false, undefined, undefined, undefined, TestProductService, logService)), new SignService(TestProductService), new NullLogService())),156uriIdentityService,157new NullLogService(),158new NullPolicyService()));159await (<WorkspaceService>testObject).initialize(convertToWorkspacePayload(folder));160161const actual = testObject.getWorkspaceFolder(joinPath(folder, 'a'));162163assert.strictEqual(actual, testObject.getWorkspace().folders[0]);164}));165166test('getWorkspaceFolder() - queries in resource', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {167168const logService = new NullLogService();169const fileService = disposables.add(new FileService(logService));170const fileSystemProvider = disposables.add(new InMemoryFileSystemProvider());171disposables.add(fileService.registerProvider(ROOT.scheme, fileSystemProvider));172173const folder = joinPath(ROOT, folderName);174await fileService.createFolder(folder);175176const environmentService = TestEnvironmentService;177const uriIdentityService = disposables.add(new UriIdentityService(fileService));178const userDataProfilesService = disposables.add(new UserDataProfilesService(environmentService, fileService, uriIdentityService, logService));179disposables.add(fileService.registerProvider(Schemas.vscodeUserData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.vscodeUserData, userDataProfilesService, uriIdentityService, new NullLogService()))));180const userDataProfileService = disposables.add(new UserDataProfileService(userDataProfilesService.defaultProfile));181const testObject = disposables.add(new WorkspaceService(182{ configurationCache: new ConfigurationCache() },183environmentService,184userDataProfileService,185userDataProfilesService,186fileService,187disposables.add(new RemoteAgentService(new RemoteSocketFactoryService(), userDataProfileService, environmentService, TestProductService, disposables.add(new RemoteAuthorityResolverService(false, undefined, undefined, undefined, TestProductService, logService)), new SignService(TestProductService), new NullLogService())),188uriIdentityService,189new NullLogService(),190new NullPolicyService()));191await testObject.initialize(convertToWorkspacePayload(folder));192193const actual = testObject.getWorkspaceFolder(joinPath(folder, 'a').with({ query: 'myquery=1' }));194195assert.strictEqual(actual, testObject.getWorkspace().folders[0]);196}));197198test('isCurrentWorkspace() => true', () => {199assert.ok(testObject.isCurrentWorkspace(folder));200});201202test('isCurrentWorkspace() => false', () => {203assert.ok(!testObject.isCurrentWorkspace(joinPath(dirname(folder), 'abc')));204});205206test('workspace is complete', () => testObject.getCompleteWorkspace());207});208209suite('WorkspaceContextService - Workspace', () => {210211let testObject: WorkspaceService;212const disposables = ensureNoDisposablesAreLeakedInTestSuite();213214setup(async () => {215const logService = new NullLogService();216const fileService = disposables.add(new FileService(logService));217const fileSystemProvider = disposables.add(new InMemoryFileSystemProvider());218disposables.add(fileService.registerProvider(ROOT.scheme, fileSystemProvider));219220const appSettingsHome = joinPath(ROOT, 'user');221const folderA = joinPath(ROOT, 'a');222const folderB = joinPath(ROOT, 'b');223const configResource = joinPath(ROOT, 'vsctests.code-workspace');224const workspace = { folders: [{ path: folderA.path }, { path: folderB.path }] };225226await fileService.createFolder(appSettingsHome);227await fileService.createFolder(folderA);228await fileService.createFolder(folderB);229await fileService.writeFile(configResource, VSBuffer.fromString(JSON.stringify(workspace, null, '\t')));230231const instantiationService = workbenchInstantiationService(undefined, disposables);232const environmentService = TestEnvironmentService;233const remoteAgentService = disposables.add(disposables.add(instantiationService.createInstance(RemoteAgentService)));234instantiationService.stub(IRemoteAgentService, remoteAgentService);235const uriIdentityService = disposables.add(new UriIdentityService(fileService));236const userDataProfilesService = instantiationService.stub(IUserDataProfilesService, disposables.add(new UserDataProfilesService(environmentService, fileService, uriIdentityService, logService)));237disposables.add(fileService.registerProvider(Schemas.vscodeUserData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.vscodeUserData, userDataProfilesService, uriIdentityService, new NullLogService()))));238testObject = disposables.add(new WorkspaceService(239{ configurationCache: new ConfigurationCache() },240environmentService,241disposables.add(new UserDataProfileService(userDataProfilesService.defaultProfile)),242userDataProfilesService, fileService, remoteAgentService, uriIdentityService, new NullLogService(), new NullPolicyService()));243244instantiationService.stub(IWorkspaceContextService, testObject);245instantiationService.stub(IConfigurationService, testObject);246instantiationService.stub(IEnvironmentService, environmentService);247248await testObject.initialize(getWorkspaceIdentifier(configResource));249testObject.acquireInstantiationService(instantiationService);250});251252test('workspace folders', () => {253const actual = testObject.getWorkspace().folders;254255assert.strictEqual(actual.length, 2);256assert.strictEqual(basename(actual[0].uri), 'a');257assert.strictEqual(basename(actual[1].uri), 'b');258});259260test('getWorkbenchState()', () => {261const actual = testObject.getWorkbenchState();262263assert.strictEqual(actual, WorkbenchState.WORKSPACE);264});265266267test('workspace is complete', () => testObject.getCompleteWorkspace());268269});270271suite('WorkspaceContextService - Workspace Editing', () => {272273let testObject: WorkspaceService, fileService: IFileService;274const disposables = ensureNoDisposablesAreLeakedInTestSuite();275276setup(async () => {277const logService = new NullLogService();278fileService = disposables.add(new FileService(logService));279const fileSystemProvider = disposables.add(new InMemoryFileSystemProvider());280disposables.add(fileService.registerProvider(ROOT.scheme, fileSystemProvider));281282const appSettingsHome = joinPath(ROOT, 'user');283const folderA = joinPath(ROOT, 'a');284const folderB = joinPath(ROOT, 'b');285const configResource = joinPath(ROOT, 'vsctests.code-workspace');286const workspace = { folders: [{ path: folderA.path }, { path: folderB.path }] };287288await fileService.createFolder(appSettingsHome);289await fileService.createFolder(folderA);290await fileService.createFolder(folderB);291await fileService.writeFile(configResource, VSBuffer.fromString(JSON.stringify(workspace, null, '\t')));292293const instantiationService = workbenchInstantiationService(undefined, disposables);294const environmentService = TestEnvironmentService;295const remoteAgentService = disposables.add(instantiationService.createInstance(RemoteAgentService));296instantiationService.stub(IRemoteAgentService, remoteAgentService);297const uriIdentityService = disposables.add(new UriIdentityService(fileService));298const userDataProfilesService = instantiationService.stub(IUserDataProfilesService, disposables.add(new UserDataProfilesService(environmentService, fileService, uriIdentityService, logService)));299disposables.add(fileService.registerProvider(Schemas.vscodeUserData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.vscodeUserData, userDataProfilesService, uriIdentityService, new NullLogService()))));300testObject = disposables.add(new WorkspaceService(301{ configurationCache: new ConfigurationCache() },302environmentService,303disposables.add(new UserDataProfileService(userDataProfilesService.defaultProfile)),304userDataProfilesService, fileService, remoteAgentService, uriIdentityService, new NullLogService(), new NullPolicyService()));305306instantiationService.stub(IFileService, fileService);307instantiationService.stub(IWorkspaceContextService, testObject);308instantiationService.stub(IConfigurationService, testObject);309instantiationService.stub(IEnvironmentService, environmentService);310311await testObject.initialize(getWorkspaceIdentifier(configResource));312instantiationService.stub(ITextFileService, disposables.add(instantiationService.createInstance(TestTextFileService)));313instantiationService.stub(ITextModelService, disposables.add(instantiationService.createInstance(TextModelResolverService)));314instantiationService.stub(IJSONEditingService, instantiationService.createInstance(JSONEditingService));315testObject.acquireInstantiationService(instantiationService);316});317318test('add folders', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {319await testObject.addFolders([{ uri: joinPath(ROOT, 'd') }, { uri: joinPath(ROOT, 'c') }]);320const actual = testObject.getWorkspace().folders;321322assert.strictEqual(actual.length, 4);323assert.strictEqual(basename(actual[0].uri), 'a');324assert.strictEqual(basename(actual[1].uri), 'b');325assert.strictEqual(basename(actual[2].uri), 'd');326assert.strictEqual(basename(actual[3].uri), 'c');327}));328329test('add folders (at specific index)', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {330await testObject.addFolders([{ uri: joinPath(ROOT, 'd') }, { uri: joinPath(ROOT, 'c') }], 0);331const actual = testObject.getWorkspace().folders;332333assert.strictEqual(actual.length, 4);334assert.strictEqual(basename(actual[0].uri), 'd');335assert.strictEqual(basename(actual[1].uri), 'c');336assert.strictEqual(basename(actual[2].uri), 'a');337assert.strictEqual(basename(actual[3].uri), 'b');338}));339340test('add folders (at specific wrong index)', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {341await testObject.addFolders([{ uri: joinPath(ROOT, 'd') }, { uri: joinPath(ROOT, 'c') }], 10);342const actual = testObject.getWorkspace().folders;343344assert.strictEqual(actual.length, 4);345assert.strictEqual(basename(actual[0].uri), 'a');346assert.strictEqual(basename(actual[1].uri), 'b');347assert.strictEqual(basename(actual[2].uri), 'd');348assert.strictEqual(basename(actual[3].uri), 'c');349}));350351test('add folders (with name)', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {352await testObject.addFolders([{ uri: joinPath(ROOT, 'd'), name: 'DDD' }, { uri: joinPath(ROOT, 'c'), name: 'CCC' }]);353const actual = testObject.getWorkspace().folders;354355assert.strictEqual(actual.length, 4);356assert.strictEqual(basename(actual[0].uri), 'a');357assert.strictEqual(basename(actual[1].uri), 'b');358assert.strictEqual(basename(actual[2].uri), 'd');359assert.strictEqual(basename(actual[3].uri), 'c');360assert.strictEqual(actual[2].name, 'DDD');361assert.strictEqual(actual[3].name, 'CCC');362}));363364test('add folders triggers change event', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {365const target = sinon.spy();366disposables.add(testObject.onWillChangeWorkspaceFolders(target));367disposables.add(testObject.onDidChangeWorkspaceFolders(target));368369const addedFolders = [{ uri: joinPath(ROOT, 'd') }, { uri: joinPath(ROOT, 'c') }];370await testObject.addFolders(addedFolders);371372assert.strictEqual(target.callCount, 2, `Should be called only once but called ${target.callCount} times`);373const actual_1 = (<IWorkspaceFoldersChangeEvent>target.args[1][0]);374assert.deepStrictEqual(actual_1.added.map(r => r.uri.toString()), addedFolders.map(a => a.uri.toString()));375assert.deepStrictEqual(actual_1.removed, []);376assert.deepStrictEqual(actual_1.changed, []);377}));378379test('remove folders', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {380await testObject.removeFolders([testObject.getWorkspace().folders[0].uri]);381const actual = testObject.getWorkspace().folders;382383assert.strictEqual(actual.length, 1);384assert.strictEqual(basename(actual[0].uri), 'b');385}));386387test('remove folders triggers change event', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {388const target = sinon.spy();389disposables.add(testObject.onWillChangeWorkspaceFolders(target));390disposables.add(testObject.onDidChangeWorkspaceFolders(target));391const removedFolder = testObject.getWorkspace().folders[0];392await testObject.removeFolders([removedFolder.uri]);393394assert.strictEqual(target.callCount, 2, `Should be called only once but called ${target.callCount} times`);395const actual_1 = (<IWorkspaceFoldersChangeEvent>target.args[1][0]);396assert.deepStrictEqual(actual_1.added, []);397assert.deepStrictEqual(actual_1.removed.map(r => r.uri.toString()), [removedFolder.uri.toString()]);398assert.deepStrictEqual(actual_1.changed.map(c => c.uri.toString()), [testObject.getWorkspace().folders[0].uri.toString()]);399}));400401test('remove folders and add them back by writing into the file', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {402const folders = testObject.getWorkspace().folders;403await testObject.removeFolders([folders[0].uri]);404405const promise = new Promise<void>((resolve, reject) => {406disposables.add(testObject.onDidChangeWorkspaceFolders(actual => {407try {408assert.deepStrictEqual(actual.added.map(r => r.uri.toString()), [folders[0].uri.toString()]);409resolve();410} catch (error) {411reject(error);412}413}));414});415416const workspace = { folders: [{ path: folders[0].uri.path }, { path: folders[1].uri.path }] };417await fileService.writeFile(testObject.getWorkspace().configuration!, VSBuffer.fromString(JSON.stringify(workspace, null, '\t')));418await promise;419}));420421test('update folders (remove last and add to end)', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {422const target = sinon.spy();423disposables.add(testObject.onWillChangeWorkspaceFolders(target));424disposables.add(testObject.onDidChangeWorkspaceFolders(target));425const addedFolders = [{ uri: joinPath(ROOT, 'd') }, { uri: joinPath(ROOT, 'c') }];426const removedFolders = [testObject.getWorkspace().folders[1]].map(f => f.uri);427await testObject.updateFolders(addedFolders, removedFolders);428429assert.strictEqual(target.callCount, 2, `Should be called only once but called ${target.callCount} times`);430const actual_1 = (<IWorkspaceFoldersChangeEvent>target.args[1][0]);431assert.deepStrictEqual(actual_1.added.map(r => r.uri.toString()), addedFolders.map(a => a.uri.toString()));432assert.deepStrictEqual(actual_1.removed.map(r_1 => r_1.uri.toString()), removedFolders.map(a_1 => a_1.toString()));433assert.deepStrictEqual(actual_1.changed, []);434}));435436test('update folders (rename first via add and remove)', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {437const target = sinon.spy();438disposables.add(testObject.onWillChangeWorkspaceFolders(target));439disposables.add(testObject.onDidChangeWorkspaceFolders(target));440const addedFolders = [{ uri: joinPath(ROOT, 'a'), name: 'The Folder' }];441const removedFolders = [testObject.getWorkspace().folders[0]].map(f => f.uri);442await testObject.updateFolders(addedFolders, removedFolders, 0);443444assert.strictEqual(target.callCount, 2, `Should be called only once but called ${target.callCount} times`);445const actual_1 = (<IWorkspaceFoldersChangeEvent>target.args[1][0]);446assert.deepStrictEqual(actual_1.added, []);447assert.deepStrictEqual(actual_1.removed, []);448assert.deepStrictEqual(actual_1.changed.map(r => r.uri.toString()), removedFolders.map(a => a.toString()));449}));450451test('update folders (remove first and add to end)', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {452const target = sinon.spy();453disposables.add(testObject.onWillChangeWorkspaceFolders(target));454disposables.add(testObject.onDidChangeWorkspaceFolders(target));455const addedFolders = [{ uri: joinPath(ROOT, 'd') }, { uri: joinPath(ROOT, 'c') }];456const removedFolders = [testObject.getWorkspace().folders[0]].map(f => f.uri);457const changedFolders = [testObject.getWorkspace().folders[1]].map(f => f.uri);458await testObject.updateFolders(addedFolders, removedFolders);459460assert.strictEqual(target.callCount, 2, `Should be called only once but called ${target.callCount} times`);461const actual_1 = (<IWorkspaceFoldersChangeEvent>target.args[1][0]);462assert.deepStrictEqual(actual_1.added.map(r => r.uri.toString()), addedFolders.map(a => a.uri.toString()));463assert.deepStrictEqual(actual_1.removed.map(r_1 => r_1.uri.toString()), removedFolders.map(a_1 => a_1.toString()));464assert.deepStrictEqual(actual_1.changed.map(r_2 => r_2.uri.toString()), changedFolders.map(a_2 => a_2.toString()));465}));466467test('reorder folders trigger change event', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {468const target = sinon.spy();469disposables.add(testObject.onWillChangeWorkspaceFolders(target));470disposables.add(testObject.onDidChangeWorkspaceFolders(target));471const workspace = { folders: [{ path: testObject.getWorkspace().folders[1].uri.path }, { path: testObject.getWorkspace().folders[0].uri.path }] };472await fileService.writeFile(testObject.getWorkspace().configuration!, VSBuffer.fromString(JSON.stringify(workspace, null, '\t')));473await testObject.reloadConfiguration();474475assert.strictEqual(target.callCount, 2, `Should be called only once but called ${target.callCount} times`);476const actual_1 = (<IWorkspaceFoldersChangeEvent>target.args[1][0]);477assert.deepStrictEqual(actual_1.added, []);478assert.deepStrictEqual(actual_1.removed, []);479assert.deepStrictEqual(actual_1.changed.map(c => c.uri.toString()), testObject.getWorkspace().folders.map(f => f.uri.toString()).reverse());480}));481482test('rename folders trigger change event', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {483const target = sinon.spy();484disposables.add(testObject.onWillChangeWorkspaceFolders(target));485disposables.add(testObject.onDidChangeWorkspaceFolders(target));486const workspace = { folders: [{ path: testObject.getWorkspace().folders[0].uri.path, name: '1' }, { path: testObject.getWorkspace().folders[1].uri.path }] };487fileService.writeFile(testObject.getWorkspace().configuration!, VSBuffer.fromString(JSON.stringify(workspace, null, '\t')));488await testObject.reloadConfiguration();489490assert.strictEqual(target.callCount, 2, `Should be called only once but called ${target.callCount} times`);491const actual_1 = (<IWorkspaceFoldersChangeEvent>target.args[1][0]);492assert.deepStrictEqual(actual_1.added, []);493assert.deepStrictEqual(actual_1.removed, []);494assert.deepStrictEqual(actual_1.changed.map(c => c.uri.toString()), [testObject.getWorkspace().folders[0].uri.toString()]);495}));496497});498499suite('WorkspaceService - Initialization', () => {500501let configResource: URI, testObject: WorkspaceService, fileService: IFileService, environmentService: BrowserWorkbenchEnvironmentService, userDataProfileService: IUserDataProfileService;502const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);503const disposables = ensureNoDisposablesAreLeakedInTestSuite();504505suiteSetup(() => {506configurationRegistry.registerConfiguration({507'id': '_test',508'type': 'object',509'properties': {510'initialization.testSetting1': {511'type': 'string',512'default': 'isSet',513scope: ConfigurationScope.RESOURCE514},515'initialization.testSetting2': {516'type': 'string',517'default': 'isSet',518scope: ConfigurationScope.RESOURCE519}520}521});522});523524setup(async () => {525const logService = new NullLogService();526fileService = disposables.add(new FileService(logService));527const fileSystemProvider = disposables.add(new InMemoryFileSystemProvider());528disposables.add(fileService.registerProvider(ROOT.scheme, fileSystemProvider));529530const appSettingsHome = joinPath(ROOT, 'user');531const folderA = joinPath(ROOT, 'a');532const folderB = joinPath(ROOT, 'b');533configResource = joinPath(ROOT, 'vsctests.code-workspace');534const workspace = { folders: [{ path: folderA.path }, { path: folderB.path }] };535536await fileService.createFolder(appSettingsHome);537await fileService.createFolder(folderA);538await fileService.createFolder(folderB);539await fileService.writeFile(configResource, VSBuffer.fromString(JSON.stringify(workspace, null, '\t')));540541const instantiationService = workbenchInstantiationService(undefined, disposables);542environmentService = TestEnvironmentService;543const remoteAgentService = disposables.add(instantiationService.createInstance(RemoteAgentService));544instantiationService.stub(IRemoteAgentService, remoteAgentService);545const uriIdentityService = disposables.add(new UriIdentityService(fileService));546const userDataProfilesService = instantiationService.stub(IUserDataProfilesService, disposables.add(new UserDataProfilesService(environmentService, fileService, uriIdentityService, logService)));547disposables.add(fileService.registerProvider(Schemas.vscodeUserData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.vscodeUserData, userDataProfilesService, uriIdentityService, new NullLogService()))));548userDataProfileService = instantiationService.stub(IUserDataProfileService, disposables.add(new UserDataProfileService(userDataProfilesService.defaultProfile)));549testObject = disposables.add(new WorkspaceService(550{ configurationCache: new ConfigurationCache() },551environmentService,552userDataProfileService,553userDataProfilesService, fileService, remoteAgentService, uriIdentityService, new NullLogService(), new NullPolicyService()));554instantiationService.stub(IFileService, fileService);555instantiationService.stub(IWorkspaceContextService, testObject);556instantiationService.stub(IConfigurationService, testObject);557instantiationService.stub(IEnvironmentService, environmentService);558559await testObject.initialize({ id: '' });560instantiationService.stub(ITextFileService, disposables.add(instantiationService.createInstance(TestTextFileService)));561instantiationService.stub(ITextModelService, disposables.add(instantiationService.createInstance(TextModelResolverService)));562testObject.acquireInstantiationService(instantiationService);563});564565(isMacintosh ? test.skip : test)('initialize a folder workspace from an empty workspace with no configuration changes', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {566567await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "initialization.testSetting1": "userValue" }'));568569await testObject.reloadConfiguration();570const target = sinon.spy();571disposables.add(testObject.onDidChangeWorkbenchState(target));572disposables.add(testObject.onDidChangeWorkspaceName(target));573disposables.add(testObject.onWillChangeWorkspaceFolders(target));574disposables.add(testObject.onDidChangeWorkspaceFolders(target));575disposables.add(testObject.onDidChangeConfiguration(target));576577const folder = joinPath(ROOT, 'a');578await testObject.initialize(convertToWorkspacePayload(folder));579580assert.strictEqual(testObject.getValue('initialization.testSetting1'), 'userValue');581assert.strictEqual(target.callCount, 4);582assert.deepStrictEqual(target.args[0], [WorkbenchState.FOLDER]);583assert.deepStrictEqual(target.args[1], [undefined]);584assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[3][0]).added.map(f => f.uri.toString()), [folder.toString()]);585assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[3][0]).removed, []);586assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[3][0]).changed, []);587588}));589590(isMacintosh ? test.skip : test)('initialize a folder workspace from an empty workspace with configuration changes', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {591592await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "initialization.testSetting1": "userValue" }'));593594await testObject.reloadConfiguration();595const target = sinon.spy();596disposables.add(testObject.onDidChangeWorkbenchState(target));597disposables.add(testObject.onDidChangeWorkspaceName(target));598disposables.add(testObject.onWillChangeWorkspaceFolders(target));599disposables.add(testObject.onDidChangeWorkspaceFolders(target));600disposables.add(testObject.onDidChangeConfiguration(target));601602const folder = joinPath(ROOT, 'a');603await fileService.writeFile(joinPath(folder, '.vscode', 'settings.json'), VSBuffer.fromString('{ "initialization.testSetting1": "workspaceValue" }'));604await testObject.initialize(convertToWorkspacePayload(folder));605606assert.strictEqual(testObject.getValue('initialization.testSetting1'), 'workspaceValue');607assert.strictEqual(target.callCount, 5);608assert.deepStrictEqual([...(<IConfigurationChangeEvent>target.args[0][0]).affectedKeys], ['initialization.testSetting1']);609assert.deepStrictEqual(target.args[1], [WorkbenchState.FOLDER]);610assert.deepStrictEqual(target.args[2], [undefined]);611assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[4][0]).added.map(f => f.uri.toString()), [folder.toString()]);612assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[4][0]).removed, []);613assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[4][0]).changed, []);614615}));616617(isMacintosh ? test.skip : test)('initialize a multi root workspace from an empty workspace with no configuration changes', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {618619await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "initialization.testSetting1": "userValue" }'));620621await testObject.reloadConfiguration();622const target = sinon.spy();623disposables.add(testObject.onDidChangeWorkbenchState(target));624disposables.add(testObject.onDidChangeWorkspaceName(target));625disposables.add(testObject.onWillChangeWorkspaceFolders(target));626disposables.add(testObject.onDidChangeWorkspaceFolders(target));627disposables.add(testObject.onDidChangeConfiguration(target));628629await testObject.initialize(getWorkspaceIdentifier(configResource));630631assert.strictEqual(target.callCount, 4);632assert.deepStrictEqual(target.args[0], [WorkbenchState.WORKSPACE]);633assert.deepStrictEqual(target.args[1], [undefined]);634assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[3][0]).added.map(folder => folder.uri.toString()), [joinPath(ROOT, 'a').toString(), joinPath(ROOT, 'b').toString()]);635assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[3][0]).removed, []);636assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[3][0]).changed, []);637638}));639640(isMacintosh ? test.skip : test)('initialize a multi root workspace from an empty workspace with configuration changes', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {641642await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "initialization.testSetting1": "userValue" }'));643644await testObject.reloadConfiguration();645const target = sinon.spy();646disposables.add(testObject.onDidChangeWorkbenchState(target));647disposables.add(testObject.onDidChangeWorkspaceName(target));648disposables.add(testObject.onWillChangeWorkspaceFolders(target));649disposables.add(testObject.onDidChangeWorkspaceFolders(target));650disposables.add(testObject.onDidChangeConfiguration(target));651652await fileService.writeFile(joinPath(ROOT, 'a', '.vscode', 'settings.json'), VSBuffer.fromString('{ "initialization.testSetting1": "workspaceValue1" }'));653await fileService.writeFile(joinPath(ROOT, 'b', '.vscode', 'settings.json'), VSBuffer.fromString('{ "initialization.testSetting2": "workspaceValue2" }'));654await testObject.initialize(getWorkspaceIdentifier(configResource));655656assert.strictEqual(target.callCount, 5);657assert.deepStrictEqual([...(<IConfigurationChangeEvent>target.args[0][0]).affectedKeys], ['initialization.testSetting1', 'initialization.testSetting2']);658assert.deepStrictEqual(target.args[1], [WorkbenchState.WORKSPACE]);659assert.deepStrictEqual(target.args[2], [undefined]);660assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[4][0]).added.map(folder => folder.uri.toString()), [joinPath(ROOT, 'a').toString(), joinPath(ROOT, 'b').toString()]);661assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[4][0]).removed, []);662assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[4][0]).changed, []);663664}));665666(isMacintosh ? test.skip : test)('initialize a folder workspace from a folder workspace with no configuration changes', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {667668await testObject.initialize(convertToWorkspacePayload(joinPath(ROOT, 'a')));669await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "initialization.testSetting1": "userValue" }'));670await testObject.reloadConfiguration();671const target = sinon.spy();672disposables.add(testObject.onDidChangeWorkbenchState(target));673disposables.add(testObject.onDidChangeWorkspaceName(target));674disposables.add(testObject.onWillChangeWorkspaceFolders(target));675disposables.add(testObject.onDidChangeWorkspaceFolders(target));676disposables.add(testObject.onDidChangeConfiguration(target));677678await testObject.initialize(convertToWorkspacePayload(joinPath(ROOT, 'b')));679680assert.strictEqual(testObject.getValue('initialization.testSetting1'), 'userValue');681assert.strictEqual(target.callCount, 2);682assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[1][0]).added.map(folder_1 => folder_1.uri.toString()), [joinPath(ROOT, 'b').toString()]);683assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[1][0]).removed.map(folder_2 => folder_2.uri.toString()), [joinPath(ROOT, 'a').toString()]);684assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[1][0]).changed, []);685686}));687688(isMacintosh ? test.skip : test)('initialize a folder workspace from a folder workspace with configuration changes', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {689690await testObject.initialize(convertToWorkspacePayload(joinPath(ROOT, 'a')));691const target = sinon.spy();692disposables.add(testObject.onDidChangeWorkbenchState(target));693disposables.add(testObject.onDidChangeWorkspaceName(target));694disposables.add(testObject.onWillChangeWorkspaceFolders(target));695disposables.add(testObject.onDidChangeWorkspaceFolders(target));696disposables.add(testObject.onDidChangeConfiguration(target));697698await fileService.writeFile(joinPath(ROOT, 'b', '.vscode', 'settings.json'), VSBuffer.fromString('{ "initialization.testSetting1": "workspaceValue2" }'));699await testObject.initialize(convertToWorkspacePayload(joinPath(ROOT, 'b')));700701assert.strictEqual(testObject.getValue('initialization.testSetting1'), 'workspaceValue2');702assert.strictEqual(target.callCount, 3);703assert.deepStrictEqual([...(<IConfigurationChangeEvent>target.args[0][0]).affectedKeys], ['initialization.testSetting1']);704assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[2][0]).added.map(folder_1 => folder_1.uri.toString()), [joinPath(ROOT, 'b').toString()]);705assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[2][0]).removed.map(folder_2 => folder_2.uri.toString()), [joinPath(ROOT, 'a').toString()]);706assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[2][0]).changed, []);707708}));709710(isMacintosh ? test.skip : test)('initialize a multi folder workspace from a folder workspacce triggers change events in the right order', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {711await testObject.initialize(convertToWorkspacePayload(joinPath(ROOT, 'a')));712const target = sinon.spy();713disposables.add(testObject.onDidChangeWorkbenchState(target));714disposables.add(testObject.onDidChangeWorkspaceName(target));715disposables.add(testObject.onWillChangeWorkspaceFolders(target));716disposables.add(testObject.onDidChangeWorkspaceFolders(target));717disposables.add(testObject.onDidChangeConfiguration(target));718719await fileService.writeFile(joinPath(ROOT, 'a', '.vscode', 'settings.json'), VSBuffer.fromString('{ "initialization.testSetting1": "workspaceValue2" }'));720await testObject.initialize(getWorkspaceIdentifier(configResource));721722assert.strictEqual(target.callCount, 5);723assert.deepStrictEqual([...(<IConfigurationChangeEvent>target.args[0][0]).affectedKeys], ['initialization.testSetting1']);724assert.deepStrictEqual(target.args[1], [WorkbenchState.WORKSPACE]);725assert.deepStrictEqual(target.args[2], [undefined]);726assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[4][0]).added.map(folder_1 => folder_1.uri.toString()), [joinPath(ROOT, 'b').toString()]);727assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[4][0]).removed, []);728assert.deepStrictEqual((<IWorkspaceFoldersChangeEvent>target.args[4][0]).changed, []);729}));730731});732733suite('WorkspaceConfigurationService - Folder', () => {734735let testObject: WorkspaceService, workspaceService: WorkspaceService, fileService: IFileService, environmentService: IBrowserWorkbenchEnvironmentService, userDataProfileService: IUserDataProfileService, instantiationService: TestInstantiationService;736const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);737const disposables = ensureNoDisposablesAreLeakedInTestSuite();738739suiteSetup(() => {740configurationRegistry.registerConfiguration({741'id': '_test',742'type': 'object',743'properties': {744'configurationService.folder.applicationSetting': {745'type': 'string',746'default': 'isSet',747scope: ConfigurationScope.APPLICATION748},749'configurationService.folder.machineSetting': {750'type': 'string',751'default': 'isSet',752scope: ConfigurationScope.MACHINE753},754'configurationService.folder.applicationMachineSetting': {755'type': 'string',756'default': 'isSet',757scope: ConfigurationScope.APPLICATION_MACHINE758},759'configurationService.folder.machineOverridableSetting': {760'type': 'string',761'default': 'isSet',762scope: ConfigurationScope.MACHINE_OVERRIDABLE763},764'configurationService.folder.testSetting': {765'type': 'string',766'default': 'isSet',767scope: ConfigurationScope.RESOURCE768},769'configurationService.folder.languageSetting': {770'type': 'string',771'default': 'isSet',772scope: ConfigurationScope.LANGUAGE_OVERRIDABLE773},774'configurationService.folder.restrictedSetting': {775'type': 'string',776'default': 'isSet',777restricted: true778},779'configurationService.folder.policySetting': {780'type': 'string',781'default': 'isSet',782policy: {783name: 'configurationService.folder.policySetting',784category: PolicyCategory.Extensions,785minimumVersion: '1.0.0',786localization: { description: { key: '', value: '' } }787}788},789'configurationService.folder.policyObjectSetting': {790'type': 'object',791'default': {},792policy: {793name: 'configurationService.folder.policyObjectSetting',794category: PolicyCategory.Extensions,795minimumVersion: '1.0.0',796localization: { description: { key: '', value: '' } }797}798},799}800});801802configurationRegistry.registerDefaultConfigurations([{803overrides: {804'[jsonc]': {805'configurationService.folder.languageSetting': 'languageValue'806}807}808}]);809});810811setup(async () => {812const logService = new NullLogService();813fileService = disposables.add(new FileService(logService));814const fileSystemProvider = disposables.add(new InMemoryFileSystemProvider());815disposables.add(fileService.registerProvider(ROOT.scheme, fileSystemProvider));816817const folder = joinPath(ROOT, 'a');818await fileService.createFolder(folder);819820instantiationService = workbenchInstantiationService(undefined, disposables);821environmentService = TestEnvironmentService;822environmentService.policyFile = joinPath(folder, 'policies.json');823const remoteAgentService = disposables.add(instantiationService.createInstance(RemoteAgentService));824instantiationService.stub(IRemoteAgentService, remoteAgentService);825const uriIdentityService = disposables.add(new UriIdentityService(fileService));826const userDataProfilesService = instantiationService.stub(IUserDataProfilesService, disposables.add(new UserDataProfilesService(environmentService, fileService, uriIdentityService, logService)));827disposables.add(fileService.registerProvider(Schemas.vscodeUserData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.vscodeUserData, userDataProfilesService, uriIdentityService, new NullLogService()))));828userDataProfileService = instantiationService.stub(IUserDataProfileService, disposables.add(new UserDataProfileService(userDataProfilesService.defaultProfile)));829workspaceService = testObject = disposables.add(new WorkspaceService(830{ configurationCache: new ConfigurationCache() },831environmentService, userDataProfileService, userDataProfilesService,832fileService, remoteAgentService, uriIdentityService, new NullLogService(),833disposables.add(new FilePolicyService(environmentService.policyFile, fileService, logService))));834instantiationService.stub(IFileService, fileService);835instantiationService.stub(IWorkspaceContextService, testObject);836instantiationService.stub(IConfigurationService, testObject);837instantiationService.stub(IEnvironmentService, environmentService);838839await workspaceService.initialize(convertToWorkspacePayload(folder));840instantiationService.stub(IKeybindingEditingService, disposables.add(instantiationService.createInstance(KeybindingsEditingService)));841instantiationService.stub(ITextFileService, disposables.add(instantiationService.createInstance(TestTextFileService)));842instantiationService.stub(ITextModelService, <ITextModelService>disposables.add(instantiationService.createInstance(TextModelResolverService)));843workspaceService.acquireInstantiationService(instantiationService);844});845846test('defaults', () => {847assert.deepStrictEqual(testObject.getValue('configurationService'),848{849'folder': {850'applicationSetting': 'isSet',851'machineSetting': 'isSet',852'applicationMachineSetting': 'isSet',853'machineOverridableSetting': 'isSet',854'testSetting': 'isSet',855'languageSetting': 'isSet',856'restrictedSetting': 'isSet',857'policySetting': 'isSet',858'policyObjectSetting': {}859}860});861});862863test('globals override defaults', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {864await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.testSetting": "userValue" }'));865await testObject.reloadConfiguration();866assert.strictEqual(testObject.getValue('configurationService.folder.testSetting'), 'userValue');867}));868869test('globals', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {870await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "testworkbench.editor.tabs": true }'));871await testObject.reloadConfiguration();872assert.strictEqual(testObject.getValue('testworkbench.editor.tabs'), true);873}));874875test('workspace settings', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {876await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "testworkbench.editor.icons": true }'));877await testObject.reloadConfiguration();878assert.strictEqual(testObject.getValue('testworkbench.editor.icons'), true);879}));880881test('workspace settings override user settings', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {882await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.testSetting": "userValue" }'));883await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.testSetting": "workspaceValue" }'));884await testObject.reloadConfiguration();885assert.strictEqual(testObject.getValue('configurationService.folder.testSetting'), 'workspaceValue');886}));887888test('machine overridable settings override user Settings', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {889await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.machineOverridableSetting": "userValue" }'));890await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.machineOverridableSetting": "workspaceValue" }'));891await testObject.reloadConfiguration();892assert.strictEqual(testObject.getValue('configurationService.folder.machineOverridableSetting'), 'workspaceValue');893}));894895test('workspace settings override user settings after defaults are registered ', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {896await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.newSetting": "userValue" }'));897await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.newSetting": "workspaceValue" }'));898await testObject.reloadConfiguration();899configurationRegistry.registerConfiguration({900'id': '_test',901'type': 'object',902'properties': {903'configurationService.folder.newSetting': {904'type': 'string',905'default': 'isSet'906}907}908});909assert.strictEqual(testObject.getValue('configurationService.folder.newSetting'), 'workspaceValue');910}));911912test('machine overridable settings override user settings after defaults are registered ', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {913await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.newMachineOverridableSetting": "userValue" }'));914await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.newMachineOverridableSetting": "workspaceValue" }'));915await testObject.reloadConfiguration();916configurationRegistry.registerConfiguration({917'id': '_test',918'type': 'object',919'properties': {920'configurationService.folder.newMachineOverridableSetting': {921'type': 'string',922'default': 'isSet',923scope: ConfigurationScope.MACHINE_OVERRIDABLE924}925}926});927assert.strictEqual(testObject.getValue('configurationService.folder.newMachineOverridableSetting'), 'workspaceValue');928}));929930test('application settings are not read from workspace', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {931await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.applicationSetting": "userValue" }'));932await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.applicationSetting": "workspaceValue" }'));933934await testObject.reloadConfiguration();935936assert.strictEqual(testObject.getValue('configurationService.folder.applicationSetting'), 'userValue');937}));938939test('application settings are not read from workspace when workspace folder uri is passed', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {940await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.applicationSetting": "userValue" }'));941await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.applicationSetting": "workspaceValue" }'));942943await testObject.reloadConfiguration();944945assert.strictEqual(testObject.getValue('configurationService.folder.applicationSetting', { resource: workspaceService.getWorkspace().folders[0].uri }), 'userValue');946}));947948test('machine settings are not read from workspace', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {949await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.machineSetting": "userValue" }'));950await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.machineSetting": "workspaceValue" }'));951952await testObject.reloadConfiguration();953954assert.strictEqual(testObject.getValue('configurationService.folder.machineSetting', { resource: workspaceService.getWorkspace().folders[0].uri }), 'userValue');955}));956957test('machine settings are not read from workspace when workspace folder uri is passed', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {958await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.machineSetting": "userValue" }'));959await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.machineSetting": "workspaceValue" }'));960961await testObject.reloadConfiguration();962963assert.strictEqual(testObject.getValue('configurationService.folder.machineSetting', { resource: workspaceService.getWorkspace().folders[0].uri }), 'userValue');964}));965966test('application machine overridable settings are not read from workspace', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {967await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.applicationMachineSetting": "userValue" }'));968await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.applicationMachineSetting": "workspaceValue" }'));969970await testObject.reloadConfiguration();971972assert.strictEqual(testObject.getValue('configurationService.folder.applicationMachineSetting'), 'userValue');973}));974975test('application machine overridable settings are not read from workspace when workspace folder uri is passed', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {976await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.applicationMachineSetting": "userValue" }'));977await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.applicationMachineSetting": "workspaceValue" }'));978979await testObject.reloadConfiguration();980981assert.strictEqual(testObject.getValue('configurationService.folder.applicationMachineSetting', { resource: workspaceService.getWorkspace().folders[0].uri }), 'userValue');982}));983984test('get application scope settings are loaded after defaults are registered', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {985await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.applicationSetting-2": "userValue" }'));986await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.applicationSetting-2": "workspaceValue" }'));987988await testObject.reloadConfiguration();989assert.strictEqual(testObject.getValue('configurationService.folder.applicationSetting-2'), 'workspaceValue');990991configurationRegistry.registerConfiguration({992'id': '_test',993'type': 'object',994'properties': {995'configurationService.folder.applicationSetting-2': {996'type': 'string',997'default': 'isSet',998scope: ConfigurationScope.APPLICATION999}1000}1001});10021003assert.strictEqual(testObject.getValue('configurationService.folder.applicationSetting-2'), 'userValue');10041005await testObject.reloadConfiguration();1006assert.strictEqual(testObject.getValue('configurationService.folder.applicationSetting-2'), 'userValue');1007}));10081009test('get application scope settings are not loaded after defaults are registered when workspace folder uri is passed', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1010await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.applicationSetting-3": "userValue" }'));1011await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.applicationSetting-3": "workspaceValue" }'));10121013await testObject.reloadConfiguration();1014assert.strictEqual(testObject.getValue('configurationService.folder.applicationSetting-3', { resource: workspaceService.getWorkspace().folders[0].uri }), 'workspaceValue');10151016configurationRegistry.registerConfiguration({1017'id': '_test',1018'type': 'object',1019'properties': {1020'configurationService.folder.applicationSetting-3': {1021'type': 'string',1022'default': 'isSet',1023scope: ConfigurationScope.APPLICATION1024}1025}1026});10271028assert.strictEqual(testObject.getValue('configurationService.folder.applicationSetting-3', { resource: workspaceService.getWorkspace().folders[0].uri }), 'userValue');10291030await testObject.reloadConfiguration();1031assert.strictEqual(testObject.getValue('configurationService.folder.applicationSetting-3', { resource: workspaceService.getWorkspace().folders[0].uri }), 'userValue');1032}));10331034test('get application machine overridable scope settings are loaded after defaults are registered', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1035await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.applicationMachineSetting-2": "userValue" }'));1036await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.applicationMachineSetting-2": "workspaceValue" }'));10371038await testObject.reloadConfiguration();1039assert.strictEqual(testObject.getValue('configurationService.folder.applicationMachineSetting-2'), 'workspaceValue');10401041configurationRegistry.registerConfiguration({1042'id': '_test',1043'type': 'object',1044'properties': {1045'configurationService.folder.applicationMachineSetting-2': {1046'type': 'string',1047'default': 'isSet',1048scope: ConfigurationScope.APPLICATION1049}1050}1051});10521053assert.strictEqual(testObject.getValue('configurationService.folder.applicationMachineSetting-2'), 'userValue');10541055await testObject.reloadConfiguration();1056assert.strictEqual(testObject.getValue('configurationService.folder.applicationMachineSetting-2'), 'userValue');1057}));10581059test('get application machine overridable scope settings are loaded after defaults are registered when workspace folder uri is passed', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1060await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.applicationMachineSetting-3": "userValue" }'));1061await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.applicationMachineSetting-3": "workspaceValue" }'));10621063await testObject.reloadConfiguration();1064assert.strictEqual(testObject.getValue('configurationService.folder.applicationMachineSetting-3', { resource: workspaceService.getWorkspace().folders[0].uri }), 'workspaceValue');10651066configurationRegistry.registerConfiguration({1067'id': '_test',1068'type': 'object',1069'properties': {1070'configurationService.folder.applicationMachineSetting-3': {1071'type': 'string',1072'default': 'isSet',1073scope: ConfigurationScope.APPLICATION1074}1075}1076});10771078assert.strictEqual(testObject.getValue('configurationService.folder.applicationMachineSetting-3', { resource: workspaceService.getWorkspace().folders[0].uri }), 'userValue');10791080await testObject.reloadConfiguration();1081assert.strictEqual(testObject.getValue('configurationService.folder.applicationMachineSetting-3', { resource: workspaceService.getWorkspace().folders[0].uri }), 'userValue');1082}));10831084test('get machine scope settings are not loaded after defaults are registered', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1085await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.machineSetting-2": "userValue" }'));1086await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.machineSetting-2": "workspaceValue" }'));10871088await testObject.reloadConfiguration();1089assert.strictEqual(testObject.getValue('configurationService.folder.machineSetting-2'), 'workspaceValue');10901091configurationRegistry.registerConfiguration({1092'id': '_test',1093'type': 'object',1094'properties': {1095'configurationService.folder.machineSetting-2': {1096'type': 'string',1097'default': 'isSet',1098scope: ConfigurationScope.MACHINE1099}1100}1101});11021103assert.strictEqual(testObject.getValue('configurationService.folder.machineSetting-2'), 'userValue');11041105await testObject.reloadConfiguration();1106assert.strictEqual(testObject.getValue('configurationService.folder.machineSetting-2'), 'userValue');1107}));11081109test('get machine scope settings are not loaded after defaults are registered when workspace folder uri is passed', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1110await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.machineSetting-3": "userValue" }'));1111await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.machineSetting-3": "workspaceValue" }'));11121113await testObject.reloadConfiguration();1114assert.strictEqual(testObject.getValue('configurationService.folder.machineSetting-3', { resource: workspaceService.getWorkspace().folders[0].uri }), 'workspaceValue');11151116configurationRegistry.registerConfiguration({1117'id': '_test',1118'type': 'object',1119'properties': {1120'configurationService.folder.machineSetting-3': {1121'type': 'string',1122'default': 'isSet',1123scope: ConfigurationScope.MACHINE1124}1125}1126});11271128assert.strictEqual(testObject.getValue('configurationService.folder.machineSetting-3', { resource: workspaceService.getWorkspace().folders[0].uri }), 'userValue');11291130await testObject.reloadConfiguration();1131assert.strictEqual(testObject.getValue('configurationService.folder.machineSetting-3', { resource: workspaceService.getWorkspace().folders[0].uri }), 'userValue');1132}));11331134test('policy value override all', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1135const result = await runWithFakedTimers({ useFakeTimers: true }, async () => {1136const promise = Event.toPromise(testObject.onDidChangeConfiguration);1137await fileService.writeFile(environmentService.policyFile!, VSBuffer.fromString('{ "configurationService.folder.policySetting": "policyValue" }'));1138return promise;1139});1140assert.deepStrictEqual([...result.affectedKeys], ['configurationService.folder.policySetting']);1141assert.strictEqual(testObject.getValue('configurationService.folder.policySetting'), 'policyValue');1142assert.strictEqual(testObject.inspect('configurationService.folder.policySetting').policyValue, 'policyValue');1143}));11441145test('policy settings when policy value is not set', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1146await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.policySetting": "userValue" }'));1147await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.policySetting": "workspaceValue" }'));1148await testObject.reloadConfiguration();1149assert.strictEqual(testObject.getValue('configurationService.folder.policySetting'), 'workspaceValue');1150assert.strictEqual(testObject.inspect('configurationService.folder.policySetting').policyValue, undefined);1151}));11521153test('policy value override all for object type setting', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1154await runWithFakedTimers({ useFakeTimers: true }, async () => {1155const promise = Event.toPromise(testObject.onDidChangeConfiguration);1156await fileService.writeFile(environmentService.policyFile!, VSBuffer.fromString('{ "configurationService.folder.policyObjectSetting": {"a": true} }'));1157return promise;1158});11591160await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.policyObjectSetting": {"b": true} }'));1161await testObject.reloadConfiguration();11621163assert.deepStrictEqual(testObject.getValue('configurationService.folder.policyObjectSetting'), { a: true });1164}));11651166test('reload configuration emits events after global configuraiton changes', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1167await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "testworkbench.editor.tabs": true }'));1168const target = sinon.spy();1169disposables.add(testObject.onDidChangeConfiguration(target));1170await testObject.reloadConfiguration();1171assert.ok(target.called);1172}));11731174test('reload configuration emits events after workspace configuraiton changes', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1175await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.testSetting": "workspaceValue" }'));1176const target = sinon.spy();1177disposables.add(testObject.onDidChangeConfiguration(target));1178await testObject.reloadConfiguration();1179assert.ok(target.called);1180}));11811182test('reload configuration should not emit event if no changes', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1183await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "testworkbench.editor.tabs": true }'));1184await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.testSetting": "workspaceValue" }'));1185await testObject.reloadConfiguration();1186const target = sinon.spy();1187disposables.add(testObject.onDidChangeConfiguration(() => { target(); }));1188await testObject.reloadConfiguration();1189assert.ok(!target.called);1190}));11911192test('inspect', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1193let actual = testObject.inspect('something.missing');1194assert.strictEqual(actual.defaultValue, undefined);1195assert.strictEqual(actual.application, undefined);1196assert.strictEqual(actual.userValue, undefined);1197assert.strictEqual(actual.workspaceValue, undefined);1198assert.strictEqual(actual.workspaceFolderValue, undefined);1199assert.strictEqual(actual.value, undefined);12001201actual = testObject.inspect('configurationService.folder.testSetting');1202assert.strictEqual(actual.defaultValue, 'isSet');1203assert.strictEqual(actual.application, undefined);1204assert.strictEqual(actual.userValue, undefined);1205assert.strictEqual(actual.workspaceValue, undefined);1206assert.strictEqual(actual.workspaceFolderValue, undefined);1207assert.strictEqual(actual.value, 'isSet');12081209await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.testSetting": "userValue" }'));1210await testObject.reloadConfiguration();1211actual = testObject.inspect('configurationService.folder.testSetting');1212assert.strictEqual(actual.defaultValue, 'isSet');1213assert.strictEqual(actual.application, undefined);1214assert.strictEqual(actual.userValue, 'userValue');1215assert.strictEqual(actual.workspaceValue, undefined);1216assert.strictEqual(actual.workspaceFolderValue, undefined);1217assert.strictEqual(actual.value, 'userValue');12181219await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.testSetting": "workspaceValue" }'));1220await testObject.reloadConfiguration();1221actual = testObject.inspect('configurationService.folder.testSetting');1222assert.strictEqual(actual.defaultValue, 'isSet');1223assert.strictEqual(actual.application, undefined);1224assert.strictEqual(actual.userValue, 'userValue');1225assert.strictEqual(actual.workspaceValue, 'workspaceValue');1226assert.strictEqual(actual.workspaceFolderValue, undefined);1227assert.strictEqual(actual.value, 'workspaceValue');12281229await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'tasks.json'), VSBuffer.fromString('{ "configurationService.tasks.testSetting": "tasksValue" }'));1230await testObject.reloadConfiguration();1231actual = testObject.inspect('tasks');1232assert.strictEqual(actual.defaultValue, undefined);1233assert.strictEqual(actual.application, undefined);1234assert.deepStrictEqual(actual.userValue, {});1235assert.deepStrictEqual(actual.workspaceValue, {1236'configurationService': {1237'tasks': {1238'testSetting': 'tasksValue'1239}1240}1241});1242assert.strictEqual(actual.workspaceFolderValue, undefined);1243assert.deepStrictEqual(actual.value, {1244'configurationService': {1245'tasks': {1246'testSetting': 'tasksValue'1247}1248}1249});1250}));12511252test('inspect restricted settings', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1253testObject.updateWorkspaceTrust(false);1254await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "userRestrictedValue" }'));1255await testObject.reloadConfiguration();1256let actual = testObject.inspect('configurationService.folder.restrictedSetting');1257assert.strictEqual(actual.defaultValue, 'isSet');1258assert.strictEqual(actual.application, undefined);1259assert.strictEqual(actual.userValue, 'userRestrictedValue');1260assert.strictEqual(actual.workspaceValue, undefined);1261assert.strictEqual(actual.workspaceFolderValue, undefined);1262assert.strictEqual(actual.value, 'userRestrictedValue');12631264testObject.updateWorkspaceTrust(true);1265await testObject.reloadConfiguration();1266actual = testObject.inspect('configurationService.folder.restrictedSetting');1267assert.strictEqual(actual.defaultValue, 'isSet');1268assert.strictEqual(actual.application, undefined);1269assert.strictEqual(actual.userValue, 'userRestrictedValue');1270assert.strictEqual(actual.workspaceValue, undefined);1271assert.strictEqual(actual.workspaceFolderValue, undefined);1272assert.strictEqual(actual.value, 'userRestrictedValue');12731274testObject.updateWorkspaceTrust(false);1275await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "workspaceRestrictedValue" }'));1276await testObject.reloadConfiguration();1277actual = testObject.inspect('configurationService.folder.restrictedSetting');1278assert.strictEqual(actual.defaultValue, 'isSet');1279assert.strictEqual(actual.application, undefined);1280assert.strictEqual(actual.userValue, 'userRestrictedValue');1281assert.strictEqual(actual.workspaceValue, 'workspaceRestrictedValue');1282assert.strictEqual(actual.workspaceFolderValue, undefined);1283assert.strictEqual(actual.value, 'userRestrictedValue');12841285await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'tasks.json'), VSBuffer.fromString('{ "configurationService.tasks.testSetting": "tasksValue" }'));1286await testObject.reloadConfiguration();1287actual = testObject.inspect('tasks');1288assert.strictEqual(actual.defaultValue, undefined);1289assert.strictEqual(actual.application, undefined);1290assert.deepStrictEqual(actual.userValue, {});1291assert.deepStrictEqual(actual.workspaceValue, {1292'configurationService': {1293'tasks': {1294'testSetting': 'tasksValue'1295}1296}1297});1298assert.strictEqual(actual.workspaceFolderValue, undefined);1299assert.deepStrictEqual(actual.value, {1300'configurationService': {1301'tasks': {1302'testSetting': 'tasksValue'1303}1304}1305});13061307testObject.updateWorkspaceTrust(true);1308await testObject.reloadConfiguration();1309actual = testObject.inspect('configurationService.folder.restrictedSetting');1310assert.strictEqual(actual.defaultValue, 'isSet');1311assert.strictEqual(actual.application, undefined);1312assert.strictEqual(actual.userValue, 'userRestrictedValue');1313assert.strictEqual(actual.workspaceValue, 'workspaceRestrictedValue');1314assert.strictEqual(actual.workspaceFolderValue, undefined);1315assert.strictEqual(actual.value, 'workspaceRestrictedValue');13161317await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'tasks.json'), VSBuffer.fromString('{ "configurationService.tasks.testSetting": "tasksValue" }'));1318await testObject.reloadConfiguration();1319actual = testObject.inspect('tasks');1320assert.strictEqual(actual.defaultValue, undefined);1321assert.strictEqual(actual.application, undefined);1322assert.deepStrictEqual(actual.userValue, {});1323assert.deepStrictEqual(actual.workspaceValue, {1324'configurationService': {1325'tasks': {1326'testSetting': 'tasksValue'1327}1328}1329});1330assert.strictEqual(actual.workspaceFolderValue, undefined);1331assert.deepStrictEqual(actual.value, {1332'configurationService': {1333'tasks': {1334'testSetting': 'tasksValue'1335}1336}1337});1338}));13391340test('inspect restricted settings after change', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1341testObject.updateWorkspaceTrust(false);1342await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "userRestrictedValue" }'));1343await testObject.reloadConfiguration();13441345const promise = Event.toPromise(testObject.onDidChangeConfiguration);1346await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "workspaceRestrictedValue" }'));1347const event = await promise;13481349const actual = testObject.inspect('configurationService.folder.restrictedSetting');1350assert.strictEqual(actual.defaultValue, 'isSet');1351assert.strictEqual(actual.application, undefined);1352assert.strictEqual(actual.userValue, 'userRestrictedValue');1353assert.strictEqual(actual.workspaceValue, 'workspaceRestrictedValue');1354assert.strictEqual(actual.workspaceFolderValue, undefined);1355assert.strictEqual(actual.value, 'userRestrictedValue');1356assert.strictEqual(event.affectsConfiguration('configurationService.folder.restrictedSetting'), true);1357}));13581359test('keys', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1360let actual = testObject.keys();1361assert.ok(actual.default.indexOf('configurationService.folder.testSetting') !== -1);1362assert.deepStrictEqual(actual.user, []);1363assert.deepStrictEqual(actual.workspace, []);1364assert.deepStrictEqual(actual.workspaceFolder, []);13651366await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.testSetting": "userValue" }'));1367await testObject.reloadConfiguration();1368actual = testObject.keys();1369assert.ok(actual.default.indexOf('configurationService.folder.testSetting') !== -1);1370assert.deepStrictEqual(actual.user, ['configurationService.folder.testSetting']);1371assert.deepStrictEqual(actual.workspace, []);1372assert.deepStrictEqual(actual.workspaceFolder, []);13731374await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.testSetting": "workspaceValue" }'));1375await testObject.reloadConfiguration();1376actual = testObject.keys();1377assert.ok(actual.default.indexOf('configurationService.folder.testSetting') !== -1);1378assert.deepStrictEqual(actual.user, ['configurationService.folder.testSetting']);1379assert.deepStrictEqual(actual.workspace, ['configurationService.folder.testSetting']);1380assert.deepStrictEqual(actual.workspaceFolder, []);1381}));13821383test('update user configuration', () => {1384return testObject.updateValue('configurationService.folder.testSetting', 'value', ConfigurationTarget.USER)1385.then(() => assert.strictEqual(testObject.getValue('configurationService.folder.testSetting'), 'value'));1386});13871388test('update workspace configuration', () => {1389return testObject.updateValue('tasks.service.testSetting', 'value', ConfigurationTarget.WORKSPACE)1390.then(() => assert.strictEqual(testObject.getValue(TasksSchemaProperties.ServiceTestSetting), 'value'));1391});13921393test('update resource configuration', () => {1394return testObject.updateValue('configurationService.folder.testSetting', 'value', { resource: workspaceService.getWorkspace().folders[0].uri }, ConfigurationTarget.WORKSPACE_FOLDER)1395.then(() => assert.strictEqual(testObject.getValue('configurationService.folder.testSetting'), 'value'));1396});13971398test('update language configuration using configuration overrides', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1399await testObject.updateValue('configurationService.folder.languageSetting', 'abcLangValue', { overrideIdentifier: 'abclang' });1400assert.strictEqual(testObject.getValue('configurationService.folder.languageSetting', { overrideIdentifier: 'abclang' }), 'abcLangValue');1401}));14021403test('update language configuration using configuration update overrides', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1404await testObject.updateValue('configurationService.folder.languageSetting', 'abcLangValue', { overrideIdentifiers: ['abclang'] });1405assert.strictEqual(testObject.getValue('configurationService.folder.languageSetting', { overrideIdentifier: 'abclang' }), 'abcLangValue');1406}));14071408test('update language configuration for multiple languages', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1409await testObject.updateValue('configurationService.folder.languageSetting', 'multiLangValue', { overrideIdentifiers: ['xyzlang', 'deflang'] }, ConfigurationTarget.USER);1410assert.strictEqual(testObject.getValue('configurationService.folder.languageSetting', { overrideIdentifier: 'deflang' }), 'multiLangValue');1411assert.strictEqual(testObject.getValue('configurationService.folder.languageSetting', { overrideIdentifier: 'xyzlang' }), 'multiLangValue');1412assert.deepStrictEqual(testObject.getValue(keyFromOverrideIdentifiers(['deflang', 'xyzlang'])), { 'configurationService.folder.languageSetting': 'multiLangValue' });1413}));14141415test('update language configuration for multiple languages when already set', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1416await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "[deflang][xyzlang]": { "configurationService.folder.languageSetting": "userValue" }}'));1417await testObject.updateValue('configurationService.folder.languageSetting', 'multiLangValue', { overrideIdentifiers: ['xyzlang', 'deflang'] }, ConfigurationTarget.USER);1418assert.strictEqual(testObject.getValue('configurationService.folder.languageSetting', { overrideIdentifier: 'deflang' }), 'multiLangValue');1419assert.strictEqual(testObject.getValue('configurationService.folder.languageSetting', { overrideIdentifier: 'xyzlang' }), 'multiLangValue');1420assert.deepStrictEqual(testObject.getValue(keyFromOverrideIdentifiers(['deflang', 'xyzlang'])), { 'configurationService.folder.languageSetting': 'multiLangValue' });1421const actualContent = (await fileService.readFile(userDataProfileService.currentProfile.settingsResource)).value.toString();1422assert.deepStrictEqual(JSON.parse(actualContent), { '[deflang][xyzlang]': { 'configurationService.folder.languageSetting': 'multiLangValue' } });1423}));14241425test('update resource language configuration', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1426await testObject.updateValue('configurationService.folder.languageSetting', 'value', { resource: workspaceService.getWorkspace().folders[0].uri }, ConfigurationTarget.WORKSPACE_FOLDER);1427assert.strictEqual(testObject.getValue('configurationService.folder.languageSetting'), 'value');1428}));14291430test('update resource language configuration for a language using configuration overrides', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1431assert.strictEqual(testObject.getValue('configurationService.folder.languageSetting', { resource: workspaceService.getWorkspace().folders[0].uri, overrideIdentifier: 'jsonc' }), 'languageValue');1432await testObject.updateValue('configurationService.folder.languageSetting', 'languageValueUpdated', { resource: workspaceService.getWorkspace().folders[0].uri, overrideIdentifier: 'jsonc' }, ConfigurationTarget.WORKSPACE_FOLDER);1433assert.strictEqual(testObject.getValue('configurationService.folder.languageSetting', { resource: workspaceService.getWorkspace().folders[0].uri, overrideIdentifier: 'jsonc' }), 'languageValueUpdated');1434}));14351436test('update resource language configuration for a language using configuration update overrides', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1437assert.strictEqual(testObject.getValue('configurationService.folder.languageSetting', { resource: workspaceService.getWorkspace().folders[0].uri, overrideIdentifier: 'jsonc' }), 'languageValue');1438await testObject.updateValue('configurationService.folder.languageSetting', 'languageValueUpdated', { resource: workspaceService.getWorkspace().folders[0].uri, overrideIdentifiers: ['jsonc'] }, ConfigurationTarget.WORKSPACE_FOLDER);1439assert.strictEqual(testObject.getValue('configurationService.folder.languageSetting', { resource: workspaceService.getWorkspace().folders[0].uri, overrideIdentifier: 'jsonc' }), 'languageValueUpdated');1440}));14411442test('update application setting into workspace configuration in a workspace is not supported', () => {1443return testObject.updateValue('configurationService.folder.applicationSetting', 'workspaceValue', {}, ConfigurationTarget.WORKSPACE, { donotNotifyError: true })1444.then(() => assert.fail('Should not be supported'), (e) => assert.strictEqual(e.code, ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_APPLICATION));1445});14461447test('update application machine overridable setting into workspace configuration in a workspace is not supported', () => {1448return testObject.updateValue('configurationService.folder.applicationMachineSetting', 'workspaceValue', {}, ConfigurationTarget.WORKSPACE, { donotNotifyError: true })1449.then(() => assert.fail('Should not be supported'), (e) => assert.strictEqual(e.code, ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_APPLICATION));1450});14511452test('update machine setting into workspace configuration in a workspace is not supported', () => {1453return testObject.updateValue('configurationService.folder.machineSetting', 'workspaceValue', {}, ConfigurationTarget.WORKSPACE, { donotNotifyError: true })1454.then(() => assert.fail('Should not be supported'), (e) => assert.strictEqual(e.code, ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_MACHINE));1455});14561457test('update tasks configuration', () => {1458return testObject.updateValue('tasks', { 'version': '1.0.0', tasks: [{ 'taskName': 'myTask' }] }, ConfigurationTarget.WORKSPACE)1459.then(() => assert.deepStrictEqual(testObject.getValue(TasksSchemaProperties.Tasks), { 'version': '1.0.0', tasks: [{ 'taskName': 'myTask' }] }));1460});14611462test('update user configuration should trigger change event before promise is resolve', () => {1463const target = sinon.spy();1464disposables.add(testObject.onDidChangeConfiguration(target));1465return testObject.updateValue('configurationService.folder.testSetting', 'value', ConfigurationTarget.USER)1466.then(() => assert.ok(target.called));1467});14681469test('update workspace configuration should trigger change event before promise is resolve', () => {1470const target = sinon.spy();1471disposables.add(testObject.onDidChangeConfiguration(target));1472return testObject.updateValue('configurationService.folder.testSetting', 'value', ConfigurationTarget.WORKSPACE)1473.then(() => assert.ok(target.called));1474});14751476test('update memory configuration', () => {1477return testObject.updateValue('configurationService.folder.testSetting', 'memoryValue', ConfigurationTarget.MEMORY)1478.then(() => assert.strictEqual(testObject.getValue('configurationService.folder.testSetting'), 'memoryValue'));1479});14801481test('update memory configuration should trigger change event before promise is resolve', () => {1482const target = sinon.spy();1483disposables.add(testObject.onDidChangeConfiguration(target));1484return testObject.updateValue('configurationService.folder.testSetting', 'memoryValue', ConfigurationTarget.MEMORY)1485.then(() => assert.ok(target.called));1486});14871488test('remove setting from all targets', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1489const key = 'configurationService.folder.testSetting';1490await testObject.updateValue(key, 'workspaceValue', ConfigurationTarget.WORKSPACE);1491await testObject.updateValue(key, 'userValue', ConfigurationTarget.USER);14921493await testObject.updateValue(key, undefined);1494await testObject.reloadConfiguration();14951496const actual = testObject.inspect(key, { resource: workspaceService.getWorkspace().folders[0].uri });1497assert.strictEqual(actual.userValue, undefined);1498assert.strictEqual(actual.workspaceValue, undefined);1499assert.strictEqual(actual.workspaceFolderValue, undefined);1500}));15011502test('update user configuration to default value when target is not passed', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1503await testObject.updateValue('configurationService.folder.testSetting', 'value', ConfigurationTarget.USER);1504await testObject.updateValue('configurationService.folder.testSetting', 'isSet');1505assert.strictEqual(testObject.inspect('configurationService.folder.testSetting').userValue, undefined);1506}));15071508test('update user configuration to default value when target is passed', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1509await testObject.updateValue('configurationService.folder.testSetting', 'value', ConfigurationTarget.USER);1510await testObject.updateValue('configurationService.folder.testSetting', 'isSet', ConfigurationTarget.USER);1511assert.strictEqual(testObject.inspect('configurationService.folder.testSetting').userValue, 'isSet');1512}));15131514test('update task configuration should trigger change event before promise is resolve', () => {1515const target = sinon.spy();1516disposables.add(testObject.onDidChangeConfiguration(target));1517return testObject.updateValue('tasks', { 'version': '1.0.0', tasks: [{ 'taskName': 'myTask' }] }, ConfigurationTarget.WORKSPACE)1518.then(() => assert.ok(target.called));1519});15201521test('no change event when there are no global tasks', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1522const target = sinon.spy();1523disposables.add(testObject.onDidChangeConfiguration(target));1524await timeout(5);1525assert.ok(target.notCalled);1526}));15271528test('change event when there are global tasks', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1529await fileService.writeFile(joinPath(environmentService.userRoamingDataHome, 'tasks.json'), VSBuffer.fromString('{ "version": "1.0.0", "tasks": [{ "taskName": "myTask" }'));1530const promise = Event.toPromise(testObject.onDidChangeConfiguration);1531await testObject.reloadLocalUserConfiguration();1532await promise;1533}));15341535test('creating workspace settings', () => runWithFakedTimers({ useFakeTimers: true }, async () => {1536await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.testSetting": "userValue" }'));1537await testObject.reloadConfiguration();1538await new Promise<void>((c, e) => {1539const disposable = testObject.onDidChangeConfiguration(e => {1540assert.ok(e.affectsConfiguration('configurationService.folder.testSetting'));1541assert.strictEqual(testObject.getValue('configurationService.folder.testSetting'), 'workspaceValue');1542disposable.dispose();1543c();1544});1545fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.testSetting": "workspaceValue" }')).catch(e);1546});1547}));15481549test('deleting workspace settings', () => runWithFakedTimers({ useFakeTimers: true }, async () => {1550await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.testSetting": "userValue" }'));1551const workspaceSettingsResource = joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json');1552await fileService.writeFile(workspaceSettingsResource, VSBuffer.fromString('{ "configurationService.folder.testSetting": "workspaceValue" }'));1553await testObject.reloadConfiguration();1554const e = await new Promise<IConfigurationChangeEvent>((c, e) => {1555Event.once(testObject.onDidChangeConfiguration)(c);1556fileService.del(workspaceSettingsResource).catch(e);1557});1558assert.ok(e.affectsConfiguration('configurationService.folder.testSetting'));1559assert.strictEqual(testObject.getValue('configurationService.folder.testSetting'), 'userValue');1560}));15611562test('restricted setting is read from workspace when workspace is trusted', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1563testObject.updateWorkspaceTrust(true);15641565await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "userValue" }'));1566await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "workspaceValue" }'));1567await testObject.reloadConfiguration();15681569assert.strictEqual(testObject.getValue('configurationService.folder.restrictedSetting', { resource: workspaceService.getWorkspace().folders[0].uri }), 'workspaceValue');1570assert.ok(testObject.restrictedSettings.default.includes('configurationService.folder.restrictedSetting'));1571assert.strictEqual(testObject.restrictedSettings.userLocal, undefined);1572assert.strictEqual(testObject.restrictedSettings.userRemote, undefined);1573assert.deepStrictEqual(testObject.restrictedSettings.workspace, ['configurationService.folder.restrictedSetting']);1574assert.strictEqual(testObject.restrictedSettings.workspaceFolder?.size, 1);1575assert.deepStrictEqual(testObject.restrictedSettings.workspaceFolder?.get(workspaceService.getWorkspace().folders[0].uri), ['configurationService.folder.restrictedSetting']);1576}));15771578test('restricted setting is not read from workspace when workspace is changed to trusted', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1579testObject.updateWorkspaceTrust(true);15801581await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "userValue" }'));1582await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "workspaceValue" }'));1583await testObject.reloadConfiguration();15841585testObject.updateWorkspaceTrust(false);15861587assert.strictEqual(testObject.getValue('configurationService.folder.restrictedSetting', { resource: workspaceService.getWorkspace().folders[0].uri }), 'userValue');1588assert.ok(testObject.restrictedSettings.default.includes('configurationService.folder.restrictedSetting'));1589assert.strictEqual(testObject.restrictedSettings.userLocal, undefined);1590assert.strictEqual(testObject.restrictedSettings.userRemote, undefined);1591assert.deepStrictEqual(testObject.restrictedSettings.workspace, ['configurationService.folder.restrictedSetting']);1592assert.strictEqual(testObject.restrictedSettings.workspaceFolder?.size, 1);1593assert.deepStrictEqual(testObject.restrictedSettings.workspaceFolder?.get(workspaceService.getWorkspace().folders[0].uri), ['configurationService.folder.restrictedSetting']);1594}));15951596test('change event is triggered when workspace is changed to untrusted', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1597testObject.updateWorkspaceTrust(true);15981599await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "userValue" }'));1600await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "workspaceValue" }'));1601await testObject.reloadConfiguration();16021603const promise = Event.toPromise(testObject.onDidChangeConfiguration);1604testObject.updateWorkspaceTrust(false);16051606const event = await promise;1607assert.ok(event.affectedKeys.has('configurationService.folder.restrictedSetting'));1608assert.ok(event.affectsConfiguration('configurationService.folder.restrictedSetting'));1609}));16101611test('restricted setting is not read from workspace when workspace is not trusted', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1612testObject.updateWorkspaceTrust(false);16131614await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "userValue" }'));1615await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "workspaceValue" }'));1616await testObject.reloadConfiguration();16171618assert.strictEqual(testObject.getValue('configurationService.folder.restrictedSetting', { resource: workspaceService.getWorkspace().folders[0].uri }), 'userValue');1619assert.ok(testObject.restrictedSettings.default.includes('configurationService.folder.restrictedSetting'));1620assert.strictEqual(testObject.restrictedSettings.userLocal, undefined);1621assert.strictEqual(testObject.restrictedSettings.userRemote, undefined);1622assert.deepStrictEqual(testObject.restrictedSettings.workspace, ['configurationService.folder.restrictedSetting']);1623assert.strictEqual(testObject.restrictedSettings.workspaceFolder?.size, 1);1624assert.deepStrictEqual(testObject.restrictedSettings.workspaceFolder?.get(workspaceService.getWorkspace().folders[0].uri), ['configurationService.folder.restrictedSetting']);1625}));16261627test('restricted setting is read when workspace is changed to trusted', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1628testObject.updateWorkspaceTrust(false);16291630await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "userValue" }'));1631await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "workspaceValue" }'));1632await testObject.reloadConfiguration();16331634testObject.updateWorkspaceTrust(true);16351636assert.strictEqual(testObject.getValue('configurationService.folder.restrictedSetting', { resource: workspaceService.getWorkspace().folders[0].uri }), 'workspaceValue');1637assert.ok(testObject.restrictedSettings.default.includes('configurationService.folder.restrictedSetting'));1638assert.strictEqual(testObject.restrictedSettings.userLocal, undefined);1639assert.strictEqual(testObject.restrictedSettings.userRemote, undefined);1640assert.deepStrictEqual(testObject.restrictedSettings.workspace, ['configurationService.folder.restrictedSetting']);1641assert.strictEqual(testObject.restrictedSettings.workspaceFolder?.size, 1);1642assert.deepStrictEqual(testObject.restrictedSettings.workspaceFolder?.get(workspaceService.getWorkspace().folders[0].uri), ['configurationService.folder.restrictedSetting']);1643}));16441645test('change event is triggered when workspace is changed to trusted', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1646testObject.updateWorkspaceTrust(false);16471648await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "userValue" }'));1649await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "workspaceValue" }'));1650await testObject.reloadConfiguration();16511652const promise = Event.toPromise(testObject.onDidChangeConfiguration);1653testObject.updateWorkspaceTrust(true);16541655const event = await promise;1656assert.ok(event.affectedKeys.has('configurationService.folder.restrictedSetting'));1657assert.ok(event.affectsConfiguration('configurationService.folder.restrictedSetting'));1658}));16591660test('adding an restricted setting triggers change event', () => runWithFakedTimers({ useFakeTimers: true }, async () => {1661await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "userValue" }'));1662testObject.updateWorkspaceTrust(false);16631664const promise = Event.toPromise(testObject.onDidChangeRestrictedSettings);1665await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.restrictedSetting": "workspaceValue" }'));16661667return promise;1668}));16691670test('remove an unregistered setting', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1671const key = 'configurationService.folder.unknownSetting';1672await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.unknownSetting": "userValue" }'));1673await fileService.writeFile(joinPath(workspaceService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.folder.unknownSetting": "workspaceValue" }'));16741675await testObject.reloadConfiguration();1676await testObject.updateValue(key, undefined);16771678const actual = testObject.inspect(key, { resource: workspaceService.getWorkspace().folders[0].uri });1679assert.strictEqual(actual.userValue, undefined);1680assert.strictEqual(actual.workspaceValue, undefined);1681assert.strictEqual(actual.workspaceFolderValue, undefined);1682}));1683});16841685suite('WorkspaceConfigurationService - Profiles', () => {16861687let testObject: WorkspaceService, workspaceService: WorkspaceService, fileService: IFileService, environmentService: IBrowserWorkbenchEnvironmentService, userDataProfileService: IUserDataProfileService, instantiationService: TestInstantiationService;1688const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);1689const disposables = ensureNoDisposablesAreLeakedInTestSuite();16901691suiteSetup(() => {1692configurationRegistry.registerConfiguration({1693'id': '_test',1694'type': 'object',1695'properties': {1696[APPLY_ALL_PROFILES_SETTING]: {1697'type': 'array',1698'default': [],1699'scope': ConfigurationScope.APPLICATION,1700},1701'configurationService.profiles.applicationSetting': {1702'type': 'string',1703'default': 'isSet',1704scope: ConfigurationScope.APPLICATION1705},1706'configurationService.profiles.applicationMachineSetting': {1707'type': 'string',1708'default': 'isSet',1709scope: ConfigurationScope.APPLICATION_MACHINE1710},1711'configurationService.profiles.testSetting': {1712'type': 'string',1713'default': 'isSet',1714},1715'configurationService.profiles.applicationSetting2': {1716'type': 'string',1717'default': 'isSet',1718scope: ConfigurationScope.APPLICATION1719},1720'configurationService.profiles.testSetting2': {1721'type': 'string',1722'default': 'isSet',1723},1724}1725});1726});17271728setup(async () => {1729const logService = new NullLogService();1730fileService = disposables.add(new FileService(logService));1731const fileSystemProvider = disposables.add(new InMemoryFileSystemProvider());1732disposables.add(fileService.registerProvider(ROOT.scheme, fileSystemProvider));17331734const folder = joinPath(ROOT, 'a');1735await fileService.createFolder(folder);17361737instantiationService = workbenchInstantiationService(undefined, disposables);1738environmentService = TestEnvironmentService;1739environmentService.policyFile = joinPath(folder, 'policies.json');1740const remoteAgentService = disposables.add(instantiationService.createInstance(RemoteAgentService));1741instantiationService.stub(IRemoteAgentService, remoteAgentService);1742const uriIdentityService = disposables.add(new UriIdentityService(fileService));1743const userDataProfilesService = instantiationService.stub(IUserDataProfilesService, disposables.add(new UserDataProfilesService(environmentService, fileService, uriIdentityService, logService)));1744disposables.add(fileService.registerProvider(Schemas.vscodeUserData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.vscodeUserData, userDataProfilesService, uriIdentityService, new NullLogService()))));1745userDataProfileService = instantiationService.stub(IUserDataProfileService, disposables.add(new UserDataProfileService(toUserDataProfile('custom', 'custom', joinPath(environmentService.userRoamingDataHome, 'profiles', 'temp'), joinPath(environmentService.cacheHome, 'profilesCache')))));1746workspaceService = testObject = disposables.add(new WorkspaceService(1747{ configurationCache: new ConfigurationCache() },1748environmentService, userDataProfileService, userDataProfilesService,1749fileService, remoteAgentService, uriIdentityService, new NullLogService(),1750disposables.add(new FilePolicyService(environmentService.policyFile, fileService, logService))));1751instantiationService.stub(IFileService, fileService);1752instantiationService.stub(IWorkspaceContextService, testObject);1753instantiationService.stub(IConfigurationService, testObject);1754instantiationService.stub(IEnvironmentService, environmentService);17551756await fileService.writeFile(userDataProfilesService.defaultProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.applicationSetting2": "applicationValue", "configurationService.profiles.testSetting2": "userValue" }'));1757await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.applicationSetting2": "profileValue", "configurationService.profiles.testSetting2": "profileValue" }'));1758await workspaceService.initialize(convertToWorkspacePayload(folder));1759instantiationService.stub(IKeybindingEditingService, disposables.add(instantiationService.createInstance(KeybindingsEditingService)));1760instantiationService.stub(ITextFileService, disposables.add(instantiationService.createInstance(TestTextFileService)));1761instantiationService.stub(ITextModelService, disposables.add(instantiationService.createInstance(TextModelResolverService)));1762workspaceService.acquireInstantiationService(instantiationService);1763});17641765test('initialize', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1766assert.strictEqual(testObject.getValue('configurationService.profiles.applicationSetting2'), 'applicationValue');1767assert.strictEqual(testObject.getValue('configurationService.profiles.testSetting2'), 'profileValue');1768}));17691770test('inspect', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1771let actual = testObject.inspect('something.missing');1772assert.strictEqual(actual.defaultValue, undefined);1773assert.strictEqual(actual.application, undefined);1774assert.strictEqual(actual.userValue, undefined);1775assert.strictEqual(actual.workspaceValue, undefined);1776assert.strictEqual(actual.workspaceFolderValue, undefined);1777assert.strictEqual(actual.value, undefined);17781779actual = testObject.inspect('configurationService.profiles.applicationSetting');1780assert.strictEqual(actual.defaultValue, 'isSet');1781assert.strictEqual(actual.application, undefined);1782assert.strictEqual(actual.userValue, undefined);1783assert.strictEqual(actual.workspaceValue, undefined);1784assert.strictEqual(actual.workspaceFolderValue, undefined);1785assert.strictEqual(actual.value, 'isSet');17861787await fileService.writeFile(instantiationService.get(IUserDataProfilesService).defaultProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.applicationSetting": "applicationValue" }'));1788await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.applicationSetting": "profileValue" }'));1789await testObject.reloadConfiguration();1790actual = testObject.inspect('configurationService.profiles.applicationSetting');1791assert.strictEqual(actual.defaultValue, 'isSet');1792assert.strictEqual(actual.applicationValue, 'applicationValue');1793assert.strictEqual(actual.userValue, 'profileValue');1794assert.strictEqual(actual.workspaceValue, undefined);1795assert.strictEqual(actual.workspaceFolderValue, undefined);1796assert.strictEqual(actual.value, 'applicationValue');17971798await fileService.writeFile(instantiationService.get(IUserDataProfilesService).defaultProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.testSetting": "applicationValue" }'));1799await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.testSetting": "profileValue" }'));1800await testObject.reloadConfiguration();1801actual = testObject.inspect('configurationService.profiles.testSetting');1802assert.strictEqual(actual.defaultValue, 'isSet');1803assert.strictEqual(actual.applicationValue, undefined);1804assert.strictEqual(actual.userValue, 'profileValue');1805assert.strictEqual(actual.workspaceValue, undefined);1806assert.strictEqual(actual.workspaceFolderValue, undefined);1807assert.strictEqual(actual.value, 'profileValue');1808}));18091810test('update application scope setting', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1811await testObject.updateValue('configurationService.profiles.applicationSetting', 'applicationValue');18121813assert.deepStrictEqual(JSON.parse((await fileService.readFile(instantiationService.get(IUserDataProfilesService).defaultProfile.settingsResource)).value.toString()), { 'configurationService.profiles.applicationSetting': 'applicationValue', 'configurationService.profiles.applicationSetting2': 'applicationValue', 'configurationService.profiles.testSetting2': 'userValue' });1814assert.strictEqual(testObject.getValue('configurationService.profiles.applicationSetting'), 'applicationValue');1815}));18161817test('update application machine setting', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1818await testObject.updateValue('configurationService.profiles.applicationMachineSetting', 'applicationValue');18191820assert.deepStrictEqual(JSON.parse((await fileService.readFile(instantiationService.get(IUserDataProfilesService).defaultProfile.settingsResource)).value.toString()), { 'configurationService.profiles.applicationMachineSetting': 'applicationValue', 'configurationService.profiles.applicationSetting2': 'applicationValue', 'configurationService.profiles.testSetting2': 'userValue' });1821assert.strictEqual(testObject.getValue('configurationService.profiles.applicationMachineSetting'), 'applicationValue');1822}));18231824test('update normal setting', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1825await testObject.updateValue('configurationService.profiles.testSetting', 'profileValue');18261827assert.deepStrictEqual(JSON.parse((await fileService.readFile(userDataProfileService.currentProfile.settingsResource)).value.toString()), { 'configurationService.profiles.testSetting': 'profileValue', 'configurationService.profiles.testSetting2': 'profileValue', 'configurationService.profiles.applicationSetting2': 'profileValue' });1828assert.strictEqual(testObject.getValue('configurationService.profiles.testSetting'), 'profileValue');1829}));18301831test('registering normal setting after init', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1832await fileService.writeFile(instantiationService.get(IUserDataProfilesService).defaultProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.testSetting3": "defaultProfile" }'));1833await testObject.reloadConfiguration();18341835configurationRegistry.registerConfiguration({1836'id': '_test',1837'type': 'object',1838'properties': {1839'configurationService.profiles.testSetting3': {1840'type': 'string',1841'default': 'isSet',1842}1843}1844});18451846assert.strictEqual(testObject.getValue('configurationService.profiles.testSetting3'), 'isSet');1847}));18481849test('registering application scope setting after init', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1850await fileService.writeFile(instantiationService.get(IUserDataProfilesService).defaultProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.applicationSetting3": "defaultProfile" }'));1851await testObject.reloadConfiguration();18521853configurationRegistry.registerConfiguration({1854'id': '_test',1855'type': 'object',1856'properties': {1857'configurationService.profiles.applicationSetting3': {1858'type': 'string',1859'default': 'isSet',1860scope: ConfigurationScope.APPLICATION1861}1862}1863});18641865assert.strictEqual(testObject.getValue('configurationService.profiles.applicationSetting3'), 'defaultProfile');1866}));18671868test('non registering setting should not be read from default profile', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1869await fileService.writeFile(instantiationService.get(IUserDataProfilesService).defaultProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.nonregistered": "defaultProfile" }'));1870await testObject.reloadConfiguration();1871assert.strictEqual(testObject.getValue('configurationService.profiles.nonregistered'), undefined);1872}));18731874test('initialize with custom all profiles settings', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1875await testObject.updateValue(APPLY_ALL_PROFILES_SETTING, ['configurationService.profiles.testSetting2'], ConfigurationTarget.USER_LOCAL);18761877await testObject.initialize(convertToWorkspacePayload(joinPath(ROOT, 'a')));18781879assert.strictEqual(testObject.getValue('configurationService.profiles.applicationSetting2'), 'applicationValue');1880assert.strictEqual(testObject.getValue('configurationService.profiles.testSetting2'), 'userValue');1881}));18821883test('update all profiles settings', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1884const promise = Event.toPromise(testObject.onDidChangeConfiguration);1885await testObject.updateValue(APPLY_ALL_PROFILES_SETTING, ['configurationService.profiles.testSetting2'], ConfigurationTarget.USER_LOCAL);18861887const changeEvent = await promise;1888assert.deepStrictEqual([...changeEvent.affectedKeys], [APPLY_ALL_PROFILES_SETTING, 'configurationService.profiles.testSetting2']);1889assert.strictEqual(testObject.getValue('configurationService.profiles.testSetting2'), 'userValue');1890}));18911892test('setting applied to all profiles is registered later', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1893await fileService.writeFile(instantiationService.get(IUserDataProfilesService).defaultProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.testSetting4": "userValue" }'));1894await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.testSetting4": "profileValue" }'));1895await testObject.updateValue(APPLY_ALL_PROFILES_SETTING, ['configurationService.profiles.testSetting4'], ConfigurationTarget.USER_LOCAL);1896assert.strictEqual(testObject.getValue('configurationService.profiles.testSetting4'), 'userValue');18971898configurationRegistry.registerConfiguration({1899'id': '_test',1900'type': 'object',1901'properties': {1902'configurationService.profiles.testSetting4': {1903'type': 'string',1904'default': 'isSet',1905}1906}1907});19081909await testObject.reloadConfiguration();1910assert.strictEqual(testObject.getValue('configurationService.profiles.testSetting4'), 'userValue');1911}));19121913test('update setting that is applied to all profiles', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1914await testObject.updateValue(APPLY_ALL_PROFILES_SETTING, ['configurationService.profiles.testSetting2'], ConfigurationTarget.USER_LOCAL);1915const promise = Event.toPromise(testObject.onDidChangeConfiguration);1916await testObject.updateValue('configurationService.profiles.testSetting2', 'updatedValue', ConfigurationTarget.USER_LOCAL);19171918const changeEvent = await promise;1919assert.deepStrictEqual([...changeEvent.affectedKeys], ['configurationService.profiles.testSetting2']);1920assert.strictEqual(testObject.getValue('configurationService.profiles.testSetting2'), 'updatedValue');1921}));19221923test('test isSettingAppliedToAllProfiles', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1924assert.strictEqual(testObject.isSettingAppliedForAllProfiles('configurationService.profiles.applicationSetting2'), true);1925assert.strictEqual(testObject.isSettingAppliedForAllProfiles('configurationService.profiles.testSetting2'), false);19261927await testObject.updateValue(APPLY_ALL_PROFILES_SETTING, ['configurationService.profiles.testSetting2'], ConfigurationTarget.USER_LOCAL);1928assert.strictEqual(testObject.isSettingAppliedForAllProfiles('configurationService.profiles.testSetting2'), true);1929}));19301931test('switch to default profile', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1932await fileService.writeFile(instantiationService.get(IUserDataProfilesService).defaultProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.applicationSetting": "applicationValue", "configurationService.profiles.testSetting": "userValue" }'));1933await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.applicationSetting": "profileValue", "configurationService.profiles.testSetting": "profileValue" }'));1934await testObject.reloadConfiguration();19351936const promise = Event.toPromise(testObject.onDidChangeConfiguration);1937await userDataProfileService.updateCurrentProfile(instantiationService.get(IUserDataProfilesService).defaultProfile);19381939const changeEvent = await promise;1940assert.deepStrictEqual([...changeEvent.affectedKeys], ['configurationService.profiles.testSetting']);1941assert.strictEqual(testObject.getValue('configurationService.profiles.applicationSetting'), 'applicationValue');1942assert.strictEqual(testObject.getValue('configurationService.profiles.testSetting'), 'userValue');1943}));19441945test('switch to non default profile', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1946await fileService.writeFile(instantiationService.get(IUserDataProfilesService).defaultProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.applicationSetting": "applicationValue", "configurationService.profiles.testSetting": "userValue" }'));1947await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.applicationSetting": "profileValue", "configurationService.profiles.testSetting": "profileValue" }'));1948await testObject.reloadConfiguration();19491950const profile = toUserDataProfile('custom2', 'custom2', joinPath(environmentService.userRoamingDataHome, 'profiles', 'custom2'), joinPath(environmentService.cacheHome, 'profilesCache'));1951await fileService.writeFile(profile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.applicationSetting": "profileValue2", "configurationService.profiles.testSetting": "profileValue2" }'));1952const promise = Event.toPromise(testObject.onDidChangeConfiguration);1953await userDataProfileService.updateCurrentProfile(profile);19541955const changeEvent = await promise;1956assert.deepStrictEqual([...changeEvent.affectedKeys], ['configurationService.profiles.testSetting']);1957assert.strictEqual(testObject.getValue('configurationService.profiles.applicationSetting'), 'applicationValue');1958assert.strictEqual(testObject.getValue('configurationService.profiles.testSetting'), 'profileValue2');1959}));19601961test('switch to non default profile using settings from default profile', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1962await fileService.writeFile(instantiationService.get(IUserDataProfilesService).defaultProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.applicationSetting": "applicationValue", "configurationService.profiles.testSetting": "userValue" }'));1963await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.applicationSetting": "profileValue", "configurationService.profiles.testSetting": "profileValue" }'));1964await testObject.reloadConfiguration();19651966const profile = toUserDataProfile('custom3', 'custom3', joinPath(environmentService.userRoamingDataHome, 'profiles', 'custom2'), joinPath(environmentService.cacheHome, 'profilesCache'), { useDefaultFlags: { settings: true } }, instantiationService.get(IUserDataProfilesService).defaultProfile);1967await fileService.writeFile(profile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.applicationSetting": "applicationValue2", "configurationService.profiles.testSetting": "profileValue2" }'));1968const promise = Event.toPromise(testObject.onDidChangeConfiguration);1969await userDataProfileService.updateCurrentProfile(profile);19701971const changeEvent = await promise;1972assert.deepStrictEqual([...changeEvent.affectedKeys], ['configurationService.profiles.applicationSetting', 'configurationService.profiles.testSetting']);1973assert.strictEqual(testObject.getValue('configurationService.profiles.applicationSetting'), 'applicationValue2');1974assert.strictEqual(testObject.getValue('configurationService.profiles.testSetting'), 'profileValue2');1975}));19761977test('In non-default profile, changing application settings shall include only application scope settings in the change event', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1978await fileService.writeFile(instantiationService.get(IUserDataProfilesService).defaultProfile.settingsResource, VSBuffer.fromString('{}'));1979await testObject.reloadConfiguration();19801981const promise = Event.toPromise(testObject.onDidChangeConfiguration);1982await fileService.writeFile(instantiationService.get(IUserDataProfilesService).defaultProfile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.applicationSetting": "applicationValue", "configurationService.profiles.testSetting": "applicationValue" }'));19831984const changeEvent = await promise;1985assert.deepStrictEqual([...changeEvent.affectedKeys], ['configurationService.profiles.applicationSetting']);1986assert.strictEqual(testObject.getValue('configurationService.profiles.applicationSetting'), 'applicationValue');1987assert.strictEqual(testObject.getValue('configurationService.profiles.testSetting'), 'isSet');1988}));19891990test('switch to default profile with settings applied to all profiles', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {1991await testObject.updateValue(APPLY_ALL_PROFILES_SETTING, ['configurationService.profiles.testSetting2'], ConfigurationTarget.USER_LOCAL);19921993await userDataProfileService.updateCurrentProfile(instantiationService.get(IUserDataProfilesService).defaultProfile);19941995assert.strictEqual(testObject.getValue('configurationService.profiles.applicationSetting2'), 'applicationValue');1996assert.strictEqual(testObject.getValue('configurationService.profiles.testSetting2'), 'userValue');1997}));19981999test('switch to non default profile with settings applied to all profiles', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2000await testObject.updateValue(APPLY_ALL_PROFILES_SETTING, ['configurationService.profiles.testSetting2'], ConfigurationTarget.USER_LOCAL);20012002const profile = toUserDataProfile('custom2', 'custom2', joinPath(environmentService.userRoamingDataHome, 'profiles', 'custom2'), joinPath(environmentService.cacheHome, 'profilesCache'));2003await fileService.writeFile(profile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.testSetting": "profileValue", "configurationService.profiles.testSetting2": "profileValue2" }'));2004const promise = Event.toPromise(testObject.onDidChangeConfiguration);2005await userDataProfileService.updateCurrentProfile(profile);20062007const changeEvent = await promise;2008assert.deepStrictEqual([...changeEvent.affectedKeys], ['configurationService.profiles.testSetting']);2009assert.strictEqual(testObject.getValue('configurationService.profiles.applicationSetting2'), 'applicationValue');2010assert.strictEqual(testObject.getValue('configurationService.profiles.testSetting2'), 'userValue');2011assert.strictEqual(testObject.getValue('configurationService.profiles.testSetting'), 'profileValue');2012}));20132014test('switch to non default from default profile with settings applied to all profiles', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2015await testObject.updateValue(APPLY_ALL_PROFILES_SETTING, ['configurationService.profiles.testSetting2'], ConfigurationTarget.USER_LOCAL);2016await userDataProfileService.updateCurrentProfile(instantiationService.get(IUserDataProfilesService).defaultProfile);20172018const profile = toUserDataProfile('custom2', 'custom2', joinPath(environmentService.userRoamingDataHome, 'profiles', 'custom2'), joinPath(environmentService.cacheHome, 'profilesCache'));2019await fileService.writeFile(profile.settingsResource, VSBuffer.fromString('{ "configurationService.profiles.testSetting": "profileValue", "configurationService.profiles.testSetting2": "profileValue2" }'));2020const promise = Event.toPromise(testObject.onDidChangeConfiguration);2021await userDataProfileService.updateCurrentProfile(profile);20222023const changeEvent = await promise;2024assert.deepStrictEqual([...changeEvent.affectedKeys], ['configurationService.profiles.testSetting']);2025assert.strictEqual(testObject.getValue('configurationService.profiles.applicationSetting2'), 'applicationValue');2026assert.strictEqual(testObject.getValue('configurationService.profiles.testSetting2'), 'userValue');2027assert.strictEqual(testObject.getValue('configurationService.profiles.testSetting'), 'profileValue');2028}));20292030});20312032suite('WorkspaceConfigurationService-Multiroot', () => {20332034let workspaceContextService: IWorkspaceContextService, jsonEditingServce: IJSONEditingService, testObject: WorkspaceService, fileService: IFileService, environmentService: BrowserWorkbenchEnvironmentService, userDataProfileService: IUserDataProfileService;2035const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);2036const disposables = ensureNoDisposablesAreLeakedInTestSuite();20372038suiteSetup(() => {2039configurationRegistry.registerConfiguration({2040'id': '_test',2041'type': 'object',2042'properties': {2043'configurationService.workspace.testSetting': {2044'type': 'string',2045'default': 'isSet'2046},2047'configurationService.workspace.applicationSetting': {2048'type': 'string',2049'default': 'isSet',2050scope: ConfigurationScope.APPLICATION2051},2052'configurationService.workspace.machineSetting': {2053'type': 'string',2054'default': 'isSet',2055scope: ConfigurationScope.MACHINE2056},2057'configurationService.workspace.machineOverridableSetting': {2058'type': 'string',2059'default': 'isSet',2060scope: ConfigurationScope.MACHINE_OVERRIDABLE2061},2062'configurationService.workspace.testResourceSetting': {2063'type': 'string',2064'default': 'isSet',2065scope: ConfigurationScope.RESOURCE2066},2067'configurationService.workspace.testLanguageSetting': {2068'type': 'string',2069'default': 'isSet',2070scope: ConfigurationScope.LANGUAGE_OVERRIDABLE2071},2072'configurationService.workspace.testRestrictedSetting1': {2073'type': 'string',2074'default': 'isSet',2075restricted: true,2076scope: ConfigurationScope.RESOURCE2077},2078'configurationService.workspace.testRestrictedSetting2': {2079'type': 'string',2080'default': 'isSet',2081restricted: true,2082scope: ConfigurationScope.RESOURCE2083}2084}2085});2086});20872088setup(async () => {2089const logService = new NullLogService();2090fileService = disposables.add(new FileService(logService));2091const fileSystemProvider = disposables.add(new InMemoryFileSystemProvider());2092disposables.add(fileService.registerProvider(ROOT.scheme, fileSystemProvider));20932094const appSettingsHome = joinPath(ROOT, 'user');2095const folderA = joinPath(ROOT, 'a');2096const folderB = joinPath(ROOT, 'b');2097const configResource = joinPath(ROOT, 'vsctests.code-workspace');2098const workspace = { folders: [{ path: folderA.path }, { path: folderB.path }] };20992100await fileService.createFolder(appSettingsHome);2101await fileService.createFolder(folderA);2102await fileService.createFolder(folderB);2103await fileService.writeFile(configResource, VSBuffer.fromString(JSON.stringify(workspace, null, '\t')));21042105const instantiationService = workbenchInstantiationService(undefined, disposables);2106environmentService = TestEnvironmentService;2107const remoteAgentService = disposables.add(instantiationService.createInstance(RemoteAgentService));2108instantiationService.stub(IRemoteAgentService, remoteAgentService);2109const uriIdentityService = disposables.add(new UriIdentityService(fileService));2110const userDataProfilesService = instantiationService.stub(IUserDataProfilesService, disposables.add(new UserDataProfilesService(environmentService, fileService, uriIdentityService, logService)));2111disposables.add(fileService.registerProvider(Schemas.vscodeUserData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.vscodeUserData, userDataProfilesService, uriIdentityService, new NullLogService()))));2112userDataProfileService = instantiationService.stub(IUserDataProfileService, disposables.add(new UserDataProfileService(userDataProfilesService.defaultProfile)));2113const workspaceService = disposables.add(new WorkspaceService(2114{ configurationCache: new ConfigurationCache() },2115environmentService, userDataProfileService, userDataProfilesService,2116fileService, remoteAgentService, uriIdentityService, new NullLogService(), new NullPolicyService()));21172118instantiationService.stub(IFileService, fileService);2119instantiationService.stub(IWorkspaceContextService, workspaceService);2120instantiationService.stub(IConfigurationService, workspaceService);2121instantiationService.stub(IWorkbenchEnvironmentService, environmentService);2122instantiationService.stub(IEnvironmentService, environmentService);21232124await workspaceService.initialize(getWorkspaceIdentifier(configResource));2125instantiationService.stub(IKeybindingEditingService, disposables.add(instantiationService.createInstance(KeybindingsEditingService)));2126instantiationService.stub(ITextFileService, disposables.add(instantiationService.createInstance(TestTextFileService)));2127instantiationService.stub(ITextModelService, disposables.add(instantiationService.createInstance(TextModelResolverService)));2128jsonEditingServce = instantiationService.createInstance(JSONEditingService);2129instantiationService.stub(IJSONEditingService, jsonEditingServce);2130workspaceService.acquireInstantiationService(instantiationService);21312132workspaceContextService = workspaceService;2133testObject = workspaceService;2134});21352136test('application settings are not read from workspace', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2137await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.workspace.applicationSetting": "userValue" }'));2138await jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['settings'], value: { 'configurationService.workspace.applicationSetting': 'workspaceValue' } }], true);21392140await testObject.reloadConfiguration();21412142assert.strictEqual(testObject.getValue('configurationService.workspace.applicationSetting'), 'userValue');2143}));21442145test('application settings are not read from workspace when folder is passed', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2146await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.workspace.applicationSetting": "userValue" }'));2147await jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['settings'], value: { 'configurationService.workspace.applicationSetting': 'workspaceValue' } }], true);21482149await testObject.reloadConfiguration();21502151assert.strictEqual(testObject.getValue('configurationService.workspace.applicationSetting', { resource: workspaceContextService.getWorkspace().folders[0].uri }), 'userValue');2152}));21532154test('machine settings are not read from workspace', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2155await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.machineSetting": "userValue" }'));2156await jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['settings'], value: { 'configurationService.workspace.machineSetting': 'workspaceValue' } }], true);21572158await testObject.reloadConfiguration();21592160assert.strictEqual(testObject.getValue('configurationService.folder.machineSetting'), 'userValue');2161}));21622163test('machine settings are not read from workspace when folder is passed', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2164await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.folder.machineSetting": "userValue" }'));2165await jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['settings'], value: { 'configurationService.workspace.machineSetting': 'workspaceValue' } }], true);21662167await testObject.reloadConfiguration();21682169assert.strictEqual(testObject.getValue('configurationService.folder.machineSetting', { resource: workspaceContextService.getWorkspace().folders[0].uri }), 'userValue');2170}));21712172test('get application scope settings are not loaded after defaults are registered', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2173await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.workspace.newSetting": "userValue" }'));2174await jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['settings'], value: { 'configurationService.workspace.newSetting': 'workspaceValue' } }], true);21752176await testObject.reloadConfiguration();2177assert.strictEqual(testObject.getValue('configurationService.workspace.newSetting'), 'workspaceValue');21782179configurationRegistry.registerConfiguration({2180'id': '_test',2181'type': 'object',2182'properties': {2183'configurationService.workspace.newSetting': {2184'type': 'string',2185'default': 'isSet',2186scope: ConfigurationScope.APPLICATION2187}2188}2189});21902191assert.strictEqual(testObject.getValue('configurationService.workspace.newSetting'), 'userValue');21922193await testObject.reloadConfiguration();2194assert.strictEqual(testObject.getValue('configurationService.workspace.newSetting'), 'userValue');2195}));21962197test('get application scope settings are not loaded after defaults are registered when workspace folder is passed', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2198await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.workspace.newSetting-2": "userValue" }'));2199await jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['settings'], value: { 'configurationService.workspace.newSetting-2': 'workspaceValue' } }], true);22002201await testObject.reloadConfiguration();2202assert.strictEqual(testObject.getValue('configurationService.workspace.newSetting-2', { resource: workspaceContextService.getWorkspace().folders[0].uri }), 'workspaceValue');22032204configurationRegistry.registerConfiguration({2205'id': '_test',2206'type': 'object',2207'properties': {2208'configurationService.workspace.newSetting-2': {2209'type': 'string',2210'default': 'isSet',2211scope: ConfigurationScope.APPLICATION2212}2213}2214});22152216assert.strictEqual(testObject.getValue('configurationService.workspace.newSetting-2', { resource: workspaceContextService.getWorkspace().folders[0].uri }), 'userValue');22172218await testObject.reloadConfiguration();2219assert.strictEqual(testObject.getValue('configurationService.workspace.newSetting-2', { resource: workspaceContextService.getWorkspace().folders[0].uri }), 'userValue');2220}));22212222test('workspace settings override user settings after defaults are registered for machine overridable settings ', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2223await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.workspace.newMachineOverridableSetting": "userValue" }'));2224await jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['settings'], value: { 'configurationService.workspace.newMachineOverridableSetting': 'workspaceValue' } }], true);22252226await testObject.reloadConfiguration();2227assert.strictEqual(testObject.getValue('configurationService.workspace.newMachineOverridableSetting'), 'workspaceValue');22282229configurationRegistry.registerConfiguration({2230'id': '_test',2231'type': 'object',2232'properties': {2233'configurationService.workspace.newMachineOverridableSetting': {2234'type': 'string',2235'default': 'isSet',2236scope: ConfigurationScope.MACHINE_OVERRIDABLE2237}2238}2239});22402241assert.strictEqual(testObject.getValue('configurationService.workspace.newMachineOverridableSetting'), 'workspaceValue');22422243await testObject.reloadConfiguration();2244assert.strictEqual(testObject.getValue('configurationService.workspace.newMachineOverridableSetting'), 'workspaceValue');22452246}));22472248test('application settings are not read from workspace folder', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2249await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.workspace.applicationSetting": "userValue" }'));2250await fileService.writeFile(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json'), VSBuffer.fromString('{ "configurationService.workspace.applicationSetting": "workspaceFolderValue" }'));22512252await testObject.reloadConfiguration();22532254assert.strictEqual(testObject.getValue('configurationService.workspace.applicationSetting'), 'userValue');2255}));22562257test('application settings are not read from workspace folder when workspace folder is passed', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2258await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.workspace.applicationSetting": "userValue" }'));2259await fileService.writeFile(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json'), VSBuffer.fromString('{ "configurationService.workspace.applicationSetting": "workspaceFolderValue" }'));22602261await testObject.reloadConfiguration();22622263assert.strictEqual(testObject.getValue('configurationService.workspace.applicationSetting', { resource: workspaceContextService.getWorkspace().folders[0].uri }), 'userValue');2264}));22652266test('machine settings are not read from workspace folder', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2267await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.workspace.machineSetting": "userValue" }'));2268await fileService.writeFile(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json'), VSBuffer.fromString('{ "configurationService.workspace.machineSetting": "workspaceFolderValue" }'));22692270await testObject.reloadConfiguration();22712272assert.strictEqual(testObject.getValue('configurationService.workspace.machineSetting'), 'userValue');2273}));22742275test('machine settings are not read from workspace folder when workspace folder is passed', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2276await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.workspace.machineSetting": "userValue" }'));2277await fileService.writeFile(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json'), VSBuffer.fromString('{ "configurationService.workspace.machineSetting": "workspaceFolderValue" }'));22782279await testObject.reloadConfiguration();22802281assert.strictEqual(testObject.getValue('configurationService.workspace.machineSetting', { resource: workspaceContextService.getWorkspace().folders[0].uri }), 'userValue');2282}));22832284test('application settings are not read from workspace folder after defaults are registered', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2285await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.workspace.testNewApplicationSetting": "userValue" }'));2286await fileService.writeFile(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json'), VSBuffer.fromString('{ "configurationService.workspace.testNewApplicationSetting": "workspaceFolderValue" }'));22872288await testObject.reloadConfiguration();2289assert.strictEqual(testObject.getValue('configurationService.workspace.testNewApplicationSetting', { resource: workspaceContextService.getWorkspace().folders[0].uri }), 'workspaceFolderValue');22902291configurationRegistry.registerConfiguration({2292'id': '_test',2293'type': 'object',2294'properties': {2295'configurationService.workspace.testNewApplicationSetting': {2296'type': 'string',2297'default': 'isSet',2298scope: ConfigurationScope.APPLICATION2299}2300}2301});23022303assert.strictEqual(testObject.getValue('configurationService.workspace.testNewApplicationSetting', { resource: workspaceContextService.getWorkspace().folders[0].uri }), 'userValue');23042305await testObject.reloadConfiguration();2306assert.strictEqual(testObject.getValue('configurationService.workspace.testNewApplicationSetting', { resource: workspaceContextService.getWorkspace().folders[0].uri }), 'userValue');2307}));23082309test('machine settings are not read from workspace folder after defaults are registered', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2310await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.workspace.testNewMachineSetting": "userValue" }'));2311await fileService.writeFile(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json'), VSBuffer.fromString('{ "configurationService.workspace.testNewMachineSetting": "workspaceFolderValue" }'));2312await testObject.reloadConfiguration();23132314assert.strictEqual(testObject.getValue('configurationService.workspace.testNewMachineSetting', { resource: workspaceContextService.getWorkspace().folders[0].uri }), 'workspaceFolderValue');23152316configurationRegistry.registerConfiguration({2317'id': '_test',2318'type': 'object',2319'properties': {2320'configurationService.workspace.testNewMachineSetting': {2321'type': 'string',2322'default': 'isSet',2323scope: ConfigurationScope.MACHINE2324}2325}2326});23272328assert.strictEqual(testObject.getValue('configurationService.workspace.testNewMachineSetting', { resource: workspaceContextService.getWorkspace().folders[0].uri }), 'userValue');23292330await testObject.reloadConfiguration();2331assert.strictEqual(testObject.getValue('configurationService.workspace.testNewMachineSetting', { resource: workspaceContextService.getWorkspace().folders[0].uri }), 'userValue');2332}));23332334test('resource setting in folder is read after it is registered later', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2335await fileService.writeFile(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json'), VSBuffer.fromString('{ "configurationService.workspace.testNewResourceSetting2": "workspaceFolderValue" }'));2336await jsonEditingServce.write((workspaceContextService.getWorkspace().configuration!), [{ path: ['settings'], value: { 'configurationService.workspace.testNewResourceSetting2': 'workspaceValue' } }], true);2337await testObject.reloadConfiguration();2338configurationRegistry.registerConfiguration({2339'id': '_test',2340'type': 'object',2341'properties': {2342'configurationService.workspace.testNewResourceSetting2': {2343'type': 'string',2344'default': 'isSet',2345scope: ConfigurationScope.RESOURCE2346}2347}2348});2349assert.strictEqual(testObject.getValue('configurationService.workspace.testNewResourceSetting2', { resource: workspaceContextService.getWorkspace().folders[0].uri }), 'workspaceFolderValue');2350}));23512352test('resource language setting in folder is read after it is registered later', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2353await fileService.writeFile(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json'), VSBuffer.fromString('{ "configurationService.workspace.testNewResourceLanguageSetting2": "workspaceFolderValue" }'));2354await jsonEditingServce.write((workspaceContextService.getWorkspace().configuration!), [{ path: ['settings'], value: { 'configurationService.workspace.testNewResourceLanguageSetting2': 'workspaceValue' } }], true);2355await testObject.reloadConfiguration();2356configurationRegistry.registerConfiguration({2357'id': '_test',2358'type': 'object',2359'properties': {2360'configurationService.workspace.testNewResourceLanguageSetting2': {2361'type': 'string',2362'default': 'isSet',2363scope: ConfigurationScope.LANGUAGE_OVERRIDABLE2364}2365}2366});2367assert.strictEqual(testObject.getValue('configurationService.workspace.testNewResourceLanguageSetting2', { resource: workspaceContextService.getWorkspace().folders[0].uri }), 'workspaceFolderValue');2368}));23692370test('machine overridable setting in folder is read after it is registered later', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2371await fileService.writeFile(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json'), VSBuffer.fromString('{ "configurationService.workspace.testNewMachineOverridableSetting2": "workspaceFolderValue" }'));2372await jsonEditingServce.write((workspaceContextService.getWorkspace().configuration!), [{ path: ['settings'], value: { 'configurationService.workspace.testNewMachineOverridableSetting2': 'workspaceValue' } }], true);2373await testObject.reloadConfiguration();2374configurationRegistry.registerConfiguration({2375'id': '_test',2376'type': 'object',2377'properties': {2378'configurationService.workspace.testNewMachineOverridableSetting2': {2379'type': 'string',2380'default': 'isSet',2381scope: ConfigurationScope.MACHINE_OVERRIDABLE2382}2383}2384});2385assert.strictEqual(testObject.getValue('configurationService.workspace.testNewMachineOverridableSetting2', { resource: workspaceContextService.getWorkspace().folders[0].uri }), 'workspaceFolderValue');2386}));23872388test('inspect', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2389let actual = testObject.inspect('something.missing');2390assert.strictEqual(actual.defaultValue, undefined);2391assert.strictEqual(actual.userValue, undefined);2392assert.strictEqual(actual.workspaceValue, undefined);2393assert.strictEqual(actual.workspaceFolderValue, undefined);2394assert.strictEqual(actual.value, undefined);23952396actual = testObject.inspect('configurationService.workspace.testResourceSetting');2397assert.strictEqual(actual.defaultValue, 'isSet');2398assert.strictEqual(actual.userValue, undefined);2399assert.strictEqual(actual.workspaceValue, undefined);2400assert.strictEqual(actual.workspaceFolderValue, undefined);2401assert.strictEqual(actual.value, 'isSet');24022403await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.workspace.testResourceSetting": "userValue" }'));2404await testObject.reloadConfiguration();2405actual = testObject.inspect('configurationService.workspace.testResourceSetting');2406assert.strictEqual(actual.defaultValue, 'isSet');2407assert.strictEqual(actual.userValue, 'userValue');2408assert.strictEqual(actual.workspaceValue, undefined);2409assert.strictEqual(actual.workspaceFolderValue, undefined);2410assert.strictEqual(actual.value, 'userValue');24112412await jsonEditingServce.write((workspaceContextService.getWorkspace().configuration!), [{ path: ['settings'], value: { 'configurationService.workspace.testResourceSetting': 'workspaceValue' } }], true);2413await testObject.reloadConfiguration();2414actual = testObject.inspect('configurationService.workspace.testResourceSetting');2415assert.strictEqual(actual.defaultValue, 'isSet');2416assert.strictEqual(actual.userValue, 'userValue');2417assert.strictEqual(actual.workspaceValue, 'workspaceValue');2418assert.strictEqual(actual.workspaceFolderValue, undefined);2419assert.strictEqual(actual.value, 'workspaceValue');24202421await fileService.writeFile(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json'), VSBuffer.fromString('{ "configurationService.workspace.testResourceSetting": "workspaceFolderValue" }'));2422await testObject.reloadConfiguration();2423actual = testObject.inspect('configurationService.workspace.testResourceSetting', { resource: workspaceContextService.getWorkspace().folders[0].uri });2424assert.strictEqual(actual.defaultValue, 'isSet');2425assert.strictEqual(actual.userValue, 'userValue');2426assert.strictEqual(actual.workspaceValue, 'workspaceValue');2427assert.strictEqual(actual.workspaceFolderValue, 'workspaceFolderValue');2428assert.strictEqual(actual.value, 'workspaceFolderValue');2429}));24302431test('inspect restricted settings', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2432testObject.updateWorkspaceTrust(false);2433await jsonEditingServce.write((workspaceContextService.getWorkspace().configuration!), [{ path: ['settings'], value: { 'configurationService.workspace.testRestrictedSetting1': 'workspaceRestrictedValue' } }], true);2434await testObject.reloadConfiguration();2435let actual = testObject.inspect('configurationService.workspace.testRestrictedSetting1', { resource: workspaceContextService.getWorkspace().folders[0].uri });2436assert.strictEqual(actual.defaultValue, 'isSet');2437assert.strictEqual(actual.application, undefined);2438assert.strictEqual(actual.userValue, undefined);2439assert.strictEqual(actual.workspaceValue, 'workspaceRestrictedValue');2440assert.strictEqual(actual.workspaceFolderValue, undefined);2441assert.strictEqual(actual.value, 'isSet');24422443testObject.updateWorkspaceTrust(true);2444await testObject.reloadConfiguration();2445actual = testObject.inspect('configurationService.workspace.testRestrictedSetting1', { resource: workspaceContextService.getWorkspace().folders[0].uri });2446assert.strictEqual(actual.defaultValue, 'isSet');2447assert.strictEqual(actual.application, undefined);2448assert.strictEqual(actual.userValue, undefined);2449assert.strictEqual(actual.workspaceValue, 'workspaceRestrictedValue');2450assert.strictEqual(actual.workspaceFolderValue, undefined);2451assert.strictEqual(actual.value, 'workspaceRestrictedValue');24522453testObject.updateWorkspaceTrust(false);2454await fileService.writeFile(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json'), VSBuffer.fromString('{ "configurationService.workspace.testRestrictedSetting1": "workspaceFolderRestrictedValue" }'));2455await testObject.reloadConfiguration();2456actual = testObject.inspect('configurationService.workspace.testRestrictedSetting1', { resource: workspaceContextService.getWorkspace().folders[0].uri });2457assert.strictEqual(actual.defaultValue, 'isSet');2458assert.strictEqual(actual.application, undefined);2459assert.strictEqual(actual.userValue, undefined);2460assert.strictEqual(actual.workspaceValue, 'workspaceRestrictedValue');2461assert.strictEqual(actual.workspaceFolderValue, 'workspaceFolderRestrictedValue');2462assert.strictEqual(actual.value, 'isSet');24632464testObject.updateWorkspaceTrust(true);2465await testObject.reloadConfiguration();2466actual = testObject.inspect('configurationService.workspace.testRestrictedSetting1', { resource: workspaceContextService.getWorkspace().folders[0].uri });2467assert.strictEqual(actual.defaultValue, 'isSet');2468assert.strictEqual(actual.application, undefined);2469assert.strictEqual(actual.userValue, undefined);2470assert.strictEqual(actual.workspaceValue, 'workspaceRestrictedValue');2471assert.strictEqual(actual.workspaceFolderValue, 'workspaceFolderRestrictedValue');2472assert.strictEqual(actual.value, 'workspaceFolderRestrictedValue');2473}));24742475test('inspect restricted settings after change', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2476testObject.updateWorkspaceTrust(false);2477await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.workspace.testRestrictedSetting1": "userRestrictedValue" }'));2478await testObject.reloadConfiguration();24792480let promise = Event.toPromise(testObject.onDidChangeConfiguration);2481await jsonEditingServce.write((workspaceContextService.getWorkspace().configuration!), [{ path: ['settings'], value: { 'configurationService.workspace.testRestrictedSetting1': 'workspaceRestrictedValue' } }], true);2482let event = await promise;24832484let actual = testObject.inspect('configurationService.workspace.testRestrictedSetting1', { resource: workspaceContextService.getWorkspace().folders[0].uri });2485assert.strictEqual(actual.defaultValue, 'isSet');2486assert.strictEqual(actual.application, undefined);2487assert.strictEqual(actual.userValue, 'userRestrictedValue');2488assert.strictEqual(actual.workspaceValue, 'workspaceRestrictedValue');2489assert.strictEqual(actual.workspaceFolderValue, undefined);2490assert.strictEqual(actual.value, 'userRestrictedValue');2491assert.strictEqual(event.affectsConfiguration('configurationService.workspace.testRestrictedSetting1'), true);24922493promise = Event.toPromise(testObject.onDidChangeConfiguration);2494await fileService.writeFile(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json'), VSBuffer.fromString('{ "configurationService.workspace.testRestrictedSetting1": "workspaceFolderRestrictedValue" }'));2495event = await promise;24962497actual = testObject.inspect('configurationService.workspace.testRestrictedSetting1', { resource: workspaceContextService.getWorkspace().folders[0].uri });2498assert.strictEqual(actual.defaultValue, 'isSet');2499assert.strictEqual(actual.application, undefined);2500assert.strictEqual(actual.userValue, 'userRestrictedValue');2501assert.strictEqual(actual.workspaceValue, 'workspaceRestrictedValue');2502assert.strictEqual(actual.workspaceFolderValue, 'workspaceFolderRestrictedValue');2503assert.strictEqual(actual.value, 'userRestrictedValue');2504assert.strictEqual(event.affectsConfiguration('configurationService.workspace.testRestrictedSetting1'), true);2505}));25062507test('get launch configuration', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2508const expectedLaunchConfiguration = {2509'version': '0.1.0',2510'configurations': [2511{2512'type': 'node',2513'request': 'launch',2514'name': 'Gulp Build',2515'program': '${workspaceFolder}/node_modules/gulp/bin/gulp.js',2516'stopOnEntry': true,2517'args': [2518'watch-extension:json-client'2519],2520'cwd': '${workspaceFolder}'2521}2522]2523};2524await jsonEditingServce.write((workspaceContextService.getWorkspace().configuration!), [{ path: ['launch'], value: expectedLaunchConfiguration }], true);2525await testObject.reloadConfiguration();2526const actual = testObject.getValue('launch');2527assert.deepStrictEqual(actual, expectedLaunchConfiguration);2528}));25292530test('inspect launch configuration', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2531const expectedLaunchConfiguration = {2532'version': '0.1.0',2533'configurations': [2534{2535'type': 'node',2536'request': 'launch',2537'name': 'Gulp Build',2538'program': '${workspaceFolder}/node_modules/gulp/bin/gulp.js',2539'stopOnEntry': true,2540'args': [2541'watch-extension:json-client'2542],2543'cwd': '${workspaceFolder}'2544}2545]2546};2547await jsonEditingServce.write((workspaceContextService.getWorkspace().configuration!), [{ path: ['launch'], value: expectedLaunchConfiguration }], true);2548await testObject.reloadConfiguration();2549const actual = testObject.inspect('launch').workspaceValue;2550assert.deepStrictEqual(actual, expectedLaunchConfiguration);2551}));255225532554test('get tasks configuration', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2555const expectedTasksConfiguration = {2556'version': '2.0.0',2557'tasks': [2558{2559'label': 'Run Dev',2560'type': 'shell',2561'command': './scripts/code.sh',2562'windows': {2563'command': '.\\scripts\\code.bat'2564},2565'problemMatcher': []2566}2567]2568};2569await jsonEditingServce.write((workspaceContextService.getWorkspace().configuration!), [{ path: ['tasks'], value: expectedTasksConfiguration }], true);2570await testObject.reloadConfiguration();2571const actual = testObject.getValue(TasksSchemaProperties.Tasks);2572assert.deepStrictEqual(actual, expectedTasksConfiguration);2573}));25742575test('inspect tasks configuration', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2576const expectedTasksConfiguration = {2577'version': '2.0.0',2578'tasks': [2579{2580'label': 'Run Dev',2581'type': 'shell',2582'command': './scripts/code.sh',2583'windows': {2584'command': '.\\scripts\\code.bat'2585},2586'problemMatcher': []2587}2588]2589};2590await jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['tasks'], value: expectedTasksConfiguration }], true);2591await testObject.reloadConfiguration();2592const actual = testObject.inspect('tasks').workspaceValue;2593assert.deepStrictEqual(actual, expectedTasksConfiguration);2594}));25952596test('update user configuration', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2597await testObject.updateValue('configurationService.workspace.testSetting', 'userValue', ConfigurationTarget.USER);2598assert.strictEqual(testObject.getValue('configurationService.workspace.testSetting'), 'userValue');2599}));26002601test('update user configuration should trigger change event before promise is resolve', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2602const target = sinon.spy();2603disposables.add(testObject.onDidChangeConfiguration(target));2604await testObject.updateValue('configurationService.workspace.testSetting', 'userValue', ConfigurationTarget.USER);2605assert.ok(target.called);2606}));26072608test('update workspace configuration', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2609await testObject.updateValue('configurationService.workspace.testSetting', 'workspaceValue', ConfigurationTarget.WORKSPACE);2610assert.strictEqual(testObject.getValue('configurationService.workspace.testSetting'), 'workspaceValue');2611}));26122613test('update workspace configuration should trigger change event before promise is resolve', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2614const target = sinon.spy();2615disposables.add(testObject.onDidChangeConfiguration(target));2616await testObject.updateValue('configurationService.workspace.testSetting', 'workspaceValue', ConfigurationTarget.WORKSPACE);2617assert.ok(target.called);2618}));26192620test('update application setting into workspace configuration in a workspace is not supported', () => {2621return testObject.updateValue('configurationService.workspace.applicationSetting', 'workspaceValue', {}, ConfigurationTarget.WORKSPACE, { donotNotifyError: true })2622.then(() => assert.fail('Should not be supported'), (e) => assert.strictEqual(e.code, ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_APPLICATION));2623});26242625test('update machine setting into workspace configuration in a workspace is not supported', () => {2626return testObject.updateValue('configurationService.workspace.machineSetting', 'workspaceValue', {}, ConfigurationTarget.WORKSPACE, { donotNotifyError: true })2627.then(() => assert.fail('Should not be supported'), (e) => assert.strictEqual(e.code, ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_MACHINE));2628});26292630test('update workspace folder configuration', () => {2631const workspace = workspaceContextService.getWorkspace();2632return testObject.updateValue('configurationService.workspace.testResourceSetting', 'workspaceFolderValue', { resource: workspace.folders[0].uri }, ConfigurationTarget.WORKSPACE_FOLDER)2633.then(() => assert.strictEqual(testObject.getValue('configurationService.workspace.testResourceSetting', { resource: workspace.folders[0].uri }), 'workspaceFolderValue'));2634});26352636test('update resource language configuration in workspace folder', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2637const workspace = workspaceContextService.getWorkspace();2638await testObject.updateValue('configurationService.workspace.testLanguageSetting', 'workspaceFolderValue', { resource: workspace.folders[0].uri }, ConfigurationTarget.WORKSPACE_FOLDER);2639assert.strictEqual(testObject.getValue('configurationService.workspace.testLanguageSetting', { resource: workspace.folders[0].uri }), 'workspaceFolderValue');2640}));26412642test('update workspace folder configuration should trigger change event before promise is resolve', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2643const workspace = workspaceContextService.getWorkspace();2644const target = sinon.spy();2645disposables.add(testObject.onDidChangeConfiguration(target));2646await testObject.updateValue('configurationService.workspace.testResourceSetting', 'workspaceFolderValue', { resource: workspace.folders[0].uri }, ConfigurationTarget.WORKSPACE_FOLDER);2647assert.ok(target.called);2648}));26492650test('update workspace folder configuration second time should trigger change event before promise is resolve', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2651const workspace = workspaceContextService.getWorkspace();2652await testObject.updateValue('configurationService.workspace.testResourceSetting', 'workspaceFolderValue', { resource: workspace.folders[0].uri }, ConfigurationTarget.WORKSPACE_FOLDER);2653const target = sinon.spy();2654disposables.add(testObject.onDidChangeConfiguration(target));2655await testObject.updateValue('configurationService.workspace.testResourceSetting', 'workspaceFolderValue2', { resource: workspace.folders[0].uri }, ConfigurationTarget.WORKSPACE_FOLDER);2656assert.ok(target.called);2657}));26582659test('update machine overridable setting in folder', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2660const workspace = workspaceContextService.getWorkspace();2661await testObject.updateValue('configurationService.workspace.machineOverridableSetting', 'workspaceFolderValue', { resource: workspace.folders[0].uri }, ConfigurationTarget.WORKSPACE_FOLDER);2662assert.strictEqual(testObject.getValue('configurationService.workspace.machineOverridableSetting', { resource: workspace.folders[0].uri }), 'workspaceFolderValue');2663}));26642665test('update memory configuration', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2666await testObject.updateValue('configurationService.workspace.testSetting', 'memoryValue', ConfigurationTarget.MEMORY);2667assert.strictEqual(testObject.getValue('configurationService.workspace.testSetting'), 'memoryValue');2668}));26692670test('update memory configuration should trigger change event before promise is resolve', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2671const target = sinon.spy();2672disposables.add(testObject.onDidChangeConfiguration(target));2673await testObject.updateValue('configurationService.workspace.testSetting', 'memoryValue', ConfigurationTarget.MEMORY);2674assert.ok(target.called);2675}));26762677test('remove setting from all targets', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2678const workspace = workspaceContextService.getWorkspace();2679const key = 'configurationService.workspace.testResourceSetting';2680await testObject.updateValue(key, 'workspaceFolderValue', { resource: workspace.folders[0].uri }, ConfigurationTarget.WORKSPACE_FOLDER);2681await testObject.updateValue(key, 'workspaceValue', ConfigurationTarget.WORKSPACE);2682await testObject.updateValue(key, 'userValue', ConfigurationTarget.USER);26832684await testObject.updateValue(key, undefined, { resource: workspace.folders[0].uri });2685await testObject.reloadConfiguration();26862687const actual = testObject.inspect(key, { resource: workspace.folders[0].uri });2688assert.strictEqual(actual.userValue, undefined);2689assert.strictEqual(actual.workspaceValue, undefined);2690assert.strictEqual(actual.workspaceFolderValue, undefined);2691}));26922693test('update tasks configuration in a folder', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2694const workspace = workspaceContextService.getWorkspace();2695await testObject.updateValue('tasks', { 'version': '1.0.0', tasks: [{ 'taskName': 'myTask' }] }, { resource: workspace.folders[0].uri }, ConfigurationTarget.WORKSPACE_FOLDER);2696assert.deepStrictEqual(testObject.getValue(TasksSchemaProperties.Tasks, { resource: workspace.folders[0].uri }), { 'version': '1.0.0', tasks: [{ 'taskName': 'myTask' }] });2697}));26982699test('update launch configuration in a workspace', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2700const workspace = workspaceContextService.getWorkspace();2701await testObject.updateValue('launch', { 'version': '1.0.0', configurations: [{ 'name': 'myLaunch' }] }, { resource: workspace.folders[0].uri }, ConfigurationTarget.WORKSPACE, { donotNotifyError: true });2702assert.deepStrictEqual(testObject.getValue('launch'), { 'version': '1.0.0', configurations: [{ 'name': 'myLaunch' }] });2703}));27042705test('update tasks configuration in a workspace', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2706const workspace = workspaceContextService.getWorkspace();2707const tasks = { 'version': '2.0.0', tasks: [{ 'label': 'myTask' }] };2708await testObject.updateValue('tasks', tasks, { resource: workspace.folders[0].uri }, ConfigurationTarget.WORKSPACE, { donotNotifyError: true });2709assert.deepStrictEqual(testObject.getValue(TasksSchemaProperties.Tasks), tasks);2710}));27112712test('configuration of newly added folder is available on configuration change event', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2713const workspaceService = <WorkspaceService>testObject;2714const uri = workspaceService.getWorkspace().folders[1].uri;2715await workspaceService.removeFolders([uri]);2716await fileService.writeFile(joinPath(uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.workspace.testResourceSetting": "workspaceFolderValue" }'));27172718return new Promise<void>((c, e) => {2719disposables.add(testObject.onDidChangeConfiguration(() => {2720try {2721assert.strictEqual(testObject.getValue('configurationService.workspace.testResourceSetting', { resource: uri }), 'workspaceFolderValue');2722c();2723} catch (error) {2724e(error);2725}2726}));2727workspaceService.addFolders([{ uri }]);2728});2729}));27302731test('restricted setting is read from workspace folders when workspace is trusted', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2732testObject.updateWorkspaceTrust(true);27332734await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.workspace.testRestrictedSetting1": "userValue", "configurationService.workspace.testRestrictedSetting2": "userValue" }'));2735await jsonEditingServce.write((workspaceContextService.getWorkspace().configuration!), [{ path: ['settings'], value: { 'configurationService.workspace.testRestrictedSetting1': 'workspaceValue' } }], true);2736await fileService.writeFile(joinPath(testObject.getWorkspace().folders[1].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.workspace.testRestrictedSetting2": "workspaceFolder2Value" }'));2737await testObject.reloadConfiguration();27382739assert.strictEqual(testObject.getValue('configurationService.workspace.testRestrictedSetting1', { resource: testObject.getWorkspace().folders[0].uri }), 'workspaceValue');2740assert.strictEqual(testObject.getValue('configurationService.workspace.testRestrictedSetting2', { resource: testObject.getWorkspace().folders[1].uri }), 'workspaceFolder2Value');2741assert.ok(testObject.restrictedSettings.default.includes('configurationService.workspace.testRestrictedSetting1'));2742assert.ok(testObject.restrictedSettings.default.includes('configurationService.workspace.testRestrictedSetting2'));2743assert.strictEqual(testObject.restrictedSettings.userLocal, undefined);2744assert.strictEqual(testObject.restrictedSettings.userRemote, undefined);2745assert.deepStrictEqual(testObject.restrictedSettings.workspace, ['configurationService.workspace.testRestrictedSetting1']);2746assert.strictEqual(testObject.restrictedSettings.workspaceFolder?.size, 1);2747assert.strictEqual(testObject.restrictedSettings.workspaceFolder?.get(testObject.getWorkspace().folders[0].uri), undefined);2748assert.deepStrictEqual(testObject.restrictedSettings.workspaceFolder?.get(testObject.getWorkspace().folders[1].uri), ['configurationService.workspace.testRestrictedSetting2']);2749}));27502751test('restricted setting is not read from workspace when workspace is not trusted', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2752testObject.updateWorkspaceTrust(false);27532754await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.workspace.testRestrictedSetting1": "userValue", "configurationService.workspace.testRestrictedSetting2": "userValue" }'));2755await jsonEditingServce.write((workspaceContextService.getWorkspace().configuration!), [{ path: ['settings'], value: { 'configurationService.workspace.testRestrictedSetting1': 'workspaceValue' } }], true);2756await fileService.writeFile(joinPath(testObject.getWorkspace().folders[1].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.workspace.testRestrictedSetting2": "workspaceFolder2Value" }'));2757await testObject.reloadConfiguration();27582759assert.strictEqual(testObject.getValue('configurationService.workspace.testRestrictedSetting1', { resource: testObject.getWorkspace().folders[0].uri }), 'userValue');2760assert.strictEqual(testObject.getValue('configurationService.workspace.testRestrictedSetting2', { resource: testObject.getWorkspace().folders[1].uri }), 'userValue');2761assert.ok(testObject.restrictedSettings.default.includes('configurationService.workspace.testRestrictedSetting1'));2762assert.ok(testObject.restrictedSettings.default.includes('configurationService.workspace.testRestrictedSetting2'));2763assert.strictEqual(testObject.restrictedSettings.userLocal, undefined);2764assert.strictEqual(testObject.restrictedSettings.userRemote, undefined);2765assert.deepStrictEqual(testObject.restrictedSettings.workspace, ['configurationService.workspace.testRestrictedSetting1']);2766assert.strictEqual(testObject.restrictedSettings.workspaceFolder?.size, 1);2767assert.strictEqual(testObject.restrictedSettings.workspaceFolder?.get(testObject.getWorkspace().folders[0].uri), undefined);2768assert.deepStrictEqual(testObject.restrictedSettings.workspaceFolder?.get(testObject.getWorkspace().folders[1].uri), ['configurationService.workspace.testRestrictedSetting2']);2769}));27702771test('remove an unregistered setting', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2772const key = 'configurationService.workspace.unknownSetting';2773await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.workspace.unknownSetting": "userValue" }'));2774await jsonEditingServce.write((workspaceContextService.getWorkspace().configuration!), [{ path: ['settings'], value: { 'configurationService.workspace.unknownSetting': 'workspaceValue' } }], true);2775await fileService.writeFile(joinPath(workspaceContextService.getWorkspace().folders[0].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.workspace.unknownSetting": "workspaceFolderValue1" }'));2776await fileService.writeFile(joinPath(workspaceContextService.getWorkspace().folders[1].uri, '.vscode', 'settings.json'), VSBuffer.fromString('{ "configurationService.workspace.unknownSetting": "workspaceFolderValue2" }'));27772778await testObject.reloadConfiguration();2779await testObject.updateValue(key, undefined, { resource: workspaceContextService.getWorkspace().folders[0].uri });27802781let actual = testObject.inspect(key, { resource: workspaceContextService.getWorkspace().folders[0].uri });2782assert.strictEqual(actual.userValue, undefined);2783assert.strictEqual(actual.workspaceValue, undefined);2784assert.strictEqual(actual.workspaceFolderValue, undefined);27852786await testObject.updateValue(key, undefined, { resource: workspaceContextService.getWorkspace().folders[1].uri });2787actual = testObject.inspect(key, { resource: workspaceContextService.getWorkspace().folders[1].uri });2788assert.strictEqual(actual.userValue, undefined);2789assert.strictEqual(actual.workspaceValue, undefined);2790assert.strictEqual(actual.workspaceFolderValue, undefined);2791}));27922793});27942795suite('WorkspaceConfigurationService - Remote Folder', () => {27962797let testObject: WorkspaceService, folder: URI,2798machineSettingsResource: URI, remoteSettingsResource: URI, fileSystemProvider: InMemoryFileSystemProvider, resolveRemoteEnvironment: () => void,2799instantiationService: TestInstantiationService, fileService: IFileService, environmentService: BrowserWorkbenchEnvironmentService, userDataProfileService: IUserDataProfileService;2800const remoteAuthority = 'configuraiton-tests';2801const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);2802const disposables = ensureNoDisposablesAreLeakedInTestSuite();28032804suiteSetup(() => {2805configurationRegistry.registerConfiguration({2806'id': '_test',2807'type': 'object',2808'properties': {2809'configurationService.remote.applicationSetting': {2810'type': 'string',2811'default': 'isSet',2812scope: ConfigurationScope.APPLICATION2813},2814'configurationService.remote.machineSetting': {2815'type': 'string',2816'default': 'isSet',2817scope: ConfigurationScope.MACHINE2818},2819'configurationService.remote.applicationMachineSetting': {2820'type': 'string',2821'default': 'isSet',2822scope: ConfigurationScope.APPLICATION_MACHINE2823},2824'configurationService.remote.machineOverridableSetting': {2825'type': 'string',2826'default': 'isSet',2827scope: ConfigurationScope.MACHINE_OVERRIDABLE2828},2829'configurationService.remote.testSetting': {2830'type': 'string',2831'default': 'isSet',2832scope: ConfigurationScope.RESOURCE2833}2834}2835});2836});28372838setup(async () => {2839const logService = new NullLogService();2840fileService = disposables.add(new FileService(logService));2841fileSystemProvider = disposables.add(new InMemoryFileSystemProvider());2842disposables.add(fileService.registerProvider(ROOT.scheme, fileSystemProvider));28432844const appSettingsHome = joinPath(ROOT, 'user');2845folder = joinPath(ROOT, 'a');2846await fileService.createFolder(folder);2847await fileService.createFolder(appSettingsHome);2848machineSettingsResource = joinPath(ROOT, 'machine-settings.json');2849remoteSettingsResource = machineSettingsResource.with({ scheme: Schemas.vscodeRemote, authority: remoteAuthority });28502851instantiationService = workbenchInstantiationService(undefined, disposables);2852environmentService = TestEnvironmentService;2853const remoteEnvironmentPromise = new Promise<Partial<IRemoteAgentEnvironment>>(c => resolveRemoteEnvironment = () => c({ settingsPath: remoteSettingsResource }));2854const remoteAgentService = instantiationService.stub(IRemoteAgentService, <Partial<IRemoteAgentService>>{ getEnvironment: () => remoteEnvironmentPromise });2855const configurationCache: IConfigurationCache = { read: () => Promise.resolve(''), write: () => Promise.resolve(), remove: () => Promise.resolve(), needsCaching: () => false };2856const uriIdentityService = disposables.add(new UriIdentityService(fileService));2857const userDataProfilesService = instantiationService.stub(IUserDataProfilesService, disposables.add(new UserDataProfilesService(environmentService, fileService, uriIdentityService, logService)));2858disposables.add(fileService.registerProvider(Schemas.vscodeUserData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.vscodeUserData, userDataProfilesService, uriIdentityService, new NullLogService()))));2859userDataProfileService = instantiationService.stub(IUserDataProfileService, disposables.add(new UserDataProfileService(userDataProfilesService.defaultProfile)));2860testObject = disposables.add(new WorkspaceService({ configurationCache, remoteAuthority }, environmentService, userDataProfileService, userDataProfilesService, fileService, remoteAgentService, uriIdentityService, new NullLogService(), new NullPolicyService()));2861instantiationService.stub(IWorkspaceContextService, testObject);2862instantiationService.stub(IConfigurationService, testObject);2863instantiationService.stub(IEnvironmentService, environmentService);2864instantiationService.stub(IFileService, fileService);2865});28662867async function initialize(): Promise<void> {2868await testObject.initialize(convertToWorkspacePayload(folder));2869instantiationService.stub(ITextFileService, disposables.add(instantiationService.createInstance(TestTextFileService)));2870instantiationService.stub(ITextModelService, <ITextModelService>disposables.add(instantiationService.createInstance(TextModelResolverService)));2871instantiationService.stub(IJSONEditingService, instantiationService.createInstance(JSONEditingService));2872testObject.acquireInstantiationService(instantiationService);2873}28742875function registerRemoteFileSystemProvider(): void {2876disposables.add(instantiationService.get(IFileService).registerProvider(Schemas.vscodeRemote, new RemoteFileSystemProvider(fileSystemProvider, remoteAuthority)));2877}28782879function registerRemoteFileSystemProviderOnActivation(): void {2880const disposable = disposables.add(instantiationService.get(IFileService).onWillActivateFileSystemProvider(e => {2881if (e.scheme === Schemas.vscodeRemote) {2882disposable.dispose();2883e.join(Promise.resolve().then(() => registerRemoteFileSystemProvider()));2884}2885}));2886}28872888test('remote machine settings override globals', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2889await fileService.writeFile(machineSettingsResource, VSBuffer.fromString('{ "configurationService.remote.machineSetting": "remoteValue" }'));2890registerRemoteFileSystemProvider();2891resolveRemoteEnvironment();2892await initialize();2893assert.strictEqual(testObject.getValue('configurationService.remote.machineSetting'), 'remoteValue');2894}));28952896test('remote machine settings override globals after remote provider is registered on activation', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2897await fileService.writeFile(machineSettingsResource, VSBuffer.fromString('{ "configurationService.remote.machineSetting": "remoteValue" }'));2898resolveRemoteEnvironment();2899registerRemoteFileSystemProviderOnActivation();2900await initialize();2901assert.strictEqual(testObject.getValue('configurationService.remote.machineSetting'), 'remoteValue');2902}));29032904test('remote machine settings override globals after remote environment is resolved', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2905await fileService.writeFile(machineSettingsResource, VSBuffer.fromString('{ "configurationService.remote.machineSetting": "remoteValue" }'));2906registerRemoteFileSystemProvider();2907await initialize();2908const promise = new Promise<void>((c, e) => {2909disposables.add(testObject.onDidChangeConfiguration(event => {2910try {2911assert.strictEqual(event.source, ConfigurationTarget.USER);2912assert.deepStrictEqual([...event.affectedKeys], ['configurationService.remote.machineSetting']);2913assert.strictEqual(testObject.getValue('configurationService.remote.machineSetting'), 'remoteValue');2914c();2915} catch (error) {2916e(error);2917}2918}));2919});2920resolveRemoteEnvironment();2921return promise;2922}));29232924test('remote settings override globals after remote provider is registered on activation and remote environment is resolved', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2925await fileService.writeFile(machineSettingsResource, VSBuffer.fromString('{ "configurationService.remote.machineSetting": "remoteValue" }'));2926registerRemoteFileSystemProviderOnActivation();2927await initialize();2928const promise = new Promise<void>((c, e) => {2929disposables.add(testObject.onDidChangeConfiguration(event => {2930try {2931assert.strictEqual(event.source, ConfigurationTarget.USER);2932assert.deepStrictEqual([...event.affectedKeys], ['configurationService.remote.machineSetting']);2933assert.strictEqual(testObject.getValue('configurationService.remote.machineSetting'), 'remoteValue');2934c();2935} catch (error) {2936e(error);2937}2938}));2939});2940resolveRemoteEnvironment();2941return promise;2942}));29432944test('machine settings in local user settings does not override defaults', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2945await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.remote.machineSetting": "globalValue" }'));2946registerRemoteFileSystemProvider();2947resolveRemoteEnvironment();2948await initialize();2949assert.strictEqual(testObject.getValue('configurationService.remote.machineSetting'), 'isSet');2950}));29512952test('remote application machine settings override globals', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2953await fileService.writeFile(machineSettingsResource, VSBuffer.fromString('{ "configurationService.remote.applicationMachineSetting": "remoteValue" }'));2954registerRemoteFileSystemProvider();2955resolveRemoteEnvironment();2956await initialize();2957assert.strictEqual(testObject.getValue('configurationService.remote.applicationMachineSetting'), 'remoteValue');2958}));29592960test('remote application machine settings override globals after remote provider is registered on activation', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2961await fileService.writeFile(machineSettingsResource, VSBuffer.fromString('{ "configurationService.remote.applicationMachineSetting": "remoteValue" }'));2962resolveRemoteEnvironment();2963registerRemoteFileSystemProviderOnActivation();2964await initialize();2965assert.strictEqual(testObject.getValue('configurationService.remote.applicationMachineSetting'), 'remoteValue');2966}));29672968test('remote application machine settings override globals after remote environment is resolved', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2969await fileService.writeFile(machineSettingsResource, VSBuffer.fromString('{ "configurationService.remote.applicationMachineSetting": "remoteValue" }'));2970registerRemoteFileSystemProvider();2971await initialize();2972const promise = new Promise<void>((c, e) => {2973disposables.add(testObject.onDidChangeConfiguration(event => {2974try {2975assert.strictEqual(event.source, ConfigurationTarget.USER);2976assert.deepStrictEqual([...event.affectedKeys], ['configurationService.remote.applicationMachineSetting']);2977assert.strictEqual(testObject.getValue('configurationService.remote.applicationMachineSetting'), 'remoteValue');2978c();2979} catch (error) {2980e(error);2981}2982}));2983});2984resolveRemoteEnvironment();2985return promise;2986}));29872988test('remote application machine settings override globals after remote provider is registered on activation and remote environment is resolved', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {2989await fileService.writeFile(machineSettingsResource, VSBuffer.fromString('{ "configurationService.remote.applicationMachineSetting": "remoteValue" }'));2990registerRemoteFileSystemProviderOnActivation();2991await initialize();2992const promise = new Promise<void>((c, e) => {2993disposables.add(testObject.onDidChangeConfiguration(event => {2994try {2995assert.strictEqual(event.source, ConfigurationTarget.USER);2996assert.deepStrictEqual([...event.affectedKeys], ['configurationService.remote.applicationMachineSetting']);2997assert.strictEqual(testObject.getValue('configurationService.remote.applicationMachineSetting'), 'remoteValue');2998c();2999} catch (error) {3000e(error);3001}3002}));3003});3004resolveRemoteEnvironment();3005return promise;3006}));30073008test('application machine settings in local user settings does not override defaults', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {3009await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.remote.applicationMachineSetting": "globalValue" }'));3010registerRemoteFileSystemProvider();3011resolveRemoteEnvironment();3012await initialize();3013assert.strictEqual(testObject.getValue('configurationService.remote.applicationMachineSetting'), 'isSet');3014}));30153016test('machine overridable settings in local user settings does not override defaults', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {3017await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.remote.machineOverridableSetting": "globalValue" }'));3018registerRemoteFileSystemProvider();3019resolveRemoteEnvironment();3020await initialize();3021assert.strictEqual(testObject.getValue('configurationService.remote.machineOverridableSetting'), 'isSet');3022}));30233024test('non machine setting is written in local settings', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {3025registerRemoteFileSystemProvider();3026resolveRemoteEnvironment();3027await initialize();3028await testObject.updateValue('configurationService.remote.applicationSetting', 'applicationValue');3029await testObject.reloadConfiguration();3030assert.strictEqual(testObject.inspect('configurationService.remote.applicationSetting').userLocalValue, 'applicationValue');3031}));30323033test('machine setting is written in remote settings', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {3034registerRemoteFileSystemProvider();3035resolveRemoteEnvironment();3036await initialize();3037await testObject.updateValue('configurationService.remote.machineSetting', 'machineValue');3038await testObject.reloadConfiguration();3039assert.strictEqual(testObject.inspect('configurationService.remote.machineSetting').userRemoteValue, 'machineValue');3040}));30413042test('application machine setting is written in remote settings', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {3043registerRemoteFileSystemProvider();3044resolveRemoteEnvironment();3045await initialize();3046await testObject.updateValue('configurationService.remote.applicationMachineSetting', 'machineValue');3047await testObject.reloadConfiguration();3048const actual = testObject.inspect('configurationService.remote.applicationMachineSetting');3049assert.strictEqual(actual.userRemoteValue, 'machineValue');3050}));30513052test('machine overridable setting is written in remote settings', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {3053registerRemoteFileSystemProvider();3054resolveRemoteEnvironment();3055await initialize();3056await testObject.updateValue('configurationService.remote.machineOverridableSetting', 'machineValue');3057await testObject.reloadConfiguration();3058assert.strictEqual(testObject.inspect('configurationService.remote.machineOverridableSetting').userRemoteValue, 'machineValue');3059}));30603061test('machine settings in local user settings does not override defaults after defalts are registered ', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {3062await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.remote.newMachineSetting": "userValue" }'));3063registerRemoteFileSystemProvider();3064resolveRemoteEnvironment();3065await initialize();3066configurationRegistry.registerConfiguration({3067'id': '_test',3068'type': 'object',3069'properties': {3070'configurationService.remote.newMachineSetting': {3071'type': 'string',3072'default': 'isSet',3073scope: ConfigurationScope.MACHINE3074}3075}3076});3077assert.strictEqual(testObject.getValue('configurationService.remote.newMachineSetting'), 'isSet');3078}));30793080test('machine overridable settings in local user settings does not override defaults after defaults are registered ', () => runWithFakedTimers<void>({ useFakeTimers: true }, async () => {3081await fileService.writeFile(userDataProfileService.currentProfile.settingsResource, VSBuffer.fromString('{ "configurationService.remote.newMachineOverridableSetting": "userValue" }'));3082registerRemoteFileSystemProvider();3083resolveRemoteEnvironment();3084await initialize();3085configurationRegistry.registerConfiguration({3086'id': '_test',3087'type': 'object',3088'properties': {3089'configurationService.remote.newMachineOverridableSetting': {3090'type': 'string',3091'default': 'isSet',3092scope: ConfigurationScope.MACHINE_OVERRIDABLE3093}3094}3095});3096assert.strictEqual(testObject.getValue('configurationService.remote.newMachineOverridableSetting'), 'isSet');3097}));30983099});31003101function getWorkspaceId(configPath: URI): string {3102let workspaceConfigPath = configPath.toString();3103if (!isLinux) {3104workspaceConfigPath = workspaceConfigPath.toLowerCase(); // sanitize for platform file system3105}3106return hash(workspaceConfigPath).toString(16);3107}31083109function getWorkspaceIdentifier(configPath: URI): IWorkspaceIdentifier {3110return {3111configPath,3112id: getWorkspaceId(configPath)3113};3114}311531163117