diff options
| author | Simon J. Gerraty <sjg@FreeBSD.org> | 2020-07-11 22:45:05 +0000 |
|---|---|---|
| committer | Simon J. Gerraty <sjg@FreeBSD.org> | 2020-07-11 22:45:05 +0000 |
| commit | 367d32e2b15fe0397ddecccaa04cf9ed0164c969 (patch) | |
| tree | 0a2abe7ed935e714ada921e5d94a9859c1298a31 /unit-tests | |
| parent | 1a2b743f6b4022dada4eeaa96ac47a5c1a2429f5 (diff) | |
Notes
Diffstat (limited to 'unit-tests')
| -rw-r--r-- | unit-tests/Makefile | 203 | ||||
| -rw-r--r-- | unit-tests/cond-short.exp | 6 | ||||
| -rw-r--r-- | unit-tests/cond-short.mk | 54 | ||||
| -rw-r--r-- | unit-tests/modmisc.exp | 18 | ||||
| -rw-r--r-- | unit-tests/modmisc.mk | 34 |
5 files changed, 218 insertions, 97 deletions
diff --git a/unit-tests/Makefile b/unit-tests/Makefile index 0f85d9ef8dfb..c9cc13d769db 100644 --- a/unit-tests/Makefile +++ b/unit-tests/Makefile @@ -1,87 +1,105 @@ -# $Id: Makefile,v 1.58 2020/07/04 22:33:00 sjg Exp $ +# $Id: Makefile,v 1.60 2020/07/10 00:48:32 sjg Exp $ # -# $NetBSD: Makefile,v 1.59 2020/06/28 09:42:40 rillig Exp $ +# $NetBSD: Makefile,v 1.63 2020/07/09 22:40:14 sjg Exp $ # # Unit tests for make(1) +# # The main targets are: -# -# all: run all the tests -# test: run 'all', and compare to expected results -# accept: move generated output to expected results # -# Adding a test case. +# all: +# run all the tests +# test: +# run 'all', and compare to expected results +# accept: +# move generated output to expected results +# +# Settable variables +# +# TEST_MAKE +# The make program to be tested. +# +# +# Adding a test case +# # Each feature should get its own set of tests in its own suitably # named makefile (*.mk), with its own set of expected results (*.exp), -# and it should be added to the TESTNAMES list. -# +# and it should be added to the TESTS list. +# +# Any added files must also be added to src/distrib/sets/lists/tests/mi. +# Makefiles that are not added to TESTS must be ignored in +# src/tests/usr.bin/make/t_make.sh (example: include-sub). +# -.MAIN: all +# Each test is in a sub-makefile. +# Keep the list sorted. +TESTS+= comment +TESTS+= cond-late +TESTS+= cond-short +TESTS+= cond1 +TESTS+= cond2 +TESTS+= dollar +TESTS+= doterror +TESTS+= dotwait +TESTS+= error +TESTS+= # escape # broken by reverting POSIX changes +TESTS+= export +TESTS+= export-all +TESTS+= export-env +TESTS+= forloop +TESTS+= forsubst +TESTS+= hash +TESTS+= # impsrc # broken by reverting POSIX changes +TESTS+= include-main +TESTS+= misc +TESTS+= moderrs +TESTS+= modmatch +TESTS+= modmisc +TESTS+= modorder +TESTS+= modts +TESTS+= modword +TESTS+= order +TESTS+= # phony-end # broken by reverting POSIX changes +TESTS+= posix +TESTS+= # posix1 # broken by reverting POSIX changes +TESTS+= qequals +TESTS+= # suffixes # broken by reverting POSIX changes +TESTS+= sunshcmd +TESTS+= sysv +TESTS+= ternary +TESTS+= unexport +TESTS+= unexport-env +TESTS+= varcmd +TESTS+= varmisc +TESTS+= varmod-edge +TESTS+= varquote +TESTS+= varshell -.-include "Makefile.config" +# Override make flags for certain tests; default is -k. +FLAGS.doterror= # none +FLAGS.order= -j1 -UNIT_TESTS:= ${.PARSEDIR} -.PATH: ${UNIT_TESTS} +# Some tests need extra post-processing. +SED_CMDS.modmisc+= -e 's,\(substitution error:\).*,\1 (details omitted),' +SED_CMDS.varshell+= -e 's,^[a-z]*sh: ,,' +SED_CMDS.varshell+= -e '/command/s,No such.*,not found,' -# Each test is in a sub-makefile. -# Keep the list sorted. -TESTNAMES= \ - comment \ - cond-late \ - cond-short \ - cond1 \ - cond2 \ - dollar \ - doterror \ - dotwait \ - error \ - export \ - export-all \ - export-env \ - forloop \ - forsubst \ - hash \ - include-main \ - misc \ - moderrs \ - modmatch \ - modmisc \ - modorder \ - modts \ - modword \ - order \ - posix \ - qequals \ - sunshcmd \ - sysv \ - ternary \ - unexport \ - unexport-env \ - varcmd \ - varmisc \ - varmod-edge \ - varquote \ - varshell +# End of the configuration section. -# these tests were broken by referting POSIX chanegs -STRICT_POSIX_TESTS = \ - escape \ - impsrc \ - phony-end \ - posix1 \ - suffixes +.MAIN: all -# Override make flags for certain tests -flags.doterror= -flags.order=-j1 +.-include "Makefile.config" -OUTFILES= ${TESTNAMES:S/$/.out/} +UNIT_TESTS:= ${.PARSEDIR} +.PATH: ${UNIT_TESTS} + +OUTFILES= ${TESTS:=.out} all: ${OUTFILES} -CLEANFILES += *.rawout *.out *.status *.tmp *.core *.tmp -CLEANFILES += obj*.[och] lib*.a # posix1.mk -CLEANFILES += issue* .[ab]* # suffixes.mk -CLEANRECURSIVE += dir dummy # posix1.mk +CLEANFILES+= *.rawout *.out *.status *.tmp *.core *.tmp +CLEANFILES+= obj*.[och] lib*.a # posix1.mk +CLEANFILES+= issue* .[ab]* # suffixes.mk +CLEANRECURSIVE+= dir dummy # posix1.mk clean: rm -f ${CLEANFILES} @@ -89,45 +107,42 @@ clean: rm -rf ${CLEANRECURSIVE} .endif -TEST_MAKE?= ${.MAKE} -TOOL_SED?= sed -TOOL_TR?= tr -TOOL_DIFF?= diff +TEST_MAKE?= ${.MAKE} +TOOL_SED?= sed +TOOL_TR?= tr +TOOL_DIFF?= diff +DIFF_FLAGS?= -u .if defined(.PARSEDIR) # ensure consistent results from sort(1) -LC_ALL= C -LANG= C +LC_ALL= C +LANG= C .export LANG LC_ALL .endif -# some tests need extra post-processing -SED_CMDS.varshell = -e 's,^[a-z]*sh: ,,' \ - -e '/command/s,No such.*,not found,' - -# the detailed error message can vary across systems -SED_CMDS.modmisc = -e 's,\(substitution error:\).*,\1 details omitted,' - # the tests are actually done with sub-makes. .SUFFIXES: .mk .rawout .out .mk.rawout: - @echo ${TEST_MAKE} ${flags.${.TARGET:R}:U-k} -f ${.IMPSRC} + @echo ${TEST_MAKE} ${FLAGS.${.TARGET:R}:U-k} -f ${.IMPSRC} -@cd ${.OBJDIR} && \ - { ${TEST_MAKE} ${flags.${.TARGET:R}:U-k} -f ${.IMPSRC} \ + { ${TEST_MAKE} ${FLAGS.${.TARGET:R}:U-k} -f ${.IMPSRC} \ 2>&1 ; echo $$? >${.TARGET:R}.status ; } > ${.TARGET}.tmp @mv ${.TARGET}.tmp ${.TARGET} -# We always pretend .MAKE was called 'make' -# and strip ${.CURDIR}/ from the output -# and replace anything after 'stopped in' with unit-tests -# so the results can be compared. +# Post-process the test output so that the results can be compared. +# +# always pretend .MAKE was called 'make' +_SED_CMDS+= -e 's,^${TEST_MAKE:T:S,.,\\.,g}[][0-9]*:,make:,' +_SED_CMDS+= -e 's,${TEST_MAKE:S,.,\\.,g},make,' +# replace anything after 'stopped in' with unit-tests +_SED_CMDS+= -e '/stopped/s, /.*, unit-tests,' +# strip ${.CURDIR}/ from the output +_SED_CMDS+= -e 's,${.CURDIR:S,.,\\.,g}/,,g' +_SED_CMDS+= -e 's,${UNIT_TESTS:S,.,\\.,g}/,,g' + .rawout.out: @echo postprocess ${.TARGET} - @${TOOL_SED} -e 's,^${TEST_MAKE:T:C/\./\\\./g}[][0-9]*:,make:,' \ - -e 's,${TEST_MAKE:C/\./\\\./g},make,' \ - -e '/stopped/s, /.*, unit-tests,' \ - -e 's,${.CURDIR:C/\./\\\./g}/,,g' \ - -e 's,${UNIT_TESTS:C/\./\\\./g}/,,g' ${SED_CMDS.${.TARGET:T:R}} \ + @${TOOL_SED} ${_SED_CMDS} ${SED_CMDS.${.TARGET:R}} \ < ${.IMPSRC} > ${.TARGET}.tmp @echo "exit status `cat ${.TARGET:R}.status`" >> ${.TARGET}.tmp @mv ${.TARGET}.tmp ${.TARGET} @@ -135,7 +150,7 @@ SED_CMDS.modmisc = -e 's,\(substitution error:\).*,\1 details omitted,' # Compare all output files test: ${OUTFILES} .PHONY @failed= ; \ - for test in ${TESTNAMES}; do \ + for test in ${TESTS}; do \ ${TOOL_DIFF} ${DIFF_FLAGS} ${UNIT_TESTS}/$${test}.exp $${test}.out \ || failed="$${failed}$${failed:+ }$${test}" ; \ done ; \ @@ -146,14 +161,14 @@ test: ${OUTFILES} .PHONY fi accept: - @for test in ${TESTNAMES}; do \ + @for test in ${TESTS}; do \ cmp -s ${UNIT_TESTS}/$${test}.exp $${test}.out \ || { echo "Replacing $${test}.exp" ; \ cp $${test}.out ${UNIT_TESTS}/$${test}.exp ; } \ done .if exists(${TEST_MAKE}) -${TESTNAMES:S/$/.rawout/}: ${TEST_MAKE} +${TESTS:=.rawout}: ${TEST_MAKE} .endif .-include <obj.mk> diff --git a/unit-tests/cond-short.exp b/unit-tests/cond-short.exp index 0c8c47a449fe..fdc38d98a8b7 100644 --- a/unit-tests/cond-short.exp +++ b/unit-tests/cond-short.exp @@ -7,4 +7,10 @@ expected M pattern expected or expected or exists expected or empty +defined(V42) && 42 > 0: Ok +defined(V66) && ( "" < 42 ): Ok +1 || 42 < 42: Ok +1 || < 42: Ok +0 || 42 <= 42: Ok +0 || < 42: Ok exit status 0 diff --git a/unit-tests/cond-short.mk b/unit-tests/cond-short.mk index 9ff5f54b715c..41d76768a404 100644 --- a/unit-tests/cond-short.mk +++ b/unit-tests/cond-short.mk @@ -1,4 +1,4 @@ -# $NetBSD: cond-short.mk,v 1.6 2020/07/02 16:37:56 rillig Exp $ +# $NetBSD: cond-short.mk,v 1.7 2020/07/09 22:34:09 sjg Exp $ # # Demonstrates that in conditions, the right-hand side of an && or || # is only evaluated if it can actually influence the result. @@ -97,5 +97,57 @@ VAR= # empty again, for the following tests .elif ${echo "unexpected nested or" 1>&2 :L:sh} .endif +# make sure these do not cause complaint +#.MAKEFLAGS: -dc + +V42 = 42 +iV1 = ${V42} +iV2 = ${V66} + +.if defined(V42) && ${V42} > 0 +x=Ok +.else +x=Fail +.endif +x!= echo 'defined(V42) && ${V42} > 0: $x' >&2; echo +# this one throws both String comparison operator and +# Malformed conditional with cond.c 1.78 +# indirect iV2 would expand to "" and treated as 0 +.if defined(V66) && ( ${iV2} < ${V42} ) +x=Fail +.else +x=Ok +.endif +x!= echo 'defined(V66) && ( "${iV2}" < ${V42} ): $x' >&2; echo +# next two thow String comparison operator with cond.c 1.78 +# indirect iV1 would expand to 42 +.if 1 || ${iV1} < ${V42} +x=Ok +.else +x=Fail +.endif +x!= echo '1 || ${iV1} < ${V42}: $x' >&2; echo +.if 1 || ${iV2:U2} < ${V42} +x=Ok +.else +x=Fail +.endif +x!= echo '1 || ${iV2:U2} < ${V42}: $x' >&2; echo +# the same expressions are fine when the lhs is expanded +# ${iV1} expands to 42 +.if 0 || ${iV1} <= ${V42} +x=Ok +.else +x=Fail +.endif +x!= echo '0 || ${iV1} <= ${V42}: $x' >&2; echo +# ${iV2:U2} expands to 2 +.if 0 || ${iV2:U2} < ${V42} +x=Ok +.else +x=Fail +.endif +x!= echo '0 || ${iV2:U2} < ${V42}: $x' >&2; echo + all: @:;: diff --git a/unit-tests/modmisc.exp b/unit-tests/modmisc.exp index fbe4edeab8b4..619ae3c7fc11 100644 --- a/unit-tests/modmisc.exp +++ b/unit-tests/modmisc.exp @@ -25,11 +25,27 @@ C:empty :a b b c: :a b b c: : b c: -make: RE substitution error: details omitted +make: RE substitution error: (details omitted) make: Unclosed substitution for (, missing) :C,word,____,:Q}: :a c: :x__ 3 x__ 3: :+one+ +two+ +three+: mod-at-resolve:w1d2d3w w2i3w w1i2d3 2i${RES3}w w1d2d3 2i${RES3} 1i${RES2}w: +mod-subst-dollar:$1: +mod-subst-dollar:$2: +mod-subst-dollar:$3: +mod-subst-dollar:$4: +mod-subst-dollar:$5: +mod-subst-dollar:$6: +mod-subst-dollar:$7: +mod-subst-dollar:$8: +mod-subst-dollar:U8: +mod-subst-dollar:$$$$: +mod-loop-dollar:1: +mod-loop-dollar:${word}: +mod-loop-dollar:$3$: +mod-loop-dollar:$${word}$: +mod-loop-dollar:$$5$$: +mod-loop-dollar:$$${word}$$: exit status 0 diff --git a/unit-tests/modmisc.mk b/unit-tests/modmisc.mk index 8c20304ba1ef..d0c334342934 100644 --- a/unit-tests/modmisc.mk +++ b/unit-tests/modmisc.mk @@ -1,4 +1,4 @@ -# $Id: modmisc.mk,v 1.1.1.2 2020/07/04 17:52:46 sjg Exp $ +# $Id: modmisc.mk,v 1.1.1.3 2020/07/09 22:35:19 sjg Exp $ # # miscellaneous modifier tests @@ -17,6 +17,7 @@ MOD_SEP=S,:, ,g all: modvar modvarloop modsysv mod-HTE emptyvar undefvar all: mod-S mod-C mod-at-varname mod-at-resolve +all: mod-subst-dollar mod-loop-dollar modsysv: @echo "The answer is ${libfoo.a:L:libfoo.a=42}" @@ -93,3 +94,34 @@ RES3= 3 mod-at-resolve: @echo $@:${RESOLVE:@v@w${v}w@:Q}: + +# No matter how many dollar characters there are, they all get merged +# into a single dollar by the :S modifier. +mod-subst-dollar: + @echo $@:${:U1:S,^,$,:Q}: + @echo $@:${:U2:S,^,$$,:Q}: + @echo $@:${:U3:S,^,$$$,:Q}: + @echo $@:${:U4:S,^,$$$$,:Q}: + @echo $@:${:U5:S,^,$$$$$,:Q}: + @echo $@:${:U6:S,^,$$$$$$,:Q}: + @echo $@:${:U7:S,^,$$$$$$$,:Q}: + @echo $@:${:U8:S,^,$$$$$$$$,:Q}: +# This generates no dollar at all: + @echo $@:${:UU8:S,^,${:U$$$$$$$$},:Q}: +# Here is an alternative way to generate dollar characters. +# It's unexpectedly complicated though. + @echo $@:${:U:range=5:ts\x24:C,[0-9],,g:Q}: + +# Demonstrate that it is possible to generate dollar characters using the +# :@ modifier. +# +# These are edge cases that could have resulted in a parse error as well +# since the $@ at the end could have been interpreted as a variable, which +# would mean a missing closing @ delimiter. +mod-loop-dollar: + @echo $@:${:U1:@word@${word}$@:Q}: + @echo $@:${:U2:@word@$${word}$$@:Q}: + @echo $@:${:U3:@word@$$${word}$$$@:Q}: + @echo $@:${:U4:@word@$$$${word}$$$$@:Q}: + @echo $@:${:U5:@word@$$$$${word}$$$$$@:Q}: + @echo $@:${:U6:@word@$$$$$${word}$$$$$$@:Q}: |
