# Workflow that runs python unit tests on mac
name: Run Python Unit Tests Mac

# This job is flaky so only run it nightly
on:
  schedule:
    - cron: '0 0 * * *'

jobs:
  # Run python unit tests on macOS
  test-on-macos:
    name: Python Unit Tests on macOS
    runs-on: macos-14
    env:
      INSTALL_DOCKER: '1' # Set to '0' to skip Docker installation
    strategy:
      matrix:
        python-version: ['3.12']
    steps:
      - uses: actions/checkout@v4
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}
      - name: Cache Poetry dependencies
        uses: actions/cache@v4
        with:
          path: |
            ~/.cache/pypoetry
            ~/.virtualenvs
          key: ${{ runner.os }}-poetry-${{ hashFiles('**/poetry.lock') }}
          restore-keys: |
            ${{ runner.os }}-poetry-
      - name: Install poetry via pipx
        run: pipx install poetry
      - name: Install Python dependencies using Poetry
        run: poetry install --without evaluation,llama-index
      - name: Install & Start Docker
        if: env.INSTALL_DOCKER == '1'
        run: |
          INSTANCE_NAME="colima-${GITHUB_RUN_ID}"

          # Uninstall colima to upgrade to the latest version
          if brew list colima &>/dev/null; then
            brew uninstall colima
            # unlinking colima dependency: go
            brew uninstall go@1.21
          fi
          rm -rf ~/.colima ~/.lima
          brew install --HEAD colima
          brew install docker

          start_colima() {
            # Find a free port in the range 10000-20000
            RANDOM_PORT=$((RANDOM % 10001 + 10000))

            # Original line:
            if ! colima start --network-address --arch x86_64 --cpu=1 --memory=1 --verbose --ssh-port $RANDOM_PORT; then
              echo "Failed to start Colima."
              return 1
            fi
            return 0
          }

          # Attempt to start Colima for 5 total attempts:
          ATTEMPT_LIMIT=5
          for ((i=1; i<=ATTEMPT_LIMIT; i++)); do

            if start_colima; then
              echo "Colima started successfully."
              break
            else
              colima stop -f
              sleep 10
              colima delete -f
              if [ $i -eq $ATTEMPT_LIMIT ]; then
                exit 1
              fi
              sleep 10
            fi
          done

          # For testcontainers to find the Colima socket
          # https://github.com/abiosoft/colima/blob/main/docs/FAQ.md#cannot-connect-to-the-docker-daemon-at-unixvarrundockersock-is-the-docker-daemon-running
          sudo ln -sf $HOME/.colima/default/docker.sock /var/run/docker.sock
      - name: Build Environment
        run: make build
      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@v3
      - name: Run Tests
        run: poetry run pytest --forked --cov=openhands --cov-report=xml ./tests/unit --ignore=tests/unit/test_memory.py
      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v4
        env:
          CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
