name: BabbleSim Tests

on:
  pull_request:
    paths:
      - ".github/workflows/bsim-tests.yaml"
      - ".github/workflows/bsim-tests-publish.yaml"
      - "west.yml"
      - "subsys/bluetooth/**"
      - "tests/bsim/**"
      - "tests/bluetooth/common/testlib/**"
      - "samples/bluetooth/**"
      - "boards/posix/**"
      - "soc/posix/**"
      - "arch/posix/**"
      - "include/zephyr/arch/posix/**"
      - "scripts/native_simulator/**"
      - "samples/net/sockets/echo_*/**"
      - "modules/openthread/**"
      - "subsys/net/l2/openthread/**"
      - "include/zephyr/net/openthread.h"
      - "drivers/ieee802154/**"
      - "include/zephyr/net/ieee802154*"
      - "drivers/serial/*nrfx*"
      - "tests/drivers/uart/**"

concurrency:
  group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.head_ref || github.ref }}
  cancel-in-progress: true

jobs:
  bsim-test:
    if: github.repository_owner == 'zephyrproject-rtos'
    runs-on:
      group: zephyr-runner-v2-linux-x64-4xlarge
    container:
      image: ghcr.io/zephyrproject-rtos/ci-repo-cache:v0.26.11.20240324
      options: '--entrypoint /bin/bash'
    env:
      ZEPHYR_TOOLCHAIN_VARIANT: zephyr
      BSIM_OUT_PATH: /opt/bsim/
      BSIM_COMPONENTS_PATH: /opt/bsim/components
      EDTT_PATH: ../tools/edtt
      bsim_bt_52_test_results_file: ./bsim_bt/52_bsim_results.xml
      bsim_bt_53_test_results_file: ./bsim_bt/53_bsim_results.xml
      bsim_bt_53split_test_results_file: ./bsim_bt/53_bsim_split_results.xml
      bsim_net_52_test_results_file: ./bsim_net/52_bsim_results.xml
      bsim_uart_test_results_file: ./bsim_uart/uart_bsim_results.xml
    steps:
      - name: Apply container owner mismatch workaround
        run: |
          # FIXME: The owner UID of the GITHUB_WORKSPACE directory may not
          #        match the container user UID because of the way GitHub
          #        Actions runner is implemented. Remove this workaround when
          #        GitHub comes up with a fundamental fix for this problem.
          git config --global --add safe.directory ${GITHUB_WORKSPACE}

      - name: Print cloud service information
        run: |
          echo "ZEPHYR_RUNNER_CLOUD_PROVIDER = ${ZEPHYR_RUNNER_CLOUD_PROVIDER}"
          echo "ZEPHYR_RUNNER_CLOUD_NODE = ${ZEPHYR_RUNNER_CLOUD_NODE}"
          echo "ZEPHYR_RUNNER_CLOUD_POD = ${ZEPHYR_RUNNER_CLOUD_POD}"

      - name: Clone cached Zephyr repository
        continue-on-error: true
        run: |
          git clone --shared /repo-cache/zephyrproject/zephyr .
          git remote set-url origin ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}

      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Environment Setup
        env:
          BASE_REF: ${{ github.base_ref }}
        run: |
          git config --global user.email "bot@zephyrproject.org"
          git config --global user.name "Zephyr Bot"
          rm -fr ".git/rebase-apply"
          git rebase origin/${BASE_REF}
          git log  --pretty=oneline | head -n 10
          west init -l . || true
          west config manifest.group-filter -- +ci
          west config --global update.narrow true
          west update --path-cache /repo-cache/zephyrproject 2>&1 1> west.update.log || west update --path-cache /repo-cache/zephyrproject 2>&1 1> west.update.log || ( rm -rf ../modules ../bootloader ../tools && west update --path-cache /repo-cache/zephyrproject)
          west forall -c 'git reset --hard HEAD'

          echo "ZEPHYR_SDK_INSTALL_DIR=/opt/toolchains/zephyr-sdk-$( cat SDK_VERSION )" >> $GITHUB_ENV

      - name: Check common triggering files
        uses: tj-actions/changed-files@v41
        id: check-common-files
        with:
          files: |
            .github/workflows/bsim-tests.yaml
            .github/workflows/bsim-tests-publish.yaml
            west.yml
            boards/posix/**
            soc/posix/**
            arch/posix/**
            include/zephyr/arch/posix/**
            scripts/native_simulator/**
            tests/bsim/*

      - name: Check if Bluethooth files changed
        uses: tj-actions/changed-files@v41
        id: check-bluetooth-files
        with:
          files: |
            tests/bsim/bluetooth/**
            samples/bluetooth/**
            subsys/bluetooth/**

      - name: Check if Networking files changed
        uses: tj-actions/changed-files@v41
        id: check-networking-files
        with:
          files: |
            tests/bsim/net/**
            samples/net/sockets/echo_*/**
            modules/openthread/**
            subsys/net/l2/openthread/**
            include/zephyr/net/openthread.h
            drivers/ieee802154/**
            include/zephyr/net/ieee802154*

      - name: Check if UART files changed
        uses: tj-actions/changed-files@v41
        id: check-uart-files
        with:
          files: |
            tests/bsim/drivers/uart/**
            drivers/serial/*nrfx*
            tests/drivers/uart/**

      - name: Update BabbleSim to manifest revision
        if: >
          steps.check-bluetooth-files.outputs.any_changed == 'true'
          || steps.check-networking-files.outputs.any_changed == 'true'
          || steps.check-uart-files.outputs.any_changed == 'true'
          || steps.check-common-files.outputs.any_changed == 'true'
        run: |
          export BSIM_VERSION=$( west list bsim -f {revision} )
          echo "Manifest points to bsim sha $BSIM_VERSION"
          cd /opt/bsim_west/bsim
          git fetch -n origin ${BSIM_VERSION}
          git -c advice.detachedHead=false checkout ${BSIM_VERSION}
          west update
          make everything -s -j 8

      - name: Run Bluetooth Tests with BSIM
        if: steps.check-bluetooth-files.outputs.any_changed == 'true' || steps.check-common-files.outputs.any_changed == 'true'
        run: |
          export ZEPHYR_BASE=${PWD}
          # Build and run the BT tests for nrf52_bsim:
          nice tests/bsim/bluetooth/compile.sh
          RESULTS_FILE=${ZEPHYR_BASE}/${bsim_bt_52_test_results_file} \
          TESTS_FILE=tests/bsim/bluetooth/tests.nrf52bsim.txt tests/bsim/run_parallel.sh
          # Build and run the BT controller tests also for the nrf5340bsim/nrf5340/cpunet
          nice tests/bsim/bluetooth/compile.nrf5340bsim_nrf5340_cpunet.sh
          BOARD=nrf5340bsim/nrf5340/cpunet \
          RESULTS_FILE=${ZEPHYR_BASE}/${bsim_bt_53_test_results_file} \
          TESTS_FILE=tests/bsim/bluetooth/tests.nrf5340bsim_nrf5340_cpunet.txt \
          tests/bsim/run_parallel.sh
          # Build and run the nrf5340 split stack tests set
          nice tests/bsim/bluetooth/compile.nrf5340bsim_nrf5340_cpuapp.sh
          BOARD=nrf5340bsim/nrf5340/cpuapp \
          RESULTS_FILE=${ZEPHYR_BASE}/${bsim_bt_53split_test_results_file} \
          TESTS_FILE=tests/bsim/bluetooth/tests.nrf5340bsim_nrf5340_cpuapp.txt \
          tests/bsim/run_parallel.sh

      - name: Run Networking Tests with BSIM
        if: steps.check-networking-files.outputs.any_changed == 'true' || steps.check-common-files.outputs.any_changed == 'true'
        run: |
          export ZEPHYR_BASE=${PWD}
          WORK_DIR=${ZEPHYR_BASE}/bsim_net nice tests/bsim/net/compile.sh
          RESULTS_FILE=${ZEPHYR_BASE}/${bsim_net_52_test_results_file} \
          SEARCH_PATH=tests/bsim/net/ tests/bsim/run_parallel.sh

      - name: Run UART Tests with BSIM
        if: steps.check-uart-files.outputs.any_changed == 'true' || steps.check-common-files.outputs.any_changed == 'true'
        run: |
          echo "UART: Single device tests"
          ./scripts/twister -T tests/drivers/uart/ --force-color --inline-logs -v -M -p nrf52_bsim \
            --fixture gpio_loopback -- -uart0_loopback
          echo "UART: Multi device tests"
          export ZEPHYR_BASE=${PWD}
          WORK_DIR=${ZEPHYR_BASE}/bsim_uart nice tests/bsim/drivers/uart/compile.sh
          RESULTS_FILE=${ZEPHYR_BASE}/${bsim_uart_test_results_file} \
          SEARCH_PATH=tests/bsim/drivers/uart/ tests/bsim/run_parallel.sh

      - name: Upload Test Results
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: bsim-test-results
          path: |
            ./bsim_bt/52_bsim_results.xml
            ./bsim_bt/53_bsim_results.xml
            ./bsim_bt/53_bsim_split_results.xml
            ./bsim_net/52_bsim_results.xml
            ./bsim_uart/uart_bsim_results.xml
            ./twister-out/twister.xml
            ./twister-out/twister.json
            ${{ github.event_path }}
          if-no-files-found: warn

      - name: Upload Event Details
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: event
          path: |
            ${{ github.event_path }}
