diff --git a/__tests__/mandrel.test.ts b/__tests__/mandrel.test.ts new file mode 100644 index 0000000..368eae9 --- /dev/null +++ b/__tests__/mandrel.test.ts @@ -0,0 +1,56 @@ +import * as path from 'path' +import * as mandrel from '../src/mandrel' +import {expect, test} from '@jest/globals' +import {getLatestRelease} from '../src/utils' + +process.env['RUNNER_TOOL_CACHE'] = path.join(__dirname, 'TOOL_CACHE') +process.env['RUNNER_TEMP'] = path.join(__dirname, 'TEMP') + +test('request invalid version/javaVersion combination', async () => { + for (var combination of [ + ['mandrel-23.1.1.0-Final', '17'], + ['mandrel-23.0.2.1-Final', '21'], + ]) { + let error = new Error('unexpected') + try { + await mandrel.setUpMandrel(combination[0], combination[1]) + } catch (err) { + if (!(err instanceof Error)) { + fail(`Unexpected non-Error: ${err}`) + } + error = err + } + + expect(error).not.toBeUndefined() + expect(error.message).toContain('Failed to download') + expect(error.message).toContain('Are you sure version') + } +}) +test('request invalid version', async () => { + for (var combination of [ + ['mandrel-23.1.1.0', '21'], + ['mandrel-23.0.2.1', '17'], + ]) { + let error = new Error('unexpected') + try { + await mandrel.setUpMandrel(combination[0], combination[1]) + } catch (err) { + if (!(err instanceof Error)) { + fail(`Unexpected non-Error: ${err}`) + } + error = err + } + + expect(error).not.toBeUndefined() + expect(error.message).toContain('Failed to download') + expect(error.message).toContain('Are you sure version') + } +}) + +test('find latest', async () => { + // Make sure the action can find the latest Mandrel release + const latestRelease = await getLatestRelease(mandrel.MANDREL_REPO) + const tag_name = latestRelease.tag_name + expect(tag_name).toContain(mandrel.MANDREL_TAG_PREFIX) +}) + diff --git a/src/mandrel.ts b/src/mandrel.ts index 7c015f8..ebd39fc 100644 --- a/src/mandrel.ts +++ b/src/mandrel.ts @@ -1,9 +1,10 @@ import * as c from './constants' import {downloadExtractAndCacheJDK, getLatestRelease} from './utils' import {downloadTool} from '@actions/tool-cache' +import {basename} from 'path' -const MANDREL_REPO = 'mandrel' -const MANDREL_TAG_PREFIX = c.MANDREL_NAMESPACE +export const MANDREL_REPO = 'mandrel' +export const MANDREL_TAG_PREFIX = c.MANDREL_NAMESPACE const MANDREL_DL_BASE = 'https://github.com/graalvm/mandrel/releases/download' export async function setUpMandrel( @@ -45,16 +46,37 @@ async function setUpMandrelRelease( version: string, javaVersion: string ): Promise { - const identifier = determineMandrelIdentifier(version, javaVersion) - const downloadUrl = `${MANDREL_DL_BASE}/${MANDREL_TAG_PREFIX}${version}/${identifier}${c.GRAALVM_FILE_EXTENSION}` const toolName = determineToolName(javaVersion) return downloadExtractAndCacheJDK( - async () => downloadTool(downloadUrl), + async () => downloadMandrelJDK(version, javaVersion), toolName, version ) } +async function downloadMandrelJDK( + version: string, + javaVersion: string +): Promise { + const identifier = determineMandrelIdentifier(version, javaVersion) + const downloadUrl = `${MANDREL_DL_BASE}/${MANDREL_TAG_PREFIX}${version}/${identifier}${c.GRAALVM_FILE_EXTENSION}` + try { + return await downloadTool(downloadUrl) + } catch (error) { + if (error instanceof Error && error.message.includes('404')) { + // Not Found + throw new Error( + `Failed to download ${basename( + downloadUrl + )}. Are you sure version: '${version}' and java-version: '${javaVersion}' are correct?` + ) + } + throw new Error( + `Failed to download ${basename(downloadUrl)} (error: ${error}).` + ) + } +} + function determineMandrelIdentifier( version: string, javaVersion: string