diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml new file mode 100644 index 0000000..fa46ed8 --- /dev/null +++ b/.github/workflows/rust.yml @@ -0,0 +1,100 @@ +on: [push, pull_request] + +name: Continuous integration + +jobs: + Stable: + name: Test - stable toolchain + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - name: Checkout Crate + uses: actions/checkout@v3 + - name: Checkout Toolchain + # https://github.com/dtolnay/rust-toolchain + uses: dtolnay/rust-toolchain@stable + - name: Running test script + env: + DO_NO_STD: true + DO_FEATURE_MATRIX: true + run: ./contrib/test.sh + + Beta: + name: Test - beta toolchain + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - name: Checkout Crate + uses: actions/checkout@v3 + - name: Checkout Toolchain + uses: dtolnay/rust-toolchain@beta + - name: Running test script + env: + DO_NO_STD: true + run: ./contrib/test.sh + + Nightly: + name: Test - nightly toolchain + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - name: Checkout Crate + uses: actions/checkout@v3 + - name: Checkout Toolchain + uses: dtolnay/rust-toolchain@nightly + - name: Running test script + env: + DO_NO_STD: true + run: ./contrib/test.sh + + MSRV: + name: Test - 1.41.1 toolchain + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - name: Checkout Crate + uses: actions/checkout@v3 + - name: Checkout Toolchain + uses: dtolnay/rust-toolchain@1.41.1 + - name: Running test script + env: + DO_NO_STD: true + DO_FEATURE_MATRIX: true + run: ./contrib/test.sh + + Arch32bit: + name: Test 32-bit version + runs-on: ubuntu-latest + steps: + - name: Checkout Crate + uses: actions/checkout@v3 + - name: Checkout Toolchain + uses: dtolnay/rust-toolchain@stable + - name: Add architecture i386 + run: sudo dpkg --add-architecture i386 + - name: Install i686 gcc + run: sudo apt-get update -y && sudo apt-get install -y gcc-multilib + - name: Install target + run: rustup target add i686-unknown-linux-gnu + - name: Run test on i686 + run: cargo test --target i686-unknown-linux-gnu + + Cross: + name: Cross test + if: ${{ !github.event.act }} + runs-on: ubuntu-latest + steps: + - name: Checkout Crate + uses: actions/checkout@v3 + - name: Checkout Toolchain + uses: dtolnay/rust-toolchain@stable + - name: Install target + run: rustup target add s390x-unknown-linux-gnu + - name: install cross + run: cargo install cross --locked + - name: run cross test + run: cross test --target s390x-unknown-linux-gnu diff --git a/contrib/test.sh b/contrib/test.sh new file mode 100755 index 0000000..f44735c --- /dev/null +++ b/contrib/test.sh @@ -0,0 +1,54 @@ +#!/bin/sh + +set -ex + +FEATURES="serde rand all-languages" + +cargo --version +rustc --version + +# Work out if we are using a nightly toolchain. +NIGHTLY=false +if cargo --version | grep nightly; then + NIGHTLY=true +fi + +# Pin dependencies as required if we are using MSRV toolchain. +# if cargo --version | grep "1\.41"; then +# fi + +echo "********* Testing std *************" +# Test without any features other than std first +cargo test --verbose --no-default-features --features="std" + +echo "********* Testing default *************" +# Then test with the default features +cargo test --verbose + +if [ "$DO_NO_STD" = true ] +then + echo "********* Testing no-std build *************" + # Build no_std, to make sure that cfg(test) doesn't hide any issues + cargo build --verbose --no-default-features + + # Build std + no_std, to make sure they are not incompatible + cargo build --verbose + # Test no_std + cargo test --verbose --no-default-features + + # Build all features + cargo build --verbose --features="$FEATURES" --no-default-features + + # Build specific features + for feature in ${FEATURES} + do + cargo build --verbose --features="$feature" --no-default-features + done +fi + +# Test each feature +for feature in ${FEATURES} +do + echo "********* Testing $feature *************" + cargo test --verbose --features="$feature" +done