# Copyright (c) 2020-2021 Project CHIP Authors
#
# Licensed 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
#
# http://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: Builds

on:
    push:
    pull_request:

jobs:
    build:
        name: Build
        timeout-minutes: 60

        strategy:
            matrix:
                type: [gcc_debug, gcc_release, clang, mbedtls, clang_experimental]
        env:
            BUILD_TYPE: ${{ matrix.type }}

        runs-on: ubuntu-latest
        if: github.actor != 'restyled-io[bot]'

        container:
            image: connectedhomeip/chip-build:latest
            volumes:
                - "/tmp/log_output:/tmp/test_logs"
            options:
                --sysctl "net.ipv6.conf.all.disable_ipv6=0
                net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1"

        steps:
            - name: Checkout
              uses: actions/checkout@v2
              with:
                  submodules: true
            - name: Initialize CodeQL
              uses: github/codeql-action/init@v1
              with:
                  languages: "cpp"

            - name: Bootstrap
              timeout-minutes: 10
              run: scripts/build/gn_bootstrap.sh
            - name: Uploading bootstrap logs
              uses: actions/upload-artifact@v2
              if: ${{ always() }}
              with:
                  name: bootstrap-logs
                  path: |
                   .environment/gn_out/.ninja_log
                   .environment/pigweed-venv/*.log
            - name: Setup Build
              run: |
                  case $BUILD_TYPE in
                     "gcc_debug") GN_ARGS='chip_config_memory_debug_checks=true chip_config_memory_debug_dmalloc=true';;
                     "gcc_release") GN_ARGS='is_debug=false';;
                     "clang") GN_ARGS='is_clang=true';;
                     "mbedtls") GN_ARGS='chip_crypto="mbedtls"';;
                     *) ;;
                  esac

                  scripts/build/gn_gen.sh --args="$GN_ARGS"
            - name: Run Build
              timeout-minutes: 10
              run: scripts/build/gn_build.sh
            - name: Run Tests
              timeout-minutes: 2
              run: scripts/tests/gn_tests.sh
            # TODO Log Upload https://github.com/project-chip/connectedhomeip/issues/2227
            # TODO https://github.com/project-chip/connectedhomeip/issues/1512
            # - name: Run Code Coverage
            #   if: ${{ contains('main', env.BUILD_TYPE) }}
            #   run: scripts/tools/codecoverage.sh
            # - name: Upload Code Coverage
            #   if: ${{ contains('main', env.BUILD_TYPE) }}
            #   run: bash <(curl -s https://codecov.io/bash)
            - name: Remove third_party binaries for CodeQL Analysis
              run: find out -type d -name "third_party" -exec rm -rf {} +
            - name: Remove dbus binaries for CodeQL Analysis
              run: find out -type d -name "dbus" -exec rm -rf {} +
            # - name: Remove nrfxlib binaries for CodeQL Analysis
            #   run: find . -type d -name "nrfxlib" -exec rm -rf {} +
            - name: Perform CodeQL Analysis
              if: ${{ github.event_name == 'push' }}
              uses: github/codeql-action/analyze@v1
