name: Continuous integration

on:
  pull_request:
  push:
    branches:
      - master

jobs:
  test-desktop:
    name: Build and test
    runs-on: ubuntu-latest
    steps:

    - name: Cancel Previous Runs
      uses: styfle/cancel-workflow-action@0.8.0
      with:
        access_token: ${{ github.token }}

    - uses: actions/checkout@v2

    - name: Cache CARGO_HOME
      uses: actions/cache@v2.1.4
      with:
        path: ~/.cargo
        key: cargo-home-${{ hashFiles('Cargo.toml') }}

    - name: Cache cargo build
      uses: actions/cache@v2.1.4
      with:
        path: target
        key: cargo-build-target-${{ hashFiles('Cargo.toml') }}

    - name: Run tests, with no feature
      run: cargo test --workspace --no-default-features

    - name: Run tests, with all features
      run: cargo test --workspace --all-features

  test-wasm:
    name: Build on WASM
    runs-on: ubuntu-latest
    container:
      image: rust
      env:
        CC: clang-10
    steps:

    - name: Cancel Previous Runs
      uses: styfle/cancel-workflow-action@0.8.0
      with:
        access_token: ${{ github.token }}

    - uses: actions/checkout@v2

    - name: Install Rust
      uses: actions-rs/toolchain@v1
      with:
        toolchain: stable
        target: wasm32-unknown-unknown
        override: true

    - name: Install a recent version of clang
      run: |
        wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -
        echo "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-10 main" >> /etc/apt/sources.list
        apt-get update
        apt-get install -y clang-10

    - name: Install CMake
      run: apt-get install -y cmake

    - name: Cache CARGO_HOME
      uses: actions/cache@v2.1.4
      with:
        path: ~/.cargo
        key: cargo-home-${{ hashFiles('Cargo.toml') }}

    - name: Cache cargo build
      uses: actions/cache@v2.1.4
      with:
        path: target
        key: wasm-cargo-build-target-${{ hashFiles('Cargo.toml') }}

    - name: Build on WASM
      # TODO: also run `cargo test`
      # TODO: ideally we would build `--workspace`, but not all crates compile for WASM
      run: cargo build --target=wasm32-unknown-unknown

  check-rustdoc-links:
    name: Check rustdoc intra-doc links
    runs-on: ubuntu-latest
    container:
      image: rust
    steps:

    - name: Cancel Previous Runs
      uses: styfle/cancel-workflow-action@0.8.0
      with:
        access_token: ${{ github.token }}

    - uses: actions/checkout@v2

    - name: Check rustdoc links
      run: RUSTDOCFLAGS="--deny broken_intra_doc_links" cargo doc --verbose --workspace --no-deps --document-private-items

  check-clippy:
    runs-on: ubuntu-latest
    steps:

    - name: Cancel Previous Runs
      uses: styfle/cancel-workflow-action@0.8.0
      with:
        access_token: ${{ github.token }}

    - uses: actions/checkout@v2

    - uses: actions-rs/toolchain@v1
      with:
        profile: minimal
        toolchain: stable
        override: true
        components: clippy

    - name: Cache CARGO_HOME
      uses: actions/cache@v2.1.4
      with:
        path: ~/.cargo
        key: cargo-home-${{ hashFiles('Cargo.toml') }}

    - name: Cache cargo build
      uses: actions/cache@v2.1.4
      with:
        path: target
        key: cargo-build-target-${{ hashFiles('Cargo.toml') }}

    - name: Run cargo clippy
      uses: actions-rs/cargo@v1
      with:
        command: clippy
        args: -- -A clippy::type_complexity -A clippy::pedantic -A clippy::style

  run-benchmarks:
    runs-on: ubuntu-latest
    steps:

    - name: Cancel Previous Runs
      uses: styfle/cancel-workflow-action@0.8.0
      with:
        access_token: ${{ github.token }}

    - uses: actions/checkout@v2

    - uses: actions-rs/toolchain@v1
      with:
        profile: minimal
        toolchain: stable
        override: true

    - name: Cache CARGO_HOME
      uses: actions/cache@v2.1.4
      with:
        path: ~/.cargo
        key: cargo-home-${{ hashFiles('Cargo.toml') }}

    - name: Cache cargo build
      uses: actions/cache@v2.1.4
      with:
        path: target
        key: cargo-build-target-${{ hashFiles('Cargo.toml') }}

    - name: Run cargo bench
      uses: actions-rs/cargo@v1
      with:
        command: bench
        args: --workspace

  integration-test:
    name: Integration tests
    runs-on: ubuntu-latest
    container:
      image: rust
    steps:

    - name: Cancel Previous Runs
      uses: styfle/cancel-workflow-action@0.8.0
      with:
        access_token: ${{ github.token }}

    - uses: actions/checkout@v2

    - name: Cache CARGO_HOME
      uses: actions/cache@v2.1.4
      with:
        path: ~/.cargo
        key: cargo-home-${{ hashFiles('Cargo.toml') }}

    - name: Cache cargo build
      uses: actions/cache@v2.1.4
      with:
        path: target
        key: cargo-build-target-${{ hashFiles('Cargo.toml') }}

    - name: Run ipfs-kad example
      run: RUST_LOG=libp2p_swarm=debug,libp2p_kad=trace,libp2p_tcp=debug cargo run --example ipfs-kad
