name: 'build-test'

on:
  push:
    paths-ignore:
      - '**.md'
  pull_request:
    paths-ignore:
      - '**.md'
  workflow_dispatch:
permissions:
  contents: read

jobs:
  build: # make sure build/ci work properly
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: |
          npm install
      - run: |
          npm run all
  test:
    name: GraalVM
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        java-version: ['17', '20', 'dev']
        distribution: ['graalvm', 'graalvm-community']
        os: [macos-latest, windows-latest, ubuntu-latest]
        include:
          - java-version: '17.0.7'
            distribution: ''
            os: ubuntu-latest
          - java-version: 'dev'
            distribution: ''
            os: windows-latest
    steps:
      - uses: actions/checkout@v3
      - name: Run setup-graalvm action
        uses: ./
        with:
          java-version: ${{ matrix.java-version }}
          distribution: ${{ matrix.distribution }}
          github-token: ${{ secrets.GITHUB_TOKEN }}
      - name: Check environment
        run: |
          echo "GRAALVM_HOME: $GRAALVM_HOME"
          if [[ "${{ matrix.java-version }}" == "dev" ]]; then
            [[ "$GRAALVM_HOME" == *"$RUNNER_TEMP"* ]] || exit 12
          else
            [[ "$GRAALVM_HOME" == *"$RUNNER_TOOL_CACHE"* ]] || exit 23
          fi
          echo "JAVA_HOME: $JAVA_HOME"
          java --version
          java --version | grep "GraalVM" || exit 34
          native-image --version
        if: runner.os != 'Windows'
      - name: Check Windows environment
        run: |
          echo "GRAALVM_HOME: $env:GRAALVM_HOME"
          echo "JAVA_HOME: $env:JAVA_HOME"
          java --version
          native-image --version
  test-ce: # make sure the action works on a clean machine without building
    needs: test  
    name: CE ${{ matrix.version }} + JDK${{ matrix.java-version }} on ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        version: ['latest', 'dev']
        java-version: ['17', '20']
        components: ['native-image']
        os: [macos-latest, windows-latest, ubuntu-latest]
        exclude:
          - version: 'latest'
            java-version: '20'
          - version: 'dev'
            java-version: '19'
        include:
          - version: '22.2.0' # for update notifications
            java-version: '17'
            components: 'native-image'
            os: ubuntu-20.04
          - version: '22.3.1'
            java-version: '11' # for JDK11 notification
            components: 'native-image'
            os: macos-11
          - version: '22.3.1'
            java-version: '17'
            components: 'native-image'
            os: windows-2022
          - version: 'dev'
            java-version: 'dev'
            components: 'native-image'
            os: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Run setup-graalvm action
        uses: ./
        with:
          version: ${{ matrix.version }}
          java-version: ${{ matrix.java-version }}
          components: ${{ matrix.components }}
          github-token: ${{ secrets.GITHUB_TOKEN }}
      - name: Check environment
        run: |
          echo "GRAALVM_HOME: $GRAALVM_HOME"
          if [[ "${{ matrix.version }}" == "dev" ]]; then
            [[ "$GRAALVM_HOME" == *"$RUNNER_TEMP"* ]] || exit 12
          else
            [[ "$GRAALVM_HOME" == *"$RUNNER_TOOL_CACHE"* ]] || exit 23
          fi
          echo "JAVA_HOME: $JAVA_HOME"
          java --version
          java --version | grep "GraalVM" || exit 34
          native-image --version
          gu list
        if: runner.os != 'Windows'
      - name: Check Windows environment
        run: |
          echo "GRAALVM_HOME: $env:GRAALVM_HOME"
          echo "JAVA_HOME: $env:JAVA_HOME"
          java --version
          native-image --version
          gu.cmd remove native-image
        if: runner.os == 'Windows'
  test-ee:
    needs: test
    name: EE ${{ matrix.version }} + JDK${{ matrix.java-version }} on ${{ matrix.os }}
    if: github.event_name != 'pull_request'
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        version: ['latest']
        java-version: ['19']
        components: ['native-image']
        os: [macos-latest, windows-latest, ubuntu-latest]
        include:
          - version: '22.3.0'
            java-version: '11'
            components: 'native-image'
            os: ubuntu-latest
          - version: '22.3.0'
            java-version: '17'
            components: 'native-image'
            os: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Run setup-graalvm action
        uses: ./
        with:
          version: ${{ matrix.version }}
          gds-token: ${{ secrets.GDS_TOKEN }}
          java-version: ${{ matrix.java-version }}
          components: ${{ matrix.components }}
          github-token: ${{ secrets.GITHUB_TOKEN }}
      - name: Check environment
        run: |
          echo "GRAALVM_HOME: $GRAALVM_HOME"
          [[ "$GRAALVM_HOME" == *"$RUNNER_TOOL_CACHE"* ]] || exit 12
          echo "JAVA_HOME: $JAVA_HOME"
          java --version
          java --version | grep "GraalVM EE" || exit 23
          native-image --version
          gu list
        if: runner.os != 'Windows'
      - name: Check Windows environment
        run: |
          echo "GRAALVM_HOME: $env:GRAALVM_HOME"
          echo "JAVA_HOME: $env:JAVA_HOME"
          java --version
          native-image --version
          gu.cmd remove native-image
        if: runner.os == 'Windows'
  test-mandrel:
    needs: test
    name: ${{ matrix.version }} + JDK${{ matrix.java-version }} on ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        version: ['mandrel-22.2.0.0-Final', 'mandrel-latest']
        java-version: ['17']
        distribution: ['mandrel']
        os: [windows-latest, ubuntu-latest]
        include:
          - version: 'mandrel-latest'
            java-version: '17'
            distribution: '' # test empty distribution for backward compatibility
            os: ubuntu-latest
        exclude: # temporarily disable Mandrel latest builds on Windows due to unavailability
          - version: 'mandrel-latest'
            java-version: '17'
            os: windows-latest
    steps:
      - uses: actions/checkout@v3
      - name: Run setup-graalvm action
        uses: ./
        with:
          version: ${{ matrix.version }}
          distribution: ${{ matrix.distribution }}
          java-version: ${{ matrix.java-version }}
          github-token: ${{ secrets.GITHUB_TOKEN }}
      - name: Check environment
        run: |
          echo "GRAALVM_HOME: $GRAALVM_HOME"
          [[ "$GRAALVM_HOME" == *"$RUNNER_TOOL_CACHE"* ]] || exit 12
          echo "JAVA_HOME: $JAVA_HOME"
          java --version
          native-image --version
        if: runner.os != 'Windows'
      - name: Check Windows environment
        run: |
          echo "GRAALVM_HOME: $env:GRAALVM_HOME"
          echo "JAVA_HOME: $env:JAVA_HOME"
          java --version
          native-image --version
        if: runner.os == 'Windows'
  test-native-image-windows:
    name: native-image on windows-latest
    runs-on: windows-latest
    permissions:
      contents: read
      pull-requests: write # for `native-image-pr-reports` option
    steps:
      - uses: actions/checkout@v3
      - name: Run setup-graalvm action
        uses: ./
        with:
          java-version: 'dev'
          distribution: 'graalvm-community'
          native-image-job-reports: 'true'
          native-image-pr-reports: 'true'
          github-token: ${{ secrets.GITHUB_TOKEN }}
      - name: Build HelloWorld executable with GraalVM Native Image on Windows
        run: |
          echo 'public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }' > HelloWorld.java
          javac HelloWorld.java
          native-image HelloWorld
          ./helloworld
  test-native-image-windows-msvc:
    name: native-image on windows-2022
    runs-on: windows-2022
    permissions:
      contents: read
      pull-requests: write # for `native-image-pr-reports` option
    steps:
      - uses: actions/checkout@v3
      - name: Run setup-graalvm action
        uses: ./
        with:
          java-version: '17'
          distribution: 'graalvm'
          native-image-job-reports: 'true'
          native-image-pr-reports: 'true'
          github-token: ${{ secrets.GITHUB_TOKEN }}
      - name: Build HelloWorld executable with GraalVM Native Image on Windows
        run: |
          echo 'public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }' > HelloWorld.java
          javac HelloWorld.java
          native-image HelloWorld
          ./helloworld
  test-native-image-musl:
    name: native-image-musl on ubuntu-latest
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write # for `native-image-pr-reports` option
    steps:
      - uses: actions/checkout@v3
      - name: Run setup-graalvm action
        uses: ./
        with:
          java-version: 'dev'
          distribution: 'graalvm-community'
          native-image-musl: 'true'
          native-image-job-reports: 'true'
          native-image-pr-reports: 'true'
          github-token: ${{ secrets.GITHUB_TOKEN }}
      - name: Build static HelloWorld executable with GraalVM Native Image and musl
        run: |
          echo 'public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }' > HelloWorld.java
          javac HelloWorld.java
          native-image --static --libc=musl HelloWorld
          ./helloworld
  test-extensive:
    name: extensive tests on ubuntu-latest
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write # for `native-image-pr-reports` option
    steps:
      - uses: actions/checkout@v3
      - name: Run setup-graalvm action
        uses: ./
        with:
          java-version: '17'
          distribution: 'graalvm'
          components: 'espresso,llvm-toolchain,native-image,nodejs,python,ruby,wasm'
          set-java-home: 'false'
          native-image-job-reports: 'true'
          native-image-pr-reports: 'true'
          github-token: ${{ secrets.GITHUB_TOKEN }}
      - name: Check environment
        run: |
          echo "GRAALVM_HOME: $GRAALVM_HOME"
          echo "JAVA_HOME: $JAVA_HOME"
          [[ "$GRAALVM_HOME" != "$JAVA_HOME" ]] || exit 12
          [[ $(which java) == *"graalvm"* ]] || exit 23
          java --version
          java -truffle --version
          gu --version
          gu list
          [[ $(which lli) == *"graalvm"* ]] || exit 34
          lli --version
          native-image --version
          [[ $(which node) == *"graalvm"* ]] || exit 45
          node --version
          graalpy --version
          truffleruby --version
          wasm --version
      - name: Build HelloWorld.java with GraalVM Native Image
        run: |
          echo 'public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }' > HelloWorld.java
          javac HelloWorld.java
          native-image -g HelloWorld
          ./helloworld
      - name: Build Ruby-FFI with TruffleRuby
        run: |
          [[ $(which bundle) == *"graalvm"* ]] || exit 57
          git clone --depth 1 https://github.com/ffi/ffi.git
          pushd ffi > /dev/null
          # https://github.com/ffi/ffi/blob/447845cb3030194c79700c86fb388a12e6f81386/.github/workflows/ci.yml#L58-L62
          bundle install
          bundle exec rake libffi
          bundle exec rake compile
          bundle exec rake test
          popd > /dev/null
      - name: Remove components
        run: gu remove espresso llvm-toolchain nodejs python ruby wasm
