Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/services/extensions/test/common/extensionManifestPropertiesService.test.ts
5272 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import assert from 'assert';
7
import { DisposableStore } from '../../../../../base/common/lifecycle.js';
8
import { isWeb } from '../../../../../base/common/platform.js';
9
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
10
import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';
11
import { TestConfigurationService } from '../../../../../platform/configuration/test/common/testConfigurationService.js';
12
import { ExtensionUntrustedWorkspaceSupportType, IExtensionManifest } from '../../../../../platform/extensions/common/extensions.js';
13
import { TestInstantiationService } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js';
14
import { NullLogService } from '../../../../../platform/log/common/log.js';
15
import { IProductService } from '../../../../../platform/product/common/productService.js';
16
import { IWorkspaceTrustEnablementService } from '../../../../../platform/workspace/common/workspaceTrust.js';
17
import { ExtensionManifestPropertiesService } from '../../common/extensionManifestPropertiesService.js';
18
import { TestProductService, TestWorkspaceTrustEnablementService } from '../../../../test/common/workbenchTestServices.js';
19
20
suite('ExtensionManifestPropertiesService - ExtensionKind', () => {
21
22
let disposables: DisposableStore;
23
let testObject: ExtensionManifestPropertiesService;
24
25
setup(() => {
26
disposables = new DisposableStore();
27
testObject = disposables.add(new ExtensionManifestPropertiesService(TestProductService, new TestConfigurationService(), new TestWorkspaceTrustEnablementService(), new NullLogService()));
28
});
29
30
teardown(() => {
31
disposables.dispose();
32
});
33
34
ensureNoDisposablesAreLeakedInTestSuite();
35
36
test('declarative with extension dependencies', () => {
37
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ extensionDependencies: ['ext1'] }), isWeb ? ['workspace', 'web'] : ['workspace']);
38
});
39
40
test('declarative extension pack', () => {
41
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ extensionPack: ['ext1', 'ext2'] }), isWeb ? ['workspace', 'web'] : ['workspace']);
42
});
43
44
test('declarative extension pack and extension dependencies', () => {
45
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ extensionPack: ['ext1', 'ext2'], extensionDependencies: ['ext1', 'ext2'] }), isWeb ? ['workspace', 'web'] : ['workspace']);
46
});
47
48
test('declarative with unknown contribution point => workspace, web in web and => workspace in desktop', () => {
49
// eslint-disable-next-line local/code-no-any-casts
50
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ contributes: <any>{ 'unknownPoint': { something: true } } }), isWeb ? ['workspace', 'web'] : ['workspace']);
51
});
52
53
test('declarative extension pack with unknown contribution point', () => {
54
// eslint-disable-next-line local/code-no-any-casts
55
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ extensionPack: ['ext1', 'ext2'], contributes: <any>{ 'unknownPoint': { something: true } } }), isWeb ? ['workspace', 'web'] : ['workspace']);
56
});
57
58
test('simple declarative => ui, workspace, web', () => {
59
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{}), ['ui', 'workspace', 'web']);
60
});
61
62
test('only browser => web', () => {
63
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ browser: 'main.browser.js' }), ['web']);
64
});
65
66
test('only main => workspace', () => {
67
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ main: 'main.js' }), ['workspace']);
68
});
69
70
test('main and browser => workspace, web in web and workspace in desktop', () => {
71
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ main: 'main.js', browser: 'main.browser.js' }), isWeb ? ['workspace', 'web'] : ['workspace']);
72
});
73
74
test('browser entry point with workspace extensionKind => workspace, web in web and workspace in desktop', () => {
75
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ main: 'main.js', browser: 'main.browser.js', extensionKind: ['workspace'] }), isWeb ? ['workspace', 'web'] : ['workspace']);
76
});
77
78
test('only browser entry point with out extensionKind => web', () => {
79
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ browser: 'main.browser.js' }), ['web']);
80
});
81
82
test('simple descriptive with workspace, ui extensionKind => workspace, ui, web in web and workspace, ui in desktop', () => {
83
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ extensionKind: ['workspace', 'ui'] }), isWeb ? ['workspace', 'ui', 'web'] : ['workspace', 'ui']);
84
});
85
86
test('opt out from web through settings even if it can run in web', () => {
87
testObject = disposables.add(new ExtensionManifestPropertiesService(TestProductService, new TestConfigurationService({ remote: { extensionKind: { 'pub.a': ['-web'] } } }), new TestWorkspaceTrustEnablementService(), new NullLogService()));
88
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ browser: 'main.browser.js', publisher: 'pub', name: 'a' }), ['ui', 'workspace']);
89
});
90
91
test('opt out from web and include only workspace through settings even if it can run in web', () => {
92
testObject = disposables.add(new ExtensionManifestPropertiesService(TestProductService, new TestConfigurationService({ remote: { extensionKind: { 'pub.a': ['-web', 'workspace'] } } }), new TestWorkspaceTrustEnablementService(), new NullLogService()));
93
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ browser: 'main.browser.js', publisher: 'pub', name: 'a' }), ['workspace']);
94
});
95
96
test('extension cannot opt out from web', () => {
97
// eslint-disable-next-line local/code-no-any-casts
98
assert.deepStrictEqual(testObject.getExtensionKind(<any>{ browser: 'main.browser.js', extensionKind: ['-web'] }), ['web']);
99
});
100
101
test('extension cannot opt into web', () => {
102
// eslint-disable-next-line local/code-no-any-casts
103
assert.deepStrictEqual(testObject.getExtensionKind(<any>{ main: 'main.js', extensionKind: ['web', 'workspace', 'ui'] }), ['workspace', 'ui']);
104
});
105
106
test('extension cannot opt into web only', () => {
107
// eslint-disable-next-line local/code-no-any-casts
108
assert.deepStrictEqual(testObject.getExtensionKind(<any>{ main: 'main.js', extensionKind: ['web'] }), ['workspace']);
109
});
110
});
111
112
113
// Workspace Trust is disabled in web at the moment
114
if (!isWeb) {
115
suite('ExtensionManifestPropertiesService - ExtensionUntrustedWorkspaceSupportType', () => {
116
let testObject: ExtensionManifestPropertiesService;
117
let instantiationService: TestInstantiationService;
118
let testConfigurationService: TestConfigurationService;
119
120
setup(async () => {
121
instantiationService = new TestInstantiationService();
122
123
testConfigurationService = new TestConfigurationService();
124
instantiationService.stub(IConfigurationService, testConfigurationService);
125
});
126
127
teardown(() => {
128
testObject.dispose();
129
instantiationService.dispose();
130
});
131
132
function assertUntrustedWorkspaceSupport(extensionManifest: IExtensionManifest, expected: ExtensionUntrustedWorkspaceSupportType): void {
133
testObject = instantiationService.createInstance(ExtensionManifestPropertiesService);
134
const untrustedWorkspaceSupport = testObject.getExtensionUntrustedWorkspaceSupportType(extensionManifest);
135
136
assert.strictEqual(untrustedWorkspaceSupport, expected);
137
}
138
139
function getExtensionManifest(properties: any = {}): IExtensionManifest {
140
return Object.create({ name: 'a', publisher: 'pub', version: '1.0.0', ...properties }) as IExtensionManifest;
141
}
142
143
test('test extension workspace trust request when main entry point is missing', () => {
144
instantiationService.stub(IProductService, {});
145
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
146
147
const extensionManifest = getExtensionManifest();
148
assertUntrustedWorkspaceSupport(extensionManifest, true);
149
});
150
151
test('test extension workspace trust request when workspace trust is disabled', async () => {
152
instantiationService.stub(IProductService, {});
153
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService(false));
154
155
const extensionManifest = getExtensionManifest({ main: './out/extension.js' });
156
assertUntrustedWorkspaceSupport(extensionManifest, true);
157
});
158
159
test('test extension workspace trust request when "true" override exists in settings.json', async () => {
160
instantiationService.stub(IProductService, {});
161
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
162
163
await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: true } } });
164
const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });
165
assertUntrustedWorkspaceSupport(extensionManifest, true);
166
});
167
168
test('test extension workspace trust request when override (false) exists in settings.json', async () => {
169
instantiationService.stub(IProductService, {});
170
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
171
172
await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: false } } });
173
const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });
174
assertUntrustedWorkspaceSupport(extensionManifest, false);
175
});
176
177
test('test extension workspace trust request when override (true) for the version exists in settings.json', async () => {
178
instantiationService.stub(IProductService, {});
179
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
180
181
await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: true, version: '1.0.0' } } });
182
const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });
183
assertUntrustedWorkspaceSupport(extensionManifest, true);
184
});
185
186
test('test extension workspace trust request when override (false) for the version exists in settings.json', async () => {
187
instantiationService.stub(IProductService, {});
188
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
189
190
await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: false, version: '1.0.0' } } });
191
const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });
192
assertUntrustedWorkspaceSupport(extensionManifest, false);
193
});
194
195
test('test extension workspace trust request when override for a different version exists in settings.json', async () => {
196
instantiationService.stub(IProductService, {});
197
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
198
199
await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: true, version: '2.0.0' } } });
200
const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });
201
assertUntrustedWorkspaceSupport(extensionManifest, 'limited');
202
});
203
204
test('test extension workspace trust request when default (true) exists in product.json', () => {
205
instantiationService.stub(IProductService, { extensionUntrustedWorkspaceSupport: { 'pub.a': { default: true } } });
206
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
207
208
const extensionManifest = getExtensionManifest({ main: './out/extension.js' });
209
assertUntrustedWorkspaceSupport(extensionManifest, true);
210
});
211
212
test('test extension workspace trust request when default (false) exists in product.json', () => {
213
instantiationService.stub(IProductService, { extensionUntrustedWorkspaceSupport: { 'pub.a': { default: false } } });
214
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
215
216
const extensionManifest = getExtensionManifest({ main: './out/extension.js' });
217
assertUntrustedWorkspaceSupport(extensionManifest, false);
218
});
219
220
test('test extension workspace trust request when override (limited) exists in product.json', () => {
221
instantiationService.stub(IProductService, { extensionUntrustedWorkspaceSupport: { 'pub.a': { override: 'limited' } } });
222
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
223
224
const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: true } } });
225
assertUntrustedWorkspaceSupport(extensionManifest, 'limited');
226
});
227
228
test('test extension workspace trust request when override (false) exists in product.json', () => {
229
instantiationService.stub(IProductService, { extensionUntrustedWorkspaceSupport: { 'pub.a': { override: false } } });
230
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
231
232
const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: true } } });
233
assertUntrustedWorkspaceSupport(extensionManifest, false);
234
});
235
236
test('test extension workspace trust request when value exists in package.json', () => {
237
instantiationService.stub(IProductService, {});
238
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
239
240
const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });
241
assertUntrustedWorkspaceSupport(extensionManifest, 'limited');
242
});
243
244
test('test extension workspace trust request when no value exists in package.json', () => {
245
instantiationService.stub(IProductService, {});
246
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
247
248
const extensionManifest = getExtensionManifest({ main: './out/extension.js' });
249
assertUntrustedWorkspaceSupport(extensionManifest, false);
250
});
251
});
252
}
253
254