name: Integration tests

on:
  push:
    branches: [ master, dev ]
  pull_request:
    branches: [ '**' ]

env:
  CARGO_TERM_COLOR: always
  UV_VERSION: 0.9.17

jobs:
  integration-tests:

    runs-on: ubuntu-latest

    steps:
      - name: Install minimal stable
        uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable
      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
      - name: Install Protoc
        uses: ./.github/actions/setup-protoc
      - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2
        with:
          shared-key: integration-tests
      - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
        with:
          python-version: '3.13'
      - name: Install dependencies
        run: |
          sudo apt-get install clang
          curl -LsSf https://astral.sh/uv/$UV_VERSION/install.sh | sh
          echo "$HOME/.local/bin" >> $GITHUB_PATH
          uv --project tests lock --check
          uv --project tests sync
      - name: Build
        run: cargo build --features "service_debug data-consistency-check staging" --locked
      - name: Run integration tests
        run: uv --project tests run bash ./tests/integration-tests.sh
        shell: bash

  integration-tests-consensus:

    runs-on: ubuntu-latest
    steps:
      - name: Install minimal stable
        uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable
      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
      - name: Install Protoc
        uses: ./.github/actions/setup-protoc
      - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2
        with:
          shared-key: integration-tests
      - name: Install dependencies
        run: sudo apt-get install clang
      - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
        with:
          python-version: '3.13'
      - name: Install uv and Python dependencies
        run: |
          curl -LsSf https://astral.sh/uv/$UV_VERSION/install.sh | sh
          echo "$HOME/.local/bin" >> $GITHUB_PATH
          uv --project tests lock --check
          uv --project tests sync
      - name: Build
        run: cargo build --features "service_debug data-consistency-check staging" --locked
      - name: Run integration tests - 1 peer
        run: uv --project tests run bash ./tests/integration-tests.sh distributed
        shell: bash
      - name: Run integration tests - multiple peers - pytest
        run: uv --project tests run pytest -n auto --dist=loadfile -v tests/consensus_tests --durations=10
        timeout-minutes: 60
      - name: upload logs
        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
        if: always()
        with:
          path: consensus_test_logs
          name: consensus-test-logs
          retention-days: 10

  test-consensus-compose:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
      - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
        with:
          python-version: '3.13'
      - name: Install uv and Python dependencies
        run: |
          curl -LsSf https://astral.sh/uv/$UV_VERSION/install.sh | sh
          echo "$HOME/.local/bin" >> $GITHUB_PATH
          uv --project tests lock --check
          uv --project tests sync
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0
      - name: Docker build
        uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0
        with:
          context: .
          tags: qdrant_consensus
          cache-from: |
            type=gha,scope=${{ github.base_ref || github.ref_name }}-consensus
            type=gha,scope=dev-consensus
          cache-to: ${{ github.event_name == 'push' && format('type=gha,mode=max,scope={0}-consensus', github.ref_name) || '' }}
          load: true
          build-args: |
            PROFILE=ci
            FEATURES=staging
      - name: Run integration tests - multiple peers - compose
        run: uv --project tests run bash ./test_restart.sh
        working-directory: ./tests/consensus_tests

  test-consistency:

    runs-on: ubuntu-latest

    steps:
      - name: Install minimal stable
        uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable
      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
      - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2
        with:
          shared-key: integration-tests
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0
      - name: Install dependencies
        run: sudo apt-get install -y clang jq
      - name: Docker build
        uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0
        with:
          context: tools/schema2openapi
          tags: schema2openapi
          cache-from: |
            type=gha,scope=${{ github.ref }}-schema2openapi
            type=gha,scope=${{ github.base_ref }}-schema2openapi
          cache-to: type=gha,mode=max,scope=${{ github.ref }}-schema2openapi
          load: true
          build-args: |
            PROFILE=ci
            FEATURES=staging
      - name: Install Protoc
        uses: ./.github/actions/setup-protoc
      - name: gRPC file consistency check
        run: ./tests/grpc_consistency_check.sh
      - name: OpenAPI file consistency check
        run: ./tests/openapi_consistency_check.sh

  test-shard-snapshot-api-s3-minio:
    runs-on: ubuntu-latest
    # Setup minio server
    services:
      minio:
        image: satantime/minio-server
        ports:
          - 9000:9000
        env:
          MINIO_ACCESS_KEY: "minioadmin"
          MINIO_SECRET_KEY: "minioadmin"
    steps:
      - name: Setup test bucket
        env:
          AWS_ACCESS_KEY_ID: "minioadmin"
          AWS_SECRET_ACCESS_KEY: "minioadmin"
          AWS_EC2_METADATA_DISABLED: "true"
        run: echo $(aws --endpoint-url http://127.0.0.1:9000/ s3 mb s3://test-bucket)
      - name: Install minimal stable
        uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable
      - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2
        with:
          shared-key: integration-tests
      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
      - name: Install Protoc
        uses: ./.github/actions/setup-protoc
      - name: Install dependencies
        run: sudo apt-get install clang jq
      - name: Build
        run: cargo build --bin qdrant --features "staging" --locked
      - name: Run Shard Snapshot API Tests (local)
        shell: bash
        run: |
          cargo run --features "staging" &
          trap 'kill $(jobs -p) &>/dev/null || :' EXIT
          sleep 10

          ./tests/shard-snapshot-api.sh test-all
      - name: Run Shard Snapshot API Tests (s3)
        shell: bash
        run: |
          export QDRANT__STORAGE__SNAPSHOTS_CONFIG__SNAPSHOTS_STORAGE=s3
          export QDRANT__STORAGE__SNAPSHOTS_CONFIG__S3_CONFIG__BUCKET=test-bucket
          export QDRANT__STORAGE__SNAPSHOTS_CONFIG__S3_CONFIG__REGION=us-east-1
          export QDRANT__STORAGE__SNAPSHOTS_CONFIG__S3_CONFIG__ACCESS_KEY=minioadmin
          export QDRANT__STORAGE__SNAPSHOTS_CONFIG__S3_CONFIG__SECRET_KEY=minioadmin
          export QDRANT__STORAGE__SNAPSHOTS_CONFIG__S3_CONFIG__ENDPOINT_URL=http://127.0.0.1:9000

          cargo run --features "staging" &
          trap 'kill $(jobs -p) &>/dev/null || :' EXIT
          sleep 10

          ./tests/shard-snapshot-api.sh test-all

  e2e-tests:
    runs-on: ubuntu-latest

    # Setup minio server
    services:
      minio:
        image: satantime/minio-server
        ports:
          - 9000:9000
        env:
          MINIO_ACCESS_KEY: "minioadmin"
          MINIO_SECRET_KEY: "minioadmin"

    steps:
      - name: Setup test bucket
        env:
          AWS_ACCESS_KEY_ID: "minioadmin"
          AWS_SECRET_ACCESS_KEY: "minioadmin"
          AWS_EC2_METADATA_DISABLED: "true"
        run: echo $(aws --endpoint-url http://127.0.0.1:9000/ s3 mb s3://test-bucket)

      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
        with:
          lfs: true  # Fetch LFS files automatically
      - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
        with:
          python-version: '3.13'
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0
      - name: Install uv and Python dependencies
        run: |
          curl -LsSf https://astral.sh/uv/$UV_VERSION/install.sh | sh
          echo "$HOME/.local/bin" >> $GITHUB_PATH
          uv --project tests lock --check
          uv --project tests sync
      - name: Build Qdrant Docker image
        uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0
        with:
          context: .
          tags: qdrant/qdrant:e2e-tests
          cache-from: |
            type=gha,scope=${{ github.base_ref || github.ref_name }}-e2e
            type=gha,scope=dev-e2e
          cache-to: ${{ github.event_name == 'push' && format('type=gha,mode=max,scope={0}-e2e', github.ref_name) || '' }}
          load: true
          build-args: |
            PROFILE=ci
            FEATURES=data-consistency-check,staging
      - name: Verify Docker image
        run: docker images | grep qdrant
      - name: Run e2e tests
        run: uv --project tests run pytest -n 4 --dist=loadgroup tests/e2e_tests -v --tb=short --durations=5 -m "not longrunning"
        shell: bash
        timeout-minutes: 20
      - name: Upload test logs on failure
        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
        if: failure()
        with:
          name: e2e-test-logs
          path: |
            tests/e2e_tests/test_*.log
            tests/e2e_tests/**/logs/
          retention-days: 7
