Skip to content

Commit

Permalink
Handle non available versions case
Browse files Browse the repository at this point in the history
  • Loading branch information
WtfJoke committed Apr 3, 2022
1 parent 1520a4f commit 3968f88
Show file tree
Hide file tree
Showing 4 changed files with 191 additions and 71 deletions.
139 changes: 118 additions & 21 deletions __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 [];
Expand All @@ -17,7 +18,6 @@ describe('getAvailableVersions', () => {
result: manifestData
});
spyGetDownloadArchiveExtension = jest.spyOn(util, 'getDownloadArchiveExtension');
spyGetDownloadArchiveExtension.mockReturnValue('tar.gz');
});

afterEach(() => {
Expand All @@ -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);
};
});
75 changes: 42 additions & 33 deletions dist/setup/index.js
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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) {
Expand All @@ -99405,7 +99414,7 @@ class CorettoDistribution extends base_installer_1.JavaBase {
return match[1];
}
}
exports.CorettoDistribution = CorettoDistribution;
exports.CorrettoDistribution = CorrettoDistribution;


/***/ }),
Expand Down
44 changes: 29 additions & 15 deletions src/distributions/corretto/installer.ts
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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<ICorrettoAllAvailableVersions>(
const fetchCurrentVersions = await this.http.getJson<ICorrettoAllAvailableVersions>(
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) {
Expand All @@ -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) {
Expand Down
4 changes: 2 additions & 2 deletions src/distributions/distribution-factory.ts
Expand Up @@ -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',
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit 3968f88

Please sign in to comment.