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
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import assert from 'assert';
7
import { 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
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ contributes: <any>{ 'unknownPoint': { something: true } } }), isWeb ? ['workspace', 'web'] : ['workspace']);
50
});
51
52
test('declarative extension pack with unknown contribution point', () => {
53
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ extensionPack: ['ext1', 'ext2'], contributes: <any>{ 'unknownPoint': { something: true } } }), isWeb ? ['workspace', 'web'] : ['workspace']);
54
});
55
56
test('simple declarative => ui, workspace, web', () => {
57
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{}), ['ui', 'workspace', 'web']);
58
});
59
60
test('only browser => web', () => {
61
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ browser: 'main.browser.js' }), ['web']);
62
});
63
64
test('only main => workspace', () => {
65
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ main: 'main.js' }), ['workspace']);
66
});
67
68
test('main and browser => workspace, web in web and workspace in desktop', () => {
69
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ main: 'main.js', browser: 'main.browser.js' }), isWeb ? ['workspace', 'web'] : ['workspace']);
70
});
71
72
test('browser entry point with workspace extensionKind => workspace, web in web and workspace in desktop', () => {
73
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ main: 'main.js', browser: 'main.browser.js', extensionKind: ['workspace'] }), isWeb ? ['workspace', 'web'] : ['workspace']);
74
});
75
76
test('only browser entry point with out extensionKind => web', () => {
77
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ browser: 'main.browser.js' }), ['web']);
78
});
79
80
test('simple descriptive with workspace, ui extensionKind => workspace, ui, web in web and workspace, ui in desktop', () => {
81
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ extensionKind: ['workspace', 'ui'] }), isWeb ? ['workspace', 'ui', 'web'] : ['workspace', 'ui']);
82
});
83
84
test('opt out from web through settings even if it can run in web', () => {
85
testObject = disposables.add(new ExtensionManifestPropertiesService(TestProductService, new TestConfigurationService({ remote: { extensionKind: { 'pub.a': ['-web'] } } }), new TestWorkspaceTrustEnablementService(), new NullLogService()));
86
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ browser: 'main.browser.js', publisher: 'pub', name: 'a' }), ['ui', 'workspace']);
87
});
88
89
test('opt out from web and include only workspace through settings even if it can run in web', () => {
90
testObject = disposables.add(new ExtensionManifestPropertiesService(TestProductService, new TestConfigurationService({ remote: { extensionKind: { 'pub.a': ['-web', 'workspace'] } } }), new TestWorkspaceTrustEnablementService(), new NullLogService()));
91
assert.deepStrictEqual(testObject.getExtensionKind(<IExtensionManifest>{ browser: 'main.browser.js', publisher: 'pub', name: 'a' }), ['workspace']);
92
});
93
94
test('extension cannot opt out from web', () => {
95
assert.deepStrictEqual(testObject.getExtensionKind(<any>{ browser: 'main.browser.js', extensionKind: ['-web'] }), ['web']);
96
});
97
98
test('extension cannot opt into web', () => {
99
assert.deepStrictEqual(testObject.getExtensionKind(<any>{ main: 'main.js', extensionKind: ['web', 'workspace', 'ui'] }), ['workspace', 'ui']);
100
});
101
102
test('extension cannot opt into web only', () => {
103
assert.deepStrictEqual(testObject.getExtensionKind(<any>{ main: 'main.js', extensionKind: ['web'] }), ['workspace']);
104
});
105
});
106
107
108
// Workspace Trust is disabled in web at the moment
109
if (!isWeb) {
110
suite('ExtensionManifestPropertiesService - ExtensionUntrustedWorkspaceSupportType', () => {
111
let testObject: ExtensionManifestPropertiesService;
112
let instantiationService: TestInstantiationService;
113
let testConfigurationService: TestConfigurationService;
114
115
setup(async () => {
116
instantiationService = new TestInstantiationService();
117
118
testConfigurationService = new TestConfigurationService();
119
instantiationService.stub(IConfigurationService, testConfigurationService);
120
});
121
122
teardown(() => {
123
testObject.dispose();
124
instantiationService.dispose();
125
});
126
127
function assertUntrustedWorkspaceSupport(extensionManifest: IExtensionManifest, expected: ExtensionUntrustedWorkspaceSupportType): void {
128
testObject = instantiationService.createInstance(ExtensionManifestPropertiesService);
129
const untrustedWorkspaceSupport = testObject.getExtensionUntrustedWorkspaceSupportType(extensionManifest);
130
131
assert.strictEqual(untrustedWorkspaceSupport, expected);
132
}
133
134
function getExtensionManifest(properties: any = {}): IExtensionManifest {
135
return Object.create({ name: 'a', publisher: 'pub', version: '1.0.0', ...properties }) as IExtensionManifest;
136
}
137
138
test('test extension workspace trust request when main entry point is missing', () => {
139
instantiationService.stub(IProductService, {});
140
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
141
142
const extensionManifest = getExtensionManifest();
143
assertUntrustedWorkspaceSupport(extensionManifest, true);
144
});
145
146
test('test extension workspace trust request when workspace trust is disabled', async () => {
147
instantiationService.stub(IProductService, {});
148
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService(false));
149
150
const extensionManifest = getExtensionManifest({ main: './out/extension.js' });
151
assertUntrustedWorkspaceSupport(extensionManifest, true);
152
});
153
154
test('test extension workspace trust request when "true" override exists in settings.json', async () => {
155
instantiationService.stub(IProductService, {});
156
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
157
158
await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: true } } });
159
const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });
160
assertUntrustedWorkspaceSupport(extensionManifest, true);
161
});
162
163
test('test extension workspace trust request when override (false) exists in settings.json', async () => {
164
instantiationService.stub(IProductService, {});
165
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
166
167
await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: false } } });
168
const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });
169
assertUntrustedWorkspaceSupport(extensionManifest, false);
170
});
171
172
test('test extension workspace trust request when override (true) for the version exists in settings.json', async () => {
173
instantiationService.stub(IProductService, {});
174
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
175
176
await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: true, version: '1.0.0' } } });
177
const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });
178
assertUntrustedWorkspaceSupport(extensionManifest, true);
179
});
180
181
test('test extension workspace trust request when override (false) for the version exists in settings.json', async () => {
182
instantiationService.stub(IProductService, {});
183
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
184
185
await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: false, version: '1.0.0' } } });
186
const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });
187
assertUntrustedWorkspaceSupport(extensionManifest, false);
188
});
189
190
test('test extension workspace trust request when override for a different version exists in settings.json', async () => {
191
instantiationService.stub(IProductService, {});
192
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
193
194
await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: true, version: '2.0.0' } } });
195
const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });
196
assertUntrustedWorkspaceSupport(extensionManifest, 'limited');
197
});
198
199
test('test extension workspace trust request when default (true) exists in product.json', () => {
200
instantiationService.stub(IProductService, { extensionUntrustedWorkspaceSupport: { 'pub.a': { default: true } } });
201
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
202
203
const extensionManifest = getExtensionManifest({ main: './out/extension.js' });
204
assertUntrustedWorkspaceSupport(extensionManifest, true);
205
});
206
207
test('test extension workspace trust request when default (false) exists in product.json', () => {
208
instantiationService.stub(IProductService, { extensionUntrustedWorkspaceSupport: { 'pub.a': { default: false } } });
209
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
210
211
const extensionManifest = getExtensionManifest({ main: './out/extension.js' });
212
assertUntrustedWorkspaceSupport(extensionManifest, false);
213
});
214
215
test('test extension workspace trust request when override (limited) exists in product.json', () => {
216
instantiationService.stub(IProductService, { extensionUntrustedWorkspaceSupport: { 'pub.a': { override: 'limited' } } });
217
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
218
219
const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: true } } });
220
assertUntrustedWorkspaceSupport(extensionManifest, 'limited');
221
});
222
223
test('test extension workspace trust request when override (false) exists in product.json', () => {
224
instantiationService.stub(IProductService, { extensionUntrustedWorkspaceSupport: { 'pub.a': { override: false } } });
225
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
226
227
const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: true } } });
228
assertUntrustedWorkspaceSupport(extensionManifest, false);
229
});
230
231
test('test extension workspace trust request when value exists in package.json', () => {
232
instantiationService.stub(IProductService, {});
233
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
234
235
const extensionManifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } });
236
assertUntrustedWorkspaceSupport(extensionManifest, 'limited');
237
});
238
239
test('test extension workspace trust request when no value exists in package.json', () => {
240
instantiationService.stub(IProductService, {});
241
instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService());
242
243
const extensionManifest = getExtensionManifest({ main: './out/extension.js' });
244
assertUntrustedWorkspaceSupport(extensionManifest, false);
245
});
246
});
247
}
248
249