Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/platform/extensionManagement/test/common/extensionGalleryService.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 { joinPath } from '../../../../base/common/resources.js';
8
import { URI } from '../../../../base/common/uri.js';
9
import { isUUID } from '../../../../base/common/uuid.js';
10
import { mock } from '../../../../base/test/common/mock.js';
11
import { IConfigurationService } from '../../../configuration/common/configuration.js';
12
import { TestConfigurationService } from '../../../configuration/test/common/testConfigurationService.js';
13
import { IEnvironmentService } from '../../../environment/common/environment.js';
14
import { IRawGalleryExtensionVersion, sortExtensionVersions } from '../../common/extensionGalleryService.js';
15
import { IFileService } from '../../../files/common/files.js';
16
import { FileService } from '../../../files/common/fileService.js';
17
import { InMemoryFileSystemProvider } from '../../../files/common/inMemoryFilesystemProvider.js';
18
import { NullLogService } from '../../../log/common/log.js';
19
import product from '../../../product/common/product.js';
20
import { IProductService } from '../../../product/common/productService.js';
21
import { resolveMarketplaceHeaders } from '../../../externalServices/common/marketplace.js';
22
import { InMemoryStorageService, IStorageService } from '../../../storage/common/storage.js';
23
import { TelemetryConfiguration, TELEMETRY_SETTING_ID } from '../../../telemetry/common/telemetry.js';
24
import { TargetPlatform } from '../../../extensions/common/extensions.js';
25
import { NullTelemetryService } from '../../../telemetry/common/telemetryUtils.js';
26
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';
27
28
class EnvironmentServiceMock extends mock<IEnvironmentService>() {
29
override readonly serviceMachineIdResource: URI;
30
constructor(serviceMachineIdResource: URI) {
31
super();
32
this.serviceMachineIdResource = serviceMachineIdResource;
33
this.isBuilt = true;
34
}
35
}
36
37
suite('Extension Gallery Service', () => {
38
const disposables = ensureNoDisposablesAreLeakedInTestSuite();
39
let fileService: IFileService, environmentService: IEnvironmentService, storageService: IStorageService, productService: IProductService, configurationService: IConfigurationService;
40
41
setup(() => {
42
const serviceMachineIdResource = joinPath(URI.file('tests').with({ scheme: 'vscode-tests' }), 'machineid');
43
environmentService = new EnvironmentServiceMock(serviceMachineIdResource);
44
fileService = disposables.add(new FileService(new NullLogService()));
45
const fileSystemProvider = disposables.add(new InMemoryFileSystemProvider());
46
disposables.add(fileService.registerProvider(serviceMachineIdResource.scheme, fileSystemProvider));
47
storageService = disposables.add(new InMemoryStorageService());
48
configurationService = new TestConfigurationService({ [TELEMETRY_SETTING_ID]: TelemetryConfiguration.ON });
49
configurationService.updateValue(TELEMETRY_SETTING_ID, TelemetryConfiguration.ON);
50
productService = { _serviceBrand: undefined, ...product, enableTelemetry: true };
51
});
52
53
test('marketplace machine id', async () => {
54
const headers = await resolveMarketplaceHeaders(product.version, productService, environmentService, configurationService, fileService, storageService, NullTelemetryService);
55
assert.ok(headers['X-Market-User-Id']);
56
assert.ok(isUUID(headers['X-Market-User-Id']));
57
const headers2 = await resolveMarketplaceHeaders(product.version, productService, environmentService, configurationService, fileService, storageService, NullTelemetryService);
58
assert.strictEqual(headers['X-Market-User-Id'], headers2['X-Market-User-Id']);
59
});
60
61
test('sorting single extension version without target platform', async () => {
62
const actual = [aExtensionVersion('1.1.2')];
63
const expected = [...actual];
64
sortExtensionVersions(actual, TargetPlatform.DARWIN_X64);
65
assert.deepStrictEqual(actual, expected);
66
});
67
68
test('sorting single extension version with preferred target platform', async () => {
69
const actual = [aExtensionVersion('1.1.2', TargetPlatform.DARWIN_X64)];
70
const expected = [...actual];
71
sortExtensionVersions(actual, TargetPlatform.DARWIN_X64);
72
assert.deepStrictEqual(actual, expected);
73
});
74
75
test('sorting single extension version with not compatible target platform', async () => {
76
const actual = [aExtensionVersion('1.1.2', TargetPlatform.DARWIN_ARM64)];
77
const expected = [...actual];
78
sortExtensionVersions(actual, TargetPlatform.WIN32_X64);
79
assert.deepStrictEqual(actual, expected);
80
});
81
82
test('sorting multiple extension versions without target platforms', async () => {
83
const actual = [aExtensionVersion('1.2.4'), aExtensionVersion('1.1.3'), aExtensionVersion('1.1.2'), aExtensionVersion('1.1.1')];
84
const expected = [...actual];
85
sortExtensionVersions(actual, TargetPlatform.WIN32_ARM64);
86
assert.deepStrictEqual(actual, expected);
87
});
88
89
test('sorting multiple extension versions with target platforms - 1', async () => {
90
const actual = [aExtensionVersion('1.2.4', TargetPlatform.DARWIN_ARM64), aExtensionVersion('1.2.4', TargetPlatform.WIN32_ARM64), aExtensionVersion('1.2.4', TargetPlatform.LINUX_ARM64), aExtensionVersion('1.1.3'), aExtensionVersion('1.1.2'), aExtensionVersion('1.1.1')];
91
const expected = [actual[1], actual[0], actual[2], actual[3], actual[4], actual[5]];
92
sortExtensionVersions(actual, TargetPlatform.WIN32_ARM64);
93
assert.deepStrictEqual(actual, expected);
94
});
95
96
test('sorting multiple extension versions with target platforms - 2', async () => {
97
const actual = [aExtensionVersion('1.2.4'), aExtensionVersion('1.2.3', TargetPlatform.DARWIN_ARM64), aExtensionVersion('1.2.3', TargetPlatform.WIN32_ARM64), aExtensionVersion('1.2.3', TargetPlatform.LINUX_ARM64), aExtensionVersion('1.1.2'), aExtensionVersion('1.1.1')];
98
const expected = [actual[0], actual[3], actual[1], actual[2], actual[4], actual[5]];
99
sortExtensionVersions(actual, TargetPlatform.LINUX_ARM64);
100
assert.deepStrictEqual(actual, expected);
101
});
102
103
test('sorting multiple extension versions with target platforms - 3', async () => {
104
const actual = [aExtensionVersion('1.2.4'), aExtensionVersion('1.1.2'), aExtensionVersion('1.1.1'), aExtensionVersion('1.0.0', TargetPlatform.DARWIN_ARM64), aExtensionVersion('1.0.0', TargetPlatform.WIN32_ARM64)];
105
const expected = [actual[0], actual[1], actual[2], actual[4], actual[3]];
106
sortExtensionVersions(actual, TargetPlatform.WIN32_ARM64);
107
assert.deepStrictEqual(actual, expected);
108
});
109
110
function aExtensionVersion(version: string, targetPlatform?: TargetPlatform): IRawGalleryExtensionVersion {
111
return { version, targetPlatform } as IRawGalleryExtensionVersion;
112
}
113
});
114
115