You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

238 lines
7.1 KiB

#!/usr/bin/env bats
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This file is part of dobuild.
# Copyright (c) 2019 Contributors as noted in the AUTHORS file.
#
# SPDX-License-Identifier: MPL-2.0
load test_helper
setup() {
PROJECTPATH="$(readlink -f "$BATS_TEST_DIRNAME/..")"
BINPATH="$PROJECTPATH/bin"
PATH="$BINPATH:$PATH"
OUTDIR="$(mktemp --directory --tmpdir="$BATS_TMPDIR" standardrules_XXXXXXXXXX)"
MAKE=("make" --no-print-directory -C "$PROJECTPATH" -f standardrules.mk -f "$BATS_TEST_DIRNAME/test_helper.mk")
export DOBUILD_OUTDIR="$OUTDIR"
}
teardown() {
rm -rf "$OUTDIR"
}
has_required_version() {
local major=${1:-0}
local minor=${2:-0}
local bugfix=${3:-0}
set -- $(sed -n -e 's/.* Make \([0-9]\+\)[.]\([0-9]\+\)\([.]\([0-9]\+\)\)\?/\1 \2 \4/p')
if [ "$1" -gt "$major" ]; then
return 0
fi
if [ "$1" -lt "$major" ]; then
return -1
fi
if [ "$2" -gt "$minor" ]; then
return 0
fi
if [ "$2" -lt "$minor" ]; then
return -2
fi
if [ "${3:-0}" -ge "$bugfix" ]; then
return 0
fi
return -3
}
make_has_required_version() {
"${MAKE[@]}" --version | has_required_version "$@"
}
@test "standardrules_mk has required deps" {
"${MAKE[@]}" --version
}
@test "standardrules_mk has required makefile deps" {
"${MAKE[@]}" testhelper-print-MAKEFILE_DEPS | sort -u | parallel --keep-order command -V
}
@test "standardrules_mk PROJECTDIR should not contain whitespace" {
run "${MAKE[@]}" PROJECTDIR='my project'
printf -- '%s\n' "${lines[@]}"
[ "$status" -ne 0 ]
[[ "${lines[@]}" =~ "Project directory PROJECTDIR='my project' should not contain whitespaces" ]]
}
@test "standardrules_mk DOBUILDDIR should not contain whitespace" {
run "${MAKE[@]}" DOBUILDDIR='my scriptdir'
printf -- '%s\n' "${lines[@]}"
[ "$status" -ne 0 ]
[[ "${lines[@]}" =~ "Script directory DOBUILDDIR='my scriptdir' should not contain whitespaces" ]]
}
@test "standardrules_mk OUTDIRS should not contain PROJECTDIR" {
run "${MAKE[@]}" PROJECTDIR="$PROJECTPATH" OUTDIR='.'
printf -- '%s\n' "${lines[@]}"
[ "$status" -ne 0 ]
[[ "${lines[@]}" =~ "assertion failed: Project location PROJECTDIR" ]]
[[ "${lines[@]}" =~ "should not point to one of the output locations" ]]
}
@test "standardrules_mk all targets are tested" {
run "${MAKE[@]}" print-targets 2>&1
printf -- '%s\n' "${lines[@]}"
[ "$status" -eq 0 ]
[ "${lines[0]}" = 'all' ]
[ "${lines[1]}" = 'check' ]
[ "${lines[2]}" = 'clean' ]
[ "${lines[3]}" = 'dist' ]
[ "${lines[4]}" = 'distclean' ]
[ "${lines[5]}" = 'install' ]
[ "${lines[6]}" = 'lint' ]
[ "${lines[7]}" = 'memcheck' ]
[ "${lines[8]}" = 'prepare' ]
[ "${lines[9]}" = 'print-targets' ]
[ "${lines[10]}" = 'run' ]
# do not forget to add a test :)
[ "${#lines[@]}" -ge 11 ]
}
@test "standardrules_mk should run default target 'all' by default" {
run "${MAKE[@]}" 2>&1
printf -- '%s\n' "${lines[@]}"
[ "$status" -eq 0 ]
[[ "${lines[@]}" =~ 'make: Nothing to be done for '[\`|\']"all'." ]]
}
@test "standardrules_mk returns success when empty check target is triggered" {
run "${MAKE[@]}" check 2>&1
printf -- '%s\n' "${lines[@]}"
[ "$status" -eq 0 ]
[[ "${lines[@]}" =~ 'make: Nothing to be done for '[\`|\']"check'." ]]
}
@test "standardrules_mk returns success when empty clean target is triggered" {
run "${MAKE[@]}" clean 2>&1
printf -- '%s\n' "${lines[@]}"
[ "$status" -eq 0 ]
[[ "${lines[@]}" =~ 'make: Nothing to be done for '[\`|\']"clean'." ]]
}
@test "standardrules_mk returns success when empty distclean target is triggered" {
run "${MAKE[@]}" distclean 2>&1
printf -- '%s\n' "${lines[@]}"
[ "$status" -eq 0 ]
[[ "${lines[@]}" =~ 'make: Nothing to be done for '[\`|\']"distclean'." ]]
}
@test "standardrules_mk returns success when empty prepare target is triggered " {
run "${MAKE[@]}" prepare 2>&1
printf -- '%s\n' "${lines[@]}"
[ "$status" -eq 0 ]
[[ "${lines[@]}" =~ 'make: Nothing to be done for '[\`|\']"prepare'." ]]
}
@test "standardrules_mk returns success when empty lint target is triggered" {
run "${MAKE[@]}" lint 2>&1
printf -- '%s\n' "${lines[@]}"
[ "$status" -eq 0 ]
[[ "${lines[@]}" =~ 'make: Nothing to be done for '[\`|\']"lint'." ]]
}
@test "standardrules_mk returns success when empty memcheck target is triggered" {
run "${MAKE[@]}" memcheck 2>&1
printf -- '%s\n' "${lines[@]}"
[ "$status" -eq 0 ]
[[ "${lines[@]}" =~ 'make: Nothing to be done for '[\`|\']"memcheck'." ]]
}
@test "standardrules_mk returns success when empty run target is triggered" {
run "${MAKE[@]}" run 2>&1
printf -- '%s\n' "${lines[@]}"
[ "$status" -eq 0 ]
[[ "${lines[@]}" =~ 'make: Nothing to be done for '[\`|\']"run'." ]]
}
@test "standardrules_mk returns error when makefile dependency are unsatisfied" {
run "${MAKE[@]}" MAKEFILE_DEPS='not-found1 not-found2 cat' not-found1 2>&1
printf -- '%s\n' "${lines[@]}"
[ "$status" -ne 0 ]
[[ "${lines[@]}" =~ "Required commands not-found1 not-found2 not found; install appropriate packages" ]]
}
@test "standardrules_mk should print PROJECTNAME when target triggered" {
EXPECTED="$(basename "$PROJECTPATH")"
VALUE="$("${MAKE[@]}" debug-print-PROJECTNAME)"
echo "$VALUE != $EXPECTED"
[ "$VALUE" = "$EXPECTED" ]
}
@test "standardrules_mk EXTERNPARALLEL should default to 1 when make called recursive with limited job slots" {
EXPECTED="1"
VALUE="$("${MAKE[@]}" -j10 testhelper-recursive-print-EXTERNPARALLEL)"
echo "$VALUE != $EXPECTED"
[ "$VALUE" -eq "$EXPECTED" ]
}
@test "standardrules_mk INTERNPARALLEL should default to 2 when make called recursive with limited job slots" {
EXPECTED="2"
VALUE="$("${MAKE[@]}" -j10 testhelper-recursive-print-INTERNPARALLEL)"
echo "$VALUE != $EXPECTED"
[ "$VALUE" -eq "$EXPECTED" ]
}
@test "standardrules_mk EXTERNPARALLEL * INTERNPARALLEL should not exceed provided job slots" {
PARALLELMFLAGS='-j10'
EXPECTED='10'
EXTERNPARALLEL="$("${MAKE[@]}" "$PARALLELMFLAGS" testhelper-print-EXTERNPARALLEL)"
INTERNPARALLEL="$("${MAKE[@]}" "$PARALLELMFLAGS" testhelper-print-INTERNPARALLEL)"
VALUE="$(($EXTERNPARALLEL * $INTERNPARALLEL))"
echo "$VALUE != $EXPECTED"
[ "$VALUE" -eq "$EXPECTED" ]
}
@test "standardrules_mk EXTERNPARALLEL should not exceed active targets" {
EXPECTED="$("${MAKE[@]}" testhelper-print-JOBS)"
VALUE="$("${MAKE[@]}" testhelper-print-EXTERNPARALLEL)"
echo "$VALUE <= $EXPECTED"
[ "$VALUE" -le "$EXPECTED" ]
}
@test "standardrules_mk MAKEFLAGS should contain output-sync option when job slots greater than 1" {
if ! make_has_required_version '4'; then
skip "make version too old '$("${MAKE[@]}" --version)'"
fi
run "${MAKE[@]}" testhelper-print-MAKEFLAGS EXTERNPARALLEL="32"
printf -- '%s\n' "${lines[@]}"
[ "$status" -eq 0 ]
[[ "${lines[@]}" =~ "-Otarget" ]]
}
@test "standardrules_mk MAKEFLAGS should not contain output-sync option when job slots equal to 1" {
run "${MAKE[@]}" testhelper-print-MAKEFLAGS EXTERNPARALLEL="1"
printf -- '%s\n' "${lines[@]}"
[ "$status" -eq 0 ]
[[ ! "${lines[@]}" =~ "-Otarget" ]]
}