Path: blob/main/src/vs/platform/extensionManagement/test/common/extensionGalleryService.test.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { joinPath } from '../../../../base/common/resources.js';7import { URI } from '../../../../base/common/uri.js';8import { isUUID } from '../../../../base/common/uuid.js';9import { mock } from '../../../../base/test/common/mock.js';10import { IConfigurationService } from '../../../configuration/common/configuration.js';11import { TestConfigurationService } from '../../../configuration/test/common/testConfigurationService.js';12import { IEnvironmentService } from '../../../environment/common/environment.js';13import { IRawGalleryExtensionVersion, sortExtensionVersions } from '../../common/extensionGalleryService.js';14import { IFileService } from '../../../files/common/files.js';15import { FileService } from '../../../files/common/fileService.js';16import { InMemoryFileSystemProvider } from '../../../files/common/inMemoryFilesystemProvider.js';17import { NullLogService } from '../../../log/common/log.js';18import product from '../../../product/common/product.js';19import { IProductService } from '../../../product/common/productService.js';20import { resolveMarketplaceHeaders } from '../../../externalServices/common/marketplace.js';21import { InMemoryStorageService, IStorageService } from '../../../storage/common/storage.js';22import { TelemetryConfiguration, TELEMETRY_SETTING_ID } from '../../../telemetry/common/telemetry.js';23import { TargetPlatform } from '../../../extensions/common/extensions.js';24import { NullTelemetryService } from '../../../telemetry/common/telemetryUtils.js';25import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';2627class EnvironmentServiceMock extends mock<IEnvironmentService>() {28override readonly serviceMachineIdResource: URI;29constructor(serviceMachineIdResource: URI) {30super();31this.serviceMachineIdResource = serviceMachineIdResource;32this.isBuilt = true;33}34}3536suite('Extension Gallery Service', () => {37const disposables = ensureNoDisposablesAreLeakedInTestSuite();38let fileService: IFileService, environmentService: IEnvironmentService, storageService: IStorageService, productService: IProductService, configurationService: IConfigurationService;3940setup(() => {41const serviceMachineIdResource = joinPath(URI.file('tests').with({ scheme: 'vscode-tests' }), 'machineid');42environmentService = new EnvironmentServiceMock(serviceMachineIdResource);43fileService = disposables.add(new FileService(new NullLogService()));44const fileSystemProvider = disposables.add(new InMemoryFileSystemProvider());45disposables.add(fileService.registerProvider(serviceMachineIdResource.scheme, fileSystemProvider));46storageService = disposables.add(new InMemoryStorageService());47configurationService = new TestConfigurationService({ [TELEMETRY_SETTING_ID]: TelemetryConfiguration.ON });48configurationService.updateValue(TELEMETRY_SETTING_ID, TelemetryConfiguration.ON);49productService = { _serviceBrand: undefined, ...product, enableTelemetry: true };50});5152test('marketplace machine id', async () => {53const headers = await resolveMarketplaceHeaders(product.version, productService, environmentService, configurationService, fileService, storageService, NullTelemetryService);54assert.ok(headers['X-Market-User-Id']);55assert.ok(isUUID(headers['X-Market-User-Id']));56const headers2 = await resolveMarketplaceHeaders(product.version, productService, environmentService, configurationService, fileService, storageService, NullTelemetryService);57assert.strictEqual(headers['X-Market-User-Id'], headers2['X-Market-User-Id']);58});5960test('sorting single extension version without target platform', async () => {61const actual = [aExtensionVersion('1.1.2')];62const expected = [...actual];63sortExtensionVersions(actual, TargetPlatform.DARWIN_X64);64assert.deepStrictEqual(actual, expected);65});6667test('sorting single extension version with preferred target platform', async () => {68const actual = [aExtensionVersion('1.1.2', TargetPlatform.DARWIN_X64)];69const expected = [...actual];70sortExtensionVersions(actual, TargetPlatform.DARWIN_X64);71assert.deepStrictEqual(actual, expected);72});7374test('sorting single extension version with not compatible target platform', async () => {75const actual = [aExtensionVersion('1.1.2', TargetPlatform.DARWIN_ARM64)];76const expected = [...actual];77sortExtensionVersions(actual, TargetPlatform.WIN32_X64);78assert.deepStrictEqual(actual, expected);79});8081test('sorting multiple extension versions without target platforms', async () => {82const actual = [aExtensionVersion('1.2.4'), aExtensionVersion('1.1.3'), aExtensionVersion('1.1.2'), aExtensionVersion('1.1.1')];83const expected = [...actual];84sortExtensionVersions(actual, TargetPlatform.WIN32_ARM64);85assert.deepStrictEqual(actual, expected);86});8788test('sorting multiple extension versions with target platforms - 1', async () => {89const 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')];90const expected = [actual[1], actual[0], actual[2], actual[3], actual[4], actual[5]];91sortExtensionVersions(actual, TargetPlatform.WIN32_ARM64);92assert.deepStrictEqual(actual, expected);93});9495test('sorting multiple extension versions with target platforms - 2', async () => {96const 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')];97const expected = [actual[0], actual[3], actual[1], actual[2], actual[4], actual[5]];98sortExtensionVersions(actual, TargetPlatform.LINUX_ARM64);99assert.deepStrictEqual(actual, expected);100});101102test('sorting multiple extension versions with target platforms - 3', async () => {103const 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)];104const expected = [actual[0], actual[1], actual[2], actual[4], actual[3]];105sortExtensionVersions(actual, TargetPlatform.WIN32_ARM64);106assert.deepStrictEqual(actual, expected);107});108109function aExtensionVersion(version: string, targetPlatform?: TargetPlatform): IRawGalleryExtensionVersion {110return { version, targetPlatform } as IRawGalleryExtensionVersion;111}112});113114115