name: LMDB Test

on:
  push:
  pull_request:
  schedule:
    - cron:  '0 0 * * *'
  workflow_dispatch:
    inputs:
      pytest_tests:
        description: 'Run only specified suites or test modules delimited by space, for example "basic/basic_test.py replication"'
        required: false
        default: false
      debug_enabled:
        description: 'Set to "true" to enable debugging with tmate (https://github.com/marketplace/actions/debugging-with-tmate)'
        required: false
        default: false

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

permissions:
  actions: read
  packages: read
  contents: read

jobs:
  build:
    name: Build
    runs-on: ubuntu-22.04
    container:
      image: quay.io/389ds/ci-images:test
    outputs:
        matrix: ${{ steps.set-matrix.outputs.matrix }}
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Add GITHUB_WORKSPACE as a safe directory
        run: git config --global --add safe.directory "$GITHUB_WORKSPACE"

      - name: Get a list of all test suites
        id: set-matrix
        run: echo "matrix=$(python3 .github/scripts/generate_matrix.py ${{ github.event.inputs.pytest_tests }})" >>$GITHUB_OUTPUT

      - name: Build RPMs
        run: SKIP_AUDIT_CI=1 make -f rpm.mk dist-bz2 rpms

      - name: Tar build artifacts
        run: tar -cvf dist.tar dist/

      - name: Upload RPMs
        uses: actions/upload-artifact@v4
        with:
          name: rpms
          path: dist.tar

  test:
    name: LMDB Test
    runs-on: ubuntu-22.04
    needs: build
    strategy:
      fail-fast: false
      matrix: ${{ fromJson(needs.build.outputs.matrix) }}

    steps:
    - name: Checkout
      uses: actions/checkout@v4

    - name: Setup tmate session
      uses: mxschmitt/action-tmate@v3
      with:
        limit-access-to-actor: true
      if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled }}

    - name: Install dependencies
      run: |
        sudo apt update -y
        sudo apt install -y docker.io containerd runc
        sudo cp .github/daemon.json /etc/docker/daemon.json
        sudo systemctl unmask docker
        sudo systemctl start docker

    - name: Free disk space
      run: |
        echo "Disk space before cleanup:"
        df -h
        sudo rm -rf /usr/local/.ghcup
        sudo rm -rf /opt/hostedtoolcache/CodeQL
        sudo rm -rf /usr/local/lib/android/sdk/ndk
        sudo rm -rf /usr/share/dotnet
        sudo rm -rf /opt/ghc
        sudo rm -rf /usr/local/share/boost
        sudo docker image prune --all --force
        sudo apt-get clean
        echo "Disk space after cleanup:"
        df -h

    - name: Download RPMs
      uses: actions/download-artifact@v4
      with:
        name: rpms

    - name: Extract RPMs
      run: tar xvf dist.tar

    - name: Run pytest in a container
      run: |
        set -x
        CID=$(sudo docker run -d -h server.example.com --ulimit core=-1 --cap-add=SYS_PTRACE --privileged --rm --shm-size=4gb -v ${PWD}:/workspace quay.io/389ds/ci-images:test)
        until sudo docker exec $CID sh -c "systemctl is-system-running"
        do
          echo "Waiting for container to be ready..."
        done
        sudo docker exec $CID sh -c "dnf install -y dist/rpms/*rpm"
        export PASSWD=$(openssl rand -base64 32)
        sudo docker exec $CID sh -c "echo \"${PASSWD}\" | passwd --stdin root"
        sudo docker exec $CID sh -c "systemctl start dbus.service"
        sudo docker exec $CID sh -c "systemctl enable --now cockpit.socket"
        sudo docker exec $CID sh -c "mkdir -p /workspace/assets/cores && chmod 777 /workspace{,/assets{,/cores}}"
        sudo docker exec $CID sh -c "echo '/workspace/assets/cores/core.%e.%P' > /proc/sys/kernel/core_pattern"
        sudo docker exec -e WEBUI=1 -e NSSLAPD_DB_LIB=mdb -e DEBUG=pw:api -e PASSWD="${PASSWD}" $CID py.test  --suppress-no-test-exit-code  -m "not flaky" --junit-xml=pytest.xml --html=pytest.html --browser=firefox --browser=chromium -v dirsrvtests/tests/suites/${{ matrix.suite }}

    - name: Make the results file readable by all
      if: always()
      run: |
        sudo chmod -f -v -R a+r pytest.*ml assets
        sudo chmod -f -v a+x assets
    - name: Sanitize filename
      if: always()
      run: echo "PYTEST_SUITE=$(echo ${{ matrix.suite }} | sed -e 's#\/#-#g')" >> $GITHUB_ENV

    - name: Upload pytest test results
      if: always()
      uses: actions/upload-artifact@v4
      with:
        name: pytest-${{ env.PYTEST_SUITE }}
        path: |
          pytest.xml
          pytest.html
          assets

