# This workflow will install Python dependencies, run tests and lint with a single version of Python.
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions

name: Regression tests

on:
  push:
    paths:
    - '**.py'
    - 'g*.sh'
    - 'src/kibot'
    - 'tests/**'
    - '.github/workflows/pythonapp.yml'
    - 'tools/dev_image/Dockerfile'
    - 'tools/dev_image_k6/Dockerfile'
  pull_request:
    paths:
    - '**.py'
    - 'g*.sh'
    - 'src/kibot'
    - 'tests/**'
    - '.github/workflows/pythonapp.yml'
    - 'tools/dev_image/Dockerfile'
    - 'tools/dev_image_k6/Dockerfile'
  repository_dispatch:
    types: [run_tests]

jobs:
  test:
    strategy:
      matrix:
        ki_release: [latest, ki6]
        w_tests: [g1, g2, g3]

    runs-on: ubuntu-latest
    container: setsoft/kicad_auto_test:${{ matrix.ki_release }}

    steps:
    - uses: actions/checkout@v3
      with:
        submodules: recursive
    - name: Lint with flake8
      run: |
        # stop the build if there are Python syntax errors or undefined names
        flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
        # exit-zero treats all errors as warnings.
        flake8 . --count --exit-zero --statistics
    - name: Test ${{ matrix.ki_release }}
      run: |
        rm -rf output
        rm -f tests/.local
        ##### Experimental stuff:
        ## Remove KiAuto
        #dpkg --remove kiauto
        ## Install KiAuto@master
        #curl https://codeload.github.com/INTI-CMNB/KiAuto/zip/refs/heads/master --output pp.zip
        #unzip pp.zip
        #pip3 install KiAuto-master/
        ## Clean the downloaded stuff
        #rm -rf KiAuto-master/ pp.zip
        ## Check what we got
        #echo $PATH
        #ls -la /usr/bin/*_do || true
        #ls -la /usr/local/bin/*_do || true
        #which pcbnew_do
        #pcbnew_do --version
        ##### End Experimental stuff
        # Ensure we start a fresh coverage meassurement
        python3-coverage erase
        # Create the caches with macros
        python3-coverage run src/kibot --help-outputs > /dev/null
        # Individual run for specific tests
        # pytest --log-cli-level debug -k "test_ibom_parse_fail" --test_dir=output
        # Run the 90% faster tests (under 3 s) together
        # Do it in parallel
        ./${{ matrix.w_tests }}.sh
    - name: Store coverage
      if: ${{ always() }}
      uses: actions/upload-artifact@v3
      with:
        name: Test_Coverage_${{ matrix.ki_release }}_${{ matrix.w_tests }}
        path: .coverage.*
    - name: Collect coverage ${{ matrix.ki_release }}
      run: |
        python3-coverage combine
        python3-coverage report
        python3-coverage html -d output/htmlcov_${{ matrix.w_tests }}
    - name: Store results
      if: ${{ always() }}
      uses: actions/upload-artifact@v3
      with:
        name: Test_Output_${{ matrix.ki_release }}_${{ matrix.w_tests }}
        # Important! empty directories are skipped!!!!
        path: output
    - name: Upload Coverage
      # Don't mix stable coverage with development coverage
      if: github.ref == 'refs/heads/dev'
      env:
        COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
        COVERALLS_FLAG_NAME: ${{ matrix.ki_release }}_${{ matrix.w_tests }}
        COVERALLS_PARALLEL: true
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        # apt-get update
        # apt-get -y install python3-pip
        # pip3 install coveralls
        #coveralls --service=github
        #echo Disabled by now
        coveralls

  consolidate_coverage:
    name: Consolidate coverage data
    runs-on: ubuntu-latest
    container: setsoft/kicad_auto_test:ki6
    needs: test
    # Don't mix stable coverage with development coverage
    if: github.ref == 'refs/heads/dev'

    steps:
    - uses: actions/checkout@v3
      with:
        submodules: recursive

    - name: Download coverage k5 g1
      uses: actions/download-artifact@v3
      with:
        name: Test_Coverage_latest_g1

    - name: Download coverage k5 g2
      uses: actions/download-artifact@v3
      with:
        name: Test_Coverage_latest_g2

    - name: Download coverage k5 g3
      uses: actions/download-artifact@v3
      with:
        name: Test_Coverage_latest_g3

    - name: Download coverage k6 g1
      uses: actions/download-artifact@v3
      with:
        name: Test_Coverage_ki6_g1

    - name: Download coverage k6 g2
      uses: actions/download-artifact@v3
      with:
        name: Test_Coverage_ki6_g2

    - name: Download coverage k6 g3
      uses: actions/download-artifact@v3
      with:
        name: Test_Coverage_ki6_g3

    - name: Combine coverage
      run: |
        pip3 install --upgrade coverage==5.1
        ln -s /usr/local/bin/coverage3 /usr/local/bin/python3-coverage || true
        python3-coverage combine
        python3-coverage report
        python3-coverage html -d htmlcov

    - name: Store result
      uses: actions/upload-artifact@v3
      with:
        name: Test_Coverage_combined
        path: htmlcov


  push_to_registry:
    name: Push Docker image to Docker Hub and GitHub Packages
    runs-on: ubuntu-latest
    needs: test
    permissions:
      packages: write
      contents: read
    # Don't create `dev` images using the `master`
    if: github.ref == 'refs/heads/dev'

    steps:
    - name: Check out the repo
      uses: actions/checkout@v3

    - name: Log in to Docker Hub
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

    - name: Log in to the Container registry
      uses: docker/login-action@v2
      with:
        registry: ghcr.io
        username: ${{ github.actor }}
        password: ${{ secrets.GITHUB_TOKEN }}

    - name: Extract metadata (tags, labels) for Docker
      id: meta
      uses: docker/metadata-action@v4
      with:
        images: |
          setsoft/kicad_auto_test
          ghcr.io/inti-cmnb/kicad_auto_test
          ghcr.io/inti-cmnb/kicad5_auto_full
        tags: |
          type=raw,dev

    - name: Build and push Docker image
      uses: docker/build-push-action@v3
      with:
        context: tools/dev_image
        push: true
        tags: ${{ steps.meta.outputs.tags }}
        labels: ${{ steps.meta.outputs.labels }}

  push_to_registry_k6:
    name: Push Docker image to Docker Hub (KiCad 6)
    runs-on: ubuntu-latest
    needs: test
    permissions:
      packages: write
      contents: read
    # Don't create `dev` images using the `master`
    if: github.ref == 'refs/heads/dev'

    steps:
    - name: Check out the repo
      uses: actions/checkout@v3

    - name: Log in to Docker Hub
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

    - name: Log in to the Container registry
      uses: docker/login-action@v2
      with:
        registry: ghcr.io
        username: ${{ github.actor }}
        password: ${{ secrets.GITHUB_TOKEN }}

    - name: Extract metadata (tags, labels) for Docker
      id: meta
      uses: docker/metadata-action@v4
      with:
        images: |
          setsoft/kicad_auto_test
          ghcr.io/inti-cmnb/kicad_auto_test
          ghcr.io/inti-cmnb/kicad6_auto_full
        tags: |
          type=raw,dev_k6

    - name: Build and push Docker image
      uses: docker/build-push-action@v3
      with:
        context: tools/dev_image_k6
        push: true
        tags: |
          setsoft/kicad_auto_test:dev_k6
          ghcr.io/inti-cmnb/kicad_auto_test:dev_k6
          ghcr.io/inti-cmnb/kicad6_auto_full:dev
        labels: ${{ steps.meta.outputs.labels }}

  coveralls:
    name: Finish Coveralls
    needs: test
    runs-on: ubuntu-latest
    # Don't mix stable coverage with development coverage
    if: github.ref == 'refs/heads/dev'
    steps:
    - name: Finished
      env:
        COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
      run: |
        curl -k https://coveralls.io/webhook?repo_token=$COVERALLS_REPO_TOKEN -d "payload[build_num]="$GITHUB_RUN_ID"&payload[status]=done"

