name: Continuous integration

on:
  workflow_dispatch:
  push:
    branches:
      - main
  pull_request:
  merge_group:

defaults:
  run:
    shell: bash

jobs:

  format:
    name: Check format
    runs-on: ubuntu-latest
    steps:

      - name: Install stable toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt

      - name: Checkout sources
        uses: actions/checkout@v3

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Install cargo-make
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: --debug cargo-make

      - name: Check format
        uses: actions-rs/cargo@v1
        with:
          command: make
          args: ci-format

  check:
    name: Check workspace
    runs-on: ubuntu-latest
    steps:

      - name: Install stable toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Checkout sources
        uses: actions/checkout@v3

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Install dependencies
        run: |
          sudo apt-get -y update

      - name: Install cargo-make
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: --debug cargo-make

      - name: Check workspace
        uses: actions-rs/cargo@v1
        with:
          command: make
          args: ci-check

  check-wasm:
    name: Check Wasm
    runs-on: ubuntu-latest
    steps:

      - name: Install stable toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: wasm32-unknown-unknown

      - name: Checkout sources
        uses: actions/checkout@v3

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Install cargo-make
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: --debug cargo-make

      - name: Check wasm
        uses: actions-rs/cargo@v1
        with:
          command: make
          args: ci-check-wasm

  clippy:
    name: Check clippy
    runs-on: ubuntu-latest
    steps:

      - name: Install stable toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy

      - name: Checkout sources
        uses: actions/checkout@v3

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Install dependencies
        run: |
          sudo apt-get -y update

      - name: Install cargo-make
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: --debug cargo-make

      - name: Run clippy
        uses: actions-rs/cargo@v1
        with:
          command: make
          args: ci-clippy

  cli:
    name: CLI integration tests
    runs-on: ubuntu-latest
    steps:

      - name: Install stable toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Checkout sources
        uses: actions/checkout@v3

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Install dependencies
        run: |
          sudo apt-get -y update

      - name: Install cargo-make
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: --debug cargo-make

      - name: Run CLI integration tests
        uses: actions-rs/cargo@v1
        with:
          command: make
          args: ci-cli-integration
      
      - name: Debug info
        if: always()
        run: |
          set -x
          free -m
          df -h
          ps auxf
          cat /tmp/surrealdb.log || true
          

  http-server:
    name: HTTP integration tests
    runs-on: ubuntu-latest
    steps:

      - name: Install stable toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Checkout sources
        uses: actions/checkout@v3

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Install dependencies
        run: |
          sudo apt-get -y update

      - name: Install cargo-make
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: --debug cargo-make

      - name: Run HTTP integration tests
        uses: actions-rs/cargo@v1
        with:
          command: make
          args: ci-http-integration

  ws-server:
    name: WebSocket integration tests
    runs-on: ubuntu-latest
    steps:

      - name: Install stable toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Checkout sources
        uses: actions/checkout@v3

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Install dependencies
        run: |
          sudo apt-get -y update

      - name: Install cargo-make
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: --debug cargo-make

      - name: Run WS integration tests
        uses: actions-rs/cargo@v1
        with:
          command: make
          args: ci-ws-integration

  test:
    name: Test workspace
    runs-on: ubuntu-latest
    steps:

      - name: Install stable toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Checkout sources
        uses: actions/checkout@v3

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Install dependencies
        run: |
          sudo apt-get -y update

      - name: Free up some disk space
        run: |
          (set -x; df -h)
          # Free up some disk space by removing unused files
          (set -x; sudo rm -rf /imagegeneration || true)
          (set -x; sudo rm -rf /opt/az || true)
          (set -x; sudo rm -rf /opt/hostedtoolcache || true)
          (set -x; sudo rm -rf /opt/google || true)
          (set -x; sudo rm -rf /opt/pipx || true)
          (set -x; df -h)

      - name: Install cargo-llvm-cov
        uses: taiki-e/install-action@cargo-llvm-cov

      - name: Install cargo-make
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: --debug cargo-make

      - name: Test workspace + coverage
        uses: actions-rs/cargo@v1
        with:
          command: make
          args: ci-workspace-coverage

      - name: Upload coverage report
        uses: actions/upload-artifact@v3
        with:
          name: code-coverage-report
          path: target/llvm-cov/html/
          retention-days: 5

  ws-engine:
    name: WebSocket engine
    runs-on: ubuntu-latest
    steps:

      - name: Install stable toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Checkout sources
        uses: actions/checkout@v3

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Install dependencies
        run: |
          sudo apt-get -y update

      - name: Setup FoundationDB
        uses: foundationdb-rs/foundationdb-actions-install@v2.0.0
        with:
          version: "7.1.30"

      - name: Install cargo-make
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: --debug cargo-make

      - name: Test ws engine
        uses: actions-rs/cargo@v1
        with:
          command: make
          args: ci-api-integration-ws

      - name: Debug info
        if: always()
        run: |
          set -x
          free -m
          df -h
          ps auxf
          cat /tmp/surrealdb.log || true

  http-engine:
    name: HTTP engine
    runs-on: ubuntu-latest
    steps:

      - name: Install stable toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Checkout sources
        uses: actions/checkout@v3

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Install dependencies
        run: |
          sudo apt-get -y update

      - name: Setup FoundationDB
        uses: foundationdb-rs/foundationdb-actions-install@v2.0.0
        with:
          version: "7.1.30"

      - name: Install cargo-make
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: --debug cargo-make

      - name: Test http engine
        uses: actions-rs/cargo@v1
        with:
          command: make
          args: ci-api-integration-http

      - name: Debug info
        if: always()
        run: |
          set -x
          free -m
          df -h
          ps auxf
          cat /tmp/surrealdb.log || true

  any-engine:
    name: Any engine
    runs-on: ubuntu-latest
    steps:

      - name: Install stable toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Checkout sources
        uses: actions/checkout@v3

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Install dependencies
        run: |
          sudo apt-get -y update

      - name: Setup FoundationDB
        uses: foundationdb-rs/foundationdb-actions-install@v2.0.0
        with:
          version: "7.1.30"

      - name: Install cargo-make
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: --debug cargo-make

      - name: Test any engine
        uses: actions-rs/cargo@v1
        with:
          command: make
          args: ci-api-integration-any

      - name: Debug info
        if: always()
        run: |
          set -x
          free -m
          df -h
          ps auxf
          cat /tmp/surrealdb.log || true

  mem-engine:
    name: Memory engine
    runs-on: ubuntu-latest
    steps:

      - name: Install stable toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Checkout sources
        uses: actions/checkout@v3

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Install cargo-make
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: --debug cargo-make

      - name: Test mem engine
        uses: actions-rs/cargo@v1
        with:
          command: make
          args: ci-api-integration-mem

  file-engine:
    name: File engine
    runs-on: ubuntu-latest
    steps:

      - name: Install stable toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Checkout sources
        uses: actions/checkout@v3

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Install cargo-make
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: --debug cargo-make

      - name: Test file engine
        uses: actions-rs/cargo@v1
        with:
          command: make
          args: ci-api-integration-file

  rocksdb-engine:
    name: RocksDB engine
    runs-on: ubuntu-latest
    steps:

      - name: Install stable toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Checkout sources
        uses: actions/checkout@v3

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Install cargo-make
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: --debug cargo-make

      - name: Test rocksdb engine
        uses: actions-rs/cargo@v1
        with:
          command: make
          args: ci-api-integration-rocksdb

  speedb-engine:
    name: SpeeDB engine
    runs-on: ubuntu-latest
    steps:

      - name: Install stable toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Checkout sources
        uses: actions/checkout@v3

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Install cargo-make
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: --debug cargo-make

      - name: Test speedb engine
        uses: actions-rs/cargo@v1
        with:
          command: make
          args: ci-api-integration-speedb

  tikv-engine:
     name: TiKV engine
     runs-on: ubuntu-latest
     steps:

      - name: Install stable toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Checkout sources
        uses: actions/checkout@v3

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Install dependencies
        run: |
          sudo apt-get -y update

      - name: Install TiUP
        run: |
          curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
          ~/.tiup/bin/tiup -v

      - name: Install cargo-make
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: --debug cargo-make

      - name: Test tikv engine
        uses: actions-rs/cargo@v1
        with:
          command: make
          args: ci-api-integration-tikv

      - name: Debug info
        if: always()
        run: |
          set -x
          free -m
          df -h
          ps auxf
          cat /tmp/surrealdb.log || true

  fdb-engine:
    name: FoundationDB engine
    runs-on: ubuntu-latest
    steps:

      - name: Install stable toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Checkout sources
        uses: actions/checkout@v3

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Setup FoundationDB
        uses: foundationdb-rs/foundationdb-actions-install@v2.0.0
        with:
          version: "7.1.30"

      - name: Install cargo-make
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: --debug cargo-make

      - name: Test fdb engine
        uses: actions-rs/cargo@v1
        with:
          command: make
          args: ci-api-integration-fdb

      - name: Debug info
        if: always()
        run: |
          set -x
          free -m
          df -h
          ps auxf
          cat /tmp/surrealdb.log || true