name: test

on:
  pull_request:
  workflow_dispatch:
  workflow_call:
    inputs:
      branch:
        description: "ref branch for this workflow"
        default: "master"
        required: true
        type: string

env:
  CARGO_TERM_COLOR: always

jobs:
  benchsuite:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout repository
      uses: actions/checkout@v3
      with:
        ref: ${{ inputs.branch }}
    - name: Environment
      run: bin/environment.sh
    - name: Install Prerequisites
      run: bin/install_prerequisites_ubuntu.sh
    - name: Install Rust
      run: bin/install_rust_latest.sh
    - name: Build
      run: |
        bin/release/release.sh
        echo "PATH=${PWD}/target/release:$PATH" >> "${GITHUB_ENV}"
    - name: Bench Suite
      run: bin/test/bench.sh
    - name: Archive artifacts
      uses: actions/upload-artifact@v3
      if: ${{ always() }}
      with:
        name: tests-bench-artifacts
        path: |
          bench/server.log

  test-ubuntu-x64-latest:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        rust: [stable]
    steps:
    - name: Checkout repository
      uses: actions/checkout@v3
      with:
        ref: ${{ inputs.branch }}
    - name: Environment
      run: bin/environment.sh
    - name: Install Prerequisites
      run: bin/install_prerequisites_ubuntu.sh
    - name: Install Rust
      run: bin/install_rust_latest.sh
    - name: Test Prerequisites
      run: bin/test/test_prerequisites.sh
    - name: Tests units
      run: |
        bin/test/test_unit.sh
        echo "PATH=${PWD}/target/release:$PATH" >> "${GITHUB_ENV}"
    - name: Integration Tests
      run: bin/test/test_integ.sh
    - name: Archive production artifacts
      uses: actions/upload-artifact@v3
      if: ${{ always() }}
      with:
        name: tests-ubuntu-${{ matrix.rust }}-artifacts
        path: |
          ./**/*.log
          ./**/report/*.json
          ./**/report/*.xml

  test-ubuntu-x64-18-04:
    runs-on: ubuntu-18.04
    strategy:
      matrix:
        rust: [stable]
    steps:
    - name: Checkout repository
      uses: actions/checkout@v3
      with:
        ref: ${{ inputs.branch }}
    - name: Environment
      run: bin/environment.sh
    - name: Install Prerequisites
      run: bin/install_prerequisites_ubuntu.sh
    - name: Install Rust
      run: bin/install_rust_latest.sh
    - name: Install Python 3.8
      uses: actions/setup-python@v4
      with:
        python-version: '3.8'
    - name: Install Curl 7.68
      uses: myci-actions/add-deb-repo@10
      with:
        repo: deb http://azure.archive.ubuntu.com/ubuntu/ focal main restricted
        repo-name: focal
        install: curl
    - name: Test Prerequisites
      run: bin/test/test_prerequisites.sh
    - name: Tests units
      run: |
        bin/test/test_unit.sh
        echo "PATH=${PWD}/target/release:$PATH" >> "${GITHUB_ENV}"
    - name: Integration Tests
      run: bin/test/test_integ.sh
    - name: Archive production artifacts
      uses: actions/upload-artifact@v3
      if: ${{ always() }}
      with:
        name: tests-ubuntu-${{ matrix.rust }}-artifacts
        path: |
          ./**/*.log
          ./**/report/*.json
          ./**/report/*.xml

  test-docker-archlinux-x64:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout repository
      uses: actions/checkout@v3
      with:
        ref: ${{ inputs.branch }}
    - name: Build, Test units and Integration tests
      uses: addnab/docker-run-action@v3
      with:
        image: archlinux
        options: --volume ${{ github.workspace }}:/work --workdir /work --privileged --env CARGO_TERM_COLOR=always
        run: |
          set -e
          echo "::group::Install Prerequisites"
          bin/install_prerequisites_docker_archlinux.sh
          echo "::endgroup::"
          echo "::group::Environment"
          bin/environment.sh
          echo "::endgroup::"
          echo "::group::Install Rust"
          bin/install_rust_latest.sh
          echo "::endgroup::"
          echo "::group::Tests"
          bin/test/test.sh
          echo "::endgroup::"
    - name: Archive production artifacts
      uses: actions/upload-artifact@v3
      if: ${{ always() }}
      with:
        name: tests-archlinux-x64-artifacts
        path: |
          ./**/*.log

  test-docker-fedora-x64:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout repository
      uses: actions/checkout@v3
      with:
        ref: ${{ inputs.branch }}
    - name: Build, Test units and Integration tests
      uses: addnab/docker-run-action@v3
      with:
        image: fedora
        options: --volume ${{ github.workspace }}:/work --workdir /work --privileged --env CARGO_TERM_COLOR=always
        run: |
          set -e
          echo "::group::Install Prerequisites"
          bin/install_prerequisites_docker_fedora.sh
          echo "::endgroup::"
          echo "::group::Environment"
          bin/environment.sh
          echo "::endgroup::"
          echo "::group::Install Rust"
          bin/install_rust_latest.sh
          echo "::endgroup::"
          echo "::group::Tests"
          bin/test/test.sh
          echo "::endgroup::"
    - name: find artifacts
      run: |
        pwd
        find . -name "*.log"
    - name: Archive production artifacts
      uses: actions/upload-artifact@v3
      if: ${{ always() }}
      with:
        name: tests-fedora-x64-artifacts
        path: |
          ./**/*.log

  test-docker-alpine-x64:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout repository
      uses: actions/checkout@v3
      with:
        ref: ${{ inputs.branch }}
    - name: Build, Test units and Integration tests
      uses: addnab/docker-run-action@v3
      with:
        image: alpine
        options: --volume ${{ github.workspace }}:/work --workdir /work --privileged --env CARGO_TERM_COLOR=always
        run: |
          set -e
          apk update --quiet
          apk add --quiet bash
          echo "::group::Install Prerequisites"
          bin/install_prerequisites_alpine.sh
          echo "::endgroup::"
          echo "::group::Environment"
          bin/environment.sh
          echo "::endgroup::"
          echo "::group::Install Rust"
          bin/install_rust_latest.sh
          echo "::endgroup::"
          echo "::group::Tests"
          bin/test/test.sh
          echo "::endgroup::"
    - name: find artifacts
      run: |
        pwd
        find . -name "*.log"
    - name: Archive production artifacts
      uses: actions/upload-artifact@v3
      if: ${{ always() }}
      with:
        name: tests-alpine-x64-artifacts
        path: |
          ./**/*.log

  test-macos-x64:
    runs-on: macos-latest
    strategy:
      matrix:
        rust: [stable]
    steps:
    - name: Checkout repository
      uses: actions/checkout@v3
      with:
        ref: ${{ inputs.branch }}
    - name: Environment
      run: bin/environment.sh
    - name: Install Rust
      run: bin/install_rust_latest.sh
    - name: Install Python 3.8
      uses: actions/setup-python@v4
      with:
        python-version: '3.8'
    - name: Test Prerequisites
      run: bin/test/test_prerequisites.sh
    - name: Tests units
      run: |
        bin/test/test_unit.sh
        echo "PATH=${PWD}/target/release:$PATH" >> "${GITHUB_ENV}"
    - name: Integration Tests
      run: bin/test/test_integ.sh
    - name: find artifacts
      run: |
        pwd
        find . -name "*.log"
    - name: Archive production artifacts
      uses: actions/upload-artifact@v3
      if: ${{ always() }}
      with:
        name: tests-macos-${{ matrix.rust }}-artifacts
        path: |
          ./**/*.log

  test-windows-x64:
    runs-on: windows-latest
    strategy:
      matrix:
        rust: [stable]
    env:
      VCPKGRS_DYNAMIC: 1
    steps:
    - name: Set git to use LF
      run: |
        git config --global core.autocrlf false
        git config --global core.eol lf
    - name: Checkout repository
      uses: actions/checkout@v3
      with:
        ref: ${{ inputs.branch }}
#    - name: Cache
#      uses: actions/cache@v3
#      with:
#        path: C:\vcpkg\installed
#        key: ${{ runner.os }}-test-windows-x64-${{ github.sha }}
#        restore-keys: ${{ runner.os }}-test-windows-x64-
    - name: Install Rust
      uses: actions-rs/toolchain@v1
      with:
        toolchain: stable
        override: true
        profile: minimal
    - name: Environment
      run: .\bin\environment.ps1
    - name: Install Prerequisites
      run: .\bin\install_prerequisites_windows.ps1
    - name: Build and test 
      run: .\bin\test\test.ps1
    - name: Archive production artifacts
      uses: actions/upload-artifact@v3
      if: ${{ always() }}
      with:
        name: tests-win64-${{ matrix.rust }}-artifacts
        path: |
          ./**/*.log

