name: Tests # Controls when the action will run. on: [push, pull_request, workflow_dispatch] permissions: contents: read jobs: changelog: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Check that PR is mentioned in Changelog run: | if ! ./.github/workflows/check_pr_label.sh "${{github.event.pull_request.number}}" "no changelog"; then grep "#${{github.event.pull_request.number}}" docs/CHANGELOG.md fi if: ${{github.event.pull_request}} shfmt: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - run: | curl https://github.com/mvdan/sh/releases/download/v3.5.1/shfmt_v3.5.1_linux_amd64 -o shfmt chmod a+x shfmt - run: ./shfmt --diff . # Ensure we detect when a change disables Bats from reporting failure. # This would not be detectable by Bats' selftests. failsafe: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - name: Check failing tests fail suite, run: "! bin/bats test/fixtures/bats/failing.bats" shellcheck: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Run shellcheck run: | sudo apt-get update -y sudo apt-get install shellcheck ./shellcheck.sh linux: strategy: matrix: os: ['ubuntu-20.04', 'ubuntu-22.04'] env_vars: - '' # allow for some parallelity without GNU parallel, since it is not installed by default - 'BATS_NO_PARALLELIZE_ACROSS_FILES=1 BATS_NUMBER_OF_PARALLEL_JOBS=2' - 'BATS_PARALLEL_BINARY_NAME=rush' runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Install rush run: | curl -sSfL https://github.com/shenwei356/rush/releases/download/v0.5.0/rush_linux_amd64.tar.gz | sudo tar xzf - -C /usr/local/bin if: contains(matrix.env_vars, 'rush') - name: Run test on OS ${{ matrix.os }} shell: 'script -q -e -c "bash {0}"' # work around tty issues env: TERM: linux # fix tput for tty issue work around run: | bash --version bash -c "time ${{ matrix.env_vars }} bin/bats --print-output-on-failure --formatter tap test" unset_variables: runs-on: ubuntu-latest steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Check unset variables shell: 'script -q -e -c "bash {0}"' # work around tty issues env: TERM: linux # fix tput for tty issue work around BASH_ENV: ${GITHUB_WORKSPACE}/.github/workflows/set_nounset.bash run: bin/bats test --print-output-on-failure npm_on_linux: strategy: matrix: os: ['ubuntu-20.04', 'ubuntu-22.04'] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 - name: Run test on OS ${{ matrix.os }} shell: 'script -q -e -c "bash {0}"' # work around tty issues env: TERM: linux # fix tput for tty issue work around run: | npm pack ./ sudo npm install -g ./bats-*.tgz bats test --print-output-on-failure windows: runs-on: windows-2019 steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Check failing tests fail suite, run: bash -c "! bin/bats test/fixtures/bats/failing.bats" - run: | bash --version bash -c "time bin/bats --print-output-on-failure --formatter tap test" npm_on_windows: strategy: matrix: os: ['windows-2019'] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 - run: npm pack ./ - run: npm install -g (get-item .\bats-*.tgz).FullName - run: bats -T --print-output-on-failure test macos: strategy: matrix: os: ['macos-11', 'macos-12'] env_vars: - '' # allow for some parallelity without GNU parallel, since it is not installed by default - 'BATS_NO_PARALLELIZE_ACROSS_FILES=1 BATS_NUMBER_OF_PARALLEL_JOBS=2' - 'BATS_PARALLEL_BINARY_NAME=rush' runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Install unbuffer via expect run: brew install expect - name: Install rush run: | curl -sSfL https://github.com/shenwei356/rush/releases/download/v0.5.0/rush_darwin_amd64.tar.gz | sudo tar xzf - -C /usr/local/bin if: contains(matrix.env_vars, 'rush') - name: Check failing tests fail suite, shell: 'unbuffer bash {0}' # work around tty issues env: TERM: linux # fix tput for tty issue work around run: bash -c '! bin/bats test/fixtures/bats/failing.bats' - name: Run test on OS ${{ matrix.os }} shell: 'unbuffer bash {0}' # work around tty issues env: TERM: linux # fix tput for tty issue work around run: | bash --version bash -c "time ${{ matrix.env_vars }} bin/bats --print-output-on-failure --formatter tap test" npm_on_macos: strategy: matrix: os: ['macos-11', 'macos-12'] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 - name: Install unbuffer via expect run: brew install expect - name: Run test on OS ${{ matrix.os }} shell: 'unbuffer bash {0}' # work around tty issues env: TERM: linux # fix tput for tty issue work around run: | npm pack ./ # somehow there is already an installed bats version around npm install --force -g ./bats-*.tgz bats --print-output-on-failure test bash-version: strategy: matrix: version: ['3.2', '4.0', '4.1', '4.2', '4.3', '4.4', '4', '5.0', '5.1', '5', 'rc'] env_vars: - '' # also test running (recursively!) in parallel - '-e BATS_NUMBER_OF_PARALLEL_JOBS=2' runs-on: ubuntu-latest steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Run test on bash version ${{ matrix.version }} shell: 'script -q -e -c "bash {0}"' # work around tty issues run: | set -e docker build --build-arg bashver="${{ matrix.version }}" --tag "bats/bats:bash-${{ matrix.version }}" . docker run -it "bash:${{ matrix.version }}" --version time docker run -it ${{ matrix.env_vars }} "bats/bats:bash-${{ matrix.version }}" --print-output-on-failure --tap /opt/bats/test alpine: runs-on: ubuntu-latest container: alpine:latest steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Install dependencies run: apk add bash ncurses util-linux - name: Run test on bash version ${{ matrix.version }} shell: 'script -q -e -c "bash {0}"' # work around tty issues env: TERM: linux # fix tput for tty issue work around run: time ./bin/bats --print-output-on-failure test/ freebsd: runs-on: ubuntu-latest strategy: matrix: packages: - flock - "" steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - uses: vmactions/freebsd-vm@35a5b20a98476a681c7576a344775be7e7f77f06 # v1.0.6 with: prepare: pkg install -y bash parallel ${{ matrix.packages }} run: | time ./bin/bats --print-output-on-failure test/ find_broken_symlinks: runs-on: ubuntu-latest steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 # list symlinks that are broken and force non-zero exit if there are any - run: "! find . -xtype l | grep ." rpm: runs-on: ubuntu-latest container: almalinux:8 steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - run: dnf install -y rpm-build rpmdevtools - name: Build and install RPM and dependencies run: | rpmdev-setuptree version=$(rpmspec -q --qf '%{version}' contrib/rpm/bats.spec) tar --transform "s,^,bats-core-${version}/," -cf /github/home/rpmbuild/SOURCES/v${version}.tar.gz ./ rpmbuild -v -bb ./contrib/rpm/bats.spec ls -al /github/home/rpmbuild/RPMS/noarch/ dnf install -y /github/home/rpmbuild/RPMS/noarch/bats-*.rpm dnf -y install procps-ng # avoid timeout failure - name: Run tests shell: 'script -q -e -c "bash {0}"' # work around tty issues env: TERM: linux # fix tput for tty issue work around run: bats --print-output-on-failure --filter-tags !dep:install_sh test/ dockerfile: runs-on: ubuntu-latest steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Set up Docker Buildx id: buildx uses: docker/setup-buildx-action@2b51285047da1547ffb1b2203d8be4c0af6b1f20 # v3.2.0 - uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 # v5.1.0 with: platforms: linux/amd64 tags: bats:test load: true - run: docker run -itv "$PWD":/code bats:test --tap --print-output-on-failure test/ shell: 'script -q -e -c "bash {0}"' # work around tty issues env: TERM: linux # fix tput for tty issue work around - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: repository: bats-core/bats-assert path: bats-assert - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: repository: bats-core/bats-support path: bats-support - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: repository: bats-core/bats-file path: bats-file - run: | <test.sh apk add sudo python3 # install bats-file's dependencies ln -sf python3 /usr/bin/python # bats-file uses python without version bats --tap --print-output-on-failure bats-*/test/ EOF docker run -itv "$PWD":/code --entrypoint bash bats:test test.sh shell: 'script -q -e -c "bash {0}"' # work around tty issues env: TERM: linux # fix tput for tty issue work around coverage: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - run: | wget https://github.com/SimonKagstrom/kcov/releases/download/v40/kcov-amd64.tar.gz tar -xf kcov-amd64.tar.gz - run: | ./usr/local/bin/kcov --exclude-path=/tmp $PWD/coverage ./bin/bats --filter-tags '!no-kcov' test/ shell: 'script -q -e -c "bash {0}"' # work around tty issues env: TERM: linux # fix tput for tty issue work around - name: Archive code coverage results uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4.3.0 with: name: code-coverage-report path: coverage/* - name: Print the Total Coverage id: coverage-percent shell: bash env: minimum_coverage: 86.40 run: | value=$(jq '.percent_covered' int=${1%.*} decimals=${1#*.} echo $int${decimals::2} } echo "Coverage: $value%" | tee "$GITHUB_STEP_SUMMARY" if (( $(fixed_point $value) < $(fixed_point $expected) )); then echo " is below required minimum coverage ($minimum_coverage%)." | tee -a "$GITHUB_STEP_SUMMARY" exit 1 fi