name: test

on: [push, pull_request]

env:
  CARGO_TERM_COLOR: always

jobs:
  rustfmt:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout repository
      uses: actions/checkout@v2
    - name: Install Rust
      uses: actions-rs/toolchain@v1
      with:
        toolchain: stable
        override: true
        profile: minimal
        components: rustfmt
    - name: Check formatting
      run: |
        cargo fmt --all -- --check

  clippy:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout repository
      uses: actions/checkout@v2
    - name: Install Rust
      uses: actions-rs/toolchain@v1
      with:
        toolchain: stable
        override: true
        profile: minimal
        components: clippy
    - name: Run Clippy
      run: |
        cargo clippy -- -D warnings

  dependency-age:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout repository
      uses: actions/checkout@v2    
    - name: Run dependency_age
      run: |
        ./ci/dependency_age.sh

  test-ubuntu:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        rust: [stable, nightly]
    steps:
    - name: Checkout repository
      uses: actions/checkout@v2
    - name: Install Rust
      uses: actions-rs/toolchain@v1
      with:
        toolchain: ${{ matrix.rust }}
        override: true
        profile: minimal
    - name: Environment
      run: |
        uname -a
        cargo --version
    - name: Build
      run: |
        cargo build --verbose
    - name: Test Prequisites
      run: |
        sudo apt update
        sudo apt install libxml2-utils
        pip3 install Flask
        cd integration
        python3 server.py >server.log 2>&1 &
        python3 ssl/server.py >server-ssl.log 2>&1 &
        wget https://snapshots.mitmproxy.org/5.2/mitmproxy-5.2-linux.tar.gz -O - | tar -xz && ./mitmdump -p 8888 --modify-header "/From-Proxy/Hello" &
    - name: Run Tests units
      run: |
        cargo test --features strict
    - name: Run Integration Tests
      run: |
         export PATH="$PWD/target/debug:$PATH"
         cd integration
         pip install lxml bs4
         ./integration.py
         ./test_curl_commands.sh tests/*.curl
         ./test_html_output.py tests/*.html
         xmllint --noout tests/*.html
    - name: Archive production artifacts
      uses: actions/upload-artifact@v2
      if: ${{ always() }}
      with:
        name: tests-ubuntu-${{ matrix.rust }}-artifacts
        path: |
          integration/server.log
          integration/server-ssl.log

  test-osx:
    runs-on: macos-latest
    strategy:
      matrix:
        rust: [stable, nightly]
    steps:
    - name: Checkout repository
      uses: actions/checkout@v2
    - name: Install Rust
      uses: actions-rs/toolchain@v1
      with:
        toolchain: ${{ matrix.rust }}
        override: true
        profile: minimal
    - name: Environment
      run: |
        uname -a
        cargo --version     
    - name: Build
      run: |
        cargo build --verbose
    - name: Test Prequisites
      run: |
        pip3 install Flask
        cd integration
        python3 server.py >server.log 2>&1 &
        python3 ssl/server.py >server-ssl.log 2>&1 &
        wget https://snapshots.mitmproxy.org/5.2/mitmproxy-5.2-osx.tar.gz -O - | tar -xz && ./mitmdump -p 8888 --modify-header "/From-Proxy/Hello" &
    - name: Run Tests units
      run: |
        cargo test
    - name: Run Integration Tests
      run: |
         export PATH="$PWD/target/debug:$PATH"
         cd integration
         ./integration.py
    - name: Archive production artifacts
      uses: actions/upload-artifact@v2
      if: ${{ always() }}
      with:
        name: tests-osx-${{ matrix.rust }}-artifacts
        path: |
          integration/server.log
          integration/server-ssl.log

  test-win64:
    runs-on: windows-latest
    strategy:
      matrix:
        rust: [stable, nightly]
    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@v2 
    - name: Install Rust
      uses: actions-rs/toolchain@v1
      with:
        toolchain: stable
        override: true
        profile: minimal
    - name: Environment
      run: |
        $Properties = 'Caption', 'CSName', 'Version', 'BuildType', 'OSArchitecture'
        Get-CimInstance Win32_OperatingSystem | Select-Object $Properties | Format-Table -AutoSize
        cargo --version
        $PsVersionTable
    - name: Install build and tests prequisites
      run: |
        # vcpkg build prequisites
        (Get-Command vcpkg).Path
        Expand-Archive -PassThru -Force -LiteralPath .\ci\windows\vcpkg_installed.zip -DestinationPath C:\vcpkg\
        Get-ChildItem C:\vcpkg\installed
        vcpkg integrate install
        # fix known win build bugs
        (Get-Content .\packages\hurl\src\runner\hurl_file.rs).replace('```', '') | Set-Content .\packages\hurl\src\runner\hurl_file.rs
        # install proxy and server
        pip3 install Flask mitmproxy   
    - name: Run Tests units
      run: |
        cd .\integration
        Start-Job -Name mitmdump -ScriptBlock { mitmdump --listen-port 8888 --modify-header "/From-Proxy/Hello" }
        Start-Job -Name server -ScriptBlock { python server.py > server.log }
        Start-Job -Name server -ScriptBlock { python ssl/server.py > server-ssl.log }
        Get-Job -Name server
        Get-Job -Name mitmdump
        Start-Sleep 5
        cd ..
        cargo test --verbose
    - name: Run Integration tests
      run: |
        cargo build --release --verbose
        $execdir=[System.Environment]::SystemDirectory
        Get-ChildItem -Path ".\target\release" -Recurse -Include *.dll -File | Copy-Item -Destination "${execdir}"
        Get-ChildItem -Path ".\target\release" -Recurse -Include hurl*.exe -File | Copy-Item -Destination "${execdir}"
        cd .\integration
        Start-Job -Name mitmdump -ScriptBlock { mitmdump --listen-port 8888 --modify-header "/From-Proxy/Hello" }
        Start-Job -Name server -ScriptBlock { python server.py > server.log }
        Start-Job -Name server -ScriptBlock { python ssl/server.py > server-ssl.log }
        Get-Job -Name server
        Get-Job -Name mitmdump
        Start-Sleep 5
        hurlfmt --no-format tests\assert_base64.hurl
        python integration.py
    - name: Archive production artifacts
      uses: actions/upload-artifact@v2
      if: ${{ always() }}
      with:
        name: tests-win64-${{ matrix.rust }}-artifacts
        path: |
          integration/server.log
          integration/server-ssl.log
