#
#  Copyright (c) 2021, The OpenThread Authors.
#  All rights reserved.
#
#  Redistribution and use in source and binary forms, with or without
#  modification, are permitted provided that the following conditions are met:
#  1. Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
#  2. Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#  3. Neither the name of the copyright holder nor the
#     names of its contributors may be used to endorse or promote products
#     derived from this software without specific prior written permission.
#
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
#  POSSIBILITY OF SUCH DAMAGE.
#

name: Border Router

on: [push, pull_request]

jobs:

  cancel-previous-runs:
    runs-on: ubuntu-20.04
    steps:
    - uses: rokroskar/workflow-run-cleanup-action@master
      env:
        GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
      if: "github.ref != 'refs/heads/main'"

  backbone-router:
    runs-on: ubuntu-20.04
    env:
      REFERENCE_DEVICE: 1
      VIRTUAL_TIME: 0
      PACKET_VERIFICATION: 1
      THREAD_VERSION: 1.2
      INTER_OP: 1
      COVERAGE: 1
      MULTIPLY: 1
      PYTHONUNBUFFERED: 1
      VERBOSE: 1
      # The Border Routing and DUA feature can coexist, but current wireshark
      # packet verification can't handle it because of the order of context ID
      # of OMR prefix and Domain prefix is not deterministic.
      BORDER_ROUTING: 0
    steps:
    - uses: actions/checkout@v2
      with:
        submodules: true
    - name: Build OTBR Docker
      env:
        GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
      run: |
        ./script/test build_otbr_docker
    - name: Bootstrap
      run: |
        sudo rm /etc/apt/sources.list.d/* && sudo apt-get update
        sudo apt-get --no-install-recommends install -y python3-setuptools python3-wheel ninja-build socat lcov
        python3 -m pip install -r tests/scripts/thread-cert/requirements.txt
    - name: Build
      run: |
        ./script/test build
    - name: Get Thread-Wireshark
      run: |
        ./script/test get_thread_wireshark
    - name: Run
      run: |
        export CI_ENV="$(bash <(curl -s https://codecov.io/env)) -e GITHUB_ACTIONS -e COVERAGE"
        echo "CI_ENV=${CI_ENV}"
        sudo -E ./script/test cert_suite ./tests/scripts/thread-cert/backbone/*.py || (sudo chmod a+r *.log *.json *.pcap && false)
    - uses: actions/upload-artifact@v2
      with:
        name: cov-thread-1-2-backbone-docker
        path: /tmp/coverage/
    - uses: actions/upload-artifact@v2
      if: ${{ failure() }}
      with:
        name: thread-1-2-backbone-results
        path: |
          *.pcap
          *.json
          *.log
          coredump_*
          otbr-agent_*
    - name: Generate Coverage
      run: |
        ./script/test generate_coverage gcc
    - uses: actions/upload-artifact@v2
      with:
        name: cov-thread-1-2-backbone
        path: tmp/coverage.info

  thread-border-router:
    runs-on: ubuntu-20.04
    strategy:
      fail-fast: false
      matrix:
        include:
          - otbr_mdns: "mDNSResponder"
            otbr_trel: 0
            cert_scripts: ./tests/scripts/thread-cert/border_router/*.py
            packet_verification: 1
            description: ""
          - otbr_mdns: "mDNSResponder"
            otbr_trel: 1
            cert_scripts: ./tests/scripts/thread-cert/border_router/*.py
            packet_verification: 2
            description: ""
          - otbr_mdns: "mDNSResponder"
            otbr_trel: 0
            cert_scripts: ./tests/scripts/thread-cert/border_router/MATN/*.py
            packet_verification: 1
            description: "MATN"
          - otbr_mdns: "avahi"
            otbr_trel: 0
            cert_scripts: ./tests/scripts/thread-cert/border_router/*.py
            packet_verification: 1
            description: ""
          - otbr_mdns: "avahi"
            otbr_trel: 1
            cert_scripts: ./tests/scripts/thread-cert/border_router/*.py
            packet_verification: 2
            description: ""
    name: BR ${{ matrix.description }} (${{ matrix.otbr_mdns }}, TREL=${{matrix.otbr_trel}})
    env:
      REFERENCE_DEVICE: 1
      VIRTUAL_TIME: 0
      PACKET_VERIFICATION: ${{ matrix.packet_verification }}
      THREAD_VERSION: 1.2
      INTER_OP: 1
      COVERAGE: 1
      MULTIPLY: 1
      OTBR_MDNS: ${{ matrix.otbr_mdns }}
      PYTHONUNBUFFERED: 1
      VERBOSE: 1
      BORDER_ROUTING: 1
      MAX_JOBS: 3
    steps:
    - uses: actions/checkout@v2
    - name: Build OTBR Docker
      env:
        GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
        TREL: ${{ matrix.otbr_trel }}
      run: |
        ./script/test build_otbr_docker
    - name: Bootstrap
      run: |
        sudo rm /etc/apt/sources.list.d/* && sudo apt-get update
        sudo apt-get --no-install-recommends install -y python3-setuptools python3-wheel ninja-build socat lcov
        python3 -m pip install -r tests/scripts/thread-cert/requirements.txt
    - name: Build
      run: |
        ./script/test build
    - name: Get Thread-Wireshark
      run: |
        ./script/test get_thread_wireshark
    - name: Run
      run: |
        export CI_ENV="$(bash <(curl -s https://codecov.io/env)) -e GITHUB_ACTIONS -e COVERAGE"
        echo "CI_ENV=${CI_ENV}"
        sudo -E ./script/test cert_suite ${{ matrix.cert_scripts }} || (sudo chmod a+r *.log *.json *.pcap && false)
    - uses: actions/upload-artifact@v2
      with:
        name: cov-thread-border-router-docker
        path: /tmp/coverage/
    - uses: actions/upload-artifact@v2
      if: ${{ failure() }}
      with:
        name: thread-border-router-results
        path: |
          *.pcap
          *.json
          *.log
          coredump_*
          otbr-agent_*
    - name: Generate Coverage
      run: |
        ./script/test generate_coverage gcc
    - uses: actions/upload-artifact@v2
      with:
        name: cov-thread-border-router
        path: tmp/coverage.info

  upload-coverage:
    needs:
    - backbone-router
    - thread-border-router
    runs-on: ubuntu-20.04
    steps:
    - uses: actions/checkout@v2
      with:
        submodules: true
    - name: Bootstrap
      run: |
        sudo apt-get --no-install-recommends install -y lcov
    - uses: actions/download-artifact@v2
      with:
        path: coverage/
    - name: Combine Coverage
      continue-on-error: true
      run: |
        script/test combine_coverage
    - name: Upload Coverage
      continue-on-error: true
      uses: codecov/codecov-action@v1
      with:
        files: final.info
        fail_ci_if_error: true

  delete-coverage-artifacts:
    needs: upload-coverage
    if: always()
    runs-on: ubuntu-20.04
    steps:
    - uses: geekyeggo/delete-artifact@1-glob-support
      with:
        name: cov-*
        useGlob: true
