Skip to content

Commit

Permalink
Add support for Adoptium OpenJDK
Browse files Browse the repository at this point in the history
  • Loading branch information
joschi committed Aug 1, 2021
1 parent ad01d13 commit 4a8552d
Show file tree
Hide file tree
Showing 7 changed files with 9,230 additions and 4 deletions.
14 changes: 13 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ This action provides the following functionality for GitHub Actions runners:
- Registering problem matchers for error output

## V2 vs V1
- V2 supports custom distributions and provides support for Zulu OpenJDK and Adopt OpenJDK out of the box. V1 supports only Zulu OpenJDK
- V2 supports custom distributions and provides support for Zulu OpenJDK, Adopt OpenJDK and Adoptium OpenJDK out of the box. V1 supports only Zulu OpenJDK
- V2 requires you to specify distribution along with the version. V1 defaults to Zulu OpenJDK, only version input is required. Follow [the migration guide](docs/switching-to-v2.md) to switch from V1 to V2

## Usage
Expand All @@ -31,6 +31,17 @@ steps:
- run: java -cp java HelloWorldApp
```
**Adoptium OpenJDK**
```yaml
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v2
with:
distribution: 'adoptium' # See 'Supported distributions' for available options
java-version: '8'
- run: java -cp java HelloWorldApp
```
**Zulu OpenJDK**
```yaml
steps:
Expand All @@ -55,6 +66,7 @@ Currently, the following distributions are supported:
| `zulu` | Zulu OpenJDK | [Link](https://www.azul.com/downloads/zulu-community/?package=jdk) | [Link](https://www.azul.com/products/zulu-and-zulu-enterprise/zulu-terms-of-use/) |
| `adopt` or `adopt-hotspot` | Adopt OpenJDK Hotspot | [Link](https://adoptopenjdk.net/) | [Link](https://adoptopenjdk.net/about.html)
| `adopt-openj9` | Adopt OpenJDK OpenJ9 | [Link](https://adoptopenjdk.net/) | [Link](https://adoptopenjdk.net/about.html)
| `adoptium` or `adoptium-hotspot` | Adoptium OpenJDK Hotspot | [Link](https://adoptium.net/) | [Link](https://adoptium.net/about.html)

**NOTE:** The different distributors can provide discrepant list of available versions / supported configurations. Please refer to the official documentation to see the list of supported versions.

Expand Down
2,566 changes: 2,566 additions & 0 deletions __tests__/data/adoptium.json

Large diffs are not rendered by default.

164 changes: 164 additions & 0 deletions __tests__/distributors/adoptium-installer.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
import { HttpClient } from '@actions/http-client';

import {
AdoptiumDistribution,
AdoptiumImplementation
} from '../../src/distributions/adoptium/installer';
import { JavaInstallerOptions } from '../../src/distributions/base-models';

let manifestData = require('../data/adoptium.json') as [];

describe('getAvailableVersions', () => {
let spyHttpClient: jest.SpyInstance;

beforeEach(() => {
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
spyHttpClient.mockReturnValue({
statusCode: 200,
headers: {},
result: []
});
});

afterEach(() => {
jest.resetAllMocks();
jest.clearAllMocks();
jest.restoreAllMocks();
});

it.each([
[
{ version: '16', architecture: 'x64', packageType: 'jdk', checkLatest: false },
AdoptiumImplementation.Hotspot,
'os=mac&architecture=x64&image_type=jdk&release_type=ga&jvm_impl=hotspot&page_size=20&page=0'
],
[
{ version: '16', architecture: 'x86', packageType: 'jdk', checkLatest: false },
AdoptiumImplementation.Hotspot,
'os=mac&architecture=x86&image_type=jdk&release_type=ga&jvm_impl=hotspot&page_size=20&page=0'
],
[
{ version: '16', architecture: 'x64', packageType: 'jre', checkLatest: false },
AdoptiumImplementation.Hotspot,
'os=mac&architecture=x64&image_type=jre&release_type=ga&jvm_impl=hotspot&page_size=20&page=0'
],
[
{ version: '16-ea', architecture: 'x64', packageType: 'jdk', checkLatest: false },
AdoptiumImplementation.Hotspot,
'os=mac&architecture=x64&image_type=jdk&release_type=ea&jvm_impl=hotspot&page_size=20&page=0'
]
])(
'build correct url for %s',
async (
installerOptions: JavaInstallerOptions,
impl: AdoptiumImplementation,
expectedParameters
) => {
const distribution = new AdoptiumDistribution(installerOptions, impl);
const baseUrl = 'https://api.adoptium.net/v3/assets/version/%5B1.0,100.0%5D';
const expectedUrl = `${baseUrl}?project=jdk&vendor=adoptium&heap_size=normal&sort_method=DEFAULT&sort_order=DESC&${expectedParameters}`;
distribution['getPlatformOption'] = () => 'mac';

await distribution['getAvailableVersions']();

expect(spyHttpClient.mock.calls).toHaveLength(1);
expect(spyHttpClient.mock.calls[0][0]).toBe(expectedUrl);
}
);

it('load available versions', async () => {
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
spyHttpClient
.mockReturnValueOnce({
statusCode: 200,
headers: {},
result: manifestData
})
.mockReturnValueOnce({
statusCode: 200,
headers: {},
result: manifestData
})
.mockReturnValueOnce({
statusCode: 200,
headers: {},
result: []
});

const distribution = new AdoptiumDistribution(
{ version: '8', architecture: 'x64', packageType: 'jdk', checkLatest: false },
AdoptiumImplementation.Hotspot
);
const availableVersions = await distribution['getAvailableVersions']();
expect(availableVersions).not.toBeNull();
expect(availableVersions.length).toBe(manifestData.length * 2);
});

it.each([
[AdoptiumImplementation.Hotspot, 'jdk', 'Java_Adoptium-Hotspot_jdk'],
[AdoptiumImplementation.Hotspot, 'jre', 'Java_Adoptium-Hotspot_jre']
])(
'find right toolchain folder',
(impl: AdoptiumImplementation, packageType: string, expected: string) => {
const distribution = new AdoptiumDistribution(
{ version: '8', architecture: 'x64', packageType: packageType, checkLatest: false },
impl
);

// @ts-ignore - because it is protected
expect(distribution.toolcacheFolderName).toBe(expected);
}
);
});

describe('findPackageForDownload', () => {
it.each([
['8', '8.0.302+8'],
['16', '16.0.2+7'],
['16.0', '16.0.2+7'],
['16.0.2', '16.0.2+7'],
['8.x', '8.0.302+8'],
['x', '16.0.2+7']
])('version is resolved correctly %s -> %s', async (input, expected) => {
const distribution = new AdoptiumDistribution(
{ version: '8', architecture: 'x64', packageType: 'jdk', checkLatest: false },
AdoptiumImplementation.Hotspot
);
distribution['getAvailableVersions'] = async () => manifestData;
const resolvedVersion = await distribution['findPackageForDownload'](input);
expect(resolvedVersion.version).toBe(expected);
});

it('version is found but binaries list is empty', async () => {
const distribution = new AdoptiumDistribution(
{ version: '9.0.8', architecture: 'x64', packageType: 'jdk', checkLatest: false },
AdoptiumImplementation.Hotspot
);
distribution['getAvailableVersions'] = async () => manifestData;
await expect(distribution['findPackageForDownload']('9.0.8')).rejects.toThrowError(
/Could not find satisfied version for SemVer */
);
});

it('version is not found', async () => {
const distribution = new AdoptiumDistribution(
{ version: '7.x', architecture: 'x64', packageType: 'jdk', checkLatest: false },
AdoptiumImplementation.Hotspot
);
distribution['getAvailableVersions'] = async () => manifestData;
await expect(distribution['findPackageForDownload']('7.x')).rejects.toThrowError(
/Could not find satisfied version for SemVer */
);
});

it('version list is empty', async () => {
const distribution = new AdoptiumDistribution(
{ version: '8', architecture: 'x64', packageType: 'jdk', checkLatest: false },
AdoptiumImplementation.Hotspot
);
distribution['getAvailableVersions'] = async () => [];
await expect(distribution['findPackageForDownload']('8')).rejects.toThrowError(
/Could not find satisfied version for SemVer */
);
});
});
Loading

0 comments on commit 4a8552d

Please sign in to comment.