name: BabbleSim Tests

on:
  pull_request:
    paths:
      - ".github/workflows/bsim-tests.yaml"
      - ".github/workflows/bsim-tests-publish.yaml"
      - "west.yml"
      - "subsys/bluetooth/**"
      - "tests/bsim/**"
      - "boards/nordic/nrf5*/*dt*"
      - "dts/*/nordic/**"
      - "tests/bluetooth/common/testlib/**"
      - "samples/bluetooth/**"
      - "boards/native/**"
      - "soc/native/**"
      - "arch/posix/**"
      - "include/zephyr/arch/posix/**"
      - "scripts/native_simulator/**"
      - "samples/net/sockets/echo_*/**"
      - "modules/hal_nordic/**"
      - "modules/mbedtls/**"
      - "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.27.4.20241026
      options: '--entrypoint /bin/bash'
    env:
      ZEPHYR_TOOLCHAIN_VARIANT: zephyr
      BSIM_OUT_PATH: /opt/bsim/
      BSIM_COMPONENTS_PATH: /opt/bsim/components
      EDTT_PATH: ../tools/edtt
    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"
          rm -fr ".git/rebase-merge"
          git rebase origin/${BASE_REF}
          git clean -f -d
          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@v45
        id: check-common-files
        with:
          files: |
            .github/workflows/bsim-tests.yaml
            .github/workflows/bsim-tests-publish.yaml
            west.yml
            boards/native/
            soc/native/
            arch/posix/
            include/zephyr/arch/posix/
            scripts/native_simulator/
            tests/bsim/*
            boards/nordic/nrf5*/*dt*
            dts/*/nordic/
            modules/mbedtls/**
            modules/hal_nordic/**

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

      - name: Check if Networking files changed
        uses: tj-actions/changed-files@v45
        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@v45
        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_modified == 'true'
          || steps.check-networking-files.outputs.any_modified == 'true'
          || steps.check-uart-files.outputs.any_modified == 'true'
          || steps.check-common-files.outputs.any_modified == '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_modified == 'true' || steps.check-common-files.outputs.any_modified == 'true'
        run: |
          tests/bsim/ci.bt.sh

      - name: Run Networking Tests with BSIM
        if: steps.check-networking-files.outputs.any_modified == 'true' || steps.check-common-files.outputs.any_modified == 'true'
        run: |
          tests/bsim/ci.net.sh

      - name: Run UART Tests with BSIM
        if: steps.check-uart-files.outputs.any_modified == 'true' || steps.check-common-files.outputs.any_modified == 'true'
        run: |
          tests/bsim/ci.uart.sh

      - name: Merge Test Results
        run: |
          pip install junitparser junit2html
          junitparser merge --glob "./bsim_*/*bsim_results.*.xml" "./twister-out/twister.xml" junit.xml
          junit2html junit.xml junit.html

      - name: Upload Unit Test Results in HTML
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: HTML Unit Test Results
          if-no-files-found: ignore
          path: |
            junit.html

      - name: Publish Unit Test Results
        uses: EnricoMi/publish-unit-test-result-action@v2
        with:
          check_name: Bsim Test Results
          files: "junit.xml"
          comment_mode: off

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