pkgsrc/regress/infra-unittests/show-all.sh
rillig 488f9fbd90 show-all: fix typo in variable name
The width only applies to a single group, not to several or even all
groups.
2020-07-01 09:13:12 +00:00

207 lines
6.4 KiB
Bash

#! /bin/sh
# $NetBSD: show-all.sh,v 1.3 2020/07/01 09:13:12 rillig Exp $
#
# Tests for the show-all target from mk/misc/show.mk.
#
# Ensures that the show-all target prints all variants of variable
# values as intended. This involves sorted multi-valued variables (like
# CONFIGURE_ENV), other multi-valued variables (like CONFIGURE_ARGS),
# variables containing special characters that need to be escaped, and
# various other edge cases.
#
. './test.subr'
if test_case_begin 'show all'; then
# Ensures that the output of the show-all target is easily
# recognizable by pkgsrc developers.
#
# The variable values are aligned in column 24 by default. The
# variable assignments have the same form as those that are
# written in Makefiles.
#
# For lists of values, each value is written on a line of its
# own, to aid readability. The final line only contains the
# comment marker, for ease of implementation. This comment
# marker also provides a convenient place for remarks like
# "sorted" or "ends with space".
create_file 'test.mk' <<'EOF'
REGRESS.empty= # empty
REGRESS.space= ${:U } # a single space
REGRESS.value= All * kinds of `strange' \escape $$characters
REGRESS_ENV.empty= # empty
REGRESS_ENV.space= ${:U } # a single space
REGRESS_ENV.value= VAR1=value1 VAR2=`command execution via backticks` *=all
REGRESS_ARGS.empty= # empty
REGRESS_ARGS.space= ${:U } # a single space
REGRESS_ARGS.value= VAR1=value1 VAR2=`command execution via backticks` *=all
# Variable names may also contain special characters that must be escaped.
#
# The "*" variable is built-in into bmake and expands to the current
# make target, which in this case is "show-all-regress".
#
# The "**" variable ensures that show-all doesn't accidentally expand
# filenames.
*= bmake built-in
**= asterisk
_VARGROUPS+= regress
_PKG_VARS.regress+= REGRESS_ENV.undefined REGRESS_ENV.empty REGRESS_ENV.space REGRESS_ENV.value
_PKG_VARS.regress+= REGRESS_ARGS.undefined REGRESS_ARGS.empty REGRESS_ARGS.space REGRESS_ARGS.value
_PKG_VARS.regress+= REGRESS.undefined REGRESS.empty REGRESS.space REGRESS.value
_PKG_VARS.regress+= * **
_SORTED_VARS.regress= *_ENV.*
_LISTED_VARS.regress= *_ARGS.*
RUN= @set -eu;
.include "${PKGSRCDIR}/mk/misc/show.mk"
EOF
PKGSRCDIR="$pkgsrcdir" \
"$make" -f 'test.mk' 'show-all-regress' 1> 'output' 2>&1 \
&& exitcode=0 || exitcode=$?
create_file 'expected' <<'EOF'
regress:
pkg REGRESS_ENV.undefined # undefined
pkg REGRESS_ENV.empty= # empty
pkg REGRESS_ENV.space= # empty
pkg REGRESS_ENV.value= \
*=all \
VAR1=value1 \
VAR2=`command \
backticks` \
execution \
via \
# end of REGRESS_ENV.value (sorted)
pkg REGRESS_ARGS.undefined # undefined
pkg REGRESS_ARGS.empty= # empty
pkg REGRESS_ARGS.space= # empty
pkg REGRESS_ARGS.value= \
VAR1=value1 \
VAR2=`command \
execution \
via \
backticks` \
*=all \
# end of REGRESS_ARGS.value
pkg REGRESS.undefined # undefined
pkg REGRESS.empty= # empty
pkg REGRESS.space= # ends with space
pkg REGRESS.value= All * kinds of `strange' \escape $$characters
pkg *= show-all-regress
pkg **= asterisk
EOF
# On first sight it may seem strange that bmake doesn't handle
# the backticks command as a single word. Luckily, this is a
# rare case.
#
# On the other hand, if it did, bmake would also have to handle
# variable expansion and all the other syntactic difficulties
# from parsing shell commands, and that would be just too much.
assert_that "$exitcode" --equals '0'
assert_that 'output' --file-equals 'expected'
test_case_end
fi
if test_case_begin 'show dollars in variable values'; then
# Up to 2020-03-20, the output of the ENV and ARGS variables differed
# a lot from the PLAIN variable.
create_file 'test.mk' <<'EOF'
SHELLVAR_PLAIN= "$$var $${var} $$other $$$$"
SHELLVAR_ENV= "$$var $${var} $$other $$$$"
SHELLVAR_ARGS= "$$var $${var} $$other $$$$"
_VARGROUPS+= shellvar
_PKG_VARS.shellvar= SHELLVAR_PLAIN SHELLVAR_ENV SHELLVAR_ARGS
_SORTED_VARS.shellvar= *_ENV
_LISTED_VARS.shellvar= *_ARGS
RUN= @set -eu;
.include "${PKGSRCDIR}/mk/misc/show.mk"
EOF
PKGSRCDIR="$pkgsrcdir" \
"$make" -f 'test.mk' 'show-all-shellvar' 1> 'output' 2>&1 \
&& exitcode=0 || exitcode=$?
create_file 'expected' <<'EOF'
shellvar:
pkg SHELLVAR_PLAIN= "$$var $${var} $$other $$$$"
pkg SHELLVAR_ENV= \
"$$var $${var} $$other $$$$" \
# end of SHELLVAR_ENV (sorted)
pkg SHELLVAR_ARGS= \
"$$var $${var} $$other $$$$" \
# end of SHELLVAR_ARGS
EOF
assert_that "$exitcode" --equals '0'
assert_that 'output' --file-equals 'expected'
test_case_end
fi
if test_case_begin 'individual width'; then
# If the variable names of a group are typically longer than 16
# characters, it is possible to increase the width.
create_file 'test.mk' <<'EOF'
VAR_PLAIN= value
VAR_ENV= value1 value2
VAR_ARGS= value1 value2
_VARGROUPS+= var
_VARGROUP_WIDTH.var= 15
_PKG_VARS.var= VAR_PLAIN VAR_PLAIN_LONG_NAME
_PKG_VARS.var+= VAR_ENV VAR_ENV_LONG_NAME
_PKG_VARS.var+= VAR_ARGS VAR_ARGS_LONG_NAME
_SORTED_VARS.var= *_ENV
_LISTED_VARS.var= *_ARGS
RUN= @set -eu;
.include "${PKGSRCDIR}/mk/misc/show.mk"
EOF
PKGSRCDIR="$pkgsrcdir" \
"$make" -f 'test.mk' 'show-all-var' 1> 'output' 2>&1 \
&& exitcode=0 || exitcode=$?
create_file 'expected' <<'EOF'
var:
pkg VAR_PLAIN= value
pkg VAR_PLAIN_LONG_NAME # undefined
pkg VAR_ENV= \
value1 \
value2 \
# end of VAR_ENV (sorted)
pkg VAR_ENV_LONG_NAME # undefined
pkg VAR_ARGS= \
value1 \
value2 \
# end of VAR_ARGS
pkg VAR_ARGS_LONG_NAME # undefined
EOF
assert_that "$exitcode" --equals '0'
assert_that 'output' --file-equals 'expected'
test_case_end
fi