name: pr_test_linux

on:
  workflow_dispatch:
  pull_request:
    branches: [main]
  issue_comment:
    types: [created]

concurrency:
  group: pr_test
  cancel-in-progress: false

jobs:
  check-comment:
    if: ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'issue_comment' && github.event.issue.pull_request && !github.event.pull_request.draft) }}
    runs-on: self-hosted
    outputs:
      should_run: ${{ steps.check.outputs.should_run }}
    steps:
      - id: check
        run: |
          body="${{ github.event.comment.body }}"
          body_lower=$(echo "$body" | tr '[:upper:]' '[:lower:]')
          if [[ "$body_lower" == "run tests" || "$body_lower" == "run test" ]]; then
            echo "should_run=true" >> $GITHUB_OUTPUT
          else
            echo "should_run=false" >> $GITHUB_OUTPUT
          fi

  set-up-build-env:
    runs-on: self-hosted
    needs: [ check-comment ]
    if: ${{ github.event_name != 'issue_comment' || needs.check-comment.outputs.should_run == 'true' }}

    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          submodules: true

      - name: Set up Python
        run: |
          which python
          echo "Setting up Python with Conda"
          conda create -n test_env python=3.11 -y

      - name: Install dependencies
        run: |
          source $(conda info --base)/etc/profile.d/conda.sh
          conda activate test_env || { echo "Failed to activate conda env"; exit 1; }
          which python
          conda install -c conda-forge gxx=11 gcc=11
          echo "Installing dependencies"
          pip install torch torchvision torchaudio
          pip install ninja wheel diffusers transformers accelerate sentencepiece protobuf huggingface_hub
  

  build:
    needs: set-up-build-env
    runs-on: self-hosted
    timeout-minutes: 30
    if: ${{ github.event_name != 'issue_comment' || needs.check-comment.outputs.should_run == 'true' }}

    steps:
      - name: Run build tests
        run: |
          source $(conda info --base)/etc/profile.d/conda.sh
          conda activate test_env || { echo "Failed to activate conda env"; exit 1; }
          which python
          NUNCHAKU_INSTALL_MODE=ALL python setup.py develop
          pip install -r tests/requirements.txt

  test-flux-memory:
    needs: build
    runs-on: self-hosted
    timeout-minutes: 30
    if: ${{ github.event_name != 'issue_comment' || needs.check-comment.outputs.should_run == 'true' }}

    steps:
      - name: Run FLUX memory test
        run: |
          which python
          source $(conda info --base)/etc/profile.d/conda.sh
          conda activate test_env || { echo "Failed to activate conda env"; exit 1; }
          which python
          HF_TOKEN=${{ secrets.HF_TOKEN }} pytest -x tests/flux/test_flux_memory.py

  test-flux-other:
    needs: build
    runs-on: self-hosted
    timeout-minutes: 120
    if: ${{ github.event_name != 'issue_comment' || needs.check-comment.outputs.should_run == 'true' }}

    steps:
      - name: Run other FLUX tests
        run: |
          which python
          source $(conda info --base)/etc/profile.d/conda.sh
          conda activate test_env || { echo "Failed to activate conda env"; exit 1; }
          which python
          HF_TOKEN=${{ secrets.HF_TOKEN }} pytest -x tests/flux --ignore=tests/flux/test_flux_memory.py

  test-sana:
    needs: build
    runs-on: self-hosted
    timeout-minutes: 60
    if: ${{ github.event_name != 'issue_comment' || needs.check-comment.outputs.should_run == 'true' }}

    steps:
      - name: Run SANA tests
        run: |
          which python
          source $(conda info --base)/etc/profile.d/conda.sh
          conda activate test_env || { echo "Failed to activate conda env"; exit 1; }
          which python
          HF_TOKEN=${{ secrets.HF_TOKEN }} pytest -x tests/sana

  clean-up:
    if: always() && (github.event_name != 'issue_comment' || needs.check-comment.outputs.should_run == 'true')
    needs: [ set-up-build-env, test-flux-memory, test-flux-other ]
    runs-on: self-hosted

    steps:
      - name: Clean up
        run: |
          cd ..
          rm -rf *nunchaku*
