Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts
5267 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
import assert from 'assert';
6
import * as sinon from 'sinon';
7
import { IExtensionManagementService, DidUninstallExtensionEvent, ILocalExtension, InstallExtensionEvent, InstallExtensionResult, UninstallExtensionEvent, DidUpdateExtensionMetadata, InstallOperation, IAllowedExtensionsService, AllowedExtensionsConfigKey, IExtensionsControlManifest } from '../../../../../platform/extensionManagement/common/extensionManagement.js';
8
import { EnablementState, IExtensionManagementServerService, IExtensionManagementServer, IWorkbenchExtensionManagementService, ExtensionInstallLocation, IProfileAwareExtensionManagementService, DidChangeProfileEvent } from '../../common/extensionManagement.js';
9
import { ExtensionEnablementService } from '../../browser/extensionEnablementService.js';
10
import { TestInstantiationService } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js';
11
import { Emitter, Event } from '../../../../../base/common/event.js';
12
import { IWorkspace, IWorkspaceContextService, WorkbenchState } from '../../../../../platform/workspace/common/workspace.js';
13
import { IWorkbenchEnvironmentService } from '../../../environment/common/environmentService.js';
14
import { IStorageService, InMemoryStorageService } from '../../../../../platform/storage/common/storage.js';
15
import { IExtensionContributions, ExtensionType, IExtension, IExtensionManifest, IExtensionIdentifier } from '../../../../../platform/extensions/common/extensions.js';
16
import { isUndefinedOrNull } from '../../../../../base/common/types.js';
17
import { areSameExtensions } from '../../../../../platform/extensionManagement/common/extensionManagementUtil.js';
18
import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';
19
import { URI } from '../../../../../base/common/uri.js';
20
import { Schemas } from '../../../../../base/common/network.js';
21
import { TestConfigurationService } from '../../../../../platform/configuration/test/common/testConfigurationService.js';
22
import { productService, TestLifecycleService } from '../../../../test/browser/workbenchTestServices.js';
23
import { GlobalExtensionEnablementService } from '../../../../../platform/extensionManagement/common/extensionEnablementService.js';
24
import { IUserDataSyncAccountService, UserDataSyncAccountService } from '../../../../../platform/userDataSync/common/userDataSyncAccount.js';
25
import { IUserDataSyncEnablementService } from '../../../../../platform/userDataSync/common/userDataSync.js';
26
import { ILifecycleService } from '../../../lifecycle/common/lifecycle.js';
27
import { INotificationService } from '../../../../../platform/notification/common/notification.js';
28
import { TestNotificationService } from '../../../../../platform/notification/test/common/testNotificationService.js';
29
import { IHostService } from '../../../host/browser/host.js';
30
import { mock } from '../../../../../base/test/common/mock.js';
31
import { IExtensionBisectService } from '../../browser/extensionBisect.js';
32
import { IWorkspaceTrustManagementService, IWorkspaceTrustRequestService, WorkspaceTrustRequestOptions } from '../../../../../platform/workspace/common/workspaceTrust.js';
33
import { ExtensionManifestPropertiesService, IExtensionManifestPropertiesService } from '../../../extensions/common/extensionManifestPropertiesService.js';
34
import { TestContextService, TestProductService, TestWorkspaceTrustEnablementService, TestWorkspaceTrustManagementService } from '../../../../test/common/workbenchTestServices.js';
35
import { TestWorkspace } from '../../../../../platform/workspace/test/common/testWorkspace.js';
36
import { ExtensionManagementService } from '../../common/extensionManagementService.js';
37
import { ILogService, NullLogService } from '../../../../../platform/log/common/log.js';
38
import { DisposableStore } from '../../../../../base/common/lifecycle.js';
39
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
40
import { IFileService } from '../../../../../platform/files/common/files.js';
41
import { FileService } from '../../../../../platform/files/common/fileService.js';
42
import { IProductService } from '../../../../../platform/product/common/productService.js';
43
import { AllowedExtensionsService } from '../../../../../platform/extensionManagement/common/allowedExtensionsService.js';
44
import { IStringDictionary } from '../../../../../base/common/collections.js';
45
46
function createStorageService(instantiationService: TestInstantiationService, disposableStore: DisposableStore): IStorageService {
47
let service = instantiationService.get(IStorageService);
48
if (!service) {
49
let workspaceContextService = instantiationService.get(IWorkspaceContextService);
50
if (!workspaceContextService) {
51
workspaceContextService = instantiationService.stub(IWorkspaceContextService, <IWorkspaceContextService>{
52
getWorkbenchState: () => WorkbenchState.FOLDER,
53
getWorkspace: () => TestWorkspace as IWorkspace
54
});
55
}
56
service = instantiationService.stub(IStorageService, disposableStore.add(new InMemoryStorageService()));
57
}
58
return service;
59
}
60
61
export class TestExtensionEnablementService extends ExtensionEnablementService {
62
constructor(instantiationService: TestInstantiationService) {
63
const disposables = new DisposableStore();
64
const storageService = createStorageService(instantiationService, disposables);
65
const extensionManagementServerService = instantiationService.get(IExtensionManagementServerService) ||
66
instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService({
67
id: 'local',
68
label: 'local',
69
extensionManagementService: <IProfileAwareExtensionManagementService>{
70
onInstallExtension: disposables.add(new Emitter<InstallExtensionEvent>()).event,
71
onDidInstallExtensions: disposables.add(new Emitter<readonly InstallExtensionResult[]>()).event,
72
onUninstallExtension: disposables.add(new Emitter<UninstallExtensionEvent>()).event,
73
onDidUninstallExtension: disposables.add(new Emitter<DidUninstallExtensionEvent>()).event,
74
onDidChangeProfile: disposables.add(new Emitter<DidChangeProfileEvent>()).event,
75
onDidUpdateExtensionMetadata: disposables.add(new Emitter<DidUpdateExtensionMetadata>()).event,
76
onProfileAwareDidInstallExtensions: Event.None,
77
},
78
}, null, null));
79
const extensionManagementService = disposables.add(instantiationService.createInstance(ExtensionManagementService));
80
const workbenchExtensionManagementService = instantiationService.get(IWorkbenchExtensionManagementService) || instantiationService.stub(IWorkbenchExtensionManagementService, extensionManagementService);
81
const workspaceTrustManagementService = instantiationService.get(IWorkspaceTrustManagementService) || instantiationService.stub(IWorkspaceTrustManagementService, disposables.add(new TestWorkspaceTrustManagementService()));
82
super(
83
storageService,
84
disposables.add(new GlobalExtensionEnablementService(storageService, extensionManagementService)),
85
instantiationService.get(IWorkspaceContextService) || new TestContextService(),
86
instantiationService.get(IWorkbenchEnvironmentService) || instantiationService.stub(IWorkbenchEnvironmentService, {}),
87
workbenchExtensionManagementService,
88
instantiationService.get(IConfigurationService),
89
extensionManagementServerService,
90
instantiationService.get(IUserDataSyncEnablementService) || instantiationService.stub(IUserDataSyncEnablementService, <Partial<IUserDataSyncEnablementService>>{ isEnabled() { return false; } }),
91
instantiationService.get(IUserDataSyncAccountService) || instantiationService.stub(IUserDataSyncAccountService, UserDataSyncAccountService),
92
instantiationService.get(ILifecycleService) || instantiationService.stub(ILifecycleService, disposables.add(new TestLifecycleService())),
93
instantiationService.get(INotificationService) || instantiationService.stub(INotificationService, new TestNotificationService()),
94
instantiationService.get(IHostService),
95
new class extends mock<IExtensionBisectService>() { override isDisabledByBisect() { return false; } },
96
instantiationService.stub(IAllowedExtensionsService, disposables.add(new AllowedExtensionsService(instantiationService.get(IProductService), instantiationService.get(IConfigurationService)))),
97
workspaceTrustManagementService,
98
new class extends mock<IWorkspaceTrustRequestService>() { override requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Promise<boolean> { return Promise.resolve(true); } },
99
instantiationService.get(IExtensionManifestPropertiesService) || instantiationService.stub(IExtensionManifestPropertiesService, disposables.add(new ExtensionManifestPropertiesService(TestProductService, new TestConfigurationService(), new TestWorkspaceTrustEnablementService(), new NullLogService()))),
100
instantiationService,
101
new NullLogService(),
102
productService
103
);
104
this._register(disposables);
105
}
106
107
public async waitUntilInitialized(): Promise<void> {
108
await this.extensionsManager.whenInitialized();
109
}
110
111
public reset(): void {
112
let extensions = this.globalExtensionEnablementService.getDisabledExtensions();
113
for (const e of this._getWorkspaceDisabledExtensions()) {
114
if (!extensions.some(r => areSameExtensions(r, e))) {
115
extensions.push(e);
116
}
117
}
118
const workspaceEnabledExtensions = this._getWorkspaceEnabledExtensions();
119
if (workspaceEnabledExtensions.length) {
120
extensions = extensions.filter(r => !workspaceEnabledExtensions.some(e => areSameExtensions(e, r)));
121
}
122
extensions.forEach(d => this.setEnablement([aLocalExtension(d.id)], EnablementState.EnabledGlobally));
123
}
124
}
125
126
suite('ExtensionEnablementService Test', () => {
127
128
const disposableStore = ensureNoDisposablesAreLeakedInTestSuite();
129
130
let instantiationService: TestInstantiationService;
131
let testObject: TestExtensionEnablementService;
132
133
const didInstallEvent = new Emitter<readonly InstallExtensionResult[]>();
134
const didUninstallEvent = new Emitter<DidUninstallExtensionEvent>();
135
const didChangeProfileExtensionsEvent = new Emitter<DidChangeProfileEvent>();
136
const installed: ILocalExtension[] = [];
137
const malicious: IExtensionIdentifier[] = [];
138
139
setup(() => {
140
installed.splice(0, installed.length);
141
instantiationService = disposableStore.add(new TestInstantiationService());
142
instantiationService.stub(IFileService, disposableStore.add(new FileService(new NullLogService())));
143
instantiationService.stub(IProductService, TestProductService);
144
const testConfigurationService = new TestConfigurationService();
145
testConfigurationService.setUserConfiguration(AllowedExtensionsConfigKey, { '*': true, 'unallowed': false });
146
instantiationService.stub(IConfigurationService, testConfigurationService);
147
instantiationService.stub(IWorkspaceContextService, new TestContextService());
148
instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService({
149
id: 'local',
150
label: 'local',
151
extensionManagementService: <IProfileAwareExtensionManagementService>{
152
onDidInstallExtensions: didInstallEvent.event,
153
onDidUninstallExtension: didUninstallEvent.event,
154
onDidChangeProfile: didChangeProfileExtensionsEvent.event,
155
onProfileAwareDidInstallExtensions: Event.None,
156
getInstalled: () => Promise.resolve(installed),
157
async getExtensionsControlManifest(): Promise<IExtensionsControlManifest> {
158
return {
159
malicious: malicious.map(e => ({ extensionOrPublisher: e })),
160
deprecated: {},
161
search: []
162
};
163
}
164
},
165
}, null, null));
166
instantiationService.stub(ILogService, NullLogService);
167
instantiationService.stub(IWorkbenchExtensionManagementService, disposableStore.add(instantiationService.createInstance(ExtensionManagementService)));
168
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
169
});
170
171
test('test disable an extension globally', async () => {
172
const extension = aLocalExtension('pub.a');
173
await testObject.setEnablement([extension], EnablementState.DisabledGlobally);
174
assert.ok(!testObject.isEnabled(extension));
175
assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledGlobally);
176
});
177
178
test('test disable an extension globally should return truthy promise', () => {
179
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)
180
.then(value => assert.ok(value));
181
});
182
183
test('test disable an extension globally triggers the change event', async () => {
184
const target = sinon.spy();
185
disposableStore.add(testObject.onEnablementChanged(target));
186
await testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally);
187
assert.ok(target.calledOnce);
188
assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });
189
});
190
191
test('test disable an extension globally again should return a falsy promise', () => {
192
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)
193
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally))
194
.then(value => assert.ok(!value[0]));
195
});
196
197
test('test state of globally disabled extension', () => {
198
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)
199
.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledGlobally));
200
});
201
202
test('test state of globally enabled extension', () => {
203
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)
204
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally))
205
.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.EnabledGlobally));
206
});
207
208
test('test disable an extension for workspace', async () => {
209
const extension = aLocalExtension('pub.a');
210
await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);
211
assert.ok(!testObject.isEnabled(extension));
212
assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledWorkspace);
213
});
214
215
test('test disable an extension for workspace returns a truthy promise', () => {
216
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)
217
.then(value => assert.ok(value));
218
});
219
220
test('test disable an extension for workspace again should return a falsy promise', () => {
221
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)
222
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))
223
.then(value => assert.ok(!value[0]));
224
});
225
226
test('test state of workspace disabled extension', () => {
227
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)
228
.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledWorkspace));
229
});
230
231
test('test state of workspace and globally disabled extension', () => {
232
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)
233
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))
234
.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledWorkspace));
235
});
236
237
test('test state of workspace enabled extension', () => {
238
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)
239
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))
240
.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.EnabledWorkspace));
241
});
242
243
test('test state of globally disabled and workspace enabled extension', () => {
244
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)
245
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))
246
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))
247
.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.EnabledWorkspace));
248
});
249
250
test('test state of an extension when disabled for workspace from workspace enabled', () => {
251
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)
252
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))
253
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))
254
.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledWorkspace));
255
});
256
257
test('test state of an extension when disabled globally from workspace enabled', () => {
258
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)
259
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))
260
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally))
261
.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledGlobally));
262
});
263
264
test('test state of an extension when disabled globally from workspace disabled', () => {
265
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)
266
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally))
267
.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.DisabledGlobally));
268
});
269
270
test('test state of an extension when enabled globally from workspace enabled', () => {
271
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)
272
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))
273
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally))
274
.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.EnabledGlobally));
275
});
276
277
test('test state of an extension when enabled globally from workspace disabled', () => {
278
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)
279
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally))
280
.then(() => assert.strictEqual(testObject.getEnablementState(aLocalExtension('pub.a')), EnablementState.EnabledGlobally));
281
});
282
283
test('test disable an extension for workspace and then globally', async () => {
284
const extension = aLocalExtension('pub.a');
285
await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);
286
await testObject.setEnablement([extension], EnablementState.DisabledGlobally);
287
assert.ok(!testObject.isEnabled(extension));
288
assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledGlobally);
289
});
290
291
test('test disable an extension for workspace and then globally return a truthy promise', () => {
292
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)
293
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally))
294
.then(value => assert.ok(value));
295
});
296
297
test('test disable an extension for workspace and then globally trigger the change event', () => {
298
const target = sinon.spy();
299
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)
300
.then(() => disposableStore.add(testObject.onEnablementChanged(target)))
301
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally))
302
.then(() => {
303
assert.ok(target.calledOnce);
304
assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });
305
});
306
});
307
308
test('test disable an extension globally and then for workspace', async () => {
309
const extension = aLocalExtension('pub.a');
310
await testObject.setEnablement([extension], EnablementState.DisabledGlobally);
311
await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);
312
assert.ok(!testObject.isEnabled(extension));
313
assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledWorkspace);
314
});
315
316
test('test disable an extension globally and then for workspace return a truthy promise', () => {
317
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)
318
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))
319
.then(value => assert.ok(value));
320
});
321
322
test('test disable an extension globally and then for workspace triggers the change event', () => {
323
const target = sinon.spy();
324
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)
325
.then(() => disposableStore.add(testObject.onEnablementChanged(target)))
326
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace))
327
.then(() => {
328
assert.ok(target.calledOnce);
329
assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });
330
});
331
});
332
333
test('test disable an extension for workspace when there is no workspace throws error', () => {
334
instantiationService.stub(IWorkspaceContextService, 'getWorkbenchState', WorkbenchState.EMPTY);
335
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)
336
.then(() => assert.fail('should throw an error'), error => assert.ok(error));
337
});
338
339
test('test enable an extension globally', async () => {
340
const extension = aLocalExtension('pub.a');
341
await testObject.setEnablement([extension], EnablementState.DisabledGlobally);
342
await testObject.setEnablement([extension], EnablementState.EnabledGlobally);
343
assert.ok(testObject.isEnabled(extension));
344
assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);
345
});
346
347
test('test enable an extension globally return truthy promise', async () => {
348
await testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally);
349
const value = await testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally);
350
assert.strictEqual(value[0], true);
351
});
352
353
test('test enable an extension globally triggers change event', () => {
354
const target = sinon.spy();
355
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)
356
.then(() => disposableStore.add(testObject.onEnablementChanged(target)))
357
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally))
358
.then(() => {
359
assert.ok(target.calledOnce);
360
assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });
361
});
362
});
363
364
test('test enable an extension globally when already enabled return falsy promise', () => {
365
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledGlobally)
366
.then(value => assert.ok(!value[0]));
367
});
368
369
test('test enable an extension for workspace', async () => {
370
const extension = aLocalExtension('pub.a');
371
await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);
372
await testObject.setEnablement([extension], EnablementState.EnabledWorkspace);
373
assert.ok(testObject.isEnabled(extension));
374
assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledWorkspace);
375
});
376
377
test('test enable an extension for workspace return truthy promise', () => {
378
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)
379
.then(() => testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace))
380
.then(value => assert.ok(value));
381
});
382
383
test('test enable an extension for workspace triggers change event', () => {
384
const target = sinon.spy();
385
return testObject.setEnablement([aLocalExtension('pub.b')], EnablementState.DisabledWorkspace)
386
.then(() => disposableStore.add(testObject.onEnablementChanged(target)))
387
.then(() => testObject.setEnablement([aLocalExtension('pub.b')], EnablementState.EnabledWorkspace))
388
.then(() => {
389
assert.ok(target.calledOnce);
390
assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.b' });
391
});
392
});
393
394
test('test enable an extension for workspace when already enabled return truthy promise', () => {
395
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.EnabledWorkspace)
396
.then(value => assert.ok(value));
397
});
398
399
test('test enable an extension for workspace when disabled in workspace and gloablly', async () => {
400
const extension = aLocalExtension('pub.a');
401
await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);
402
await testObject.setEnablement([extension], EnablementState.DisabledGlobally);
403
await testObject.setEnablement([extension], EnablementState.EnabledWorkspace);
404
assert.ok(testObject.isEnabled(extension));
405
assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledWorkspace);
406
});
407
408
test('test enable an extension globally when disabled in workspace and gloablly', async () => {
409
const extension = aLocalExtension('pub.a');
410
await testObject.setEnablement([extension], EnablementState.EnabledWorkspace);
411
await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);
412
await testObject.setEnablement([extension], EnablementState.DisabledGlobally);
413
await testObject.setEnablement([extension], EnablementState.EnabledGlobally);
414
assert.ok(testObject.isEnabled(extension));
415
assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);
416
});
417
418
test('test enable an extension also enables dependencies', async () => {
419
installed.push(...[aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'] }), aLocalExtension('pub.b')]);
420
const target = installed[0];
421
const dep = installed[1];
422
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
423
await testObject.setEnablement([dep, target], EnablementState.DisabledGlobally);
424
await testObject.setEnablement([target], EnablementState.EnabledGlobally);
425
assert.ok(testObject.isEnabled(target));
426
assert.ok(testObject.isEnabled(dep));
427
assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);
428
assert.strictEqual(testObject.getEnablementState(dep), EnablementState.EnabledGlobally);
429
});
430
431
test('test enable an extension in workspace with a dependency extension that has auth providers', async () => {
432
installed.push(...[aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'] }), aLocalExtension('pub.b', { authentication: [{ id: 'a', label: 'a' }] })]);
433
const target = installed[0];
434
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
435
await testObject.setEnablement([target], EnablementState.DisabledWorkspace);
436
await testObject.setEnablement([target], EnablementState.EnabledWorkspace);
437
assert.ok(testObject.isEnabled(target));
438
assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledWorkspace);
439
});
440
441
test('test enable an extension with a dependency extension that cannot be enabled', async () => {
442
instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));
443
const localWorkspaceDepExtension = aLocalExtension2('pub.b', { extensionKind: ['workspace'] }, { location: URI.file(`pub.b`) });
444
const remoteWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace'], extensionDependencies: ['pub.b'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
445
const remoteWorkspaceDepExtension = aLocalExtension2('pub.b', { extensionKind: ['workspace'] }, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });
446
installed.push(localWorkspaceDepExtension, remoteWorkspaceExtension, remoteWorkspaceDepExtension);
447
448
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
449
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
450
451
await testObject.setEnablement([remoteWorkspaceExtension], EnablementState.DisabledGlobally);
452
await testObject.setEnablement([remoteWorkspaceExtension], EnablementState.EnabledGlobally);
453
assert.ok(testObject.isEnabled(remoteWorkspaceExtension));
454
assert.strictEqual(testObject.getEnablementState(remoteWorkspaceExtension), EnablementState.EnabledGlobally);
455
});
456
457
test('test enable an extension also enables packed extensions', async () => {
458
installed.push(...[aLocalExtension2('pub.a', { extensionPack: ['pub.b'] }), aLocalExtension('pub.b')]);
459
const target = installed[0];
460
const dep = installed[1];
461
await testObject.setEnablement([dep, target], EnablementState.DisabledGlobally);
462
await testObject.setEnablement([target], EnablementState.EnabledGlobally);
463
assert.ok(testObject.isEnabled(target));
464
assert.ok(testObject.isEnabled(dep));
465
assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);
466
assert.strictEqual(testObject.getEnablementState(dep), EnablementState.EnabledGlobally);
467
});
468
469
test('test remove an extension from disablement list when uninstalled', async () => {
470
const extension = aLocalExtension('pub.a');
471
installed.push(extension);
472
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
473
474
await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);
475
await testObject.setEnablement([extension], EnablementState.DisabledGlobally);
476
didUninstallEvent.fire({ identifier: { id: 'pub.a' }, profileLocation: null! });
477
478
assert.ok(testObject.isEnabled(extension));
479
assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);
480
});
481
482
test('test isEnabled return false extension is disabled globally', () => {
483
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledGlobally)
484
.then(() => assert.ok(!testObject.isEnabled(aLocalExtension('pub.a'))));
485
});
486
487
test('test isEnabled return false extension is disabled in workspace', () => {
488
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)
489
.then(() => assert.ok(!testObject.isEnabled(aLocalExtension('pub.a'))));
490
});
491
492
test('test isEnabled return true extension is not disabled', () => {
493
return testObject.setEnablement([aLocalExtension('pub.a')], EnablementState.DisabledWorkspace)
494
.then(() => testObject.setEnablement([aLocalExtension('pub.c')], EnablementState.DisabledGlobally))
495
.then(() => assert.ok(testObject.isEnabled(aLocalExtension('pub.b'))));
496
});
497
498
test('test canChangeEnablement return false for language packs', () => {
499
assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a', { localizations: [{ languageId: 'gr', translations: [{ id: 'vscode', path: 'path' }] }] })), false);
500
});
501
502
test('test canChangeEnablement return true for auth extension', () => {
503
assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a', { authentication: [{ id: 'a', label: 'a' }] })), true);
504
});
505
506
test('test canChangeEnablement return true for auth extension when user data sync account does not depends on it', () => {
507
instantiationService.stub(IUserDataSyncAccountService, <Partial<IUserDataSyncAccountService>>{
508
account: { authenticationProviderId: 'b' }
509
});
510
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
511
assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a', { authentication: [{ id: 'a', label: 'a' }] })), true);
512
});
513
514
test('test canChangeEnablement return true for auth extension when user data sync account depends on it but auto sync is off', () => {
515
instantiationService.stub(IUserDataSyncAccountService, <Partial<IUserDataSyncAccountService>>{
516
account: { authenticationProviderId: 'a' }
517
});
518
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
519
assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a', { authentication: [{ id: 'a', label: 'a' }] })), true);
520
});
521
522
test('test canChangeEnablement return false for auth extension and user data sync account depends on it and auto sync is on', () => {
523
instantiationService.stub(IUserDataSyncEnablementService, <Partial<IUserDataSyncEnablementService>>{ isEnabled() { return true; } });
524
instantiationService.stub(IUserDataSyncAccountService, <Partial<IUserDataSyncAccountService>>{
525
account: { authenticationProviderId: 'a' }
526
});
527
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
528
assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a', { authentication: [{ id: 'a', label: 'a' }] })), false);
529
});
530
531
test('test canChangeWorkspaceEnablement return true', () => {
532
assert.strictEqual(testObject.canChangeWorkspaceEnablement(aLocalExtension('pub.a')), true);
533
});
534
535
test('test canChangeWorkspaceEnablement return false if there is no workspace', () => {
536
instantiationService.stub(IWorkspaceContextService, 'getWorkbenchState', WorkbenchState.EMPTY);
537
assert.strictEqual(testObject.canChangeWorkspaceEnablement(aLocalExtension('pub.a')), false);
538
});
539
540
test('test canChangeWorkspaceEnablement return false for auth extension', () => {
541
assert.strictEqual(testObject.canChangeWorkspaceEnablement(aLocalExtension('pub.a', { authentication: [{ id: 'a', label: 'a' }] })), false);
542
});
543
544
test('test canChangeEnablement return false when extensions are disabled in environment', () => {
545
instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: true });
546
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
547
assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a')), false);
548
});
549
550
test('test canChangeEnablement return false when the extension is disabled in environment', () => {
551
instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: ['pub.a'] });
552
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
553
assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a')), false);
554
});
555
556
test('test canChangeEnablement return true for system extensions when extensions are disabled in environment', () => {
557
instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: true });
558
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
559
const extension = aLocalExtension('pub.a', undefined, ExtensionType.System);
560
assert.strictEqual(testObject.canChangeEnablement(extension), true);
561
});
562
563
test('test canChangeEnablement return false for system extension when extension is disabled in environment', () => {
564
instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: ['pub.a'] });
565
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
566
const extension = aLocalExtension('pub.a', undefined, ExtensionType.System);
567
assert.ok(!testObject.canChangeEnablement(extension));
568
});
569
570
test('test extension is disabled when disabled in environment', async () => {
571
const extension = aLocalExtension('pub.a');
572
installed.push(extension);
573
574
instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: ['pub.a'] });
575
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
576
577
assert.ok(!testObject.isEnabled(extension));
578
assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByEnvironment);
579
});
580
581
test('test extension is enabled globally when enabled in environment', async () => {
582
const extension = aLocalExtension('pub.a');
583
installed.push(extension);
584
585
instantiationService.stub(IWorkbenchEnvironmentService, { enableExtensions: <readonly string[]>['pub.a'] });
586
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
587
588
assert.ok(testObject.isEnabled(extension));
589
assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);
590
});
591
592
test('test extension is enabled workspace when enabled in environment', async () => {
593
const extension = aLocalExtension('pub.a');
594
installed.push(extension);
595
596
await testObject.setEnablement([extension], EnablementState.EnabledWorkspace);
597
instantiationService.stub(IWorkbenchEnvironmentService, { enableExtensions: <readonly string[]>['pub.a'] });
598
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
599
600
assert.ok(testObject.isEnabled(extension));
601
assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledWorkspace);
602
});
603
604
test('test extension is enabled by environment when disabled globally', async () => {
605
const extension = aLocalExtension('pub.a');
606
installed.push(extension);
607
608
await testObject.setEnablement([extension], EnablementState.DisabledGlobally);
609
instantiationService.stub(IWorkbenchEnvironmentService, { enableExtensions: <readonly string[]>['pub.a'] });
610
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
611
612
assert.ok(testObject.isEnabled(extension));
613
assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledByEnvironment);
614
});
615
616
test('test extension is enabled by environment when disabled workspace', async () => {
617
const extension = aLocalExtension('pub.a');
618
installed.push(extension);
619
620
await testObject.setEnablement([extension], EnablementState.DisabledWorkspace);
621
instantiationService.stub(IWorkbenchEnvironmentService, { enableExtensions: <readonly string[]>['pub.a'] });
622
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
623
624
assert.ok(testObject.isEnabled(extension));
625
assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledByEnvironment);
626
});
627
628
test('test extension is disabled by environment when also enabled in environment', async () => {
629
const extension = aLocalExtension('pub.a');
630
installed.push(extension);
631
632
testObject.setEnablement([extension], EnablementState.DisabledWorkspace);
633
instantiationService.stub(IWorkbenchEnvironmentService, { disableExtensions: true, enableExtensions: <readonly string[]>['pub.a'] });
634
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
635
636
assert.ok(!testObject.isEnabled(extension));
637
assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByEnvironment);
638
});
639
640
test('test canChangeEnablement return false when the extension is enabled in environment', () => {
641
instantiationService.stub(IWorkbenchEnvironmentService, { enableExtensions: <readonly string[]>['pub.a'] });
642
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
643
assert.strictEqual(testObject.canChangeEnablement(aLocalExtension('pub.a')), false);
644
});
645
646
test('test extension does not support vitrual workspace is not enabled in virtual workspace', async () => {
647
const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } });
648
instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });
649
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
650
assert.ok(!testObject.isEnabled(extension));
651
assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByVirtualWorkspace);
652
});
653
654
test('test web extension from web extension management server and does not support vitrual workspace is enabled in virtual workspace', async () => {
655
instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, anExtensionManagementServer('vscode-remote', instantiationService), anExtensionManagementServer('web', instantiationService)));
656
const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false }, browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'web' }) });
657
instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });
658
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
659
assert.ok(testObject.isEnabled(extension));
660
assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);
661
});
662
663
test('test web extension from remote extension management server and does not support vitrual workspace is disabled in virtual workspace', async () => {
664
instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, anExtensionManagementServer('vscode-remote', instantiationService), anExtensionManagementServer('web', instantiationService)));
665
const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false }, browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });
666
instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });
667
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
668
assert.ok(!testObject.isEnabled(extension));
669
assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByVirtualWorkspace);
670
});
671
672
test('test enable a remote workspace extension and local ui extension that is a dependency of remote', async () => {
673
instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));
674
const localUIExtension = aLocalExtension2('pub.a', { main: 'main.js', extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });
675
const remoteUIExtension = aLocalExtension2('pub.a', { main: 'main.js', extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });
676
const target = aLocalExtension2('pub.b', { main: 'main.js', extensionDependencies: ['pub.a'] }, { location: URI.file(`pub.b`).with({ scheme: 'vscode-remote' }) });
677
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
678
679
installed.push(localUIExtension, remoteUIExtension, target);
680
await testObject.setEnablement([target, localUIExtension], EnablementState.DisabledGlobally);
681
await testObject.setEnablement([target, localUIExtension], EnablementState.EnabledGlobally);
682
assert.ok(testObject.isEnabled(target));
683
assert.ok(testObject.isEnabled(localUIExtension));
684
assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);
685
assert.strictEqual(testObject.getEnablementState(localUIExtension), EnablementState.EnabledGlobally);
686
});
687
688
test('test enable a remote workspace extension also enables its dependency in local', async () => {
689
instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));
690
const localUIExtension = aLocalExtension2('pub.a', { main: 'main.js', extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });
691
const remoteUIExtension = aLocalExtension2('pub.a', { main: 'main.js', extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });
692
const target = aLocalExtension2('pub.b', { main: 'main.js', extensionDependencies: ['pub.a'] }, { location: URI.file(`pub.b`).with({ scheme: 'vscode-remote' }) });
693
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
694
695
installed.push(localUIExtension, remoteUIExtension, target);
696
await testObject.setEnablement([target, localUIExtension], EnablementState.DisabledGlobally);
697
await testObject.setEnablement([target], EnablementState.EnabledGlobally);
698
assert.ok(testObject.isEnabled(target));
699
assert.ok(testObject.isEnabled(localUIExtension));
700
assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);
701
assert.strictEqual(testObject.getEnablementState(localUIExtension), EnablementState.EnabledGlobally);
702
});
703
704
test('test canChangeEnablement return false when extension is disabled in virtual workspace', () => {
705
const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } });
706
instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });
707
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
708
assert.ok(!testObject.canChangeEnablement(extension));
709
});
710
711
test('test extension does not support vitrual workspace is enabled in normal workspace', async () => {
712
const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } });
713
instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA') }] });
714
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
715
assert.ok(testObject.isEnabled(extension));
716
assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);
717
});
718
719
test('test extension supports virtual workspace is enabled in virtual workspace', async () => {
720
const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: true } });
721
instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });
722
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
723
assert.ok(testObject.isEnabled(extension));
724
assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);
725
});
726
727
test('test extension does not support untrusted workspaces is disabled in untrusted workspace', () => {
728
const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } });
729
instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });
730
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
731
assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByTrustRequirement);
732
});
733
734
test('test canChangeEnablement return true when extension is disabled by workspace trust', () => {
735
const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } });
736
instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });
737
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
738
assert.ok(testObject.canChangeEnablement(extension));
739
});
740
741
test('test extension supports untrusted workspaces is enabled in untrusted workspace', () => {
742
const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: true } } });
743
instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });
744
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
745
assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);
746
});
747
748
test('test extension does not support untrusted workspaces is enabled in trusted workspace', () => {
749
const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: '' } } });
750
instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return true; } });
751
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
752
assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);
753
});
754
755
test('test extension supports untrusted workspaces is enabled in trusted workspace', () => {
756
const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: true } } });
757
instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return true; } });
758
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
759
assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);
760
});
761
762
test('test extension without any value for virtual worksapce is enabled in virtual workspace', async () => {
763
const extension = aLocalExtension2('pub.a');
764
instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });
765
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
766
assert.ok(testObject.isEnabled(extension));
767
assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);
768
});
769
770
test('test local workspace extension is disabled by kind', async () => {
771
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
772
const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });
773
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
774
assert.ok(!testObject.isEnabled(localWorkspaceExtension));
775
assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);
776
});
777
778
test('test local workspace + ui extension is enabled by kind', async () => {
779
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
780
const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace', 'ui'] }, { location: URI.file(`pub.a`) });
781
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
782
assert.ok(testObject.isEnabled(localWorkspaceExtension));
783
assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);
784
});
785
786
test('test local ui extension is not disabled by kind', async () => {
787
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
788
const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });
789
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
790
assert.ok(testObject.isEnabled(localWorkspaceExtension));
791
assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);
792
});
793
794
test('test canChangeEnablement return true when the local workspace extension is disabled by kind', () => {
795
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
796
const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) });
797
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
798
assert.strictEqual(testObject.canChangeEnablement(localWorkspaceExtension), false);
799
});
800
801
test('test canChangeEnablement return true for local ui extension', () => {
802
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
803
const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });
804
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
805
assert.strictEqual(testObject.canChangeEnablement(localWorkspaceExtension), true);
806
});
807
808
test('test remote ui extension is disabled by kind', async () => {
809
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
810
const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
811
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
812
assert.ok(!testObject.isEnabled(localWorkspaceExtension));
813
assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);
814
});
815
816
test('test remote ui+workspace extension is disabled by kind', async () => {
817
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
818
const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui', 'workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
819
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
820
assert.ok(testObject.isEnabled(localWorkspaceExtension));
821
assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);
822
});
823
824
test('test remote ui extension is disabled by kind when there is no local server', async () => {
825
instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, anExtensionManagementServer('vscode-remote', instantiationService), null));
826
const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
827
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
828
assert.ok(!testObject.isEnabled(localWorkspaceExtension));
829
assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);
830
});
831
832
test('test remote workspace extension is not disabled by kind', async () => {
833
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
834
const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
835
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
836
assert.ok(testObject.isEnabled(localWorkspaceExtension));
837
assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);
838
});
839
840
test('test canChangeEnablement return true when the remote ui extension is disabled by kind', () => {
841
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
842
const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
843
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
844
assert.strictEqual(testObject.canChangeEnablement(localWorkspaceExtension), false);
845
});
846
847
test('test canChangeEnablement return true for remote workspace extension', () => {
848
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
849
const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
850
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
851
assert.strictEqual(testObject.canChangeEnablement(localWorkspaceExtension), true);
852
});
853
854
test('test web extension on local server is disabled by kind when web worker is not enabled', async () => {
855
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
856
const localWorkspaceExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`) });
857
(<TestConfigurationService>instantiationService.get(IConfigurationService)).setUserConfiguration('extensions', { webWorker: false });
858
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
859
assert.strictEqual(testObject.isEnabled(localWorkspaceExtension), false);
860
assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);
861
});
862
863
test('test web extension on local server is not disabled by kind when web worker is enabled', async () => {
864
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
865
const localWorkspaceExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`) });
866
(<TestConfigurationService>instantiationService.get(IConfigurationService)).setUserConfiguration('extensions', { webWorker: true });
867
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
868
assert.strictEqual(testObject.isEnabled(localWorkspaceExtension), true);
869
assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);
870
});
871
872
test('test web extension on remote server is disabled by kind when web worker is not enabled', async () => {
873
instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));
874
const localWorkspaceExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });
875
(<TestConfigurationService>instantiationService.get(IConfigurationService)).setUserConfiguration('extensions', { webWorker: false });
876
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
877
assert.strictEqual(testObject.isEnabled(localWorkspaceExtension), false);
878
assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);
879
});
880
881
test('test web extension on remote server is disabled by kind when web worker is enabled', async () => {
882
instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));
883
const localWorkspaceExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });
884
(<TestConfigurationService>instantiationService.get(IConfigurationService)).setUserConfiguration('extensions', { webWorker: true });
885
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
886
assert.strictEqual(testObject.isEnabled(localWorkspaceExtension), false);
887
assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);
888
});
889
890
test('test web extension on remote server is enabled in web', async () => {
891
instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), anExtensionManagementServer('web', instantiationService)));
892
const localWorkspaceExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });
893
(<TestConfigurationService>instantiationService.get(IConfigurationService)).setUserConfiguration('extensions', { webWorker: false });
894
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
895
assert.strictEqual(testObject.isEnabled(localWorkspaceExtension), true);
896
assert.deepStrictEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);
897
});
898
899
test('test web extension on web server is not disabled by kind', async () => {
900
instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), anExtensionManagementServer('web', instantiationService)));
901
const webExtension = aLocalExtension2('pub.a', { browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'web' }) });
902
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
903
assert.strictEqual(testObject.isEnabled(webExtension), true);
904
assert.deepStrictEqual(testObject.getEnablementState(webExtension), EnablementState.EnabledGlobally);
905
});
906
907
test('test state of multipe extensions', async () => {
908
installed.push(...[aLocalExtension('pub.a'), aLocalExtension('pub.b'), aLocalExtension('pub.c'), aLocalExtension('pub.d'), aLocalExtension('pub.e')]);
909
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
910
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
911
912
await testObject.setEnablement([installed[0]], EnablementState.DisabledGlobally);
913
await testObject.setEnablement([installed[1]], EnablementState.DisabledWorkspace);
914
await testObject.setEnablement([installed[2]], EnablementState.EnabledWorkspace);
915
await testObject.setEnablement([installed[3]], EnablementState.EnabledGlobally);
916
917
assert.deepStrictEqual(testObject.getEnablementStates(installed), [EnablementState.DisabledGlobally, EnablementState.DisabledWorkspace, EnablementState.EnabledWorkspace, EnablementState.EnabledGlobally, EnablementState.EnabledGlobally]);
918
});
919
920
test('test extension is disabled by dependency if it has a dependency that is disabled', async () => {
921
installed.push(...[aLocalExtension2('pub.a'), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] })]);
922
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
923
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
924
925
await testObject.setEnablement([installed[0]], EnablementState.DisabledGlobally);
926
927
assert.strictEqual(testObject.getEnablementState(installed[1]), EnablementState.DisabledByExtensionDependency);
928
});
929
930
test('test extension is disabled by dependency if it has a dependency that is disabled by virtual workspace', async () => {
931
installed.push(...[aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } }), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'], capabilities: { virtualWorkspaces: true } })]);
932
instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });
933
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
934
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
935
936
assert.strictEqual(testObject.getEnablementState(installed[0]), EnablementState.DisabledByVirtualWorkspace);
937
assert.strictEqual(testObject.getEnablementState(installed[1]), EnablementState.DisabledByExtensionDependency);
938
});
939
940
test('test canChangeEnablement return false when extension is disabled by dependency if it has a dependency that is disabled by virtual workspace', async () => {
941
installed.push(...[aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } }), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'], capabilities: { virtualWorkspaces: true } })]);
942
instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });
943
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
944
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
945
946
assert.ok(!testObject.canChangeEnablement(installed[1]));
947
});
948
949
test('test extension is disabled by dependency if it has a dependency that is disabled by workspace trust', async () => {
950
installed.push(...[aLocalExtension2('pub.a', { main: 'hello.js', capabilities: { untrustedWorkspaces: { supported: false, description: '' } } }), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'], capabilities: { untrustedWorkspaces: { supported: true } } })]);
951
instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });
952
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
953
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
954
955
assert.strictEqual(testObject.getEnablementState(installed[0]), EnablementState.DisabledByTrustRequirement);
956
assert.strictEqual(testObject.getEnablementState(installed[1]), EnablementState.DisabledByExtensionDependency);
957
});
958
959
test('test extension is not disabled by dependency if it has a dependency that is disabled by extension kind', async () => {
960
instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(anExtensionManagementServer('vscode-local', instantiationService), anExtensionManagementServer('vscode-remote', instantiationService), null));
961
const localUIExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });
962
const remoteUIExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
963
const remoteWorkspaceExtension = aLocalExtension2('pub.n', { extensionKind: ['workspace'], extensionDependencies: ['pub.a'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
964
installed.push(localUIExtension, remoteUIExtension, remoteWorkspaceExtension);
965
966
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
967
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
968
969
assert.strictEqual(testObject.getEnablementState(localUIExtension), EnablementState.EnabledGlobally);
970
assert.strictEqual(testObject.getEnablementState(remoteUIExtension), EnablementState.DisabledByExtensionKind);
971
assert.strictEqual(testObject.getEnablementState(remoteWorkspaceExtension), EnablementState.EnabledGlobally);
972
});
973
974
test('test canChangeEnablement return false when extension is disabled by dependency if it has a dependency that is disabled by workspace trust', async () => {
975
installed.push(...[aLocalExtension2('pub.a', { main: 'hello.js', capabilities: { untrustedWorkspaces: { supported: false, description: '' } } }), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'], capabilities: { untrustedWorkspaces: { supported: true } } })]);
976
instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });
977
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
978
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
979
980
assert.deepEqual(testObject.canChangeEnablement(installed[1]), false);
981
});
982
983
test('test canChangeEnablement return false when extension is disabled by dependency if it has a dependency that is disabled globally', async () => {
984
installed.push(...[aLocalExtension2('pub.a', {}), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] })]);
985
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
986
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
987
988
await testObject.setEnablement([installed[0]], EnablementState.DisabledGlobally);
989
990
assert.deepEqual(testObject.canChangeEnablement(installed[1]), false);
991
});
992
993
test('test canChangeEnablement return false when extension is disabled by dependency if it has a dependency that is disabled workspace', async () => {
994
installed.push(...[aLocalExtension2('pub.a', {}), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] })]);
995
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
996
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
997
998
await testObject.setEnablement([installed[0]], EnablementState.DisabledWorkspace);
999
1000
assert.deepEqual(testObject.canChangeEnablement(installed[1]), false);
1001
});
1002
1003
test('test extension is not disabled by dependency even if it has a dependency that is disabled when installed extensions are not set', async () => {
1004
await testObject.setEnablement([aLocalExtension2('pub.a')], EnablementState.DisabledGlobally);
1005
1006
assert.strictEqual(testObject.getEnablementState(aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] })), EnablementState.EnabledGlobally);
1007
});
1008
1009
test('test extension is disabled by dependency if it has a dependency that is disabled when all extensions are passed', async () => {
1010
installed.push(...[aLocalExtension2('pub.a'), aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] })]);
1011
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
1012
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
1013
1014
await testObject.setEnablement([installed[0]], EnablementState.DisabledGlobally);
1015
1016
assert.deepStrictEqual(testObject.getEnablementStates(installed), [EnablementState.DisabledGlobally, EnablementState.DisabledByExtensionDependency]);
1017
});
1018
1019
test('test extension is not disabled when it has a missing dependency', async () => {
1020
const target = aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] });
1021
installed.push(target);
1022
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
1023
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
1024
1025
assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);
1026
});
1027
1028
test('test extension is not disabled when it has a dependency in another server', async () => {
1029
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
1030
const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'], extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });
1031
const depdencyOnAnotherServer = aLocalExtension2('pub.b', {}, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });
1032
installed.push(...[target, depdencyOnAnotherServer]);
1033
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
1034
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
1035
1036
assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);
1037
});
1038
1039
test('test extension is enabled when it has a dependency in another server which is disabled', async () => {
1040
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
1041
const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'], extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });
1042
const depdencyOnAnotherServer = aLocalExtension2('pub.b', {}, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });
1043
installed.push(...[target, depdencyOnAnotherServer]);
1044
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
1045
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
1046
await testObject.setEnablement([depdencyOnAnotherServer], EnablementState.DisabledGlobally);
1047
1048
assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);
1049
});
1050
1051
test('test extension is enabled when it has a dependency in another server which is disabled and with no exports and no main and no browser entrypoints', async () => {
1052
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
1053
const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'], extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });
1054
const depdencyOnAnotherServer = aLocalExtension2('pub.b', { api: 'none' }, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });
1055
installed.push(...[target, depdencyOnAnotherServer]);
1056
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
1057
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
1058
await testObject.setEnablement([depdencyOnAnotherServer], EnablementState.DisabledGlobally);
1059
1060
assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);
1061
});
1062
1063
test('test extension is disabled by dependency when it has a dependency in another server which is disabled and with no exports and has main entry point', async () => {
1064
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
1065
const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'], extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });
1066
const depdencyOnAnotherServer = aLocalExtension2('pub.b', { api: 'none', main: 'main.js' }, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });
1067
installed.push(...[target, depdencyOnAnotherServer]);
1068
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
1069
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
1070
await testObject.setEnablement([depdencyOnAnotherServer], EnablementState.DisabledGlobally);
1071
1072
assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByExtensionDependency);
1073
});
1074
1075
test('test extension is disabled by dependency when it has a dependency in another server which is disabled and with no exports and has browser entry point', async () => {
1076
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
1077
const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
1078
const depdencyOnAnotherServer = aLocalExtension2('pub.b', { api: 'none', browser: 'browser.js', extensionKind: 'ui' }, { location: URI.file(`pub.b`) });
1079
installed.push(...[target, depdencyOnAnotherServer]);
1080
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
1081
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
1082
await testObject.setEnablement([depdencyOnAnotherServer], EnablementState.DisabledGlobally);
1083
1084
assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByExtensionDependency);
1085
});
1086
1087
test('test extension is disabled by invalidity', async () => {
1088
const target = aLocalExtension2('pub.b', {}, { isValid: false });
1089
assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByInvalidExtension);
1090
});
1091
1092
test('test extension is disabled by dependency when it has a dependency that is invalid', async () => {
1093
const target = aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] });
1094
installed.push(...[target, aLocalExtension2('pub.a', {}, { isValid: false })]);
1095
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
1096
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
1097
1098
assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByExtensionDependency);
1099
});
1100
1101
test('test extension is enabled when its dependency becomes valid', async () => {
1102
const extension = aLocalExtension2('pub.b', { extensionDependencies: ['pub.a'] });
1103
installed.push(...[extension, aLocalExtension2('pub.a', {}, { isValid: false })]);
1104
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
1105
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
1106
1107
assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByExtensionDependency);
1108
1109
const target = sinon.spy();
1110
disposableStore.add(testObject.onEnablementChanged(target));
1111
1112
const validExtension = aLocalExtension2('pub.a');
1113
didInstallEvent.fire([{
1114
identifier: validExtension.identifier,
1115
operation: InstallOperation.Install,
1116
source: validExtension.location,
1117
profileLocation: validExtension.location,
1118
local: validExtension,
1119
}]);
1120
1121
assert.strictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);
1122
assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.b' });
1123
});
1124
1125
test('test override workspace to trusted when getting extensions enablements', async () => {
1126
const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } });
1127
instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return false; } });
1128
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
1129
1130
assert.strictEqual(testObject.getEnablementStates([extension], { trusted: true })[0], EnablementState.EnabledGlobally);
1131
});
1132
1133
test('test override workspace to not trusted when getting extensions enablements', async () => {
1134
const extension = aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } });
1135
instantiationService.stub(IWorkspaceTrustManagementService, <Partial<IWorkspaceTrustManagementService>>{ isWorkspaceTrusted() { return true; } });
1136
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
1137
1138
assert.strictEqual(testObject.getEnablementStates([extension], { trusted: false })[0], EnablementState.DisabledByTrustRequirement);
1139
});
1140
1141
test('test update extensions enablements on trust change triggers change events for extensions depending on workspace trust', async () => {
1142
installed.push(...[
1143
aLocalExtension2('pub.a', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } }),
1144
aLocalExtension2('pub.b', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: true } } }),
1145
aLocalExtension2('pub.c', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: false, description: 'hello' } } }),
1146
aLocalExtension2('pub.d', { main: 'main.js', capabilities: { untrustedWorkspaces: { supported: true } } }),
1147
]);
1148
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
1149
const target = sinon.spy();
1150
disposableStore.add(testObject.onEnablementChanged(target));
1151
1152
await testObject.updateExtensionsEnablementsWhenWorkspaceTrustChanges();
1153
assert.strictEqual(target.args[0][0].length, 2);
1154
assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });
1155
assert.deepStrictEqual((<IExtension>target.args[0][0][1]).identifier, { id: 'pub.c' });
1156
});
1157
1158
test('test adding an extension that was disabled', async () => {
1159
const extension = aLocalExtension('pub.a');
1160
installed.push(extension);
1161
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
1162
await testObject.setEnablement([extension], EnablementState.DisabledGlobally);
1163
1164
const target = sinon.spy();
1165
disposableStore.add(testObject.onEnablementChanged(target));
1166
didChangeProfileExtensionsEvent.fire({ added: [extension], removed: [] });
1167
1168
assert.ok(!testObject.isEnabled(extension));
1169
assert.strictEqual(testObject.getEnablementState(extension), EnablementState.DisabledGlobally);
1170
assert.strictEqual(target.args[0][0].length, 1);
1171
assert.deepStrictEqual((<IExtension>target.args[0][0][0]).identifier, { id: 'pub.a' });
1172
});
1173
1174
test('test extension is disabled by allowed list', async () => {
1175
const target = aLocalExtension2('unallowed.extension');
1176
assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByAllowlist);
1177
});
1178
1179
test('test extension is disabled by malicious', async () => {
1180
malicious.push({ id: 'malicious.extensionA' });
1181
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
1182
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
1183
const target = aLocalExtension2('malicious.extensionA');
1184
assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByMalicious);
1185
});
1186
1187
test('test installed malicious extension triggers change event', async () => {
1188
testObject.dispose();
1189
malicious.push({ id: 'malicious.extensionB' });
1190
const local = aLocalExtension2('malicious.extensionB');
1191
installed.push(local);
1192
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
1193
assert.strictEqual(testObject.getEnablementState(local), EnablementState.EnabledGlobally);
1194
const promise = Event.toPromise(testObject.onEnablementChanged);
1195
1196
const result = await promise;
1197
assert.deepStrictEqual(result[0], local);
1198
assert.strictEqual(testObject.getEnablementState(local), EnablementState.DisabledByMalicious);
1199
});
1200
1201
});
1202
1203
function anExtensionManagementServer(authority: string, instantiationService: TestInstantiationService): IExtensionManagementServer {
1204
return {
1205
id: authority,
1206
label: authority,
1207
extensionManagementService: instantiationService.get(IExtensionManagementService) as IProfileAwareExtensionManagementService,
1208
};
1209
}
1210
1211
function aMultiExtensionManagementServerService(instantiationService: TestInstantiationService): IExtensionManagementServerService {
1212
const localExtensionManagementServer = anExtensionManagementServer('vscode-local', instantiationService);
1213
const remoteExtensionManagementServer = anExtensionManagementServer('vscode-remote', instantiationService);
1214
return anExtensionManagementServerService(localExtensionManagementServer, remoteExtensionManagementServer, null);
1215
}
1216
1217
export function anExtensionManagementServerService(localExtensionManagementServer: IExtensionManagementServer | null, remoteExtensionManagementServer: IExtensionManagementServer | null, webExtensionManagementServer: IExtensionManagementServer | null): IExtensionManagementServerService {
1218
return {
1219
_serviceBrand: undefined,
1220
localExtensionManagementServer,
1221
remoteExtensionManagementServer,
1222
webExtensionManagementServer,
1223
getExtensionManagementServer: (extension: IExtension) => {
1224
if (extension.location.scheme === Schemas.file) {
1225
return localExtensionManagementServer;
1226
}
1227
if (extension.location.scheme === Schemas.vscodeRemote) {
1228
return remoteExtensionManagementServer;
1229
}
1230
return webExtensionManagementServer;
1231
},
1232
getExtensionInstallLocation(extension: IExtension): ExtensionInstallLocation | null {
1233
const server = this.getExtensionManagementServer(extension);
1234
return server === remoteExtensionManagementServer ? ExtensionInstallLocation.Remote
1235
: server === webExtensionManagementServer ? ExtensionInstallLocation.Web
1236
: ExtensionInstallLocation.Local;
1237
}
1238
};
1239
}
1240
1241
function aLocalExtension(id: string, contributes?: IExtensionContributions, type?: ExtensionType): ILocalExtension {
1242
return aLocalExtension2(id, contributes ? { contributes } : {}, isUndefinedOrNull(type) ? {} : { type });
1243
}
1244
1245
function aLocalExtension2(id: string, manifest: Partial<IExtensionManifest> = {}, properties: IStringDictionary<unknown> = {}): ILocalExtension {
1246
const [publisher, name] = id.split('.');
1247
manifest = { name, publisher, ...manifest };
1248
properties = {
1249
identifier: { id },
1250
location: URI.file(`pub.${name}`),
1251
galleryIdentifier: { id, uuid: undefined },
1252
type: ExtensionType.User,
1253
...properties,
1254
isValid: properties.isValid ?? true,
1255
};
1256
properties.isBuiltin = properties.type === ExtensionType.System;
1257
return <ILocalExtension>Object.create({ manifest, ...properties });
1258
}
1259
1260