Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/services/extensions/test/browser/extensionService.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 { Event } from '../../../../../base/common/event.js';
8
import { DisposableStore } from '../../../../../base/common/lifecycle.js';
9
import { mock } from '../../../../../base/test/common/mock.js';
10
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
11
import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';
12
import { TestConfigurationService } from '../../../../../platform/configuration/test/common/testConfigurationService.js';
13
import { TestDialogService } from '../../../../../platform/dialogs/test/common/testDialogService.js';
14
import { ExtensionKind, IEnvironmentService } from '../../../../../platform/environment/common/environment.js';
15
import { ExtensionIdentifier, IExtension, IExtensionDescription } from '../../../../../platform/extensions/common/extensions.js';
16
import { IFileService } from '../../../../../platform/files/common/files.js';
17
import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';
18
import { TestInstantiationService, createServices } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js';
19
import { ILogService, NullLogService } from '../../../../../platform/log/common/log.js';
20
import { INotificationService } from '../../../../../platform/notification/common/notification.js';
21
import { TestNotificationService } from '../../../../../platform/notification/test/common/testNotificationService.js';
22
import product from '../../../../../platform/product/common/product.js';
23
import { IProductService } from '../../../../../platform/product/common/productService.js';
24
import { RemoteAuthorityResolverService } from '../../../../../platform/remote/browser/remoteAuthorityResolverService.js';
25
import { IRemoteAuthorityResolverService, ResolverResult } from '../../../../../platform/remote/common/remoteAuthorityResolver.js';
26
import { IRemoteExtensionsScannerService } from '../../../../../platform/remote/common/remoteExtensionsScanner.js';
27
import { ITelemetryService } from '../../../../../platform/telemetry/common/telemetry.js';
28
import { NullTelemetryService } from '../../../../../platform/telemetry/common/telemetryUtils.js';
29
import { IUriIdentityService } from '../../../../../platform/uriIdentity/common/uriIdentity.js';
30
import { UriIdentityService } from '../../../../../platform/uriIdentity/common/uriIdentityService.js';
31
import { IUserDataProfilesService, UserDataProfilesService } from '../../../../../platform/userDataProfile/common/userDataProfile.js';
32
import { IWorkspaceContextService } from '../../../../../platform/workspace/common/workspace.js';
33
import { IWorkspaceTrustEnablementService } from '../../../../../platform/workspace/common/workspaceTrust.js';
34
import { IWorkbenchEnvironmentService } from '../../../environment/common/environmentService.js';
35
import { IWebExtensionsScannerService, IWorkbenchExtensionEnablementService, IWorkbenchExtensionManagementService } from '../../../extensionManagement/common/extensionManagement.js';
36
import { BrowserExtensionHostKindPicker } from '../../browser/extensionService.js';
37
import { AbstractExtensionService, IExtensionHostFactory, ResolvedExtensions } from '../../common/abstractExtensionService.js';
38
import { ExtensionHostKind, ExtensionRunningPreference } from '../../common/extensionHostKind.js';
39
import { IExtensionHostManager } from '../../common/extensionHostManagers.js';
40
import { ExtensionManifestPropertiesService, IExtensionManifestPropertiesService } from '../../common/extensionManifestPropertiesService.js';
41
import { ExtensionRunningLocation } from '../../common/extensionRunningLocation.js';
42
import { ExtensionRunningLocationTracker } from '../../common/extensionRunningLocationTracker.js';
43
import { IExtensionHost, IExtensionService } from '../../common/extensions.js';
44
import { ExtensionsProposedApi } from '../../common/extensionsProposedApi.js';
45
import { ILifecycleService } from '../../../lifecycle/common/lifecycle.js';
46
import { IRemoteAgentService } from '../../../remote/common/remoteAgentService.js';
47
import { IUserDataProfileService } from '../../../userDataProfile/common/userDataProfile.js';
48
import { WorkspaceTrustEnablementService } from '../../../workspaces/common/workspaceTrust.js';
49
import { TestEnvironmentService, TestFileService, TestLifecycleService, TestRemoteAgentService, TestRemoteExtensionsScannerService, TestWebExtensionsScannerService, TestWorkbenchExtensionEnablementService, TestWorkbenchExtensionManagementService } from '../../../../test/browser/workbenchTestServices.js';
50
import { TestContextService, TestUserDataProfileService } from '../../../../test/common/workbenchTestServices.js';
51
52
suite('BrowserExtensionService', () => {
53
54
ensureNoDisposablesAreLeakedInTestSuite();
55
56
test('pickRunningLocation', () => {
57
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation([], false, false, ExtensionRunningPreference.None), null);
58
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation([], false, true, ExtensionRunningPreference.None), null);
59
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation([], true, false, ExtensionRunningPreference.None), null);
60
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation([], true, true, ExtensionRunningPreference.None), null);
61
62
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui'], false, false, ExtensionRunningPreference.None), null);
63
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);
64
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui'], true, false, ExtensionRunningPreference.None), null);
65
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);
66
67
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace'], false, false, ExtensionRunningPreference.None), null);
68
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);
69
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace'], true, false, ExtensionRunningPreference.None), null);
70
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);
71
72
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web'], false, false, ExtensionRunningPreference.None), null);
73
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
74
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
75
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
76
77
78
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'workspace'], false, false, ExtensionRunningPreference.None), null);
79
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'workspace'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);
80
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'workspace'], true, false, ExtensionRunningPreference.None), null);
81
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'workspace'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);
82
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'ui'], false, false, ExtensionRunningPreference.None), null);
83
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'ui'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);
84
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'ui'], true, false, ExtensionRunningPreference.None), null);
85
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'ui'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);
86
87
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'workspace'], false, false, ExtensionRunningPreference.None), null);
88
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'workspace'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
89
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'workspace'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
90
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'workspace'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
91
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'web'], false, false, ExtensionRunningPreference.None), null);
92
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'web'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);
93
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'web'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
94
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'web'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);
95
96
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'web'], false, false, ExtensionRunningPreference.None), null);
97
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'web'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
98
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'web'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
99
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'web'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
100
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'ui'], false, false, ExtensionRunningPreference.None), null);
101
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'ui'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
102
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'ui'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
103
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'ui'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
104
105
106
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'web', 'workspace'], false, false, ExtensionRunningPreference.None), null);
107
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'web', 'workspace'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
108
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'web', 'workspace'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
109
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'web', 'workspace'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
110
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'workspace', 'web'], false, false, ExtensionRunningPreference.None), null);
111
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'workspace', 'web'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);
112
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'workspace', 'web'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
113
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['ui', 'workspace', 'web'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);
114
115
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'ui', 'workspace'], false, false, ExtensionRunningPreference.None), null);
116
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'ui', 'workspace'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
117
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'ui', 'workspace'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
118
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'ui', 'workspace'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
119
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'workspace', 'ui'], false, false, ExtensionRunningPreference.None), null);
120
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'workspace', 'ui'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
121
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'workspace', 'ui'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
122
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['web', 'workspace', 'ui'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
123
124
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'ui', 'web'], false, false, ExtensionRunningPreference.None), null);
125
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'ui', 'web'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);
126
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'ui', 'web'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
127
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'ui', 'web'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);
128
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'web', 'ui'], false, false, ExtensionRunningPreference.None), null);
129
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'web', 'ui'], false, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);
130
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'web', 'ui'], true, false, ExtensionRunningPreference.None), ExtensionHostKind.LocalWebWorker);
131
assert.deepStrictEqual(BrowserExtensionHostKindPicker.pickRunningLocation(['workspace', 'web', 'ui'], true, true, ExtensionRunningPreference.None), ExtensionHostKind.Remote);
132
});
133
});
134
135
suite('ExtensionService', () => {
136
137
class MyTestExtensionService extends AbstractExtensionService {
138
139
constructor(
140
@IInstantiationService instantiationService: IInstantiationService,
141
@INotificationService notificationService: INotificationService,
142
@IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService,
143
@ITelemetryService telemetryService: ITelemetryService,
144
@IWorkbenchExtensionEnablementService extensionEnablementService: IWorkbenchExtensionEnablementService,
145
@IFileService fileService: IFileService,
146
@IProductService productService: IProductService,
147
@IWorkbenchExtensionManagementService extensionManagementService: IWorkbenchExtensionManagementService,
148
@IWorkspaceContextService contextService: IWorkspaceContextService,
149
@IConfigurationService configurationService: IConfigurationService,
150
@IExtensionManifestPropertiesService extensionManifestPropertiesService: IExtensionManifestPropertiesService,
151
@ILogService logService: ILogService,
152
@IRemoteAgentService remoteAgentService: IRemoteAgentService,
153
@IRemoteExtensionsScannerService remoteExtensionsScannerService: IRemoteExtensionsScannerService,
154
@ILifecycleService lifecycleService: ILifecycleService,
155
@IRemoteAuthorityResolverService remoteAuthorityResolverService: IRemoteAuthorityResolverService,
156
) {
157
const extensionsProposedApi = instantiationService.createInstance(ExtensionsProposedApi);
158
const extensionHostFactory = new class implements IExtensionHostFactory {
159
createExtensionHost(runningLocations: ExtensionRunningLocationTracker, runningLocation: ExtensionRunningLocation, isInitialStart: boolean): IExtensionHost | null {
160
return new class extends mock<IExtensionHost>() {
161
override runningLocation = runningLocation;
162
};
163
}
164
};
165
super(
166
{ allowRemoteExtensionsInLocalWebWorker: false, hasLocalProcess: true },
167
extensionsProposedApi,
168
extensionHostFactory,
169
null!,
170
instantiationService,
171
notificationService,
172
environmentService,
173
telemetryService,
174
extensionEnablementService,
175
fileService,
176
productService,
177
extensionManagementService,
178
contextService,
179
configurationService,
180
extensionManifestPropertiesService,
181
logService,
182
remoteAgentService,
183
remoteExtensionsScannerService,
184
lifecycleService,
185
remoteAuthorityResolverService,
186
new TestDialogService()
187
);
188
}
189
190
private _extHostId = 0;
191
public readonly order: string[] = [];
192
protected _pickExtensionHostKind(extensionId: ExtensionIdentifier, extensionKinds: ExtensionKind[], isInstalledLocally: boolean, isInstalledRemotely: boolean, preference: ExtensionRunningPreference): ExtensionHostKind | null {
193
throw new Error('Method not implemented.');
194
}
195
protected override _doCreateExtensionHostManager(extensionHost: IExtensionHost, initialActivationEvents: string[]): IExtensionHostManager {
196
const order = this.order;
197
const extensionHostId = ++this._extHostId;
198
order.push(`create ${extensionHostId}`);
199
return new class extends mock<IExtensionHostManager>() {
200
override onDidExit = Event.None;
201
override onDidChangeResponsiveState = Event.None;
202
override disconnect() {
203
return Promise.resolve();
204
}
205
override start(): Promise<void> {
206
return Promise.resolve();
207
}
208
override dispose(): void {
209
order.push(`dispose ${extensionHostId}`);
210
}
211
override representsRunningLocation(runningLocation: ExtensionRunningLocation): boolean {
212
return extensionHost.runningLocation.equals(runningLocation);
213
}
214
};
215
}
216
protected _resolveExtensions(): AsyncIterable<ResolvedExtensions> {
217
throw new Error('Method not implemented.');
218
}
219
protected _scanSingleExtension(extension: IExtension): Promise<IExtensionDescription | null> {
220
throw new Error('Method not implemented.');
221
}
222
protected _onExtensionHostExit(code: number): Promise<void> {
223
throw new Error('Method not implemented.');
224
}
225
protected _resolveAuthority(remoteAuthority: string): Promise<ResolverResult> {
226
throw new Error('Method not implemented.');
227
}
228
}
229
230
let disposables: DisposableStore;
231
let instantiationService: TestInstantiationService;
232
let extService: MyTestExtensionService;
233
234
setup(() => {
235
disposables = new DisposableStore();
236
const testProductService = { _serviceBrand: undefined, ...product };
237
disposables.add(instantiationService = createServices(disposables, [
238
// custom
239
[IExtensionService, MyTestExtensionService],
240
// default
241
[ILifecycleService, TestLifecycleService],
242
[IWorkbenchExtensionManagementService, TestWorkbenchExtensionManagementService],
243
[INotificationService, TestNotificationService],
244
[IRemoteAgentService, TestRemoteAgentService],
245
[ILogService, NullLogService],
246
[IWebExtensionsScannerService, TestWebExtensionsScannerService],
247
[IExtensionManifestPropertiesService, ExtensionManifestPropertiesService],
248
[IConfigurationService, TestConfigurationService],
249
[IWorkspaceContextService, TestContextService],
250
[IProductService, testProductService],
251
[IFileService, TestFileService],
252
[IWorkbenchExtensionEnablementService, TestWorkbenchExtensionEnablementService],
253
[ITelemetryService, NullTelemetryService],
254
[IEnvironmentService, TestEnvironmentService],
255
[IWorkspaceTrustEnablementService, WorkspaceTrustEnablementService],
256
[IUserDataProfilesService, UserDataProfilesService],
257
[IUserDataProfileService, TestUserDataProfileService],
258
[IUriIdentityService, UriIdentityService],
259
[IRemoteExtensionsScannerService, TestRemoteExtensionsScannerService],
260
[IRemoteAuthorityResolverService, new RemoteAuthorityResolverService(false, undefined, undefined, undefined, testProductService, new NullLogService())]
261
]));
262
extService = <MyTestExtensionService>instantiationService.get(IExtensionService);
263
});
264
265
teardown(async () => {
266
disposables.dispose();
267
});
268
269
ensureNoDisposablesAreLeakedInTestSuite();
270
271
test('issue #152204: Remote extension host not disposed after closing vscode client', async () => {
272
await extService.startExtensionHosts();
273
await extService.stopExtensionHosts('foo');
274
assert.deepStrictEqual(extService.order, (['create 1', 'create 2', 'create 3', 'dispose 3', 'dispose 2', 'dispose 1']));
275
});
276
277
test('Extension host disposed when awaited', async () => {
278
await extService.startExtensionHosts();
279
await extService.stopExtensionHosts('foo');
280
assert.deepStrictEqual(extService.order, (['create 1', 'create 2', 'create 3', 'dispose 3', 'dispose 2', 'dispose 1']));
281
});
282
283
test('Extension host not disposed when vetoed (sync)', async () => {
284
await extService.startExtensionHosts();
285
286
disposables.add(extService.onWillStop(e => e.veto(true, 'test 1')));
287
disposables.add(extService.onWillStop(e => e.veto(false, 'test 2')));
288
289
await extService.stopExtensionHosts('foo');
290
assert.deepStrictEqual(extService.order, (['create 1', 'create 2', 'create 3']));
291
});
292
293
test('Extension host not disposed when vetoed (async)', async () => {
294
await extService.startExtensionHosts();
295
296
disposables.add(extService.onWillStop(e => e.veto(false, 'test 1')));
297
disposables.add(extService.onWillStop(e => e.veto(Promise.resolve(true), 'test 2')));
298
disposables.add(extService.onWillStop(e => e.veto(Promise.resolve(false), 'test 3')));
299
300
await extService.stopExtensionHosts('foo');
301
assert.deepStrictEqual(extService.order, (['create 1', 'create 2', 'create 3']));
302
});
303
});
304
305