mirror of
https://github.com/actions/setup-java.git
synced 2026-06-27 15:37:57 +00:00
Compare commits
62 Commits
5398d30241
...
9fb63696bc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9fb63696bc | ||
|
|
2e8dabe420 | ||
|
|
453087a25c | ||
|
|
c913721a14 | ||
|
|
45620929c5 | ||
|
|
6323dcf952 | ||
|
|
1411ef367b | ||
|
|
b622de1dfa | ||
|
|
c76542e033 | ||
|
|
0756542bc5 | ||
|
|
1d018f9b8b | ||
|
|
fe779bf55e | ||
|
|
be666c2fcd | ||
|
|
f7a6fefba9 | ||
|
|
d81c4e45f3 | ||
|
|
1b1bbe1085 | ||
|
|
5d7b214633 | ||
|
|
f2beeb24e1 | ||
|
|
4e7e684fbb | ||
|
|
46c56d6f92 | ||
|
|
66b945764b | ||
|
|
6ba5449b7d | ||
|
|
de5a937a1d | ||
|
|
ead9eaa3cf | ||
|
|
8c57fa3627 | ||
|
|
a7ab372554 | ||
|
|
d0351b4837 | ||
|
|
dded088883 | ||
|
|
0913e9a06e | ||
|
|
e9343db97e | ||
|
|
ae2b61dbc6 | ||
|
|
c190c18feb | ||
|
|
67aec007b3 | ||
|
|
ebb356cc4e | ||
|
|
f4f1212c88 | ||
|
|
c5195efecf | ||
|
|
dd38875f93 | ||
|
|
148017a9b0 | ||
|
|
3b6c050358 | ||
|
|
b8ebb8ba1d | ||
|
|
799ee7c97e | ||
|
|
3a4f6e1af5 | ||
|
|
25f376e348 | ||
|
|
d4e4b6bbc1 | ||
|
|
28b532bcb3 | ||
|
|
51ab6d2e30 | ||
|
|
99d3141d9b | ||
|
|
7a6d8a8234 | ||
|
|
7136edc5e8 | ||
|
|
8df1039502 | ||
|
|
870c199c48 | ||
|
|
83a06ff9d9 | ||
|
|
292cc14be8 | ||
|
|
b36c23c0d9 | ||
|
|
40b9536ce5 | ||
|
|
0a40ce6f61 | ||
|
|
68b1d5a3da | ||
|
|
bcfbca5b71 | ||
|
|
78eae7945c | ||
|
|
2dfa2011c5 | ||
|
|
7467385c61 | ||
|
|
8e04ddff28 |
22
.github/dependabot.yml
vendored
Normal file
22
.github/dependabot.yml
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# package ecosystems to update and where the package manifests are located.
|
||||
# Please see the documentation for all configuration options:
|
||||
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
# Enable version updates for npm
|
||||
- package-ecosystem: 'npm'
|
||||
# Look for `package.json` and `lock` files in the `root` directory
|
||||
directory: '/'
|
||||
# Check the npm registry for updates every day (weekdays)
|
||||
schedule:
|
||||
interval: 'weekly'
|
||||
|
||||
# Enable version updates for GitHub Actions
|
||||
- package-ecosystem: 'github-actions'
|
||||
# Workflow files stored in the default location of `.github/workflows`
|
||||
# You don't need to specify `/.github/workflows` for `directory`. You can use `directory: "/"`.
|
||||
directory: '/'
|
||||
schedule:
|
||||
interval: 'weekly'
|
||||
2
.github/workflows/basic-validation.yml
vendored
2
.github/workflows/basic-validation.yml
vendored
@ -16,4 +16,4 @@ jobs:
|
||||
name: Basic validation
|
||||
uses: actions/reusable-workflows/.github/workflows/basic-validation.yml@main
|
||||
with:
|
||||
node-version: '20.x'
|
||||
node-version: '24.x'
|
||||
|
||||
2
.github/workflows/check-dist.yml
vendored
2
.github/workflows/check-dist.yml
vendored
@ -16,4 +16,4 @@ jobs:
|
||||
name: Check dist/
|
||||
uses: actions/reusable-workflows/.github/workflows/check-dist.yml@main
|
||||
with:
|
||||
node-version: '20.x'
|
||||
node-version: '24.x'
|
||||
|
||||
@ -24,13 +24,13 @@ jobs:
|
||||
os: [macos-latest, windows-latest, ubuntu-latest]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Run setup-java with the cache for gradle
|
||||
uses: ./
|
||||
id: setup-java
|
||||
with:
|
||||
distribution: 'adopt'
|
||||
java-version: '11'
|
||||
java-version: '17'
|
||||
cache: gradle
|
||||
cache-dependency-path: __tests__/cache/gradle1/*.gradle*
|
||||
- name: Create files to cache
|
||||
@ -51,7 +51,7 @@ jobs:
|
||||
needs: gradle1-save
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Run setup-java with the cache for gradle
|
||||
uses: ./
|
||||
id: setup-java
|
||||
@ -76,7 +76,7 @@ jobs:
|
||||
needs: gradle1-save
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Run setup-java with the cache for gradle
|
||||
uses: ./
|
||||
id: setup-java
|
||||
|
||||
32
.github/workflows/e2e-cache.yml
vendored
32
.github/workflows/e2e-cache.yml
vendored
@ -21,16 +21,16 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-13, windows-latest, ubuntu-latest]
|
||||
os: [macos-15-intel, windows-latest, ubuntu-latest]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Run setup-java with the cache for gradle
|
||||
uses: ./
|
||||
id: setup-java
|
||||
with:
|
||||
distribution: 'adopt'
|
||||
java-version: '11'
|
||||
java-version: '17'
|
||||
cache: gradle
|
||||
- name: Create files to cache
|
||||
# Need to avoid using Gradle daemon to stabilize the save process on Windows
|
||||
@ -46,11 +46,11 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-13, windows-latest, ubuntu-latest]
|
||||
os: [macos-15-intel, windows-latest, ubuntu-latest]
|
||||
needs: gradle-save
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Run setup-java with the cache for gradle
|
||||
uses: ./
|
||||
id: setup-java
|
||||
@ -70,10 +70,10 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-13, windows-latest, ubuntu-latest]
|
||||
os: [macos-15-intel, windows-latest, ubuntu-latest]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Run setup-java with the cache for maven
|
||||
uses: ./
|
||||
id: setup-java
|
||||
@ -93,11 +93,11 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-13, windows-latest, ubuntu-latest]
|
||||
os: [macos-15-intel, windows-latest, ubuntu-latest]
|
||||
needs: maven-save
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Run setup-java with the cache for maven
|
||||
uses: ./
|
||||
id: setup-java
|
||||
@ -121,10 +121,10 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-13, windows-latest, ubuntu-latest]
|
||||
os: [macos-15-intel, windows-latest, ubuntu-22.04]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Run setup-java with the cache for sbt
|
||||
uses: ./
|
||||
id: setup-java
|
||||
@ -133,7 +133,7 @@ jobs:
|
||||
java-version: '11'
|
||||
cache: sbt
|
||||
- name: Setup SBT
|
||||
if: matrix.os == 'macos-13'
|
||||
if: matrix.os == 'macos-15-intel'
|
||||
run: |
|
||||
echo ""Installing SBT...""
|
||||
brew install sbt
|
||||
@ -141,7 +141,7 @@ jobs:
|
||||
run: sbt update
|
||||
|
||||
- name: Check files to cache on macos-latest
|
||||
if: matrix.os == 'macos-13'
|
||||
if: matrix.os == 'macos-15-intel'
|
||||
run: |
|
||||
if [ ! -d ~/Library/Caches/Coursier ]; then
|
||||
echo "::error::The ~/Library/Caches/Coursier directory does not exist unexpectedly"
|
||||
@ -170,11 +170,11 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-13, windows-latest, ubuntu-latest]
|
||||
os: [macos-15-intel, windows-latest, ubuntu-22.04]
|
||||
needs: sbt-save
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Run setup-java with the cache for sbt
|
||||
uses: ./
|
||||
id: setup-java
|
||||
@ -184,7 +184,7 @@ jobs:
|
||||
cache: sbt
|
||||
|
||||
- name: Confirm that ~/Library/Caches/Coursier directory has been made
|
||||
if: matrix.os == 'macos-13'
|
||||
if: matrix.os == 'macos-15-intel'
|
||||
run: |
|
||||
if [ ! -d ~/Library/Caches/Coursier ]; then
|
||||
echo "::error::The ~/Library/Caches/Coursier directory does not exist unexpectedly"
|
||||
|
||||
6
.github/workflows/e2e-local-file.yml
vendored
6
.github/workflows/e2e-local-file.yml
vendored
@ -21,7 +21,7 @@ jobs:
|
||||
os: [macos-latest, windows-latest, ubuntu-latest]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Download Adopt OpenJDK file
|
||||
run: |
|
||||
if ($IsLinux) {
|
||||
@ -58,7 +58,7 @@ jobs:
|
||||
os: [macos-latest, windows-latest, ubuntu-latest]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Download Zulu OpenJDK file
|
||||
run: |
|
||||
if ($IsLinux) {
|
||||
@ -95,7 +95,7 @@ jobs:
|
||||
os: [macos-latest, windows-latest, ubuntu-latest]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Download Eclipse Temurin file
|
||||
run: |
|
||||
if ($IsLinux) {
|
||||
|
||||
8
.github/workflows/e2e-publishing.yml
vendored
8
.github/workflows/e2e-publishing.yml
vendored
@ -25,7 +25,7 @@ jobs:
|
||||
os: [macos-latest, windows-latest, ubuntu-latest]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: setup-java
|
||||
uses: ./
|
||||
id: setup-java
|
||||
@ -60,7 +60,7 @@ jobs:
|
||||
os: [macos-latest, windows-latest, ubuntu-latest]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Create fake settings.xml
|
||||
run: |
|
||||
$xmlDirectory = Join-Path $HOME ".m2"
|
||||
@ -96,7 +96,7 @@ jobs:
|
||||
os: [macos-latest, windows-latest, ubuntu-latest]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Create fake settings.xml
|
||||
run: |
|
||||
$xmlDirectory = Join-Path $HOME ".m2"
|
||||
@ -133,7 +133,7 @@ jobs:
|
||||
os: [macos-latest, windows-latest, ubuntu-latest]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: setup-java
|
||||
uses: ./
|
||||
id: setup-java
|
||||
|
||||
189
.github/workflows/e2e-versions.yml
vendored
189
.github/workflows/e2e-versions.yml
vendored
@ -20,7 +20,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-13, windows-latest, ubuntu-latest]
|
||||
os: [macos-15-intel, windows-latest, ubuntu-latest]
|
||||
distribution: [
|
||||
'temurin',
|
||||
'adopt',
|
||||
@ -30,34 +30,58 @@ jobs:
|
||||
'microsoft',
|
||||
'semeru',
|
||||
'corretto',
|
||||
'dragonwell'
|
||||
'dragonwell',
|
||||
'sapmachine',
|
||||
'jetbrains'
|
||||
] # internally 'adopt-hotspot' is the same as 'adopt'
|
||||
version: ['21', '11', '17']
|
||||
exclude:
|
||||
- distribution: microsoft
|
||||
version: 8
|
||||
- distribution: dragonwell
|
||||
os: macos-13
|
||||
os: macos-15-intel
|
||||
include:
|
||||
- distribution: microsoft
|
||||
os: windows-latest
|
||||
version: 25
|
||||
- distribution: microsoft
|
||||
os: ubuntu-latest
|
||||
version: 25
|
||||
- distribution: microsoft
|
||||
os: macos-latest
|
||||
version: 25
|
||||
- distribution: oracle
|
||||
os: macos-13
|
||||
os: macos-15-intel
|
||||
version: 17
|
||||
- distribution: oracle
|
||||
os: windows-latest
|
||||
version: 20
|
||||
version: 21
|
||||
- distribution: oracle
|
||||
os: ubuntu-latest
|
||||
version: 20
|
||||
|
||||
version: 21
|
||||
- distribution: graalvm
|
||||
os: macos-latest
|
||||
version: 17.0.12
|
||||
- distribution: graalvm
|
||||
os: windows-latest
|
||||
version: 21
|
||||
- distribution: graalvm
|
||||
os: ubuntu-latest
|
||||
version: 21
|
||||
- distribution: graalvm
|
||||
os: ubuntu-latest
|
||||
version: '24-ea'
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: setup-java
|
||||
uses: ./
|
||||
id: setup-java
|
||||
with:
|
||||
java-version: ${{ matrix.version }}
|
||||
distribution: ${{ matrix.distribution }}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Verify Java
|
||||
run: bash __tests__/verify-java.sh "${{ matrix.version }}" "${{ steps.setup-java.outputs.path }}"
|
||||
shell: bash
|
||||
@ -75,7 +99,7 @@ jobs:
|
||||
version: ['21', '17']
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Install bash
|
||||
run: apk add --no-cache bash
|
||||
- name: setup-java
|
||||
@ -104,16 +128,28 @@ jobs:
|
||||
include:
|
||||
- distribution: oracle
|
||||
os: ubuntu-latest
|
||||
version: '20.0.1'
|
||||
version: '21.0.4'
|
||||
- distribution: graalvm
|
||||
os: ubuntu-latest
|
||||
version: '21.0.4'
|
||||
- distribution: dragonwell
|
||||
os: ubuntu-latest
|
||||
version: '11.0'
|
||||
- distribution: dragonwell
|
||||
os: ubuntu-latest
|
||||
version: '11.0.13+9'
|
||||
- distribution: sapmachine
|
||||
os: ubuntu-latest
|
||||
version: '17.0.7'
|
||||
- distribution: jetbrains
|
||||
os: ubuntu-latest
|
||||
version: '11.0.11'
|
||||
- distribution: jetbrains
|
||||
os: ubuntu-latest
|
||||
version: '17.0.7'
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: setup-java
|
||||
uses: ./
|
||||
id: setup-java
|
||||
@ -123,6 +159,8 @@ jobs:
|
||||
- name: Verify Java
|
||||
run: bash __tests__/verify-java.sh "${{ matrix.version }}" "${{ steps.setup-java.outputs.path }}"
|
||||
shell: bash
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
setup-java-check-latest:
|
||||
name: ${{ matrix.distribution }} ${{ matrix.version }} - check-latest flag - ${{ matrix.os }}
|
||||
@ -132,13 +170,21 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-latest, windows-latest, ubuntu-latest]
|
||||
distribution: ['temurin', 'zulu', 'liberica', 'dragonwell']
|
||||
distribution:
|
||||
[
|
||||
'temurin',
|
||||
'zulu',
|
||||
'liberica',
|
||||
'dragonwell',
|
||||
'sapmachine',
|
||||
'jetbrains'
|
||||
]
|
||||
exclude:
|
||||
- distribution: dragonwell
|
||||
os: macos-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: setup-java
|
||||
uses: ./
|
||||
id: setup-java
|
||||
@ -146,6 +192,8 @@ jobs:
|
||||
distribution: ${{ matrix.distribution }}
|
||||
java-version: 11
|
||||
check-latest: true
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Verify Java
|
||||
run: bash __tests__/verify-java.sh "11" "${{ steps.setup-java.outputs.path }}"
|
||||
shell: bash
|
||||
@ -158,13 +206,21 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-latest, windows-latest, ubuntu-latest]
|
||||
distribution: ['temurin', 'zulu', 'liberica', 'dragonwell']
|
||||
distribution:
|
||||
[
|
||||
'temurin',
|
||||
'zulu',
|
||||
'liberica',
|
||||
'dragonwell',
|
||||
'sapmachine',
|
||||
'jetbrains'
|
||||
]
|
||||
exclude:
|
||||
- distribution: dragonwell
|
||||
os: macos-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: setup-java
|
||||
uses: ./
|
||||
id: setup-java
|
||||
@ -173,6 +229,8 @@ jobs:
|
||||
java-version: |
|
||||
11
|
||||
17
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Verify Java env variables
|
||||
run: |
|
||||
$versionsArr = "11","17"
|
||||
@ -180,10 +238,10 @@ jobs:
|
||||
{
|
||||
$envName = "JAVA_HOME_${version}_${env:RUNNER_ARCH}"
|
||||
$JavaVersionPath = [Environment]::GetEnvironmentVariable($envName)
|
||||
if (-not (Test-Path "$JavaVersionPath")) {
|
||||
if (-not (Test-Path "$JavaVersionPath")) {
|
||||
Write-Host "$envName is not found"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
}
|
||||
shell: pwsh
|
||||
- name: Verify Java
|
||||
@ -197,11 +255,11 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-13, windows-latest, ubuntu-latest]
|
||||
os: [macos-15-intel, windows-latest, ubuntu-latest]
|
||||
version: ['17-ea', '15.0.0-ea.14']
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: setup-java
|
||||
uses: ./
|
||||
id: setup-java
|
||||
@ -223,7 +281,7 @@ jobs:
|
||||
version: ['17-ea']
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: setup-java
|
||||
uses: ./
|
||||
id: setup-java
|
||||
@ -234,6 +292,28 @@ jobs:
|
||||
run: bash __tests__/verify-java.sh "${{ matrix.version }}" "${{ steps.setup-java.outputs.path }}"
|
||||
shell: bash
|
||||
|
||||
setup-java-ea-versions-sapmachine:
|
||||
name: sapmachine ${{ matrix.version }} (jdk-x64) - ${{ matrix.os }}
|
||||
needs: setup-java-major-minor-versions
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-latest, windows-latest, ubuntu-latest]
|
||||
version: ['17-ea', '21-ea']
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
- name: setup-java
|
||||
uses: ./
|
||||
id: setup-java
|
||||
with:
|
||||
java-version: ${{ matrix.version }}
|
||||
distribution: sapmachine
|
||||
- name: Verify Java
|
||||
run: bash __tests__/verify-java.sh "${{ matrix.version }}" "${{ steps.setup-java.outputs.path }}"
|
||||
shell: bash
|
||||
|
||||
setup-java-custom-package-type:
|
||||
name: ${{ matrix.distribution }} ${{ matrix.version }} (${{ matrix.java-package }}-x64) - ${{ matrix.os }}
|
||||
needs: setup-java-major-minor-versions
|
||||
@ -241,8 +321,9 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-13, windows-latest, ubuntu-latest]
|
||||
distribution: ['temurin', 'zulu', 'liberica', 'semeru']
|
||||
os: [macos-15-intel, windows-latest, ubuntu-latest]
|
||||
distribution:
|
||||
['temurin', 'zulu', 'liberica', 'semeru', 'sapmachine', 'jetbrains']
|
||||
java-package: ['jre']
|
||||
version: ['17.0']
|
||||
include:
|
||||
@ -266,9 +347,50 @@ jobs:
|
||||
java-package: jre
|
||||
version: '8'
|
||||
os: windows-latest
|
||||
- distribution: 'jetbrains'
|
||||
java-package: jdk+jcef
|
||||
version: '11'
|
||||
os: ubuntu-latest
|
||||
- distribution: 'jetbrains'
|
||||
java-package: jdk+jcef
|
||||
version: '17'
|
||||
os: ubuntu-latest
|
||||
- distribution: 'jetbrains'
|
||||
java-package: jdk+jcef
|
||||
version: '21'
|
||||
os: ubuntu-latest
|
||||
- distribution: 'jetbrains'
|
||||
java-package: jre+jcef
|
||||
version: '11'
|
||||
os: ubuntu-latest
|
||||
- distribution: 'jetbrains'
|
||||
java-package: jre+jcef
|
||||
version: '17'
|
||||
os: ubuntu-latest
|
||||
- distribution: 'jetbrains'
|
||||
java-package: jre+jcef
|
||||
version: '21'
|
||||
os: ubuntu-latest
|
||||
- distribution: 'jetbrains'
|
||||
java-package: jdk+ft
|
||||
version: '17'
|
||||
os: ubuntu-latest
|
||||
- distribution: 'jetbrains'
|
||||
java-package: jdk+ft
|
||||
version: '21'
|
||||
os: ubuntu-latest
|
||||
- distribution: 'jetbrains'
|
||||
java-package: jre+ft
|
||||
version: '17'
|
||||
os: ubuntu-latest
|
||||
- distribution: 'jetbrains'
|
||||
java-package: jre+ft
|
||||
version: '21'
|
||||
os: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: setup-java
|
||||
uses: ./
|
||||
id: setup-java
|
||||
@ -276,6 +398,8 @@ jobs:
|
||||
java-version: ${{ matrix.version }}
|
||||
java-package: ${{ matrix.java-package }}
|
||||
distribution: ${{ matrix.distribution }}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Verify Java
|
||||
run: bash __tests__/verify-java.sh "${{ matrix.version }}" "${{ steps.setup-java.outputs.path }}"
|
||||
shell: bash
|
||||
@ -289,12 +413,12 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
# x86 is not supported on macOS
|
||||
os: [windows-latest, ubuntu-latest]
|
||||
os: [windows-latest, ubuntu-22.04]
|
||||
distribution: ['liberica', 'zulu', 'corretto']
|
||||
version: ['11']
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: setup-java
|
||||
uses: ./
|
||||
id: setup-java
|
||||
@ -317,7 +441,7 @@ jobs:
|
||||
java-version-file: ['.java-version', '.tool-versions']
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Create .java-version file
|
||||
shell: bash
|
||||
run: echo "17" > .java-version
|
||||
@ -346,7 +470,7 @@ jobs:
|
||||
java-version-file: ['.java-version', '.tool-versions']
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Create .java-version file
|
||||
shell: bash
|
||||
run: echo "11" > .java-version
|
||||
@ -374,7 +498,7 @@ jobs:
|
||||
java-version-file: ['.java-version', '.tool-versions']
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Create .java-version file
|
||||
shell: bash
|
||||
run: echo "17.0.10" > .java-version
|
||||
@ -392,23 +516,26 @@ jobs:
|
||||
shell: bash
|
||||
|
||||
setup-java-version-from-file-major-minor-patch-with-dist:
|
||||
name: ${{ matrix.distribution }} version from file 'openjdk64-17.0.10' - ${{ matrix.os }}
|
||||
name: ${{ matrix.distribution }} version from file '${{ matrix.java-version-file }}' - ${{ matrix.os }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-latest, windows-latest, ubuntu-latest]
|
||||
distribution: ['adopt', 'zulu', 'liberica']
|
||||
java-version-file: ['.java-version', '.tool-versions']
|
||||
java-version-file: ['.java-version', '.tool-versions', '.sdkmanrc']
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
- name: Create .java-version file
|
||||
shell: bash
|
||||
run: echo "openjdk64-17.0.10" > .java-version
|
||||
- name: Create .tool-versions file
|
||||
shell: bash
|
||||
run: echo "java openjdk64-17.0.10" > .tool-versions
|
||||
- name: Create .sdkmanrc file
|
||||
shell: bash
|
||||
run: echo "java=17.0.10-tem" > .sdkmanrc
|
||||
- name: setup-java
|
||||
uses: ./
|
||||
id: setup-java
|
||||
|
||||
21
.github/workflows/publish-immutable-actions.yml
vendored
Normal file
21
.github/workflows/publish-immutable-actions.yml
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
name: 'Publish Immutable Action Version'
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [released]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
id-token: write
|
||||
packages: write
|
||||
|
||||
steps:
|
||||
- name: Checking out
|
||||
uses: actions/checkout@v6
|
||||
- name: Publish
|
||||
id: publish
|
||||
uses: actions/publish-immutable-action@v0.0.4
|
||||
@ -23,7 +23,7 @@ jobs:
|
||||
steps:
|
||||
- name: Update the ${{ env.TAG_NAME }} tag
|
||||
id: update-major-tag
|
||||
uses: actions/publish-action@v0.2.2
|
||||
uses: actions/publish-action@v0.4.0
|
||||
with:
|
||||
source-tag: ${{ env.TAG_NAME }}
|
||||
slack-webhook: ${{ secrets.SLACK_WEBHOOK }}
|
||||
|
||||
@ -12,4 +12,6 @@ allowed:
|
||||
- unlicense
|
||||
|
||||
reviewed:
|
||||
npm:
|
||||
npm:
|
||||
- "@actions/http-client" # MIT (license text present), but detected as "other"
|
||||
- "argparse" # Python Software Foundation License (PSF), but detected as "other"
|
||||
BIN
.licenses/npm/@actions/cache.dep.yml
generated
BIN
.licenses/npm/@actions/cache.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@actions/core.dep.yml
generated
BIN
.licenses/npm/@actions/core.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@actions/exec.dep.yml
generated
BIN
.licenses/npm/@actions/exec.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@actions/glob-0.4.0.dep.yml
generated
BIN
.licenses/npm/@actions/glob-0.4.0.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/@actions/http-client.dep.yml
generated
BIN
.licenses/npm/@actions/http-client.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@actions/io.dep.yml
generated
BIN
.licenses/npm/@actions/io.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@actions/tool-cache.dep.yml
generated
BIN
.licenses/npm/@actions/tool-cache.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/@azure/core-auth.dep.yml
generated
BIN
.licenses/npm/@azure/core-auth.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@azure/core-client.dep.yml
generated
Normal file
BIN
.licenses/npm/@azure/core-client.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@azure/core-http-compat.dep.yml
generated
Normal file
BIN
.licenses/npm/@azure/core-http-compat.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@azure/core-lro.dep.yml
generated
BIN
.licenses/npm/@azure/core-lro.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@azure/core-paging.dep.yml
generated
BIN
.licenses/npm/@azure/core-paging.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@azure/core-rest-pipeline.dep.yml
generated
Normal file
BIN
.licenses/npm/@azure/core-rest-pipeline.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@azure/core-tracing.dep.yml
generated
BIN
.licenses/npm/@azure/core-tracing.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@azure/core-util.dep.yml
generated
BIN
.licenses/npm/@azure/core-util.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@azure/core-xml.dep.yml
generated
Normal file
BIN
.licenses/npm/@azure/core-xml.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@azure/logger.dep.yml
generated
BIN
.licenses/npm/@azure/logger.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@azure/ms-rest-js.dep.yml
generated
BIN
.licenses/npm/@azure/ms-rest-js.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@azure/storage-blob.dep.yml
generated
BIN
.licenses/npm/@azure/storage-blob.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/@fastify/busboy.dep.yml
generated
BIN
.licenses/npm/@fastify/busboy.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@oozcitak/dom.dep.yml
generated
BIN
.licenses/npm/@oozcitak/dom.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@oozcitak/infra.dep.yml
generated
BIN
.licenses/npm/@oozcitak/infra.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@oozcitak/url.dep.yml
generated
BIN
.licenses/npm/@oozcitak/url.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@oozcitak/util.dep.yml
generated
BIN
.licenses/npm/@oozcitak/util.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/@protobuf-ts/runtime.dep.yml
generated
Normal file
BIN
.licenses/npm/@protobuf-ts/runtime.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@types/node-fetch.dep.yml
generated
BIN
.licenses/npm/@types/node-fetch.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@types/node.dep.yml
generated
BIN
.licenses/npm/@types/node.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@types/tunnel.dep.yml
generated
BIN
.licenses/npm/@types/tunnel.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@typespec/ts-http-runtime.dep.yml
generated
Normal file
BIN
.licenses/npm/@typespec/ts-http-runtime.dep.yml
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/argparse.dep.yml
generated
BIN
.licenses/npm/argparse.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/brace-expansion.dep.yml
generated
BIN
.licenses/npm/brace-expansion.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/combined-stream.dep.yml
generated
BIN
.licenses/npm/combined-stream.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/debug.dep.yml
generated
Normal file
BIN
.licenses/npm/debug.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/delayed-stream.dep.yml
generated
BIN
.licenses/npm/delayed-stream.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/esprima.dep.yml
generated
BIN
.licenses/npm/esprima.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/fast-xml-parser.dep.yml
generated
Normal file
BIN
.licenses/npm/fast-xml-parser.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/form-data-2.5.1.dep.yml
generated
BIN
.licenses/npm/form-data-2.5.1.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/form-data-4.0.0.dep.yml
generated
BIN
.licenses/npm/form-data-4.0.0.dep.yml
generated
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/js-yaml.dep.yml
generated
BIN
.licenses/npm/js-yaml.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/lru-cache.dep.yml
generated
BIN
.licenses/npm/lru-cache.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/minimatch.dep.yml
generated
BIN
.licenses/npm/minimatch.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/node-fetch.dep.yml
generated
BIN
.licenses/npm/node-fetch.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/sax.dep.yml
generated
BIN
.licenses/npm/sax.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/sprintf-js.dep.yml
generated
BIN
.licenses/npm/sprintf-js.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/tslib-1.14.1.dep.yml
generated
BIN
.licenses/npm/tslib-1.14.1.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/undici.dep.yml
generated
BIN
.licenses/npm/undici.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/uuid-3.4.0.dep.yml
generated
BIN
.licenses/npm/uuid-3.4.0.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/uuid-8.3.2.dep.yml
generated
BIN
.licenses/npm/uuid-8.3.2.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/webidl-conversions.dep.yml
generated
BIN
.licenses/npm/webidl-conversions.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/whatwg-url.dep.yml
generated
BIN
.licenses/npm/whatwg-url.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/xml2js.dep.yml
generated
BIN
.licenses/npm/xml2js.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/xmlbuilder.dep.yml
generated
BIN
.licenses/npm/xmlbuilder.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/xmlbuilder2.dep.yml
generated
BIN
.licenses/npm/xmlbuilder2.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/yallist.dep.yml
generated
BIN
.licenses/npm/yallist.dep.yml
generated
Binary file not shown.
88
README.md
88
README.md
@ -18,17 +18,26 @@ The `setup-java` action provides the following functionality for GitHub Actions
|
||||
|
||||
This action allows you to work with Java and Scala projects.
|
||||
|
||||
## Breaking changes in V5
|
||||
|
||||
- Upgraded action from node20 to node24
|
||||
> Make sure your runner is on version v2.327.1 or later to ensure compatibility with this release [Release Notes](https://github.com/actions/runner/releases/tag/v2.327.1)
|
||||
|
||||
For more details, see the full release notes on the [releases page](https://github.com/actions/setup-java/releases/tag/v5.0.0)
|
||||
|
||||
## V2 vs V1
|
||||
|
||||
- V2 supports custom distributions and provides support for Azul Zulu OpenJDK, Eclipse Temurin and AdoptOpenJDK out of the box. V1 supports only Azul Zulu OpenJDK.
|
||||
- V2 requires you to specify distribution along with the version. V1 defaults to Azul Zulu OpenJDK, only version input is required. Follow [the migration guide](docs/switching-to-v2.md) to switch from V1 to V2.
|
||||
|
||||
For information about the latest releases, recent updates, and newly supported distributions, please refer to the `setup-java` [Releases](https://github.com/actions/setup-java/releases).
|
||||
|
||||
## Usage
|
||||
|
||||
- `java-version`: The Java version that is going to be set up. Takes a whole or [semver](#supported-version-syntax) Java version. If not specified, the action will expect `java-version-file` input to be specified.
|
||||
|
||||
- `java-version-file`: The path to a file containing java version. Supported file types are `.java-version` and `.tool-versions`. See more details in [about .java-version-file](docs/advanced-usage.md#Java-version-file).
|
||||
|
||||
|
||||
- `distribution`: _(required)_ Java [distribution](#supported-distributions).
|
||||
|
||||
- `java-package`: The packaging variant of the chosen distribution. Possible values: `jdk`, `jre`, `jdk+fx`, `jre+fx`. Default value: `jdk`.
|
||||
@ -69,28 +78,28 @@ This action allows you to work with Java and Scala projects.
|
||||
#### Eclipse Temurin
|
||||
```yaml
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v4
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-java@v5
|
||||
with:
|
||||
distribution: 'temurin' # See 'Supported distributions' for available options
|
||||
java-version: '21'
|
||||
java-version: '25'
|
||||
- run: java HelloWorldApp.java
|
||||
```
|
||||
|
||||
#### Azul Zulu OpenJDK
|
||||
```yaml
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v4
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-java@v5
|
||||
with:
|
||||
distribution: 'zulu' # See 'Supported distributions' for available options
|
||||
java-version: '21'
|
||||
java-version: '25'
|
||||
- run: java HelloWorldApp.java
|
||||
```
|
||||
|
||||
#### Supported version syntax
|
||||
The `java-version` input supports an exact version or a version range using [SemVer](https://semver.org/) notation:
|
||||
- major versions: `8`, `11`, `16`, `17`, `21`
|
||||
- major versions: `8`, `11`, `16`, `17`, `21`, `25`
|
||||
- more specific versions: `8.0.282+8`, `8.0.232`, `11.0`, `11.0.4`, `17.0`
|
||||
- early access (EA) versions: `15-ea`, `15.0.0-ea`
|
||||
|
||||
@ -108,6 +117,9 @@ Currently, the following distributions are supported:
|
||||
| `semeru` | IBM Semeru Runtime Open Edition | [Link](https://developer.ibm.com/languages/java/semeru-runtimes/downloads/) | [Link](https://openjdk.java.net/legal/gplv2+ce.html) |
|
||||
| `oracle` | Oracle JDK | [Link](https://www.oracle.com/java/technologies/downloads/) | [Link](https://java.com/freeuselicense)
|
||||
| `dragonwell` | Alibaba Dragonwell JDK | [Link](https://dragonwell-jdk.io/) | [Link](https://www.aliyun.com/product/dragonwell/)
|
||||
| `sapmachine` | SAP SapMachine JDK/JRE | [Link](https://sapmachine.io/) | [Link](https://github.com/SAP/SapMachine/blob/sapmachine/LICENSE)
|
||||
| `graalvm` | Oracle GraalVM | [Link](https://www.graalvm.org/) | [Link](https://www.oracle.com/downloads/licenses/graal-free-license.html)
|
||||
| `jetbrains` | JetBrains Runtime | [Link](https://github.com/JetBrains/JetBrainsRuntime/) | [Link](https://github.com/JetBrains/JetBrainsRuntime/blob/main/LICENSE)
|
||||
|
||||
**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.
|
||||
|
||||
@ -115,6 +127,10 @@ Currently, the following distributions are supported:
|
||||
|
||||
**NOTE:** For Azul Zulu OpenJDK architectures x64 and arm64 are mapped to x86 / arm with proper hw_bitness.
|
||||
|
||||
**NOTE:** To comply with the GraalVM Free Terms and Conditions (GFTC) license, it is recommended to use GraalVM JDK 17 version 17.0.12, as this is the only version of GraalVM JDK 17 available under the GFTC license. Additionally, it is encouraged to consider upgrading to GraalVM JDK 21, which offers the latest features and improvements.
|
||||
|
||||
**NOTE:** Oracle JDK 17 licensing varies by patch level. As shown on the [JDK 17 Archive](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) (versions up to 17.0.12 are under the [NFTC](https://www.oracle.com/downloads/licenses/no-fee-license.html) license) and the [JDK 17.0.13+ Archive](https://www.oracle.com/java/technologies/javase/jdk17-0-13-later-archive-downloads.html) (versions 17.0.13 and later are under the [OTN](https://www.oracle.com/downloads/licenses/javase-license1.html) license). To stay on the free NFTC license, use `distribution: 'oracle'` with `java-version: '17.0.12'` (or earlier) instead of the floating `'17'`. Alternatively, upgrade to Oracle JDK 21+, which remains under the NFTC license.
|
||||
|
||||
### Caching packages dependencies
|
||||
The action has a built-in functionality for caching and restoring dependencies. It uses [toolkit/cache](https://github.com/actions/toolkit/tree/main/packages/cache) under hood for caching dependencies but requires less configuration settings. Supported package managers are gradle, maven and sbt. The format of the used cache key is `setup-java-${{ platform }}-${{ packageManager }}-${{ fileHash }}`, where the hash is based on the following files:
|
||||
|
||||
@ -131,26 +147,31 @@ The cache input is optional, and caching is turned off by default.
|
||||
#### Caching gradle dependencies
|
||||
```yaml
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v4
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-java@v5
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: '21'
|
||||
java-version: '25'
|
||||
cache: 'gradle'
|
||||
cache-dependency-path: | # optional
|
||||
sub-project/*.gradle*
|
||||
sub-project/**/gradle-wrapper.properties
|
||||
- run: ./gradlew build --no-daemon
|
||||
```
|
||||
Using the `cache: gradle` provides a simple and effective way to cache Gradle dependencies with minimal configuration.
|
||||
|
||||
For projects that require more advanced `Gradle` caching features, such as caching build outputs, support for Gradle configuration cache, encrypted cache storage, fine-grained cache control (including options to enable or disable the cache, set it to read-only or write-only, perform automated cleanup, and define custom cache rules), or optimized performance for complex CI workflows, consider using [`gradle/actions/setup-gradle`](https://github.com/gradle/actions/tree/main/setup-gradle).
|
||||
|
||||
For setup details and a comprehensive overview of all available features, visit the [setup-gradle documentation](https://github.com/gradle/actions/blob/main/docs/setup-gradle.md).
|
||||
|
||||
#### Caching maven dependencies
|
||||
```yaml
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v4
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-java@v5
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: '21'
|
||||
java-version: '25'
|
||||
cache: 'maven'
|
||||
cache-dependency-path: 'sub-project/pom.xml' # optional
|
||||
- name: Build with Maven
|
||||
@ -160,11 +181,11 @@ steps:
|
||||
#### Caching sbt dependencies
|
||||
```yaml
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v4
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-java@v5
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: '21'
|
||||
java-version: '25'
|
||||
cache: 'sbt'
|
||||
cache-dependency-path: | # optional
|
||||
sub-project/build.sbt
|
||||
@ -180,11 +201,11 @@ Usually, cache gets downloaded in multiple segments of fixed sizes. Sometimes, a
|
||||
env:
|
||||
SEGMENT_DOWNLOAD_TIMEOUT_MINS: '5'
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v4
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-java@v5
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: '21'
|
||||
java-version: '25'
|
||||
cache: 'gradle'
|
||||
- run: ./gradlew build --no-daemon
|
||||
```
|
||||
@ -200,11 +221,11 @@ For Java distributions that are not cached on Hosted images, `check-latest` alwa
|
||||
|
||||
```yaml
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v4
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-java@v5
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: '21'
|
||||
java-version: '25'
|
||||
check-latest: true
|
||||
- run: java HelloWorldApp.java
|
||||
```
|
||||
@ -216,12 +237,12 @@ jobs:
|
||||
runs-on: ubuntu-20.04
|
||||
strategy:
|
||||
matrix:
|
||||
java: [ '8', '11', '17', '21' ]
|
||||
java: [ '8', '11', '17', '21', '25' ]
|
||||
name: Java ${{ matrix.Java }} sample
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
- name: Setup java
|
||||
uses: actions/setup-java@v4
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
distribution: '<distribution>'
|
||||
java-version: ${{ matrix.java }}
|
||||
@ -230,11 +251,11 @@ jobs:
|
||||
|
||||
### Install multiple JDKs
|
||||
|
||||
All versions are added to the PATH. The last version will be used and available globally. Other Java versions can be accessed through env variables with such specification as 'JAVA_HOME_{{ MAJOR_VERSION }}_{{ ARCHITECTURE }}'.
|
||||
All configured Java versions are added to the PATH. The last one added to the PATH (i.e., the last JDK set up by this action) will be used as the default and available globally. Other Java versions can be accessed through environment variables such as 'JAVA_HOME_{{ MAJOR_VERSION }}_{{ ARCHITECTURE }}'. To use a specific Java version, set the JAVA_HOME environment variable accordingly and prepend its bin directory to the PATH to ensure it takes priority during execution.
|
||||
|
||||
```yaml
|
||||
steps:
|
||||
- uses: actions/setup-java@v4
|
||||
- uses: actions/setup-java@v5
|
||||
with:
|
||||
distribution: '<distribution>'
|
||||
java-version: |
|
||||
@ -257,6 +278,8 @@ In the example above multiple JDKs are installed for the same job. The result af
|
||||
- [Amazon Corretto](docs/advanced-usage.md#Amazon-Corretto)
|
||||
- [Oracle](docs/advanced-usage.md#Oracle)
|
||||
- [Alibaba Dragonwell](docs/advanced-usage.md#Alibaba-Dragonwell)
|
||||
- [SapMachine](docs/advanced-usage.md#SapMachine)
|
||||
- [GraalVM](docs/advanced-usage.md#GraalVM)
|
||||
- [Installing custom Java package type](docs/advanced-usage.md#Installing-custom-Java-package-type)
|
||||
- [Installing custom Java architecture](docs/advanced-usage.md#Installing-custom-Java-architecture)
|
||||
- [Installing custom Java distribution from local file](docs/advanced-usage.md#Installing-Java-from-local-file)
|
||||
@ -268,6 +291,15 @@ In the example above multiple JDKs are installed for the same job. The result af
|
||||
- [Modifying Maven Toolchains](docs/advanced-usage.md#Modifying-Maven-Toolchains)
|
||||
- [Java Version File](docs/advanced-usage.md#Java-version-file)
|
||||
|
||||
## Recommended permissions
|
||||
|
||||
When using the `setup-java` action in your GitHub Actions workflow, it is recommended to set the following permissions to ensure proper functionality:
|
||||
|
||||
```yaml
|
||||
permissions:
|
||||
contents: read # access to check out code and install dependencies
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
The scripts and documentation in this project are released under the [MIT License](LICENSE).
|
||||
|
||||
@ -17,6 +17,7 @@ describe('dependency cache', () => {
|
||||
let spyWarning: jest.SpyInstance<void, Parameters<typeof core.warning>>;
|
||||
let spyDebug: jest.SpyInstance<void, Parameters<typeof core.debug>>;
|
||||
let spySaveState: jest.SpyInstance<void, Parameters<typeof core.saveState>>;
|
||||
let spyCoreError: jest.SpyInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
workspace = mkdtempSync(join(tmpdir(), 'setup-java-cache-'));
|
||||
@ -51,6 +52,10 @@ describe('dependency cache', () => {
|
||||
|
||||
spySaveState = jest.spyOn(core, 'saveState');
|
||||
spySaveState.mockImplementation(() => null);
|
||||
|
||||
// Mock core.error to suppress error logs
|
||||
spyCoreError = jest.spyOn(core, 'error');
|
||||
spyCoreError.mockImplementation(() => {});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
@ -58,6 +63,10 @@ describe('dependency cache', () => {
|
||||
process.env['GITHUB_WORKSPACE'] = ORIGINAL_GITHUB_WORKSPACE;
|
||||
process.env['RUNNER_OS'] = ORIGINAL_RUNNER_OS;
|
||||
resetState();
|
||||
|
||||
jest.resetAllMocks();
|
||||
jest.clearAllMocks();
|
||||
jest.restoreAllMocks();
|
||||
});
|
||||
|
||||
describe('restore', () => {
|
||||
|
||||
@ -11,19 +11,32 @@ describe('cleanup', () => {
|
||||
Parameters<typeof cache.saveCache>
|
||||
>;
|
||||
let spyJobStatusSuccess: jest.SpyInstance;
|
||||
let spyCoreError: jest.SpyInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
spyWarning = jest.spyOn(core, 'warning');
|
||||
spyWarning.mockImplementation(() => null);
|
||||
|
||||
spyInfo = jest.spyOn(core, 'info');
|
||||
spyInfo.mockImplementation(() => null);
|
||||
|
||||
spyCacheSave = jest.spyOn(cache, 'saveCache');
|
||||
|
||||
spyJobStatusSuccess = jest.spyOn(util, 'isJobStatusSuccess');
|
||||
spyJobStatusSuccess.mockReturnValue(true);
|
||||
|
||||
// Mock core.error to suppress error logs
|
||||
spyCoreError = jest.spyOn(core, 'error');
|
||||
spyCoreError.mockImplementation(() => {});
|
||||
|
||||
createStateForSuccessfulRestore();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
resetState();
|
||||
jest.resetAllMocks();
|
||||
jest.clearAllMocks();
|
||||
jest.restoreAllMocks();
|
||||
});
|
||||
|
||||
it('does not fail nor warn even when the save process throws a ReserveCacheError', async () => {
|
||||
|
||||
1454
__tests__/data/jetbrains.json
Normal file
1454
__tests__/data/jetbrains.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,47 @@
|
||||
[
|
||||
{
|
||||
"version": "25.0.0",
|
||||
"stable": true,
|
||||
"release_url": "https://aka.ms/download-jdk",
|
||||
"files": [
|
||||
{
|
||||
"filename": "microsoft-jdk-25.0.0-macos-x64.tar.gz",
|
||||
"arch": "x64",
|
||||
"platform": "darwin",
|
||||
"download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-macos-x64.tar.gz"
|
||||
},
|
||||
{
|
||||
"filename": "microsoft-jdk-25.0.0-linux-x64.tar.gz",
|
||||
"arch": "x64",
|
||||
"platform": "linux",
|
||||
"download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-linux-x64.tar.gz"
|
||||
},
|
||||
{
|
||||
"filename": "microsoft-jdk-25.0.0-windows-x64.zip",
|
||||
"arch": "x64",
|
||||
"platform": "win32",
|
||||
"download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-windows-x64.zip"
|
||||
},
|
||||
{
|
||||
"filename": "microsoft-jdk-25.0.0-macos-aarch64.tar.gz",
|
||||
"arch": "aarch64",
|
||||
"platform": "darwin",
|
||||
"download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-macos-aarch64.tar.gz"
|
||||
},
|
||||
{
|
||||
"filename": "microsoft-jdk-25.0.0-linux-aarch64.tar.gz",
|
||||
"arch": "aarch64",
|
||||
"platform": "linux",
|
||||
"download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-linux-aarch64.tar.gz"
|
||||
},
|
||||
{
|
||||
"filename": "microsoft-jdk-25.0.0-windows-aarch64.zip",
|
||||
"arch": "aarch64",
|
||||
"platform": "win32",
|
||||
"download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-windows-aarch64.zip"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"version": "21.0.0",
|
||||
"stable": true,
|
||||
|
||||
87242
__tests__/data/sapmachine.json
Normal file
87242
__tests__/data/sapmachine.json
Normal file
File diff suppressed because it is too large
Load Diff
135
__tests__/data/sdkman-java-versions.csv
Normal file
135
__tests__/data/sdkman-java-versions.csv
Normal file
@ -0,0 +1,135 @@
|
||||
6.0.119-zulu, 6.0.119
|
||||
7.0.352-zulu, 7.0.352
|
||||
8.0.282-trava, 8.0.282
|
||||
8.0.432-albba, 8.0.432
|
||||
8.0.432-amzn, 8.0.432
|
||||
8.0.432-kona, 8.0.432
|
||||
8.0.432-librca, 8.0.432
|
||||
8.0.432-sem, 8.0.432
|
||||
8.0.432-tem, 8.0.432
|
||||
8.0.432-zulu, 8.0.432
|
||||
8.0.432.fx-librca, 8.0.432
|
||||
8.0.432.fx-zulu, 8.0.432
|
||||
8.0.442-amzn, 8.0.442
|
||||
8.0.442-librca, 8.0.442
|
||||
8.0.442-tem, 8.0.442
|
||||
8.0.442-zulu, 8.0.442
|
||||
8.0.442.fx-librca, 8.0.442
|
||||
8.0.442.fx-zulu, 8.0.442
|
||||
11.0.14.1-jbr, 11.0.14
|
||||
11.0.15-trava, 11.0.15
|
||||
11.0.25-albba, 11.0.25
|
||||
11.0.25-amzn, 11.0.25
|
||||
11.0.25-kona, 11.0.25
|
||||
11.0.25-librca, 11.0.25
|
||||
11.0.25-ms, 11.0.25
|
||||
11.0.25-sapmchn, 11.0.25
|
||||
11.0.25-sem, 11.0.25
|
||||
11.0.25-tem, 11.0.25
|
||||
11.0.25-zulu, 11.0.25
|
||||
11.0.25.fx-librca, 11.0.25
|
||||
11.0.25.fx-zulu, 11.0.25
|
||||
11.0.26-amzn, 11.0.26
|
||||
11.0.26-librca, 11.0.26
|
||||
11.0.26-ms, 11.0.26
|
||||
11.0.26-sapmchn, 11.0.26
|
||||
11.0.26-zulu, 11.0.26
|
||||
11.0.26.fx-librca, 11.0.26
|
||||
11.0.26.fx-zulu, 11.0.26
|
||||
17.0.12-graal, 17.0.12
|
||||
17.0.12-jbr, 17.0.12
|
||||
17.0.12-oracle, 17.0.12
|
||||
17.0.13-albba, 17.0.13
|
||||
17.0.13-amzn, 17.0.13
|
||||
17.0.13-kona, 17.0.13
|
||||
17.0.13-librca, 17.0.13
|
||||
17.0.13-ms, 17.0.13
|
||||
17.0.13-sapmchn, 17.0.13
|
||||
17.0.13-sem, 17.0.13
|
||||
17.0.13-tem, 17.0.13
|
||||
17.0.13-zulu, 17.0.13
|
||||
17.0.13.crac-librca, 17.0.13
|
||||
17.0.13.crac-zulu, 17.0.13
|
||||
17.0.13.fx-librca, 17.0.13
|
||||
17.0.13.fx-zulu, 17.0.13
|
||||
17.0.14-amzn, 17.0.14
|
||||
17.0.14-librca, 17.0.14
|
||||
17.0.14-ms, 17.0.14
|
||||
17.0.14-sapmchn, 17.0.14
|
||||
17.0.14-zulu, 17.0.14
|
||||
17.0.14.fx-librca, 17.0.14
|
||||
17.0.14.fx-zulu, 17.0.14
|
||||
17.0.9-graalce, 17.0.9
|
||||
21.0.2-graalce, 21.0.2
|
||||
21.0.2-open, 21.0.2
|
||||
21.0.5-amzn, 21.0.5
|
||||
21.0.5-graal, 21.0.5
|
||||
21.0.5-jbr, 21.0.5
|
||||
21.0.5-kona, 21.0.5
|
||||
21.0.5-librca, 21.0.5
|
||||
21.0.5-ms, 21.0.5
|
||||
21.0.5-oracle, 21.0.5
|
||||
21.0.5-sapmchn, 21.0.5
|
||||
21.0.5-sem, 21.0.5
|
||||
21.0.5-tem, 21.0.5
|
||||
21.0.5-zulu, 21.0.5
|
||||
21.0.5.crac-librca, 21.0.5
|
||||
21.0.5.crac-zulu, 21.0.5
|
||||
21.0.5.fx-librca, 21.0.5
|
||||
21.0.5.fx-zulu, 21.0.5
|
||||
21.0.6-amzn, 21.0.6
|
||||
21.0.6-graal, 21.0.6
|
||||
21.0.6-librca, 21.0.6
|
||||
21.0.6-ms, 21.0.6
|
||||
21.0.6-oracle, 21.0.6
|
||||
21.0.6-sapmchn, 21.0.6
|
||||
21.0.6-tem, 21.0.6
|
||||
21.0.6-zulu, 21.0.6
|
||||
21.0.6.fx-librca, 21.0.6
|
||||
21.0.6.fx-zulu, 21.0.6
|
||||
22.0.2-oracle, 22.0.2
|
||||
22.1.0.1.r11-gln, 22.1.0
|
||||
22.1.0.1.r17-gln, 22.1.0
|
||||
22.3.5.r11-nik, 22.3.5
|
||||
22.3.5.r17-mandrel, 22.3.5
|
||||
22.3.5.r17-nik, 22.3.5
|
||||
23-open, 23
|
||||
23.0.1-amzn, 23.0.1
|
||||
23.0.1-graal, 23.0.1
|
||||
23.0.1-graalce, 23.0.1
|
||||
23.0.1-librca, 23.0.1
|
||||
23.0.1-open, 23.0.1
|
||||
23.0.1-oracle, 23.0.1
|
||||
23.0.1-sapmchn, 23.0.1
|
||||
23.0.1-tem, 23.0.1
|
||||
23.0.1-zulu, 23.0.1
|
||||
23.0.1.crac-zulu, 23.0.1
|
||||
23.0.1.fx-librca, 23.0.1
|
||||
23.0.1.fx-zulu, 23.0.1
|
||||
23.0.2-amzn, 23.0.2
|
||||
23.0.2-graal, 23.0.2
|
||||
23.0.2-graalce, 23.0.2
|
||||
23.0.2-librca, 23.0.2
|
||||
23.0.2-oracle, 23.0.2
|
||||
23.0.2-sapmchn, 23.0.2
|
||||
23.0.2-tem, 23.0.2
|
||||
23.0.2-zulu, 23.0.2
|
||||
23.0.2.fx-librca, 23.0.2
|
||||
23.0.2.fx-zulu, 23.0.2
|
||||
23.0.6.fx-nik, 23.0.6
|
||||
23.0.6.r17-mandrel, 23.0.6
|
||||
23.0.6.r17-nik, 23.0.6
|
||||
23.1.5.fx-nik, 23.1.5
|
||||
23.1.5.r21-mandrel, 23.1.5
|
||||
23.1.5.r21-nik, 23.1.5
|
||||
24.0.2.r22-mandrel, 24.0.2
|
||||
24.ea.27-graal, 24.0.0
|
||||
24.ea.28-graal, 24.0.0
|
||||
24.ea.31-open, 24.0.0
|
||||
24.ea.32-open, 24.0.0
|
||||
24.1.1.r23-mandrel, 24.1.1
|
||||
24.1.1.r23-nik, 24.1.1
|
||||
25.ea.4-graal, 25.0.0
|
||||
25.ea.5-graal, 25.0.0
|
||||
25.ea.5-open, 25.0.0
|
||||
25.ea.6-open, 25.0.0
|
||||
|
@ -9,9 +9,11 @@ import {JavaInstallerOptions} from '../../src/distributions/base-models';
|
||||
import os from 'os';
|
||||
|
||||
import manifestData from '../data/adopt.json';
|
||||
import * as core from '@actions/core';
|
||||
|
||||
describe('getAvailableVersions', () => {
|
||||
let spyHttpClient: jest.SpyInstance;
|
||||
let spyCoreError: jest.SpyInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
|
||||
@ -20,6 +22,10 @@ describe('getAvailableVersions', () => {
|
||||
headers: {},
|
||||
result: []
|
||||
});
|
||||
|
||||
// Mock core.error to suppress error logs
|
||||
spyCoreError = jest.spyOn(core, 'error');
|
||||
spyCoreError.mockImplementation(() => {});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
@ -191,7 +197,9 @@ describe('getAvailableVersions', () => {
|
||||
])(
|
||||
'defaults to os.arch(): %s mapped to distro arch: %s',
|
||||
async (osArch: string, distroArch: string) => {
|
||||
jest.spyOn(os, 'arch').mockReturnValue(osArch);
|
||||
jest
|
||||
.spyOn(os, 'arch')
|
||||
.mockReturnValue(osArch as ReturnType<typeof os.arch>);
|
||||
|
||||
const installerOptions: JavaInstallerOptions = {
|
||||
version: '17',
|
||||
@ -260,7 +268,7 @@ describe('findPackageForDownload', () => {
|
||||
distribution['getAvailableVersions'] = async () => manifestData as any;
|
||||
await expect(
|
||||
distribution['findPackageForDownload']('9.0.8')
|
||||
).rejects.toThrow(/Could not find satisfied version for SemVer */);
|
||||
).rejects.toThrow(/No matching version found for SemVer */);
|
||||
});
|
||||
|
||||
it('version is not found', async () => {
|
||||
@ -275,7 +283,7 @@ describe('findPackageForDownload', () => {
|
||||
);
|
||||
distribution['getAvailableVersions'] = async () => manifestData as any;
|
||||
await expect(distribution['findPackageForDownload']('7.x')).rejects.toThrow(
|
||||
/Could not find satisfied version for SemVer */
|
||||
/No matching version found for SemVer */
|
||||
);
|
||||
});
|
||||
|
||||
@ -291,7 +299,7 @@ describe('findPackageForDownload', () => {
|
||||
);
|
||||
distribution['getAvailableVersions'] = async () => [];
|
||||
await expect(distribution['findPackageForDownload']('11')).rejects.toThrow(
|
||||
/Could not find satisfied version for SemVer */
|
||||
/No matching version found for SemVer */
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@ -38,7 +38,7 @@ class EmptyJavaBase extends JavaBase {
|
||||
): Promise<JavaDownloadRelease> {
|
||||
const availableVersion = '11.0.9';
|
||||
if (!semver.satisfies(availableVersion, range)) {
|
||||
throw new Error('Available version not found');
|
||||
throw this.createVersionNotFoundError(range, [availableVersion]);
|
||||
}
|
||||
|
||||
return {
|
||||
@ -248,6 +248,7 @@ describe('setupJava', () => {
|
||||
let spyCoreExportVariable: jest.SpyInstance;
|
||||
let spyCoreAddPath: jest.SpyInstance;
|
||||
let spyCoreSetOutput: jest.SpyInstance;
|
||||
let spyCoreError: jest.SpyInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
spyGetToolcachePath = jest.spyOn(util, 'getToolcachePath');
|
||||
@ -287,7 +288,11 @@ describe('setupJava', () => {
|
||||
spyCoreSetOutput = jest.spyOn(core, 'setOutput');
|
||||
spyCoreSetOutput.mockImplementation(() => undefined);
|
||||
|
||||
jest.spyOn(os, 'arch').mockReturnValue('x86');
|
||||
// Mock core.error to suppress error logs
|
||||
spyCoreError = jest.spyOn(core, 'error');
|
||||
spyCoreError.mockImplementation(() => undefined);
|
||||
|
||||
jest.spyOn(os, 'arch').mockReturnValue('x86' as ReturnType<typeof os.arch>);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
@ -530,19 +535,16 @@ describe('setupJava', () => {
|
||||
checkLatest: false
|
||||
}
|
||||
]
|
||||
])(
|
||||
'should throw an error for Available version not found for %s',
|
||||
async input => {
|
||||
mockJavaBase = new EmptyJavaBase(input);
|
||||
await expect(mockJavaBase.setupJava()).rejects.toThrow(
|
||||
'Available version not found'
|
||||
);
|
||||
expect(spyTcFindAllVersions).toHaveBeenCalled();
|
||||
expect(spyCoreAddPath).not.toHaveBeenCalled();
|
||||
expect(spyCoreExportVariable).not.toHaveBeenCalled();
|
||||
expect(spyCoreSetOutput).not.toHaveBeenCalled();
|
||||
}
|
||||
);
|
||||
])('should throw an error for version not found for %s', async input => {
|
||||
mockJavaBase = new EmptyJavaBase(input);
|
||||
await expect(mockJavaBase.setupJava()).rejects.toThrow(
|
||||
`No matching version found for SemVer '${input.version}'`
|
||||
);
|
||||
expect(spyTcFindAllVersions).toHaveBeenCalled();
|
||||
expect(spyCoreAddPath).not.toHaveBeenCalled();
|
||||
expect(spyCoreExportVariable).not.toHaveBeenCalled();
|
||||
expect(spyCoreSetOutput).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe('normalizeVersion', () => {
|
||||
@ -570,6 +572,97 @@ describe('normalizeVersion', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('createVersionNotFoundError', () => {
|
||||
it('should include all required fields in error message without available versions', () => {
|
||||
const mockJavaBase = new EmptyJavaBase({
|
||||
version: '17.0.5',
|
||||
architecture: 'x64',
|
||||
packageType: 'jdk',
|
||||
checkLatest: false
|
||||
});
|
||||
|
||||
const error = (mockJavaBase as any).createVersionNotFoundError('17.0.5');
|
||||
|
||||
expect(error.message).toContain(
|
||||
"No matching version found for SemVer '17.0.5'"
|
||||
);
|
||||
expect(error.message).toContain('Distribution: Empty');
|
||||
expect(error.message).toContain('Package type: jdk');
|
||||
expect(error.message).toContain('Architecture: x64');
|
||||
});
|
||||
|
||||
it('should include available versions when provided', () => {
|
||||
const mockJavaBase = new EmptyJavaBase({
|
||||
version: '17.0.5',
|
||||
architecture: 'x64',
|
||||
packageType: 'jdk',
|
||||
checkLatest: false
|
||||
});
|
||||
|
||||
const availableVersions = ['11.0.1', '11.0.2', '17.0.1', '17.0.2'];
|
||||
const error = (mockJavaBase as any).createVersionNotFoundError(
|
||||
'17.0.5',
|
||||
availableVersions
|
||||
);
|
||||
|
||||
expect(error.message).toContain(
|
||||
"No matching version found for SemVer '17.0.5'"
|
||||
);
|
||||
expect(error.message).toContain('Distribution: Empty');
|
||||
expect(error.message).toContain('Package type: jdk');
|
||||
expect(error.message).toContain('Architecture: x64');
|
||||
expect(error.message).toContain(
|
||||
'Available versions: 11.0.1, 11.0.2, 17.0.1, 17.0.2'
|
||||
);
|
||||
});
|
||||
|
||||
it('should truncate available versions when there are many', () => {
|
||||
const mockJavaBase = new EmptyJavaBase({
|
||||
version: '17.0.5',
|
||||
architecture: 'x64',
|
||||
packageType: 'jdk',
|
||||
checkLatest: false
|
||||
});
|
||||
|
||||
// Create 60 versions to test truncation
|
||||
const availableVersions = Array.from({length: 60}, (_, i) => `11.0.${i}`);
|
||||
const error = (mockJavaBase as any).createVersionNotFoundError(
|
||||
'17.0.5',
|
||||
availableVersions
|
||||
);
|
||||
|
||||
expect(error.message).toContain('Available versions:');
|
||||
expect(error.message).toContain('...');
|
||||
expect(error.message).toContain('(showing first 50 of 60 versions');
|
||||
});
|
||||
|
||||
it('should include additional context when provided', () => {
|
||||
const mockJavaBase = new EmptyJavaBase({
|
||||
version: '17.0.5',
|
||||
architecture: 'x64',
|
||||
packageType: 'jdk',
|
||||
checkLatest: false
|
||||
});
|
||||
|
||||
const availableVersions = ['11.0.1', '11.0.2'];
|
||||
const additionalContext = 'Platform: linux';
|
||||
const error = (mockJavaBase as any).createVersionNotFoundError(
|
||||
'17.0.5',
|
||||
availableVersions,
|
||||
additionalContext
|
||||
);
|
||||
|
||||
expect(error.message).toContain(
|
||||
"No matching version found for SemVer '17.0.5'"
|
||||
);
|
||||
expect(error.message).toContain('Distribution: Empty');
|
||||
expect(error.message).toContain('Package type: jdk');
|
||||
expect(error.message).toContain('Architecture: x64');
|
||||
expect(error.message).toContain('Platform: linux');
|
||||
expect(error.message).toContain('Available versions: 11.0.1, 11.0.2');
|
||||
});
|
||||
});
|
||||
|
||||
describe('getToolcacheVersionName', () => {
|
||||
const DummyJavaBase = JavaBase as any;
|
||||
|
||||
|
||||
@ -4,13 +4,14 @@ import {JavaInstallerOptions} from '../../src/distributions/base-models';
|
||||
import {CorrettoDistribution} from '../../src/distributions/corretto/installer';
|
||||
import * as util from '../../src/util';
|
||||
import os from 'os';
|
||||
import {isGeneratorFunction} from 'util/types';
|
||||
import * as core from '@actions/core';
|
||||
|
||||
import manifestData from '../data/corretto.json';
|
||||
|
||||
describe('getAvailableVersions', () => {
|
||||
let spyHttpClient: jest.SpyInstance;
|
||||
let spyGetDownloadArchiveExtension: jest.SpyInstance;
|
||||
let spyCoreError: jest.SpyInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
|
||||
@ -23,6 +24,10 @@ describe('getAvailableVersions', () => {
|
||||
util,
|
||||
'getDownloadArchiveExtension'
|
||||
);
|
||||
|
||||
// Mock core.error to suppress error logs
|
||||
spyCoreError = jest.spyOn(core, 'error');
|
||||
spyCoreError.mockImplementation(() => {});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
@ -150,9 +155,8 @@ describe('getAvailableVersions', () => {
|
||||
});
|
||||
mockPlatform(distribution, platform);
|
||||
|
||||
const availableVersion = await distribution['findPackageForDownload'](
|
||||
version
|
||||
);
|
||||
const availableVersion =
|
||||
await distribution['findPackageForDownload'](version);
|
||||
expect(availableVersion).not.toBeNull();
|
||||
expect(availableVersion.url).toBe(expectedLink);
|
||||
});
|
||||
@ -199,33 +203,31 @@ describe('getAvailableVersions', () => {
|
||||
|
||||
await expect(
|
||||
distribution['findPackageForDownload'](version)
|
||||
).rejects.toThrow("Could not find satisfied version for SemVer '4'");
|
||||
).rejects.toThrow("No matching version found for SemVer '4'");
|
||||
});
|
||||
|
||||
it.each([
|
||||
['arm64', 'aarch64'],
|
||||
['amd64', 'x64']
|
||||
['amd64', 'x64'],
|
||||
['arm64', 'aarch64']
|
||||
])(
|
||||
'defaults to os.arch(): %s mapped to distro arch: %s',
|
||||
async (osArch: string, distroArch: string) => {
|
||||
jest.spyOn(os, 'arch').mockReturnValue(osArch);
|
||||
jest
|
||||
.spyOn(os, 'arch')
|
||||
.mockReturnValue(osArch as ReturnType<typeof os.arch>);
|
||||
|
||||
const version = '17';
|
||||
const installerOptions: JavaInstallerOptions = {
|
||||
version,
|
||||
const distribution = new CorrettoDistribution({
|
||||
version: '17',
|
||||
architecture: '', // to get default value
|
||||
packageType: 'jdk',
|
||||
checkLatest: false
|
||||
};
|
||||
|
||||
const distribution = new CorrettoDistribution(installerOptions);
|
||||
});
|
||||
mockPlatform(distribution, 'macos');
|
||||
|
||||
const expectedLink = `https://corretto.aws/downloads/resources/17.0.2.8.1/amazon-corretto-17.0.2.8.1-macosx-${distroArch}.tar.gz`;
|
||||
|
||||
const availableVersion = await distribution['findPackageForDownload'](
|
||||
version
|
||||
);
|
||||
const availableVersion =
|
||||
await distribution['findPackageForDownload']('17');
|
||||
expect(availableVersion).not.toBeNull();
|
||||
expect(availableVersion.url).toBe(expectedLink);
|
||||
}
|
||||
|
||||
@ -1,12 +1,14 @@
|
||||
import {HttpClient} from '@actions/http-client';
|
||||
import {DragonwellDistribution} from '../../src/distributions/dragonwell/installer';
|
||||
import * as utils from '../../src/util';
|
||||
import * as core from '@actions/core';
|
||||
|
||||
import manifestData from '../data/dragonwell.json';
|
||||
|
||||
describe('getAvailableVersions', () => {
|
||||
let spyHttpClient: jest.SpyInstance;
|
||||
let spyUtilGetDownloadArchiveExtension: jest.SpyInstance;
|
||||
let spyCoreError: jest.SpyInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
|
||||
@ -21,6 +23,10 @@ describe('getAvailableVersions', () => {
|
||||
'getDownloadArchiveExtension'
|
||||
);
|
||||
spyUtilGetDownloadArchiveExtension.mockReturnValue('tar.gz');
|
||||
|
||||
// Mock core.error to suppress error logs
|
||||
spyCoreError = jest.spyOn(core, 'error');
|
||||
spyCoreError.mockImplementation(() => {});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
@ -206,9 +212,8 @@ describe('getAvailableVersions', () => {
|
||||
});
|
||||
mockPlatform(distribution, platform);
|
||||
|
||||
const availableVersion = await distribution['findPackageForDownload'](
|
||||
jdkVersion
|
||||
);
|
||||
const availableVersion =
|
||||
await distribution['findPackageForDownload'](jdkVersion);
|
||||
expect(availableVersion).not.toBeNull();
|
||||
expect(availableVersion.url).toBe(expectedLink);
|
||||
}
|
||||
@ -233,7 +238,7 @@ describe('getAvailableVersions', () => {
|
||||
await expect(
|
||||
distribution['findPackageForDownload'](jdkVersion)
|
||||
).rejects.toThrow(
|
||||
`Couldn't find any satisfied version for the specified java-version: "${jdkVersion}" and architecture: "${arch}".`
|
||||
`No matching version found for SemVer '${jdkVersion}'`
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
952
__tests__/distributors/graalvm-installer.test.ts
Normal file
952
__tests__/distributors/graalvm-installer.test.ts
Normal file
@ -0,0 +1,952 @@
|
||||
import * as core from '@actions/core';
|
||||
import * as tc from '@actions/tool-cache';
|
||||
import * as http from '@actions/http-client';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import {GraalVMDistribution} from '../../src/distributions/graalvm/installer';
|
||||
import {JavaInstallerOptions} from '../../src/distributions/base-models';
|
||||
import * as util from '../../src/util';
|
||||
|
||||
jest.mock('@actions/core');
|
||||
jest.mock('@actions/tool-cache');
|
||||
jest.mock('@actions/http-client');
|
||||
|
||||
jest.mock('../../src/util', () => ({
|
||||
...jest.requireActual('../../src/util'),
|
||||
extractJdkFile: jest.fn(),
|
||||
getDownloadArchiveExtension: jest.fn(),
|
||||
renameWinArchive: jest.fn(),
|
||||
getGitHubHttpHeaders: jest.fn().mockReturnValue({Accept: 'application/json'})
|
||||
}));
|
||||
|
||||
jest.mock('fs', () => ({
|
||||
...jest.requireActual('fs'),
|
||||
readdirSync: jest.fn(),
|
||||
existsSync: jest.fn()
|
||||
}));
|
||||
|
||||
beforeAll(() => {
|
||||
process.env.NODE_ENV = 'test';
|
||||
|
||||
if (!jest.isMockFunction(http.HttpClient)) {
|
||||
throw new Error('HTTP client must be mocked in tests!');
|
||||
}
|
||||
|
||||
if (!jest.isMockFunction(tc.downloadTool)) {
|
||||
throw new Error('Tool cache downloadTool must be mocked in tests!');
|
||||
}
|
||||
|
||||
console.log('✅ All external dependencies are properly mocked');
|
||||
});
|
||||
|
||||
describe('GraalVMDistribution', () => {
|
||||
let distribution: GraalVMDistribution;
|
||||
let mockHttpClient: jest.Mocked<http.HttpClient>;
|
||||
let spyCoreError: jest.SpyInstance;
|
||||
|
||||
const defaultOptions: JavaInstallerOptions = {
|
||||
version: '17',
|
||||
architecture: 'x64',
|
||||
packageType: 'jdk',
|
||||
checkLatest: false
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks();
|
||||
|
||||
distribution = new GraalVMDistribution(defaultOptions);
|
||||
|
||||
mockHttpClient = new http.HttpClient() as jest.Mocked<http.HttpClient>;
|
||||
(distribution as any).http = mockHttpClient;
|
||||
|
||||
(util.getDownloadArchiveExtension as jest.Mock).mockReturnValue('tar.gz');
|
||||
|
||||
// Mock core.error to suppress error logs
|
||||
spyCoreError = jest.spyOn(core, 'error');
|
||||
spyCoreError.mockImplementation(() => {});
|
||||
});
|
||||
|
||||
afterAll(() => {
|
||||
expect(jest.isMockFunction(http.HttpClient)).toBe(true);
|
||||
|
||||
expect(jest.isMockFunction(tc.downloadTool)).toBe(true);
|
||||
expect(jest.isMockFunction(tc.cacheDir)).toBe(true);
|
||||
|
||||
jest.restoreAllMocks();
|
||||
jest.clearAllMocks();
|
||||
});
|
||||
|
||||
describe('getPlatform', () => {
|
||||
it('should map darwin to macos', () => {
|
||||
const result = distribution.getPlatform('darwin');
|
||||
expect(result).toBe('macos');
|
||||
});
|
||||
|
||||
it('should map win32 to windows', () => {
|
||||
const result = distribution.getPlatform('win32');
|
||||
expect(result).toBe('windows');
|
||||
});
|
||||
|
||||
it('should map linux to linux', () => {
|
||||
const result = distribution.getPlatform('linux');
|
||||
expect(result).toBe('linux');
|
||||
});
|
||||
|
||||
it('should throw error for unsupported platform', () => {
|
||||
expect(() => distribution.getPlatform('aix' as NodeJS.Platform)).toThrow(
|
||||
"Platform 'aix' is not supported. Supported platforms: 'linux', 'macos', 'windows'"
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('downloadTool', () => {
|
||||
const javaRelease = {
|
||||
version: '17.0.5',
|
||||
url: 'https://example.com/graalvm.tar.gz'
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
(tc.downloadTool as jest.Mock).mockResolvedValue('/tmp/archive.tar.gz');
|
||||
(tc.cacheDir as jest.Mock).mockResolvedValue('/cached/java/path');
|
||||
|
||||
(util.extractJdkFile as jest.Mock).mockResolvedValue('/tmp/extracted');
|
||||
|
||||
// Mock renameWinArchive - it returns the same path (no renaming)
|
||||
(util.renameWinArchive as jest.Mock).mockImplementation((p: string) => p);
|
||||
|
||||
(util.getDownloadArchiveExtension as jest.Mock).mockReturnValue('tar.gz');
|
||||
|
||||
// Mock fs.existsSync to return true for extracted path
|
||||
(fs.existsSync as jest.Mock).mockReturnValue(true);
|
||||
|
||||
(fs.readdirSync as jest.Mock).mockReturnValue(['graalvm-jdk-17.0.5']);
|
||||
|
||||
jest
|
||||
.spyOn(distribution as any, 'getToolcacheVersionName')
|
||||
.mockImplementation(version => version);
|
||||
});
|
||||
|
||||
it('should download, extract and cache the tool successfully', async () => {
|
||||
const result = await (distribution as any).downloadTool(javaRelease);
|
||||
|
||||
// Verify the download was initiated
|
||||
expect(tc.downloadTool).toHaveBeenCalledWith(javaRelease.url);
|
||||
|
||||
// The implementation uses the original path for extraction
|
||||
expect(util.extractJdkFile).toHaveBeenCalledWith(
|
||||
'/tmp/archive.tar.gz', // Original path
|
||||
'tar.gz'
|
||||
);
|
||||
|
||||
// Verify path existence check
|
||||
expect(fs.existsSync).toHaveBeenCalledWith('/tmp/extracted');
|
||||
|
||||
// Verify directory reading
|
||||
expect(fs.readdirSync).toHaveBeenCalledWith('/tmp/extracted');
|
||||
|
||||
// Verify caching with correct parameters
|
||||
expect(tc.cacheDir).toHaveBeenCalledWith(
|
||||
path.join('/tmp/extracted', 'graalvm-jdk-17.0.5'),
|
||||
'Java_GraalVM_jdk',
|
||||
'17.0.5',
|
||||
'x64'
|
||||
);
|
||||
|
||||
// Verify the result
|
||||
expect(result).toEqual({
|
||||
version: '17.0.5',
|
||||
path: '/cached/java/path'
|
||||
});
|
||||
|
||||
// Verify logging
|
||||
expect(core.info).toHaveBeenCalledWith(
|
||||
'Downloading Java 17.0.5 (GraalVM) from https://example.com/graalvm.tar.gz ...'
|
||||
);
|
||||
expect(core.info).toHaveBeenCalledWith('Extracting Java archive...');
|
||||
});
|
||||
|
||||
it('should throw error when extracted path does not exist', async () => {
|
||||
(fs.existsSync as jest.Mock).mockReturnValue(false);
|
||||
|
||||
await expect(
|
||||
(distribution as any).downloadTool(javaRelease)
|
||||
).rejects.toThrow(
|
||||
'Extraction failed: path /tmp/extracted does not exist'
|
||||
);
|
||||
|
||||
expect(core.error).toHaveBeenCalledWith(
|
||||
expect.stringContaining('Failed to download and extract GraalVM:')
|
||||
);
|
||||
});
|
||||
|
||||
it('should throw error when extracted directory is empty', async () => {
|
||||
(fs.existsSync as jest.Mock).mockReturnValue(true);
|
||||
(fs.readdirSync as jest.Mock).mockReturnValue([]);
|
||||
|
||||
await expect(
|
||||
(distribution as any).downloadTool(javaRelease)
|
||||
).rejects.toThrow(
|
||||
'Extraction failed: no files found in extracted directory'
|
||||
);
|
||||
|
||||
expect(core.error).toHaveBeenCalledWith(
|
||||
expect.stringContaining('Failed to download and extract GraalVM:')
|
||||
);
|
||||
});
|
||||
|
||||
it('should handle download errors', async () => {
|
||||
const downloadError = new Error('Network error during download');
|
||||
(tc.downloadTool as jest.Mock).mockRejectedValue(downloadError);
|
||||
|
||||
await expect(
|
||||
(distribution as any).downloadTool(javaRelease)
|
||||
).rejects.toThrow('Network error during download');
|
||||
|
||||
expect(core.error).toHaveBeenCalledWith(
|
||||
'Failed to download and extract GraalVM: Error: Network error during download'
|
||||
);
|
||||
});
|
||||
|
||||
it('should handle extraction errors', async () => {
|
||||
const extractError = new Error('Failed to extract archive');
|
||||
(util.extractJdkFile as jest.Mock).mockRejectedValue(extractError);
|
||||
|
||||
await expect(
|
||||
(distribution as any).downloadTool(javaRelease)
|
||||
).rejects.toThrow('Failed to extract archive');
|
||||
|
||||
expect(core.error).toHaveBeenCalledWith(
|
||||
'Failed to download and extract GraalVM: Error: Failed to extract archive'
|
||||
);
|
||||
});
|
||||
|
||||
it('should handle different archive extensions', async () => {
|
||||
// Test with a .zip file
|
||||
(util.getDownloadArchiveExtension as jest.Mock).mockReturnValue('zip');
|
||||
(tc.downloadTool as jest.Mock).mockResolvedValue('/tmp/archive.zip');
|
||||
|
||||
const zipRelease = {
|
||||
version: '17.0.5',
|
||||
url: 'https://example.com/graalvm.zip'
|
||||
};
|
||||
|
||||
const result = await (distribution as any).downloadTool(zipRelease);
|
||||
|
||||
expect(util.extractJdkFile).toHaveBeenCalledWith(
|
||||
'/tmp/archive.zip',
|
||||
'zip'
|
||||
);
|
||||
|
||||
expect(result).toEqual({
|
||||
version: '17.0.5',
|
||||
path: '/cached/java/path'
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('findPackageForDownload', () => {
|
||||
beforeEach(() => {
|
||||
jest.spyOn(distribution, 'getPlatform').mockReturnValue('linux');
|
||||
});
|
||||
|
||||
describe('input validation', () => {
|
||||
it('should throw error for null version range', async () => {
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload(null)
|
||||
).rejects.toThrow('Version range is required and must be a string');
|
||||
});
|
||||
|
||||
it('should throw error for undefined version range', async () => {
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload(undefined)
|
||||
).rejects.toThrow('Version range is required and must be a string');
|
||||
});
|
||||
|
||||
it('should throw error for empty string version range', async () => {
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('')
|
||||
).rejects.toThrow('Version range is required and must be a string');
|
||||
});
|
||||
|
||||
it('should throw error for non-string version range', async () => {
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload(123)
|
||||
).rejects.toThrow('Version range is required and must be a string');
|
||||
});
|
||||
|
||||
it('should throw error for invalid version format', async () => {
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('abc')
|
||||
).rejects.toThrow('Invalid version format: abc');
|
||||
});
|
||||
});
|
||||
|
||||
describe('stable builds', () => {
|
||||
it('should construct correct URL for specific version', async () => {
|
||||
const mockResponse = {
|
||||
message: {statusCode: 200}
|
||||
} as http.HttpClientResponse;
|
||||
mockHttpClient.head.mockResolvedValue(mockResponse);
|
||||
|
||||
const result = await (distribution as any).findPackageForDownload(
|
||||
'17.0.5'
|
||||
);
|
||||
|
||||
expect(result).toEqual({
|
||||
url: 'https://download.oracle.com/graalvm/17/archive/graalvm-jdk-17.0.5_linux-x64_bin.tar.gz',
|
||||
version: '17.0.5'
|
||||
});
|
||||
expect(mockHttpClient.head).toHaveBeenCalledWith(result.url);
|
||||
});
|
||||
|
||||
it('should construct correct URL for major version (latest)', async () => {
|
||||
const mockResponse = {
|
||||
message: {statusCode: 200}
|
||||
} as http.HttpClientResponse;
|
||||
mockHttpClient.head.mockResolvedValue(mockResponse);
|
||||
|
||||
const result = await (distribution as any).findPackageForDownload('21');
|
||||
|
||||
expect(result).toEqual({
|
||||
url: 'https://download.oracle.com/graalvm/21/latest/graalvm-jdk-21_linux-x64_bin.tar.gz',
|
||||
version: '21'
|
||||
});
|
||||
});
|
||||
|
||||
it('should throw error for unsupported architecture', async () => {
|
||||
distribution = new GraalVMDistribution({
|
||||
...defaultOptions,
|
||||
architecture: 'x86'
|
||||
});
|
||||
(distribution as any).http = mockHttpClient;
|
||||
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('17')
|
||||
).rejects.toThrow(
|
||||
'Unsupported architecture: x86. Supported architectures are: x64, aarch64'
|
||||
);
|
||||
});
|
||||
|
||||
it('should throw error for JDK versions less than 17', async () => {
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('11')
|
||||
).rejects.toThrow(
|
||||
'GraalVM is only supported for JDK 17 and later. Requested version: 11'
|
||||
);
|
||||
});
|
||||
|
||||
it('should throw error for non-jdk package types', async () => {
|
||||
distribution = new GraalVMDistribution({
|
||||
...defaultOptions,
|
||||
packageType: 'jre'
|
||||
});
|
||||
(distribution as any).http = mockHttpClient;
|
||||
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('17')
|
||||
).rejects.toThrow('GraalVM provides only the `jdk` package type');
|
||||
});
|
||||
|
||||
it('should throw error when file not found (404)', async () => {
|
||||
const mockResponse = {
|
||||
message: {statusCode: 404}
|
||||
} as http.HttpClientResponse;
|
||||
mockHttpClient.head.mockResolvedValue(mockResponse);
|
||||
|
||||
// Verify the error is thrown with the expected message
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('17.0.99')
|
||||
).rejects.toThrow("No matching version found for SemVer '17.0.99'");
|
||||
// Verify distribution info is included
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('17.0.99')
|
||||
).rejects.toThrow('GraalVM');
|
||||
|
||||
// Verify the hint about checking the base URL is included
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('17.0.99')
|
||||
).rejects.toThrow('https://www.graalvm.org/downloads/');
|
||||
});
|
||||
|
||||
it('should throw error for unauthorized access (401)', async () => {
|
||||
const mockResponse = {
|
||||
message: {statusCode: 401}
|
||||
} as http.HttpClientResponse;
|
||||
mockHttpClient.head.mockResolvedValue(mockResponse);
|
||||
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('17')
|
||||
).rejects.toThrow(
|
||||
'Access denied when downloading GraalVM. Status code: 401. Please check your credentials or permissions.'
|
||||
);
|
||||
});
|
||||
|
||||
it('should throw error for forbidden access (403)', async () => {
|
||||
const mockResponse = {
|
||||
message: {statusCode: 403}
|
||||
} as http.HttpClientResponse;
|
||||
mockHttpClient.head.mockResolvedValue(mockResponse);
|
||||
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('17')
|
||||
).rejects.toThrow(
|
||||
'Access denied when downloading GraalVM. Status code: 403. Please check your credentials or permissions.'
|
||||
);
|
||||
});
|
||||
|
||||
it('should throw error for other HTTP errors with status message', async () => {
|
||||
const mockResponse = {
|
||||
message: {
|
||||
statusCode: 500,
|
||||
statusMessage: 'Internal Server Error'
|
||||
}
|
||||
} as http.HttpClientResponse;
|
||||
mockHttpClient.head.mockResolvedValue(mockResponse);
|
||||
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('17')
|
||||
).rejects.toThrow(
|
||||
'HTTP request for GraalVM failed with status code: 500 (Internal Server Error)'
|
||||
);
|
||||
});
|
||||
|
||||
it('should throw error for other HTTP errors without status message', async () => {
|
||||
const mockResponse = {
|
||||
message: {statusCode: 500}
|
||||
} as http.HttpClientResponse;
|
||||
mockHttpClient.head.mockResolvedValue(mockResponse);
|
||||
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('17')
|
||||
).rejects.toThrow(
|
||||
'HTTP request for GraalVM failed with status code: 500 (Unknown error)'
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('EA builds', () => {
|
||||
beforeEach(() => {
|
||||
distribution = new GraalVMDistribution(defaultOptions);
|
||||
(distribution as any).http = mockHttpClient;
|
||||
(distribution as any).stable = false;
|
||||
});
|
||||
|
||||
it('should delegate to findEABuildDownloadUrl for unstable versions', async () => {
|
||||
const currentPlatform =
|
||||
process.platform === 'win32' ? 'windows' : process.platform;
|
||||
|
||||
const mockEAVersions = [
|
||||
{
|
||||
version: '23-ea-20240716',
|
||||
latest: true,
|
||||
download_base_url: 'https://example.com/download/',
|
||||
files: [
|
||||
{
|
||||
arch: 'x64',
|
||||
platform: currentPlatform,
|
||||
filename: 'graalvm-jdk-23_linux-x64_bin.tar.gz'
|
||||
},
|
||||
{
|
||||
arch: 'aarch64',
|
||||
platform: currentPlatform,
|
||||
filename: 'graalvm-jdk-23_linux-aarch64_bin.tar.gz'
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
mockHttpClient.getJson.mockResolvedValue({
|
||||
result: mockEAVersions,
|
||||
statusCode: 200,
|
||||
headers: {}
|
||||
});
|
||||
|
||||
jest
|
||||
.spyOn(distribution as any, 'distributionArchitecture')
|
||||
.mockReturnValue('x64');
|
||||
|
||||
const result = await (distribution as any).findPackageForDownload('23');
|
||||
|
||||
expect(result).toEqual({
|
||||
url: 'https://example.com/download/graalvm-jdk-23_linux-x64_bin.tar.gz',
|
||||
version: '23-ea-20240716'
|
||||
});
|
||||
|
||||
expect(mockHttpClient.getJson).toHaveBeenCalledWith(
|
||||
'https://api.github.com/repos/graalvm/oracle-graalvm-ea-builds/contents/versions/23-ea.json?ref=main',
|
||||
{Accept: 'application/json'}
|
||||
);
|
||||
});
|
||||
|
||||
it('should throw error when no latest EA version found', async () => {
|
||||
const currentPlatform =
|
||||
process.platform === 'win32' ? 'windows' : process.platform;
|
||||
|
||||
const mockEAVersions = [
|
||||
{
|
||||
version: '23-ea-20240716',
|
||||
latest: false,
|
||||
download_base_url: 'https://example.com/download/',
|
||||
files: [
|
||||
{
|
||||
arch: 'x64',
|
||||
platform: currentPlatform,
|
||||
filename: 'graalvm-jdk-23_linux-x64_bin.tar.gz'
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
mockHttpClient.getJson.mockResolvedValue({
|
||||
result: mockEAVersions,
|
||||
statusCode: 200,
|
||||
headers: {}
|
||||
});
|
||||
|
||||
jest
|
||||
.spyOn(distribution as any, 'distributionArchitecture')
|
||||
.mockReturnValue('x64');
|
||||
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('23')
|
||||
).rejects.toThrow("No matching version found for SemVer '23-ea'");
|
||||
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('23')
|
||||
).rejects.toThrow(
|
||||
'Note: No EA build is marked as latest for this version.'
|
||||
);
|
||||
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('23')
|
||||
).rejects.toThrow('23-ea-20240716');
|
||||
|
||||
// Verify error logging - removed as we now use the helper method which doesn't call core.error
|
||||
});
|
||||
|
||||
it('should throw error when no matching file for architecture in EA build', async () => {
|
||||
const currentPlatform =
|
||||
process.platform === 'win32' ? 'windows' : process.platform;
|
||||
|
||||
const mockEAVersions = [
|
||||
{
|
||||
version: '23-ea-20240716',
|
||||
latest: true,
|
||||
download_base_url: 'https://example.com/download/',
|
||||
files: [
|
||||
{
|
||||
arch: 'arm64',
|
||||
platform: currentPlatform,
|
||||
filename: 'graalvm-jdk-23_linux-arm64_bin.tar.gz'
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
mockHttpClient.getJson.mockResolvedValue({
|
||||
result: mockEAVersions,
|
||||
statusCode: 200,
|
||||
headers: {}
|
||||
});
|
||||
|
||||
jest
|
||||
.spyOn(distribution as any, 'distributionArchitecture')
|
||||
.mockReturnValue('x64');
|
||||
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('23')
|
||||
).rejects.toThrow(
|
||||
`Unable to find file for architecture 'x64' and platform '${currentPlatform}'`
|
||||
);
|
||||
|
||||
// Verify error logging
|
||||
expect(core.error).toHaveBeenCalledWith(
|
||||
expect.stringContaining('Available files for architecture x64:')
|
||||
);
|
||||
});
|
||||
|
||||
it('should throw error when no matching platform in EA build', async () => {
|
||||
const mockEAVersions = [
|
||||
{
|
||||
version: '23-ea-20240716',
|
||||
latest: true,
|
||||
download_base_url: 'https://example.com/download/',
|
||||
files: [
|
||||
{
|
||||
arch: 'x64',
|
||||
platform: 'different-platform',
|
||||
filename: 'graalvm-jdk-23_different-x64_bin.tar.gz'
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
mockHttpClient.getJson.mockResolvedValue({
|
||||
result: mockEAVersions,
|
||||
statusCode: 200,
|
||||
headers: {}
|
||||
});
|
||||
|
||||
jest
|
||||
.spyOn(distribution as any, 'distributionArchitecture')
|
||||
.mockReturnValue('x64');
|
||||
|
||||
const currentPlatform =
|
||||
process.platform === 'win32' ? 'windows' : process.platform;
|
||||
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('23')
|
||||
).rejects.toThrow(
|
||||
`Unable to find file for architecture 'x64' and platform '${currentPlatform}'`
|
||||
);
|
||||
});
|
||||
|
||||
it('should throw error when filename does not start with graalvm-jdk-', async () => {
|
||||
const currentPlatform =
|
||||
process.platform === 'win32' ? 'windows' : process.platform;
|
||||
|
||||
const mockEAVersions = [
|
||||
{
|
||||
version: '23-ea-20240716',
|
||||
latest: true,
|
||||
download_base_url: 'https://example.com/download/',
|
||||
files: [
|
||||
{
|
||||
arch: 'x64',
|
||||
platform: currentPlatform,
|
||||
filename: 'wrong-prefix-23_linux-x64_bin.tar.gz'
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
mockHttpClient.getJson.mockResolvedValue({
|
||||
result: mockEAVersions,
|
||||
statusCode: 200,
|
||||
headers: {}
|
||||
});
|
||||
|
||||
jest
|
||||
.spyOn(distribution as any, 'distributionArchitecture')
|
||||
.mockReturnValue('x64');
|
||||
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('23')
|
||||
).rejects.toThrow(
|
||||
"Invalid filename format: wrong-prefix-23_linux-x64_bin.tar.gz. Expected to start with 'graalvm-jdk-'"
|
||||
);
|
||||
});
|
||||
|
||||
it('should throw error when EA version JSON is not found', async () => {
|
||||
mockHttpClient.getJson.mockResolvedValue({
|
||||
result: null,
|
||||
statusCode: 404,
|
||||
headers: {}
|
||||
});
|
||||
|
||||
await expect(
|
||||
(distribution as any).findPackageForDownload('23')
|
||||
).rejects.toThrow(
|
||||
"No GraalVM EA build found for version '23-ea'. Please check if the version is correct."
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('findEABuildDownloadUrl', () => {
|
||||
const currentPlatform =
|
||||
process.platform === 'win32' ? 'windows' : process.platform;
|
||||
|
||||
const mockEAVersions = [
|
||||
{
|
||||
version: '23-ea-20240716',
|
||||
latest: true,
|
||||
download_base_url: 'https://example.com/download/',
|
||||
files: [
|
||||
{
|
||||
arch: 'x64',
|
||||
platform: currentPlatform,
|
||||
filename: 'graalvm-jdk-23_linux-x64_bin.tar.gz'
|
||||
},
|
||||
{
|
||||
arch: 'aarch64',
|
||||
platform: currentPlatform,
|
||||
filename: 'graalvm-jdk-23_linux-aarch64_bin.tar.gz'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
version: '23-ea-20240709',
|
||||
latest: false,
|
||||
download_base_url: 'https://example.com/old/',
|
||||
files: [
|
||||
{
|
||||
arch: 'x64',
|
||||
platform: currentPlatform,
|
||||
filename: 'graalvm-jdk-23_linux-x64_bin.tar.gz'
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
let fetchEASpy: jest.SpyInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
fetchEASpy = jest.spyOn(distribution as any, 'fetchEAJson');
|
||||
jest
|
||||
.spyOn(distribution as any, 'distributionArchitecture')
|
||||
.mockReturnValue('x64');
|
||||
});
|
||||
|
||||
it('should find latest version and return correct URL', async () => {
|
||||
fetchEASpy.mockResolvedValue(mockEAVersions);
|
||||
|
||||
const result = await (distribution as any).findEABuildDownloadUrl(
|
||||
'23-ea'
|
||||
);
|
||||
|
||||
expect(fetchEASpy).toHaveBeenCalledWith('23-ea');
|
||||
expect(result).toEqual({
|
||||
url: 'https://example.com/download/graalvm-jdk-23_linux-x64_bin.tar.gz',
|
||||
version: '23-ea-20240716'
|
||||
});
|
||||
|
||||
// Verify debug logging
|
||||
expect(core.debug).toHaveBeenCalledWith('Searching for EA build: 23-ea');
|
||||
expect(core.debug).toHaveBeenCalledWith('Found 2 EA versions');
|
||||
expect(core.debug).toHaveBeenCalledWith(
|
||||
'Latest version found: 23-ea-20240716'
|
||||
);
|
||||
expect(core.debug).toHaveBeenCalledWith(
|
||||
'Download URL: https://example.com/download/graalvm-jdk-23_linux-x64_bin.tar.gz'
|
||||
);
|
||||
});
|
||||
|
||||
it('should throw error when no latest version found', async () => {
|
||||
const noLatestVersions = mockEAVersions.map(v => ({...v, latest: false}));
|
||||
fetchEASpy.mockResolvedValue(noLatestVersions);
|
||||
|
||||
await expect(
|
||||
(distribution as any).findEABuildDownloadUrl('23-ea')
|
||||
).rejects.toThrow("No matching version found for SemVer '23-ea'");
|
||||
|
||||
await expect(
|
||||
(distribution as any).findEABuildDownloadUrl('23-ea')
|
||||
).rejects.toThrow(
|
||||
'Note: No EA build is marked as latest for this version.'
|
||||
);
|
||||
|
||||
await expect(
|
||||
(distribution as any).findEABuildDownloadUrl('23-ea')
|
||||
).rejects.toThrow('23-ea-20240716');
|
||||
|
||||
// Verify error logging - removed as we now use the helper method which doesn't call core.error
|
||||
});
|
||||
|
||||
it('should throw error when no matching file for architecture', async () => {
|
||||
const wrongArchVersions = [
|
||||
{
|
||||
version: '23-ea-20240716',
|
||||
latest: true,
|
||||
download_base_url: 'https://example.com/download/',
|
||||
files: [
|
||||
{
|
||||
arch: 'arm',
|
||||
platform: currentPlatform,
|
||||
filename: 'graalvm-jdk-23_linux-arm_bin.tar.gz'
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
fetchEASpy.mockResolvedValue(wrongArchVersions);
|
||||
|
||||
await expect(
|
||||
(distribution as any).findEABuildDownloadUrl('23-ea')
|
||||
).rejects.toThrow(
|
||||
`Unable to find file for architecture 'x64' and platform '${currentPlatform}'`
|
||||
);
|
||||
|
||||
expect(core.error).toHaveBeenCalledWith(
|
||||
expect.stringContaining('Available files for architecture x64:')
|
||||
);
|
||||
});
|
||||
|
||||
it('should throw error when filename does not start with graalvm-jdk-', async () => {
|
||||
const badFilenameVersions = [
|
||||
{
|
||||
version: '23-ea-20240716',
|
||||
latest: true,
|
||||
download_base_url: 'https://example.com/download/',
|
||||
files: [
|
||||
{
|
||||
arch: 'x64',
|
||||
platform: currentPlatform,
|
||||
filename: 'wrong-name.tar.gz'
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
fetchEASpy.mockResolvedValue(badFilenameVersions);
|
||||
|
||||
await expect(
|
||||
(distribution as any).findEABuildDownloadUrl('23-ea')
|
||||
).rejects.toThrow(
|
||||
"Invalid filename format: wrong-name.tar.gz. Expected to start with 'graalvm-jdk-'"
|
||||
);
|
||||
});
|
||||
|
||||
it('should work with aarch64 architecture', async () => {
|
||||
jest
|
||||
.spyOn(distribution as any, 'distributionArchitecture')
|
||||
.mockReturnValue('aarch64');
|
||||
|
||||
fetchEASpy.mockResolvedValue(mockEAVersions);
|
||||
|
||||
const result = await (distribution as any).findEABuildDownloadUrl(
|
||||
'23-ea'
|
||||
);
|
||||
|
||||
expect(result).toEqual({
|
||||
url: 'https://example.com/download/graalvm-jdk-23_linux-aarch64_bin.tar.gz',
|
||||
version: '23-ea-20240716'
|
||||
});
|
||||
});
|
||||
|
||||
it('should throw error when platform does not match', async () => {
|
||||
const wrongPlatformVersions = [
|
||||
{
|
||||
version: '23-ea-20240716',
|
||||
latest: true,
|
||||
download_base_url: 'https://example.com/download/',
|
||||
files: [
|
||||
{
|
||||
arch: 'x64',
|
||||
platform: 'different-platform',
|
||||
filename: 'graalvm-jdk-23_different-x64_bin.tar.gz'
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
fetchEASpy.mockResolvedValue(wrongPlatformVersions);
|
||||
|
||||
await expect(
|
||||
(distribution as any).findEABuildDownloadUrl('23-ea')
|
||||
).rejects.toThrow(
|
||||
`Unable to find file for architecture 'x64' and platform '${currentPlatform}'`
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('fetchEAJson', () => {
|
||||
it('should fetch and return EA version data', async () => {
|
||||
const mockData = [{version: '23-ea', files: []}];
|
||||
mockHttpClient.getJson.mockResolvedValue({
|
||||
result: mockData,
|
||||
statusCode: 200,
|
||||
headers: {}
|
||||
});
|
||||
|
||||
const result = await (distribution as any).fetchEAJson('23-ea');
|
||||
|
||||
expect(mockHttpClient.getJson).toHaveBeenCalledWith(
|
||||
'https://api.github.com/repos/graalvm/oracle-graalvm-ea-builds/contents/versions/23-ea.json?ref=main',
|
||||
{Accept: 'application/json'}
|
||||
);
|
||||
expect(result).toEqual(mockData);
|
||||
expect(core.debug).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should throw error when no data returned', async () => {
|
||||
mockHttpClient.getJson.mockResolvedValue({
|
||||
result: null,
|
||||
statusCode: 200,
|
||||
headers: {}
|
||||
});
|
||||
|
||||
await expect((distribution as any).fetchEAJson('23-ea')).rejects.toThrow(
|
||||
"No GraalVM EA build found for version '23-ea'. Please check if the version is correct."
|
||||
);
|
||||
});
|
||||
|
||||
it('should handle 404 errors with specific message', async () => {
|
||||
const error404 = new Error('Not Found: 404');
|
||||
mockHttpClient.getJson.mockRejectedValue(error404);
|
||||
|
||||
await expect((distribution as any).fetchEAJson('23-ea')).rejects.toThrow(
|
||||
"GraalVM EA version '23-ea' not found. Please verify the version exists in the EA builds repository."
|
||||
);
|
||||
});
|
||||
|
||||
it('should handle generic HTTP errors with context', async () => {
|
||||
const networkError = new Error('Network timeout');
|
||||
mockHttpClient.getJson.mockRejectedValue(networkError);
|
||||
|
||||
await expect((distribution as any).fetchEAJson('23-ea')).rejects.toThrow(
|
||||
"Failed to fetch GraalVM EA version information for '23-ea': Network timeout"
|
||||
);
|
||||
});
|
||||
|
||||
it('should handle non-Error exceptions', async () => {
|
||||
mockHttpClient.getJson.mockRejectedValue('String error');
|
||||
|
||||
await expect((distribution as any).fetchEAJson('23-ea')).rejects.toThrow(
|
||||
"Failed to fetch GraalVM EA version information for '23-ea'"
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Integration tests', () => {
|
||||
it('should handle different architectures correctly', async () => {
|
||||
const architectures = ['x64', 'aarch64'];
|
||||
|
||||
for (const arch of architectures) {
|
||||
distribution = new GraalVMDistribution({
|
||||
...defaultOptions,
|
||||
architecture: arch
|
||||
});
|
||||
(distribution as any).http = mockHttpClient;
|
||||
|
||||
const mockResponse = {
|
||||
message: {statusCode: 200}
|
||||
} as http.HttpClientResponse;
|
||||
mockHttpClient.head.mockResolvedValue(mockResponse);
|
||||
|
||||
const result = await (distribution as any).findPackageForDownload('17');
|
||||
expect(result.url).toContain(arch);
|
||||
}
|
||||
});
|
||||
|
||||
it('should handle different platforms correctly', async () => {
|
||||
const platforms = [
|
||||
{process: 'darwin', expected: 'macos'},
|
||||
{process: 'win32', expected: 'windows'},
|
||||
{process: 'linux', expected: 'linux'}
|
||||
];
|
||||
|
||||
const originalPlatform = process.platform;
|
||||
|
||||
for (const {process: proc, expected} of platforms) {
|
||||
Object.defineProperty(process, 'platform', {
|
||||
value: proc,
|
||||
configurable: true
|
||||
});
|
||||
|
||||
distribution = new GraalVMDistribution(defaultOptions);
|
||||
(distribution as any).http = mockHttpClient;
|
||||
|
||||
const mockResponse = {
|
||||
message: {statusCode: 200}
|
||||
} as http.HttpClientResponse;
|
||||
mockHttpClient.head.mockResolvedValue(mockResponse);
|
||||
|
||||
const result = await (distribution as any).findPackageForDownload('17');
|
||||
expect(result.url).toContain(expected);
|
||||
}
|
||||
|
||||
Object.defineProperty(process, 'platform', {
|
||||
value: originalPlatform,
|
||||
configurable: true
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
123
__tests__/distributors/jetbrains-installer.test.ts
Normal file
123
__tests__/distributors/jetbrains-installer.test.ts
Normal file
@ -0,0 +1,123 @@
|
||||
import https from 'https';
|
||||
import {HttpClient} from '@actions/http-client';
|
||||
import {JetBrainsDistribution} from '../../src/distributions/jetbrains/installer';
|
||||
|
||||
import manifestData from '../data/jetbrains.json';
|
||||
import os from 'os';
|
||||
import * as core from '@actions/core';
|
||||
|
||||
describe('getAvailableVersions', () => {
|
||||
let spyHttpClient: jest.SpyInstance;
|
||||
let spyCoreError: jest.SpyInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
|
||||
spyHttpClient.mockReturnValue({
|
||||
statusCode: 200,
|
||||
headers: {},
|
||||
result: []
|
||||
});
|
||||
|
||||
// Mock core.error to suppress error logs
|
||||
spyCoreError = jest.spyOn(core, 'error');
|
||||
spyCoreError.mockImplementation(() => {});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
jest.resetAllMocks();
|
||||
jest.clearAllMocks();
|
||||
jest.restoreAllMocks();
|
||||
});
|
||||
|
||||
it('load available versions', async () => {
|
||||
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
|
||||
spyHttpClient.mockReturnValueOnce({
|
||||
statusCode: 200,
|
||||
headers: {},
|
||||
result: manifestData as any
|
||||
});
|
||||
|
||||
const distribution = new JetBrainsDistribution({
|
||||
version: '17',
|
||||
architecture: 'x64',
|
||||
packageType: 'jdk',
|
||||
checkLatest: false
|
||||
});
|
||||
const availableVersions = await distribution['getAvailableVersions']();
|
||||
expect(availableVersions).not.toBeNull();
|
||||
|
||||
const length =
|
||||
os.platform() === 'win32' ? manifestData.length : manifestData.length + 2;
|
||||
expect(availableVersions.length).toBe(length);
|
||||
}, 10_000);
|
||||
});
|
||||
|
||||
describe('findPackageForDownload', () => {
|
||||
it.each([
|
||||
['17', '17.0.11+1207.24'],
|
||||
['11.0', '11.0.16+2043.64'],
|
||||
['11.0.11', '11.0.11+1542.1'],
|
||||
['21.0.2', '21.0.2+375.1'],
|
||||
['21', '21.0.3+465.3'],
|
||||
['x', '21.0.3+465.3']
|
||||
])('version is resolved correctly %s -> %s', async (input, expected) => {
|
||||
const distribution = new JetBrainsDistribution({
|
||||
version: input,
|
||||
architecture: 'x64',
|
||||
packageType: 'jdk',
|
||||
checkLatest: false
|
||||
});
|
||||
distribution['getAvailableVersions'] = async () => manifestData as any;
|
||||
const resolvedVersion = await distribution['findPackageForDownload'](input);
|
||||
expect(resolvedVersion.version).toBe(expected);
|
||||
});
|
||||
|
||||
it.each(['17', '11.0', '11.0.11', '21.0.2', '21'])(
|
||||
'version %s can be downloaded',
|
||||
async input => {
|
||||
const distribution = new JetBrainsDistribution({
|
||||
version: input,
|
||||
architecture: 'x64',
|
||||
packageType: 'jdk',
|
||||
checkLatest: false
|
||||
});
|
||||
distribution['getAvailableVersions'] = async () => manifestData as any;
|
||||
const resolvedVersion =
|
||||
await distribution['findPackageForDownload'](input);
|
||||
const url = resolvedVersion.url;
|
||||
const options = {method: 'HEAD'};
|
||||
|
||||
https.request(url, options, res => {
|
||||
// JetBrains uses 403 for inexistent packages
|
||||
expect(res.statusCode).not.toBe(403);
|
||||
res.resume();
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
it('version is not found', async () => {
|
||||
const distribution = new JetBrainsDistribution({
|
||||
version: '8.0.452',
|
||||
architecture: 'x64',
|
||||
packageType: 'jdk',
|
||||
checkLatest: false
|
||||
});
|
||||
distribution['getAvailableVersions'] = async () => manifestData as any;
|
||||
await expect(distribution['findPackageForDownload']('8.x')).rejects.toThrow(
|
||||
/No matching version found for SemVer */
|
||||
);
|
||||
});
|
||||
|
||||
it('version list is empty', async () => {
|
||||
const distribution = new JetBrainsDistribution({
|
||||
version: '8',
|
||||
architecture: 'x64',
|
||||
packageType: 'jdk',
|
||||
checkLatest: false
|
||||
});
|
||||
distribution['getAvailableVersions'] = async () => [];
|
||||
await expect(distribution['findPackageForDownload']('8')).rejects.toThrow(
|
||||
/No matching version found for SemVer */
|
||||
);
|
||||
});
|
||||
});
|
||||
@ -5,11 +5,13 @@ import {
|
||||
} from '../../src/distributions/liberica/models';
|
||||
import {HttpClient} from '@actions/http-client';
|
||||
import os from 'os';
|
||||
import * as core from '@actions/core';
|
||||
|
||||
import manifestData from '../data/liberica.json';
|
||||
|
||||
describe('getAvailableVersions', () => {
|
||||
let spyHttpClient: jest.SpyInstance;
|
||||
let spyCoreError: jest.SpyInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
|
||||
@ -18,6 +20,10 @@ describe('getAvailableVersions', () => {
|
||||
headers: {},
|
||||
result: manifestData as LibericaVersion[]
|
||||
});
|
||||
|
||||
// Mock core.error to suppress error logs
|
||||
spyCoreError = jest.spyOn(core, 'error');
|
||||
spyCoreError.mockImplementation(() => {});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
@ -105,9 +111,11 @@ describe('getAvailableVersions', () => {
|
||||
])(
|
||||
'defaults to os.arch(): %s mapped to distro arch: %s',
|
||||
async (osArch: string, distroArch: DistroArch) => {
|
||||
jest.spyOn(os, 'arch').mockReturnValue(osArch);
|
||||
jest
|
||||
.spyOn(os, 'arch')
|
||||
.mockReturnValue(osArch as ReturnType<typeof os.arch>);
|
||||
|
||||
const distribution = new LibericaDistributions({
|
||||
const distributions = new LibericaDistributions({
|
||||
version: '17',
|
||||
architecture: '', // to get default value
|
||||
packageType: 'jdk',
|
||||
@ -117,11 +125,11 @@ describe('getAvailableVersions', () => {
|
||||
const additionalParams =
|
||||
'&installation-type=archive&fields=downloadUrl%2Cversion%2CfeatureVersion%2CinterimVersion%2C' +
|
||||
'updateVersion%2CbuildVersion';
|
||||
distribution['getPlatformOption'] = () => 'macos';
|
||||
distributions['getPlatformOption'] = () => 'macos';
|
||||
|
||||
const buildUrl = `https://api.bell-sw.com/v1/liberica/releases?os=macos&bundle-type=jdk&bitness=${distroArch.bitness}&arch=${distroArch.arch}&build-type=all${additionalParams}`;
|
||||
|
||||
await distribution['getAvailableVersions']();
|
||||
await distributions['getAvailableVersions']();
|
||||
|
||||
expect(spyHttpClient.mock.calls).toHaveLength(1);
|
||||
expect(spyHttpClient.mock.calls[0][0]).toBe(buildUrl);
|
||||
@ -207,7 +215,7 @@ describe('findPackageForDownload', () => {
|
||||
|
||||
it('should throw an error', async () => {
|
||||
await expect(distribution['findPackageForDownload']('17')).rejects.toThrow(
|
||||
/Could not find satisfied version for semver */
|
||||
/No matching version found for SemVer/
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@ -5,11 +5,13 @@ import {
|
||||
} from '../../src/distributions/liberica/models';
|
||||
import {HttpClient} from '@actions/http-client';
|
||||
import os from 'os';
|
||||
import * as core from '@actions/core';
|
||||
|
||||
import manifestData from '../data/liberica-linux.json';
|
||||
|
||||
describe('getAvailableVersions', () => {
|
||||
let spyHttpClient: jest.SpyInstance;
|
||||
let spyCoreError: jest.SpyInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
|
||||
@ -18,6 +20,10 @@ describe('getAvailableVersions', () => {
|
||||
headers: {},
|
||||
result: manifestData as LibericaVersion[]
|
||||
});
|
||||
|
||||
// Mock core.error to suppress error logs
|
||||
spyCoreError = jest.spyOn(core, 'error');
|
||||
spyCoreError.mockImplementation(() => {});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
@ -105,7 +111,9 @@ describe('getAvailableVersions', () => {
|
||||
])(
|
||||
'defaults to os.arch(): %s mapped to distro arch: %s',
|
||||
async (osArch: string, distroArch: DistroArch) => {
|
||||
jest.spyOn(os, 'arch').mockReturnValue(osArch);
|
||||
jest
|
||||
.spyOn(os, 'arch')
|
||||
.mockReturnValue(osArch as ReturnType<typeof os.arch>);
|
||||
|
||||
const distribution = new LibericaDistributions({
|
||||
version: '17',
|
||||
@ -207,7 +215,7 @@ describe('findPackageForDownload', () => {
|
||||
|
||||
it('should throw an error', async () => {
|
||||
await expect(distribution['findPackageForDownload']('18')).rejects.toThrow(
|
||||
/Could not find satisfied version for semver */
|
||||
/No matching version found for SemVer/
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@ -5,11 +5,13 @@ import {
|
||||
} from '../../src/distributions/liberica/models';
|
||||
import {HttpClient} from '@actions/http-client';
|
||||
import os from 'os';
|
||||
import * as core from '@actions/core';
|
||||
|
||||
import manifestData from '../data/liberica-windows.json';
|
||||
|
||||
describe('getAvailableVersions', () => {
|
||||
let spyHttpClient: jest.SpyInstance;
|
||||
let spyCoreError: jest.SpyInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
|
||||
@ -18,6 +20,9 @@ describe('getAvailableVersions', () => {
|
||||
headers: {},
|
||||
result: manifestData as LibericaVersion[]
|
||||
});
|
||||
// Mock core.error to suppress error logs
|
||||
spyCoreError = jest.spyOn(core, 'error');
|
||||
spyCoreError.mockImplementation(() => {});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
@ -105,7 +110,9 @@ describe('getAvailableVersions', () => {
|
||||
])(
|
||||
'defaults to os.arch(): %s mapped to distro arch: %s',
|
||||
async (osArch: string, distroArch: DistroArch) => {
|
||||
jest.spyOn(os, 'arch').mockReturnValue(osArch);
|
||||
jest
|
||||
.spyOn(os, 'arch')
|
||||
.mockReturnValue(osArch as ReturnType<typeof os.arch>);
|
||||
|
||||
const distribution = new LibericaDistributions({
|
||||
version: '17',
|
||||
@ -207,7 +214,7 @@ describe('findPackageForDownload', () => {
|
||||
|
||||
it('should throw an error', async () => {
|
||||
await expect(distribution['findPackageForDownload']('18')).rejects.toThrow(
|
||||
/Could not find satisfied version for semver */
|
||||
/No matching version found for SemVer/
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@ -27,6 +27,7 @@ describe('setupJava', () => {
|
||||
let spyFsReadDir: jest.SpyInstance;
|
||||
let spyUtilsExtractJdkFile: jest.SpyInstance;
|
||||
let spyPathResolve: jest.SpyInstance;
|
||||
let spyCoreError: jest.SpyInstance;
|
||||
const expectedJdkFile = 'JavaLocalJdkFile';
|
||||
|
||||
beforeEach(() => {
|
||||
@ -93,6 +94,10 @@ describe('setupJava', () => {
|
||||
// Spy on path methods
|
||||
spyPathResolve = jest.spyOn(path, 'resolve');
|
||||
spyPathResolve.mockImplementation((path: string) => path);
|
||||
|
||||
// Mock core.error to suppress error logs
|
||||
spyCoreError = jest.spyOn(core, 'error');
|
||||
spyCoreError.mockImplementation(() => {});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
|
||||
@ -8,6 +8,7 @@ describe('findPackageForDownload', () => {
|
||||
let distribution: MicrosoftDistributions;
|
||||
let spyGetManifestFromRepo: jest.SpyInstance;
|
||||
let spyDebug: jest.SpyInstance;
|
||||
let spyCoreError: jest.SpyInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
distribution = new MicrosoftDistributions({
|
||||
@ -26,9 +27,18 @@ describe('findPackageForDownload', () => {
|
||||
|
||||
spyDebug = jest.spyOn(core, 'debug');
|
||||
spyDebug.mockImplementation(() => {});
|
||||
|
||||
// Mock core.error to suppress error logs
|
||||
spyCoreError = jest.spyOn(core, 'error');
|
||||
spyCoreError.mockImplementation(() => {});
|
||||
});
|
||||
|
||||
it.each([
|
||||
[
|
||||
'25.x',
|
||||
'25.0.0',
|
||||
'https://aka.ms/download-jdk/microsoft-jdk-25.0.0-{{OS_TYPE}}-x64.{{ARCHIVE_TYPE}}'
|
||||
],
|
||||
[
|
||||
'21.x',
|
||||
'21.0.0',
|
||||
@ -95,7 +105,9 @@ describe('findPackageForDownload', () => {
|
||||
])(
|
||||
'defaults to os.arch(): %s mapped to distro arch: %s',
|
||||
async (osArch: string, distroArch: string) => {
|
||||
jest.spyOn(os, 'arch').mockReturnValue(osArch);
|
||||
jest
|
||||
.spyOn(os, 'arch')
|
||||
.mockReturnValue(osArch as ReturnType<typeof os.arch>);
|
||||
jest.spyOn(os, 'platform').mockReturnValue('darwin');
|
||||
|
||||
const version = '17';
|
||||
@ -119,7 +131,9 @@ describe('findPackageForDownload', () => {
|
||||
])(
|
||||
'defaults to os.arch(): %s mapped to distro arch: %s',
|
||||
async (osArch: string, distroArch: string) => {
|
||||
jest.spyOn(os, 'arch').mockReturnValue(osArch);
|
||||
jest
|
||||
.spyOn(os, 'arch')
|
||||
.mockReturnValue(osArch as ReturnType<typeof os.arch>);
|
||||
jest.spyOn(os, 'platform').mockReturnValue('linux');
|
||||
|
||||
const version = '17';
|
||||
@ -143,7 +157,9 @@ describe('findPackageForDownload', () => {
|
||||
])(
|
||||
'defaults to os.arch(): %s mapped to distro arch: %s',
|
||||
async (osArch: string, distroArch: string) => {
|
||||
jest.spyOn(os, 'arch').mockReturnValue(osArch);
|
||||
jest
|
||||
.spyOn(os, 'arch')
|
||||
.mockReturnValue(osArch as ReturnType<typeof os.arch>);
|
||||
jest.spyOn(os, 'platform').mockReturnValue('win32');
|
||||
|
||||
const version = '17';
|
||||
@ -163,7 +179,7 @@ describe('findPackageForDownload', () => {
|
||||
|
||||
it('should throw an error', async () => {
|
||||
await expect(distribution['findPackageForDownload']('8')).rejects.toThrow(
|
||||
/Could not find satisfied version for SemVer */
|
||||
/No matching version found for SemVer */
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@ -8,6 +8,7 @@ describe('findPackageForDownload', () => {
|
||||
let distribution: OracleDistribution;
|
||||
let spyDebug: jest.SpyInstance;
|
||||
let spyHttpClient: jest.SpyInstance;
|
||||
let spyCoreError: jest.SpyInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
distribution = new OracleDistribution({
|
||||
@ -19,6 +20,10 @@ describe('findPackageForDownload', () => {
|
||||
|
||||
spyDebug = jest.spyOn(core, 'debug');
|
||||
spyDebug.mockImplementation(() => {});
|
||||
|
||||
// Mock core.error to suppress error logs
|
||||
spyCoreError = jest.spyOn(core, 'error');
|
||||
spyCoreError.mockImplementation(() => {});
|
||||
});
|
||||
|
||||
it.each([
|
||||
@ -95,7 +100,9 @@ describe('findPackageForDownload', () => {
|
||||
])(
|
||||
'defaults to os.arch(): %s mapped to distro arch: %s',
|
||||
async (osArch: string, distroArch: string) => {
|
||||
jest.spyOn(os, 'arch').mockReturnValue(osArch);
|
||||
jest
|
||||
.spyOn(os, 'arch')
|
||||
.mockReturnValue(osArch as ReturnType<typeof os.arch>);
|
||||
jest.spyOn(os, 'platform').mockReturnValue('linux');
|
||||
|
||||
const version = '18';
|
||||
|
||||
298
__tests__/distributors/sapmachine-installer.test.ts
Normal file
298
__tests__/distributors/sapmachine-installer.test.ts
Normal file
@ -0,0 +1,298 @@
|
||||
import {HttpClient} from '@actions/http-client';
|
||||
import {SapMachineDistribution} from '../../src/distributions/sapmachine/installer';
|
||||
import * as utils from '../../src/util';
|
||||
import * as core from '@actions/core';
|
||||
|
||||
import manifestData from '../data/sapmachine.json';
|
||||
|
||||
describe('getAvailableVersions', () => {
|
||||
let spyHttpClient: jest.SpyInstance;
|
||||
let spyUtilGetDownloadArchiveExtension: jest.SpyInstance;
|
||||
let spyCoreError: jest.SpyInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
|
||||
spyHttpClient.mockReturnValue({
|
||||
statusCode: 200,
|
||||
headers: {},
|
||||
result: manifestData
|
||||
});
|
||||
|
||||
spyUtilGetDownloadArchiveExtension = jest.spyOn(
|
||||
utils,
|
||||
'getDownloadArchiveExtension'
|
||||
);
|
||||
spyUtilGetDownloadArchiveExtension.mockReturnValue('tar.gz');
|
||||
|
||||
// Mock core.error to suppress error logs
|
||||
spyCoreError = jest.spyOn(core, 'error');
|
||||
spyCoreError.mockImplementation(() => {});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
jest.resetAllMocks();
|
||||
jest.clearAllMocks();
|
||||
jest.restoreAllMocks();
|
||||
});
|
||||
|
||||
const mockPlatform = (
|
||||
distribution: SapMachineDistribution,
|
||||
platform: string
|
||||
) => {
|
||||
distribution['getPlatformOption'] = () => platform;
|
||||
const mockedExtension = platform == 'windows' ? 'zip' : 'tar.gz';
|
||||
spyUtilGetDownloadArchiveExtension.mockReturnValue(mockedExtension);
|
||||
};
|
||||
|
||||
describe('shouldFallbackToBackupUrl', () => {
|
||||
it('should return correct release when the primary URL is not available', async () => {
|
||||
spyHttpClient.mockReturnValueOnce({
|
||||
statusCode: 404,
|
||||
headers: {},
|
||||
result: ''
|
||||
});
|
||||
spyHttpClient.mockReturnValueOnce({
|
||||
statusCode: 200,
|
||||
headers: {},
|
||||
result: manifestData
|
||||
});
|
||||
|
||||
const version = '17';
|
||||
const distribution = new SapMachineDistribution({
|
||||
version: version,
|
||||
architecture: 'x64',
|
||||
packageType: 'jdk',
|
||||
checkLatest: false
|
||||
});
|
||||
|
||||
mockPlatform(distribution, 'linux');
|
||||
|
||||
const availableVersion =
|
||||
await distribution['findPackageForDownload'](version);
|
||||
expect(availableVersion).not.toBeNull();
|
||||
expect(availableVersion.url).toBe(
|
||||
'https://github.com/SAP/SapMachine/releases/download/sapmachine-17.0.10/sapmachine-jdk-17.0.10_linux-x64_bin.tar.gz'
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getAvailableVersions', () => {
|
||||
it.each([
|
||||
['11', 'x64', 'linux', 71],
|
||||
['11', 'aarch64', 'linux', 54],
|
||||
['17', 'riscv', 'linux', 0],
|
||||
['16.0.1', 'x64', 'linux', 71],
|
||||
['23-ea', 'x64', 'linux', 798],
|
||||
['23-ea', 'aarch64', 'windows', 0],
|
||||
['23-ea', 'x64', 'windows', 750]
|
||||
])(
|
||||
'should get right number of available versions from JSON',
|
||||
async (
|
||||
jdkVersion: string,
|
||||
arch: string,
|
||||
platform: string,
|
||||
len: number
|
||||
) => {
|
||||
const distribution = new SapMachineDistribution({
|
||||
version: jdkVersion,
|
||||
architecture: arch,
|
||||
packageType: 'jdk',
|
||||
checkLatest: false
|
||||
});
|
||||
mockPlatform(distribution, platform);
|
||||
|
||||
const availableVersions = await distribution['getAvailableVersions']();
|
||||
expect(availableVersions).not.toBeNull();
|
||||
expect(availableVersions.length).toBe(len);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
describe('findPackageForDownload', () => {
|
||||
it.each([
|
||||
[
|
||||
'11',
|
||||
'linux',
|
||||
'x64',
|
||||
'jdk',
|
||||
'https://github.com/SAP/SapMachine/releases/download/sapmachine-11.0.22/sapmachine-jdk-11.0.22_linux-x64_bin.tar.gz'
|
||||
],
|
||||
[
|
||||
'11',
|
||||
'linux',
|
||||
'aarch64',
|
||||
'jdk',
|
||||
'https://github.com/SAP/SapMachine/releases/download/sapmachine-11.0.22/sapmachine-jdk-11.0.22_linux-aarch64_bin.tar.gz'
|
||||
],
|
||||
[
|
||||
'11',
|
||||
'windows',
|
||||
'x64',
|
||||
'jdk',
|
||||
'https://github.com/SAP/SapMachine/releases/download/sapmachine-11.0.22/sapmachine-jdk-11.0.22_windows-x64_bin.zip'
|
||||
],
|
||||
[
|
||||
'11.0.17',
|
||||
'linux',
|
||||
'x64',
|
||||
'jdk',
|
||||
'https://github.com/SAP/SapMachine/releases/download/sapmachine-11.0.17/sapmachine-jdk-11.0.17_linux-x64_bin.tar.gz'
|
||||
],
|
||||
[
|
||||
'17',
|
||||
'linux',
|
||||
'x64',
|
||||
'jdk',
|
||||
'https://github.com/SAP/SapMachine/releases/download/sapmachine-17.0.10/sapmachine-jdk-17.0.10_linux-x64_bin.tar.gz'
|
||||
],
|
||||
[
|
||||
'17',
|
||||
'linux',
|
||||
'aarch64',
|
||||
'jdk',
|
||||
'https://github.com/SAP/SapMachine/releases/download/sapmachine-17.0.10/sapmachine-jdk-17.0.10_linux-aarch64_bin.tar.gz'
|
||||
],
|
||||
[
|
||||
'17',
|
||||
'windows',
|
||||
'x64',
|
||||
'jdk',
|
||||
'https://github.com/SAP/SapMachine/releases/download/sapmachine-17.0.10/sapmachine-jdk-17.0.10_windows-x64_bin.zip'
|
||||
],
|
||||
[
|
||||
'17.0.4',
|
||||
'linux',
|
||||
'x64',
|
||||
'jdk',
|
||||
'https://github.com/SAP/SapMachine/releases/download/sapmachine-17.0.4.1/sapmachine-jdk-17.0.4.1_linux-x64_bin.tar.gz'
|
||||
],
|
||||
[
|
||||
'17',
|
||||
'linux',
|
||||
'x64',
|
||||
'jre',
|
||||
'https://github.com/SAP/SapMachine/releases/download/sapmachine-17.0.10/sapmachine-jre-17.0.10_linux-x64_bin.tar.gz'
|
||||
],
|
||||
[
|
||||
'17',
|
||||
'linux',
|
||||
'aarch64',
|
||||
'jre',
|
||||
'https://github.com/SAP/SapMachine/releases/download/sapmachine-17.0.10/sapmachine-jre-17.0.10_linux-aarch64_bin.tar.gz'
|
||||
],
|
||||
[
|
||||
'17',
|
||||
'windows',
|
||||
'x64',
|
||||
'jre',
|
||||
'https://github.com/SAP/SapMachine/releases/download/sapmachine-17.0.10/sapmachine-jre-17.0.10_windows-x64_bin.zip'
|
||||
],
|
||||
[
|
||||
'17.0.4',
|
||||
'linux',
|
||||
'x64',
|
||||
'jre',
|
||||
'https://github.com/SAP/SapMachine/releases/download/sapmachine-17.0.4.1/sapmachine-jre-17.0.4.1_linux-x64_bin.tar.gz'
|
||||
],
|
||||
[
|
||||
'23-ea',
|
||||
'linux',
|
||||
'x64',
|
||||
'jdk',
|
||||
'https://github.com/SAP/SapMachine/releases/download/sapmachine-23%2B15/sapmachine-jdk-23-ea.15_linux-x64_bin.tar.gz',
|
||||
'23'
|
||||
],
|
||||
[
|
||||
'21.0.2+2-ea',
|
||||
'linux',
|
||||
'x64',
|
||||
'jdk',
|
||||
'https://github.com/SAP/SapMachine/releases/download/sapmachine-21.0.2%2B2/sapmachine-jdk-21.0.2-ea.2_linux-x64_bin.tar.gz',
|
||||
'21.0.2+2'
|
||||
],
|
||||
[
|
||||
'17',
|
||||
'linux-musl',
|
||||
'x64',
|
||||
'jdk',
|
||||
'https://github.com/SAP/SapMachine/releases/download/sapmachine-17.0.10/sapmachine-jdk-17.0.10_linux-x64-musl_bin.tar.gz'
|
||||
]
|
||||
])(
|
||||
'should return proper link according to the specified java-version, platform and arch',
|
||||
async (
|
||||
version: string,
|
||||
platform: string,
|
||||
arch: string,
|
||||
packageType: string,
|
||||
expectedLink: string,
|
||||
normalizedVersion: string = version
|
||||
) => {
|
||||
const distribution = new SapMachineDistribution({
|
||||
version: version,
|
||||
architecture: arch,
|
||||
packageType: packageType,
|
||||
checkLatest: false
|
||||
});
|
||||
mockPlatform(distribution, platform);
|
||||
|
||||
const availableVersion =
|
||||
await distribution['findPackageForDownload'](normalizedVersion);
|
||||
expect(availableVersion).not.toBeNull();
|
||||
expect(availableVersion.url).toBe(expectedLink);
|
||||
}
|
||||
);
|
||||
|
||||
it.each([
|
||||
['8', 'linux', 'x64'],
|
||||
['8', 'macos', 'aarch64'],
|
||||
['23', 'macos', 'aarch64'],
|
||||
['17', 'linux', 'riscv'],
|
||||
['23', 'linux', 'x64'],
|
||||
['25-ea', 'linux', 'x64', '25'],
|
||||
['8-ea', 'linux', 'x64', '8'],
|
||||
['21.0.3+7', 'linux', 'x64', '21.0.3+7'],
|
||||
['21.0.3+8-ea', 'linux', 'x64', '21.0.3+8'],
|
||||
['17', 'linux-muse', 'aarch64']
|
||||
])(
|
||||
'should throw when required version of JDK can not be found in the JSON',
|
||||
async (
|
||||
version: string,
|
||||
platform: string,
|
||||
arch: string,
|
||||
normalizedVersion: string = version
|
||||
) => {
|
||||
const distribution = new SapMachineDistribution({
|
||||
version: version,
|
||||
architecture: arch,
|
||||
packageType: 'jdk',
|
||||
checkLatest: false
|
||||
});
|
||||
mockPlatform(distribution, platform);
|
||||
|
||||
await expect(
|
||||
distribution['findPackageForDownload'](normalizedVersion)
|
||||
).rejects.toThrow(
|
||||
`No matching version found for SemVer '${normalizedVersion}'`
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
it('should throw when required package type is not supported', async () => {
|
||||
const jdkVersion = '17';
|
||||
const arch = 'x64';
|
||||
const platform = 'linux';
|
||||
const distribution = new SapMachineDistribution({
|
||||
version: jdkVersion,
|
||||
architecture: arch,
|
||||
packageType: 'jdk+fx',
|
||||
checkLatest: false
|
||||
});
|
||||
mockPlatform(distribution, platform);
|
||||
await expect(
|
||||
distribution['findPackageForDownload'](jdkVersion)
|
||||
).rejects.toThrow(
|
||||
'SapMachine provides only the `jdk` and `jre` package type'
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -4,9 +4,11 @@ import {JavaInstallerOptions} from '../../src/distributions/base-models';
|
||||
import {SemeruDistribution} from '../../src/distributions/semeru/installer';
|
||||
|
||||
import manifestData from '../data/semeru.json';
|
||||
import * as core from '@actions/core';
|
||||
|
||||
describe('getAvailableVersions', () => {
|
||||
let spyHttpClient: jest.SpyInstance;
|
||||
let spyCoreError: jest.SpyInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
|
||||
@ -15,6 +17,9 @@ describe('getAvailableVersions', () => {
|
||||
headers: {},
|
||||
result: []
|
||||
});
|
||||
// Mock core.error to suppress error logs
|
||||
spyCoreError = jest.spyOn(core, 'error');
|
||||
spyCoreError.mockImplementation(() => {});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
@ -152,7 +157,7 @@ describe('findPackageForDownload', () => {
|
||||
distribution['getAvailableVersions'] = async () => manifestData as any;
|
||||
await expect(
|
||||
distribution['findPackageForDownload']('9.0.8')
|
||||
).rejects.toThrow(/Could not find satisfied version for SemVer */);
|
||||
).rejects.toThrow(/No matching version found for SemVer */);
|
||||
});
|
||||
|
||||
it('version is not found', async () => {
|
||||
@ -164,7 +169,7 @@ describe('findPackageForDownload', () => {
|
||||
});
|
||||
distribution['getAvailableVersions'] = async () => manifestData as any;
|
||||
await expect(distribution['findPackageForDownload']('7.x')).rejects.toThrow(
|
||||
/Could not find satisfied version for SemVer */
|
||||
/No matching version found for SemVer */
|
||||
);
|
||||
});
|
||||
|
||||
@ -177,7 +182,7 @@ describe('findPackageForDownload', () => {
|
||||
});
|
||||
distribution['getAvailableVersions'] = async () => [];
|
||||
await expect(distribution['findPackageForDownload']('8')).rejects.toThrow(
|
||||
/Could not find satisfied version for SemVer */
|
||||
/No matching version found for SemVer */
|
||||
);
|
||||
});
|
||||
|
||||
@ -207,7 +212,7 @@ describe('findPackageForDownload', () => {
|
||||
});
|
||||
distribution['getAvailableVersions'] = async () => [];
|
||||
await expect(distribution['findPackageForDownload']('8')).rejects.toThrow(
|
||||
`Unsupported architecture for IBM Semeru: ${arch}, the following are supported: x64, x86, ppc64le, ppc64, s390x, aarch64`
|
||||
`Unsupported architecture for IBM Semeru: ${arch} for your current OS version, the following are supported: x64, x86, ppc64le, ppc64, s390x, aarch64`
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user