name: CI Checks

on:
  push:
    branches: ["**"]
  pull_request:
    branches: ["**"]
  workflow_dispatch:

jobs:
  unittest:
    runs-on: ubuntu-latest
    steps:
      - name: Clone This Repo
        uses: actions/checkout@v2
        with:
          submodules: recursive
      - name: Build
        run: |
          git submodule update --checkout
          cd tools/CMock
          git submodule update --init vendor/unity
          cd ../..
          sudo apt-get install -y lcov
          sudo apt-get install -y unifdef
          cmake -S test/unit-test -B test/unit-test/build/
          make -C test/unit-test/build/ all
      - name: Test
        run: |
          cd test/unit-test/build/
          ctest -E system --output-on-failure
          cd ..
      - name: Coverage
        run: |
          make -C test/unit-test/build/ coverage
          lcov --list --rc lcov_branch_coverage=1 test/unit-test/build/coverage.info
      - name: Check Coverage
        uses: FreeRTOS/CI-CD-Github-Actions/coverage-cop@main
        with:
          path: ./test/unit-test/build/coverage.info

  spell-check:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Parent Repo
        uses: actions/checkout@v2
        with:
          ref: main
          repository: aws/aws-iot-device-sdk-embedded-C
          path: main
      - name: Clone This Repo
        uses: actions/checkout@v2
        with:
          path: ./tcp
      - name: Install spell
        run: |
          sudo apt-get install spell
          sudo apt-get install util-linux
      - name: Check spelling
        run: |
          PATH=$PATH:main/tools/spell
          # Make sure that the portable directory is not included in the spellcheck.
          sed -i 's/find $DIRNAME/find $DIRNAME -not -path '*portable*'/g' main/tools/spell/find-unknown-comment-words
          find-unknown-comment-words --directory tcp/ --lexicon tcp/lexicon.txt
          if [ "$?" = "0" ]; then
            exit 0
          else
            exit 1
          fi

  formatting:
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v2
      - name: Check formatting
        uses: FreeRTOS/CI-CD-Github-Actions/formatting@main
        with:
          path: ./

  doxygen:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Run doxygen build
        uses: FreeRTOS/CI-CD-Github-Actions/doxygen@main
        with:
          path: ./

  build-checks:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Build Install Dependencies
        run: |
          sudo apt-get install -y libpcap-dev
      - name: Build checks (Enable all functionalities)
        run: |
          cmake -S . -B build -DFREERTOS_PLUS_TCP_TEST_CONFIGURATION=ENABLE_ALL
          cmake --build build --target freertos_plus_tcp_build_test
      - name: Build checks (Enable all functionalities IPv4)
        run: |
          cmake -S . -B build -DFREERTOS_PLUS_TCP_TEST_CONFIGURATION=ENABLE_ALL_IPV4
          cmake --build build --target clean
          cmake --build build --target freertos_plus_tcp_build_test
      - name: Build checks (Enable all functionalities IPv6)
        run: |
          cmake -S . -B build -DFREERTOS_PLUS_TCP_TEST_CONFIGURATION=ENABLE_ALL_IPV6
          cmake --build build --target freertos_plus_tcp_build_test
      - name: Build checks (Enable all functionalities IPv4 IPv6)
        run: |
          cmake -S . -B build -DFREERTOS_PLUS_TCP_TEST_CONFIGURATION=ENABLE_ALL_IPV4_IPV6
          cmake --build build --target clean
          cmake --build build --target freertos_plus_tcp_build_test
      - name: Build checks (Enable all functionalities IPv4 TCP)
        run: |
          cmake -S . -B build -DFREERTOS_PLUS_TCP_TEST_CONFIGURATION=ENABLE_ALL_IPV4_TCP
          cmake --build build --target clean
          cmake --build build --target freertos_plus_tcp_build_test
      - name: Build checks (Enable all functionalities IPv6 TCP)
        run: |
          cmake -S . -B build -DFREERTOS_PLUS_TCP_TEST_CONFIGURATION=ENABLE_ALL_IPV6_TCP
          cmake --build build --target freertos_plus_tcp_build_test
      - name: Build checks (Disable all functionalities)
        run: |
          cmake -S . -B build -DFREERTOS_PLUS_TCP_TEST_CONFIGURATION=DISABLE_ALL
          cmake --build build --target clean
          cmake --build build --target freertos_plus_tcp_build_test
      - name: Build checks (Default configuration)
        run: |
          cmake -S . -B build -DFREERTOS_PLUS_TCP_TEST_CONFIGURATION=DEFAULT_CONF
          cmake --build build --target clean
          cmake --build build --target freertos_plus_tcp_build_test
      - name: Build checks (Header Self Contain)
        run: |
          cmake -S . -B build -DFREERTOS_PLUS_TCP_TEST_CONFIGURATION=HEADER_SELF_CONTAIN
          cmake --build build --target clean
          cmake --build build --target freertos_plus_tcp_build_test_FreeRTOS_DHCP
          cmake --build build --target freertos_plus_tcp_build_test_FreeRTOS_DNS
          cmake --build build --target freertos_plus_tcp_build_test_FreeRTOS_IP
          cmake --build build --target freertos_plus_tcp_build_test_FreeRTOS_ND
          cmake --build build --target freertos_plus_tcp_build_test_FreeRTOS_Routing
          cmake --build build --target freertos_plus_tcp_build_test_FreeRTOS_Sockets
          cmake --build build --target freertos_plus_tcp_build_test_NetworkBufferManagement
          cmake --build build --target freertos_plus_tcp_build_test_NetworkInterface

  complexity:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Setup
        run: sudo apt-get install complexity
      - name: Install Uncrustify
        run: sudo apt-get install uncrustify
      - name: Complexity
        run: |
          COMPLEXITY_PARAMS="--scores --threshold=10 --horrid-threshold=283"
          TEMP_DIR=./temp
          mkdir -p ${TEMP_DIR}
          for SOURCE_FILE in source/portable/BufferManagement/*.c source/*.c
          do
              TARGET_DIR=${TEMP_DIR}/`dirname ${SOURCE_FILE}`
              TARGET_FILE=${TARGET_DIR}/`basename ${SOURCE_FILE}`
              mkdir -p ${TARGET_DIR}
              uncrustify -c tools/uncrustify.complexity.cfg -f ${SOURCE_FILE} > ${TARGET_FILE}
          done
          find ${TEMP_DIR} -iname '*.c' | xargs complexity ${COMPLEXITY_PARAMS}
          RESULT=$?
          rm -rf ${TEMP_DIR}
          if [ "${RESULT}" = "0" ]; then
              echo "All is good."
              exit 0
          else
              echo "Sources are too complex, rc = " ${RESULT}
              exit 1
          fi

  git-secrets:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: recursive
      - name: Checkout awslabs/git-secrets
        uses: actions/checkout@v2
        with:
          repository: awslabs/git-secrets
          ref: master
          path: git-secrets
      - name: Install git-secrets
        run: cd git-secrets && sudo make install && cd ..
      - name: Run git-secrets
        run: |
          git-secrets --register-aws
          git-secrets --scan
  proof_ci:
    runs-on: cbmc_ubuntu-latest_16-core
    steps:
      - name: Set up CBMC runner
        uses: FreeRTOS/CI-CD-Github-Actions/set_up_cbmc_runner@main
        with:
          cbmc_version: "5.61.0"
      - run: |
          git submodule update --init --checkout --recursive
          sudo apt-get update
          sudo apt-get install --yes --no-install-recommends gcc-multilib
      - name: Run CBMC
        uses: FreeRTOS/CI-CD-Github-Actions/run_cbmc@main
        with:
          proofs_dir: test/cbmc/proofs
