1name: Rust 2 3on: 4 push: {} 5 pull_request: {} 6 7env: 8 RUST_BACKTRACE: 1 9 10jobs: 11 test: 12 name: Test Rust ${{ matrix.rust }} on ${{ matrix.os }} 13 runs-on: ${{ matrix.os }} 14 strategy: 15 matrix: 16 # it's a little tempting to use `matrix` to do a cartesian product with 17 # our `--feature` config here, but doing so will be very slow, as the 18 # free tier only supports up to 20 job runners at a time. 19 include: 20 # versions (all on linux-x86_64) 21 - { rust: 1.34.0, os: ubuntu-latest } 22 - { rust: stable, os: ubuntu-latest } 23 - { rust: beta, os: ubuntu-latest } 24 - { rust: nightly, os: ubuntu-latest } 25 # non-linux platforms (ones which don't require `cross`) 26 - { rust: stable, os: macos-latest } 27 - { rust: stable, os: windows-latest } 28 - { rust: stable-x86_64-gnu, os: windows-latest } 29 - { rust: stable-i686-msvc, os: windows-latest } 30 - { rust: stable-i686-gnu, os: windows-latest } 31 steps: 32 - uses: hecrj/setup-rust-action@v1 33 with: 34 rust-version: ${{ matrix.rust }} 35 - uses: actions/checkout@v3 36 - run: cargo test --verbose 37 - run: cargo test --verbose --no-default-features 38 - run: cargo test --verbose 39 - run: cargo test --verbose --all-features 40 if: matrix.rust == 'nightly' 41 - run: cargo test --verbose --manifest-path=derive/Cargo.toml --all-features 42 if: matrix.rust == 'nightly' 43 44 cross-test: 45 name: Test on ${{ matrix.target }} with cross 46 runs-on: ubuntu-latest 47 strategy: 48 matrix: 49 # we once had mips runners for Big-endian coverage but those got demoted to tier 3. 50 target: [i686-unknown-linux-gnu] 51 steps: 52 - uses: hecrj/setup-rust-action@v1 53 with: 54 rust-version: nightly 55 - uses: actions/checkout@v3 56 - run: cargo install cross 57 - run: cross test --verbose --target=${{ matrix.target }} --no-default-features 58 - run: cross test --verbose --target=${{ matrix.target }} 59 - run: cross test --verbose --target=${{ matrix.target }} --all-features 60 if: matrix.rust == 'nightly' 61 - run: cross test --verbose --target=${{ matrix.target }} --manifest-path=derive/Cargo.toml --all-features 62 if: matrix.rust == 'nightly' 63 64 miri-test: 65 name: Test with miri 66 runs-on: ubuntu-latest 67 env: 68 MIRIFLAGS: -Zmiri-tag-raw-pointers 69 steps: 70 - uses: hecrj/setup-rust-action@v1 71 with: 72 rust-version: nightly 73 components: miri 74 - uses: actions/checkout@v3 75 # Note(Lokathor): We got some cached json errors, and so we cargo clean for this run. 76 - run: rm -fr target 77 - run: cargo miri test --verbose --no-default-features 78 - run: cargo miri test --verbose --all-features 79 - run: cd derive && rm -fr target && cargo miri test --verbose --all-features 80 81 sanitizer-test: 82 name: Test with -Zsanitizer=${{ matrix.sanitizer }} 83 runs-on: ubuntu-latest 84 strategy: 85 fail-fast: false 86 matrix: 87 sanitizer: [address, memory, leak] 88 steps: 89 - uses: actions/checkout@v3 90 - uses: hecrj/setup-rust-action@v1 91 with: 92 rust-version: nightly 93 components: rust-src 94 - name: Test with sanitizer 95 env: 96 RUSTFLAGS: -Zsanitizer=${{ matrix.sanitizer }} 97 RUSTDOCFLAGS: -Zsanitizer=${{ matrix.sanitizer }} 98 ASAN_OPTIONS: detect_stack_use_after_return=1 99 # Asan's leak detection occasionally complains about some small leaks if 100 # backtraces are captured. 101 RUST_BACKTRACE: 0 102 # We don't run `derive`'s unit tests here the way we do elsewhere (for 103 # example, in `miri-test` above), as at the moment we can't easily build 104 # the `proc_macro` runtime with sanitizers on. IIUC doing this would 105 # require a custom rustc build, and... lol nope. 106 # 107 # This would mean only part of the code running under the sanitizer would 108 # actually include the sanitizer's checks, which is a recipe for false 109 # positives, so we just skip it, the generated code is what we care 110 # about anyway. 111 run: | 112 cargo test -Zbuild-std --verbose --target=x86_64-unknown-linux-gnu --no-default-features 113 cargo test -Zbuild-std --verbose --target=x86_64-unknown-linux-gnu --all-features 114