# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#    https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
name: "Go Platform compatibility"

on:
  push:
    branches: [ "develop", "plc4go" ]
    paths:
      - plc4go**
  pull_request:
    paths:
      - plc4go**
  workflow_dispatch:
    inputs:
      forceUpdates:
        description: "Forces a snapshot update"
        required: false
        default: 'false'
      highLogPrecision:
        description: "sets the logs to nano resolution"
        required: false
        default: 'false'
      passLoggerToModel:
        description: "passes the logger to the model"
        required: false
        default: 'false'
      receiveTimeout:
        description: "sets the receive timeout to milliseconds"
        required: false
        default: '600000'
      traceTransactionManagerWorkers:
        description: "sets tracing for transaction manager workers"
        required: false
        default: 'false'
      traceTransactionManagerTransactions:
        description: "sets tracing for transaction manager transactions"
        required: false
        default: 'false'
      traceDefaultMessageCodecWorker:
        description: "sets tracing for the default message codec worker"
        required: false
        default: 'false'
      traceExecutorWorkers:
        description: "sets tracing for executor workers"
        required: false
        default: 'false'
      traceTestTransportInstance:
        description: "sets tracing for test transport instance"
        required: false
        default: 'false'

env:
  PLC4X_TEST_HIGH_TEST_LOG_PRECISION: ${{ github.event.inputs.highLogPrecision }}
  PLC4X_TEST_PASS_LOGGER_TO_MODEL: ${{ github.event.inputs.passLoggerToModel }}
  PLC4X_TEST_RECEIVE_TIMEOUT_MS: ${{ github.event.inputs.receiveTimeout }}
  PLC4X_TEST_TRACE_TRANSACTION_MANAGER_WORKERS: ${{ github.event.inputs.traceTransactionManagerWorkers }}
  PLC4X_TEST_TRACE_TRANSACTION_MANAGER_TRANSACTIONS: ${{ github.event.inputs.traceTransactionManagerTransactions }}
  PLC4X_TEST_TRACE_DEFAULT_MESSAGE_CODEC_WORKER: ${{ github.event.inputs.traceDefaultMessageCodecWorker }}
  PLC4X_TEST_TRACE_EXECUTOR_WORKERS: ${{ github.event.inputs.traceExecutorWorkers }}
  PLC4X_TEST_TEST_TRANSPORT_INSTANCE: ${{ github.event.inputs.traceTestTransportInstance }}
  DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}

jobs:
  test:
    strategy:
      matrix:
        java: [ 21 ]
        os: [ ubuntu-latest, macos-latest, windows-latest ]
      fail-fast: false
    runs-on: ${{ matrix.os }}
    steps:
      - name: Install libpcap for Linux
        if: matrix.os == 'ubuntu-latest'
        run: sudo apt-get install libpcap-dev

      - name: Install libpcap for macos
        if: matrix.os == 'macos-latest'
        run: brew install libpcap

      - name: Install libpcap for windows
        if: matrix.os == 'windows-latest'
        run: choco install -y nmap

      - name: Checkout repository
        uses: actions/checkout@v7

      - name: Setup Java
        uses: actions/setup-java@v6
        with:
          distribution: 'temurin'
          java-package: jdk
          java-version: ${{ matrix.java }}

      - name: Cache local Maven repository
        uses: actions/cache@v6
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-

      - name: Set Platform options
        id: platform_opts
        uses: actions/github-script@v9.0.0
        env:
          OS: ${{ matrix.os }}
        with:
          script: |
            const { OS } = process.env
            if (OS.includes("windows")) {
              core.setOutput('platform_opts', ``)
            } else if (OS.includes("macos")) {
              core.setOutput('platform_opts', `-Djna.library.path="$(find /usr/local/Cellar/libpcap/ -name lib)"`)
            } else if (OS.includes("ubuntu")) {
              core.setOutput('platform_opts', ``)
            } else {
              core.setOutput('platform_opts', ``)
            }

      - name: Calculate platform suffix
        id: platform_suffix
        uses: actions/github-script@v9.0.0
        env:
          OS: ${{ matrix.os }}
        with:
          script: |
            const { OS } = process.env
            if (OS.includes("windows")) {
              core.setOutput('platform_suffix', `.cmd`)
            } else {
              core.setOutput('platform_suffix', ``)
            }

      - name: Set extra options
        id: extra_options
        uses: actions/github-script@v9.0.0
        env:
          FORCE_UPDATE: ${{ github.event.inputs.forceUpdates }}
        with:
          script: |
            const { FORCE_UPDATE } = process.env
            if (FORCE_UPDATE.includes("true")) {
              core.setOutput('extra_options', `-U`)
            } else {
              core.setOutput('extra_options', ``)
            }

      - name: Check LongPathsEnabled on Windows
        if: matrix.os == 'windows-latest'
        run: |
          (Get-ItemProperty "HKLM:System\CurrentControlSet\Control\FileSystem").LongPathsEnabled

      # Note: due to github has no concept of recovering from a fail even if we have our fallback below we append a second un-parallel run behind this to be sure that it works with all checks. Only if that fails too we are ok with a "red" (which should be yellow) cross indicating a problem
      - name: Run mvnw
        run: |
          ./mvnw${{ steps.platform_suffix.outputs.platform_suffix }} ${{ steps.extra_options.outputs.extra_options }} -B -Pwith-go ${{ steps.platform_opts.outputs.platform_opts }} install

      - name: Upload Test Report (first failure)
        uses: actions/upload-artifact@v7
        if: failure()
        with:
          name: "golang-test-report-first-failure-${{ matrix.os }}"
          path: |
            **/surefire-reports/go-junit-report.xml
            **/reports/test-out-verbose.log

      - name: Upload Test Report
        uses: actions/upload-artifact@v7
        if: success() || failure()
        with:
          name: "golang-test-report-${{ matrix.os }}"
          path: |
            **/surefire-reports/go-junit-report.xml
            **/reports/test-out-verbose.log
