From 3968f88c75c256e45d256a61313a1d92f4df6432 Mon Sep 17 00:00:00 2001 From: Manuel Date: Sun, 3 Apr 2022 11:28:31 +0200 Subject: [PATCH] Handle non available versions case --- .../distributors/corretto-installer.test.ts | 139 +++++++++++++++--- dist/setup/index.js | 75 +++++----- src/distributions/corretto/installer.ts | 44 ++++-- src/distributions/distribution-factory.ts | 4 +- 4 files changed, 191 insertions(+), 71 deletions(-) diff --git a/__tests__/distributors/corretto-installer.test.ts b/__tests__/distributors/corretto-installer.test.ts index e9bcdef6c..45d51aca8 100644 --- a/__tests__/distributors/corretto-installer.test.ts +++ b/__tests__/distributors/corretto-installer.test.ts @@ -1,6 +1,7 @@ import { HttpClient } from '@actions/http-client'; +import { JavaInstallerOptions } from '../../src/distributions/base-models'; -import { CorettoDistribution } from '../../src/distributions/corretto/installer'; +import { CorrettoDistribution } from '../../src/distributions/corretto/installer'; import * as util from '../../src/util'; const manifestData = require('../data/corretto.json') as []; @@ -17,7 +18,6 @@ describe('getAvailableVersions', () => { result: manifestData }); spyGetDownloadArchiveExtension = jest.spyOn(util, 'getDownloadArchiveExtension'); - spyGetDownloadArchiveExtension.mockReturnValue('tar.gz'); }); afterEach(() => { @@ -26,30 +26,127 @@ describe('getAvailableVersions', () => { jest.restoreAllMocks(); }); - it('load available versions', async () => { - const distribution = new CorettoDistribution({ - version: '11', - architecture: 'x64', - packageType: 'jdk', - checkLatest: false + describe('getAvailableVersions', () => { + it('load available versions', async () => { + const distribution = new CorrettoDistribution({ + version: '11', + architecture: 'x64', + packageType: 'jdk', + checkLatest: false + }); + mockPlatform(distribution, 'linux'); + + const availableVersions = await distribution['getAvailableVersions'](); + expect(availableVersions).not.toBeNull(); + expect(availableVersions.length).toBe(6); }); - distribution['getPlatformOption'] = () => 'linux'; - const availableVersions = await distribution['getAvailableVersions'](); - expect(availableVersions).not.toBeNull(); - expect(availableVersions.length).toBe(6); + it.each([ + [{ version: '16', architecture: 'x64', packageType: 'jdk', checkLatest: false }, 'macos', 6], + [{ version: '16', architecture: 'x86', packageType: 'jdk', checkLatest: false }, 'macos', 0], + [{ version: '16', architecture: 'x64', packageType: 'jre', checkLatest: false }, 'macos', 0], + [{ version: '16', architecture: 'x64', packageType: 'jdk', checkLatest: false }, 'linux', 6], + [ + { version: '18', architecture: 'x64', packageType: 'jdk', checkLatest: false }, + 'windows', + 6 + ], + [{ version: '18', architecture: 'x64', packageType: 'jre', checkLatest: false }, 'windows', 1] + ])( + 'fetch expected amount of available versions for %s', + async ( + installerOptions: JavaInstallerOptions, + platform: string, + expectedAmountOfAvailableVersions + ) => { + const distribution = new CorrettoDistribution(installerOptions); + mockPlatform(distribution, platform); + + const availableVersions = await distribution['getAvailableVersions'](); + expect(availableVersions).not.toBeNull(); + expect(availableVersions.length).toBe(expectedAmountOfAvailableVersions); + } + ); }); - it('find package for download', async () => { - const distribution = new CorettoDistribution({ - version: '15', - architecture: 'x64', - packageType: 'jdk', - checkLatest: false + describe('findPackageForDownload', () => { + it.each([ + [ + 'macos', + 'https://corretto.aws/downloads/resources/18.0.0.37.1/amazon-corretto-18.0.0.37.1-macosx-x64.tar.gz' + ], + [ + 'windows', + 'https://corretto.aws/downloads/resources/18.0.0.37.1/amazon-corretto-18.0.0.37.1-windows-x64-jdk.zip' + ], + [ + 'linux', + 'https://corretto.aws/downloads/resources/18.0.0.37.1/amazon-corretto-18.0.0.37.1-linux-x64.tar.gz' + ] + ])('for os: %s', async (platform: string, expectedLink: string) => { + const version = '18'; + const distribution = new CorrettoDistribution({ + version, + architecture: 'x64', + packageType: 'jdk', + checkLatest: false + }); + mockPlatform(distribution, platform); + + const availableVersion = await distribution['findPackageForDownload'](version); + expect(availableVersion).not.toBeNull(); + expect(availableVersion.url).toBe(expectedLink); + }); + + it('with unstable version expect to throw not supported error', async () => { + const version = '18.0.1-ea'; + const distribution = new CorrettoDistribution({ + version, + architecture: 'x64', + packageType: 'jdk', + checkLatest: false + }); + mockPlatform(distribution, 'linux'); + + await expect(distribution['findPackageForDownload'](version)).rejects.toThrowError( + 'Early access versions are not supported' + ); }); - distribution['getPlatformOption'] = () => 'linux'; - const availableVersion = await distribution['findPackageForDownload']('15'); - expect(availableVersion).not.toBeNull(); + it('with non major version expect to throw not supported error', async () => { + const version = '18.0.1'; + const distribution = new CorrettoDistribution({ + version, + architecture: 'x64', + packageType: 'jdk', + checkLatest: false + }); + mockPlatform(distribution, 'linux'); + + await expect(distribution['findPackageForDownload'](version)).rejects.toThrowError( + 'Only major versions are supported' + ); + }); + + it('with unfound version throw could not find error', async () => { + const version = '4'; + const distribution = new CorrettoDistribution({ + version, + architecture: 'x64', + packageType: 'jdk', + checkLatest: false + }); + mockPlatform(distribution, 'linux'); + + await expect(distribution['findPackageForDownload'](version)).rejects.toThrowError( + "Could not find satisfied version for SemVer '4'" + ); + }); }); + + const mockPlatform = (distributon: CorrettoDistribution, platform: string) => { + distributon['getPlatformOption'] = () => platform; + const mockedExtension = platform === 'windows' ? 'zip' : 'tar.gz'; + spyGetDownloadArchiveExtension.mockReturnValue(mockedExtension); + }; }); diff --git a/dist/setup/index.js b/dist/setup/index.js index a5bfc31e8..c97d9a334 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -56223,7 +56223,7 @@ function getJavaDistribution(distributionName, installerOptions, jdkFile) { case JavaDistribution.Microsoft: return new installer_6.MicrosoftDistributions(installerOptions); case JavaDistribution.Corretto: - return new installer_7.CorettoDistribution(installerOptions); + return new installer_7.CorrettoDistribution(installerOptions); default: return null; } @@ -99290,14 +99290,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.CorettoDistribution = void 0; +exports.CorrettoDistribution = void 0; const core = __importStar(__webpack_require__(470)); const tc = __importStar(__webpack_require__(186)); const fs_1 = __importDefault(__webpack_require__(747)); const path_1 = __importDefault(__webpack_require__(622)); const util_1 = __webpack_require__(322); const base_installer_1 = __webpack_require__(83); -class CorettoDistribution extends base_installer_1.JavaBase { +class CorrettoDistribution extends base_installer_1.JavaBase { constructor(installerOptions) { super('Corretto', installerOptions); } @@ -99343,48 +99343,57 @@ class CorettoDistribution extends base_installer_1.JavaBase { }); } getAvailableVersions() { + var _a, _b; return __awaiter(this, void 0, void 0, function* () { const platform = this.getPlatformOption(); const arch = this.architecture; const imageType = this.packageType; console.time('coretto-retrieve-available-versions'); const availableVersionsUrl = 'https://corretto.github.io/corretto-downloads/latest_links/indexmap_with_checksum.json'; - const fetchResult = yield this.http.getJson(availableVersionsUrl); - if (!fetchResult.result) { + const fetchCurrentVersions = yield this.http.getJson(availableVersionsUrl); + const fetchedCurrentVersions = fetchCurrentVersions.result; + if (!fetchedCurrentVersions) { throw Error(`Could not fetch latest corretto versions from ${availableVersionsUrl}`); } - const availableVersions = []; - const eligbleVersions = fetchResult.result[platform][arch][imageType]; - for (const version in eligbleVersions) { - const availableVersion = eligbleVersions[version]; - for (const fileType in availableVersion) { - const skipNonExtractableBinaries = fileType != util_1.getDownloadArchiveExtension(); - if (skipNonExtractableBinaries) { - continue; - } - const availableVersionDetails = availableVersion[fileType]; - const correttoVersion = this.getCorettoVersion(availableVersionDetails.resource); - availableVersions.push({ - checksum: availableVersionDetails.checksum, - checksum_sha256: availableVersionDetails.checksum_sha256, - fileType, - resource: availableVersionDetails.resource, - downloadLink: `https://corretto.aws${availableVersionDetails.resource}`, - version: version, - correttoVersion - }); - } - } + const eligbleVersions = (_b = (_a = fetchedCurrentVersions === null || fetchedCurrentVersions === void 0 ? void 0 : fetchedCurrentVersions[platform]) === null || _a === void 0 ? void 0 : _a[arch]) === null || _b === void 0 ? void 0 : _b[imageType]; + const availableVersions = this.getAvailableVersionsForPlatform(eligbleVersions); if (core.isDebug()) { - core.startGroup('Print information about available versions'); - console.timeEnd('coretto-retrieve-available-versions'); - console.log(`Available versions: [${availableVersions.length}]`); - console.log(availableVersions.map(item => `${item.version}: ${item.correttoVersion}`).join(', ')); - core.endGroup(); + this.printAvailableVersions(availableVersions); } return availableVersions; }); } + getAvailableVersionsForPlatform(eligbleVersions) { + const availableVersions = []; + for (const version in eligbleVersions) { + const availableVersion = eligbleVersions[version]; + for (const fileType in availableVersion) { + const skipNonExtractableBinaries = fileType != util_1.getDownloadArchiveExtension(); + if (skipNonExtractableBinaries) { + continue; + } + const availableVersionDetails = availableVersion[fileType]; + const correttoVersion = this.getCorettoVersion(availableVersionDetails.resource); + availableVersions.push({ + checksum: availableVersionDetails.checksum, + checksum_sha256: availableVersionDetails.checksum_sha256, + fileType, + resource: availableVersionDetails.resource, + downloadLink: `https://corretto.aws${availableVersionDetails.resource}`, + version: version, + correttoVersion + }); + } + } + return availableVersions; + } + printAvailableVersions(availableVersions) { + core.startGroup('Print information about available versions'); + console.timeEnd('coretto-retrieve-available-versions'); + console.log(`Available versions: [${availableVersions.length}]`); + console.log(availableVersions.map(item => `${item.version}: ${item.correttoVersion}`).join(', ')); + core.endGroup(); + } getPlatformOption() { // Coretto has its own platform names so we need to map them switch (process.platform) { @@ -99405,7 +99414,7 @@ class CorettoDistribution extends base_installer_1.JavaBase { return match[1]; } } -exports.CorettoDistribution = CorettoDistribution; +exports.CorrettoDistribution = CorrettoDistribution; /***/ }), diff --git a/src/distributions/corretto/installer.ts b/src/distributions/corretto/installer.ts index 421415bc8..207bf1649 100644 --- a/src/distributions/corretto/installer.ts +++ b/src/distributions/corretto/installer.ts @@ -7,7 +7,7 @@ import { JavaBase } from '../base-installer'; import { JavaDownloadRelease, JavaInstallerOptions, JavaInstallerResults } from '../base-models'; import { ICorrettoAllAvailableVersions, ICorettoAvailableVersions } from './models'; -export class CorettoDistribution extends JavaBase { +export class CorrettoDistribution extends JavaBase { constructor(installerOptions: JavaInstallerOptions) { super('Corretto', installerOptions); } @@ -75,14 +75,29 @@ export class CorettoDistribution extends JavaBase { const availableVersionsUrl = 'https://corretto.github.io/corretto-downloads/latest_links/indexmap_with_checksum.json'; - const fetchResult = await this.http.getJson( + const fetchCurrentVersions = await this.http.getJson( availableVersionsUrl ); - if (!fetchResult.result) { + const fetchedCurrentVersions = fetchCurrentVersions.result; + if (!fetchedCurrentVersions) { throw Error(`Could not fetch latest corretto versions from ${availableVersionsUrl}`); } + + const eligbleVersions = fetchedCurrentVersions?.[platform]?.[arch]?.[imageType]; + const availableVersions = this.getAvailableVersionsForPlatform(eligbleVersions); + + if (core.isDebug()) { + this.printAvailableVersions(availableVersions); + } + + return availableVersions; + } + + private getAvailableVersionsForPlatform( + eligbleVersions: ICorrettoAllAvailableVersions['os']['arch']['imageType'] | undefined + ): ICorettoAvailableVersions[] { const availableVersions: ICorettoAvailableVersions[] = []; - const eligbleVersions = fetchResult.result[platform][arch][imageType]; + for (const version in eligbleVersions) { const availableVersion = eligbleVersions[version]; for (const fileType in availableVersion) { @@ -104,20 +119,19 @@ export class CorettoDistribution extends JavaBase { }); } } - - if (core.isDebug()) { - core.startGroup('Print information about available versions'); - console.timeEnd('coretto-retrieve-available-versions'); - console.log(`Available versions: [${availableVersions.length}]`); - console.log( - availableVersions.map(item => `${item.version}: ${item.correttoVersion}`).join(', ') - ); - core.endGroup(); - } - return availableVersions; } + private printAvailableVersions(availableVersions: ICorettoAvailableVersions[]) { + core.startGroup('Print information about available versions'); + console.timeEnd('coretto-retrieve-available-versions'); + console.log(`Available versions: [${availableVersions.length}]`); + console.log( + availableVersions.map(item => `${item.version}: ${item.correttoVersion}`).join(', ') + ); + core.endGroup(); + } + private getPlatformOption(): string { // Coretto has its own platform names so we need to map them switch (process.platform) { diff --git a/src/distributions/distribution-factory.ts b/src/distributions/distribution-factory.ts index f146ce3bb..9e14a8044 100644 --- a/src/distributions/distribution-factory.ts +++ b/src/distributions/distribution-factory.ts @@ -6,7 +6,7 @@ import { AdoptDistribution, AdoptImplementation } from './adopt/installer'; import { TemurinDistribution, TemurinImplementation } from './temurin/installer'; import { LibericaDistributions } from './liberica/installer'; import { MicrosoftDistributions } from './microsoft/installer'; -import { CorettoDistribution } from './corretto/installer'; +import { CorrettoDistribution } from './corretto/installer'; enum JavaDistribution { Adopt = 'adopt', @@ -42,7 +42,7 @@ export function getJavaDistribution( case JavaDistribution.Microsoft: return new MicrosoftDistributions(installerOptions); case JavaDistribution.Corretto: - return new CorettoDistribution(installerOptions); + return new CorrettoDistribution(installerOptions); default: return null; }