on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  changes:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    outputs:
      dirs: ${{ steps.filter.outputs.changes }}
    steps:
      - uses: actions/checkout@v2
      - uses: dorny/paths-filter@v2
        id: filter
        with:
          filters: |
            crates/youki: crates/youki/**
            crates/libcontainer: crates/libcontainer/**
            crates/libcgroups: crates/libcgroups/**
            tests/rust-integration-tests/runtimetest: ./tests/rust-integration-tests/runtimetest
            tests/rust-integration-tests/integration_test: ./tests/rust-integration-tests/integration_test
            tests/rust-integration-tests/test_framework: ./tests/rust-integration-tests/test_framework
  check:
    needs: [changes]
    if: ${{ !contains(needs.changes.outputs.dirs, '[]') }}
    runs-on: ubuntu-latest
    timeout-minutes: 15
    strategy:
      matrix:
        rust: [1.59.0, 1.60.0]
        dirs: ${{ fromJSON(needs.changes.outputs.dirs) }}
    steps:
      - uses: actions/checkout@v2
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ matrix.rust }}
          override: true
      - name: Cache youki
        uses: Swatinem/rust-cache@v1
      - run: rustup component add rustfmt clippy
      - run: sudo apt-get -y update
      - run: sudo apt-get install -y pkg-config libsystemd-dev libdbus-glib-1-dev libelf-dev libseccomp-dev
      - name: Check formatting
        run: cargo fmt --all -- --check
        working-directory: ${{matrix.dirs}}
      - name: Check clippy lints
        working-directory: ${{matrix.dirs}}
        run: cargo clippy --all-targets --all-features -- -D warnings
  tests:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    strategy:
      matrix:
        rust: [1.59.0, 1.60.0]
    steps:
      - uses: actions/checkout@v2
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ matrix.rust }}
          override: true
      - name: Cache youki
        uses: Swatinem/rust-cache@v1
      - run: sudo apt-get -y update
      - run: sudo apt-get install -y pkg-config libsystemd-dev libdbus-glib-1-dev libelf-dev libseccomp-dev
      - name: Run tests
        run: cd ./crates && cargo test --all --all-features --no-fail-fast
  coverage:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    name: Run test coverage
    steps:
      - uses: actions/checkout@v2
      - name: Toolchain setup
        uses: actions-rs/toolchain@v1
        with:
          toolchain: nightly-2022-01-14
          override: true
          profile: minimal
          components: llvm-tools-preview
      - name: Cache youki
        uses: Swatinem/rust-cache@v1
      - name: install cargo-llvm-cov
        env:
          CARGO_LLVM_COV_VERSION: 0.1.5
        run: |
          wget https://github.com/taiki-e/cargo-llvm-cov/releases/download/v${CARGO_LLVM_COV_VERSION}/cargo-llvm-cov-x86_64-unknown-linux-gnu.tar.gz -qO- | tar -xzvf -
          mv cargo-llvm-cov ~/.cargo/bin
      - name: Update System Libraries
        run: sudo apt-get -y update
      - name: Install System Libraries
        run: sudo apt-get install -y pkg-config libsystemd-dev libdbus-glib-1-dev libelf-dev libseccomp-dev
      - name: Run Test Coverage for youki
        run: |
          cd ./crates
          cargo llvm-cov clean --workspace
          cargo llvm-cov --no-report
          cargo llvm-cov --no-run --lcov --ignore-filename-regex "libcgroups/src/systemd/dbus/systemd_api.rs" --output-path ./coverage.lcov
      - name: Upload Youki Code Coverage Results
        uses: codecov/codecov-action@v2
        with:
          file: ./coverage.lcov
  integration_tests:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    strategy:
      matrix:
        rust: [1.59.0, 1.60.0]
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: recursive
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ matrix.rust }}
          override: true
      - name: Cache youki
        uses: Swatinem/rust-cache@v1
      - run: sudo apt-get -y update
      - run: sudo apt-get install -y pkg-config libsystemd-dev libdbus-glib-1-dev libelf-dev libseccomp-dev
      - uses: actions/setup-go@v2
        with:
          go-version: "1.17.6"
      - name: Run integration tests
        run: make oci-integration-test
