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