name: Miri Tests

on:
  push:
    # Run in PRs and for bors, but not on master.
    branches:
      - 'auto'
      - 'try'
  pull_request:
    types: [opened, synchronize, reopened, ready_for_review]
    branches:
      - 'master'
  schedule:
    - cron: '6 6 * * *' # At 6:06 UTC every day.

env:
  CARGO_UNSTABLE_SPARSE_REGISTRY: 'true'
  RUSTFLAGS: -Dwarnings
  RUST_BACKTRACE: 1
  # Change to specific Rust release to pin
  rust_stable: stable
  rust_nightly: nightly-2022-11-03
  rust_clippy: 1.65.0
  # When updating this, also update:
  # - README.md
  # - tokio/README.md
  # - CONTRIBUTING.md
  # - tokio/Cargo.toml
  # - tokio-util/Cargo.toml
  # - tokio-test/Cargo.toml
  # - tokio-stream/Cargo.toml
  # rust_min: 1.49.0



jobs:
  test:
    runs-on: ${{ matrix.os }}
    env:
      RUST_BACKTRACE: 1
      HOST_TARGET: ${{ matrix.host_target }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - os: ubuntu-latest
            host_target: x86_64-unknown-linux-gnu
          # - os: macos-latest
          #   host_target: x86_64-apple-darwin
          # - os: windows-latest
          #   host_target: i686-pc-windows-msvc
          # - os: windows-latest
          #   host_target: i686-pc-windows-msvc
          # - os: windows-latest
          #   host_target: i686-pc-windows-msvc
          # - os: windows-latest
          #   host_target: i686-pc-windows-msvc
    steps:
      - name: Set the tag GC interval to 1 on linux
        if: runner.os == 'Linux'
        run: echo "MIRIFLAGS=-Zmiri-tag-gc=1" >> $GITHUB_ENV

      - uses: actions/checkout@v3
      - name: Install Rust ${{ env.rust_nightly }}
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ env.rust_nightly }}
          components: miri
      - uses: Swatinem/rust-cache@v2
      - name: miri
        # Many of tests in tokio/tests and doctests use #[tokio::test] or
        # #[tokio::main] that calls epoll_create1 that Miri does not support.
        # run: cargo miri test --features full --lib --no-fail-fast
        run: |
          cargo miri test --package dioxus-core --test miri_stress  -- --exact --nocapture
          cargo miri test --package dioxus-native-core --test miri_native  -- --exact --nocapture

        # working-directory: tokio
        env:
          #  todo: disable memory leaks ignore
          MIRIFLAGS: -Zmiri-disable-isolation -Zmiri-strict-provenance -Zmiri-retag-fields -Zmiri-ignore-leaks
          PROPTEST_CASES: 10

      # Cache the global cargo directory, but NOT the local `target` directory which
      # we cannot reuse anyway when the nightly changes (and it grows quite large
      # over time).
      # - name: Add cache for cargo
      #   id: cache
      #   uses: actions/cache@v3
      #   with:
      #     path: |
      #       # Taken from <https://doc.rust-lang.org/nightly/cargo/guide/cargo-home.html#caching-the-cargo-home-in-ci>.
      #       ~/.cargo/bin
      #       ~/.cargo/registry/index
      #       ~/.cargo/registry/cache
      #       ~/.cargo/git/db
      #       # contains package information of crates installed via `cargo install`.
      #       ~/.cargo/.crates.toml
      #       ~/.cargo/.crates2.json
      #     key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      #     restore-keys: ${{ runner.os }}-cargo

      # - name: Install rustup-toolchain-install-master
      #   if: ${{ steps.cache.outputs.cache-hit != 'true' }}
      #   shell: bash
      #   run: |
      #     cargo install -f rustup-toolchain-install-master
      # - name: Install "master" toolchain
      #   shell: bash
      #   run: |
      #     if [[ ${{ github.event_name }} == 'schedule' ]]; then
      #       echo "Building against latest rustc git version"
      #       git ls-remote https://github.com/rust-lang/rust/ HEAD | cut -f 1 > rust-version
      #     fi
      #      toolchain --host ${{ matrix.host_target }}
      # - name: Show Rust version
      #   run: |
      #     rustup show
      #     rustc -Vv
      #     cargo -V
      # - name: Test
      #   run: |
      #     MIRIFLAGS="-Zmiri-disable-isolation -Zmiri-ignore-leaks" cargo +nightly miri test --package dioxus-core --test miri_stress  -- --exact --nocapture
      #     MIRIFLAGS="-Zmiri-disable-isolation -Zmiri-ignore-leaks" cargo +nightly miri test --package dioxus-native-core --test miri_native  -- --exact --nocapture
