13841c287SSimon J. Gerraty# $Id: Makefile,v 1.60 2020/07/10 00:48:32 sjg Exp $ 249caa483SSimon J. Gerraty# 33841c287SSimon J. Gerraty# $NetBSD: Makefile,v 1.63 2020/07/09 22:40:14 sjg Exp $ 449caa483SSimon J. Gerraty# 549caa483SSimon J. Gerraty# Unit tests for make(1) 63841c287SSimon J. Gerraty# 749caa483SSimon J. Gerraty# The main targets are: 849caa483SSimon J. Gerraty# 93841c287SSimon J. Gerraty# all: 103841c287SSimon J. Gerraty# run all the tests 113841c287SSimon J. Gerraty# test: 123841c287SSimon J. Gerraty# run 'all', and compare to expected results 133841c287SSimon J. Gerraty# accept: 143841c287SSimon J. Gerraty# move generated output to expected results 1549caa483SSimon J. Gerraty# 163841c287SSimon J. Gerraty# Settable variables 173841c287SSimon J. Gerraty# 183841c287SSimon J. Gerraty# TEST_MAKE 193841c287SSimon J. Gerraty# The make program to be tested. 203841c287SSimon J. Gerraty# 213841c287SSimon J. Gerraty# 223841c287SSimon J. Gerraty# Adding a test case 233841c287SSimon J. Gerraty# 2449caa483SSimon J. Gerraty# Each feature should get its own set of tests in its own suitably 2549caa483SSimon J. Gerraty# named makefile (*.mk), with its own set of expected results (*.exp), 263841c287SSimon J. Gerraty# and it should be added to the TESTS list. 2749caa483SSimon J. Gerraty# 283841c287SSimon J. Gerraty# Any added files must also be added to src/distrib/sets/lists/tests/mi. 293841c287SSimon J. Gerraty# Makefiles that are not added to TESTS must be ignored in 303841c287SSimon J. Gerraty# src/tests/usr.bin/make/t_make.sh (example: include-sub). 313841c287SSimon J. Gerraty# 323841c287SSimon J. Gerraty 333841c287SSimon J. Gerraty# Each test is in a sub-makefile. 343841c287SSimon J. Gerraty# Keep the list sorted. 353841c287SSimon J. GerratyTESTS+= comment 363841c287SSimon J. GerratyTESTS+= cond-late 373841c287SSimon J. GerratyTESTS+= cond-short 383841c287SSimon J. GerratyTESTS+= cond1 393841c287SSimon J. GerratyTESTS+= cond2 403841c287SSimon J. GerratyTESTS+= dollar 413841c287SSimon J. GerratyTESTS+= doterror 423841c287SSimon J. GerratyTESTS+= dotwait 433841c287SSimon J. GerratyTESTS+= error 443841c287SSimon J. GerratyTESTS+= # escape # broken by reverting POSIX changes 453841c287SSimon J. GerratyTESTS+= export 463841c287SSimon J. GerratyTESTS+= export-all 473841c287SSimon J. GerratyTESTS+= export-env 483841c287SSimon J. GerratyTESTS+= forloop 493841c287SSimon J. GerratyTESTS+= forsubst 503841c287SSimon J. GerratyTESTS+= hash 513841c287SSimon J. GerratyTESTS+= # impsrc # broken by reverting POSIX changes 523841c287SSimon J. GerratyTESTS+= include-main 533841c287SSimon J. GerratyTESTS+= misc 543841c287SSimon J. GerratyTESTS+= moderrs 553841c287SSimon J. GerratyTESTS+= modmatch 563841c287SSimon J. GerratyTESTS+= modmisc 573841c287SSimon J. GerratyTESTS+= modorder 583841c287SSimon J. GerratyTESTS+= modts 593841c287SSimon J. GerratyTESTS+= modword 603841c287SSimon J. GerratyTESTS+= order 613841c287SSimon J. GerratyTESTS+= # phony-end # broken by reverting POSIX changes 623841c287SSimon J. GerratyTESTS+= posix 633841c287SSimon J. GerratyTESTS+= # posix1 # broken by reverting POSIX changes 643841c287SSimon J. GerratyTESTS+= qequals 653841c287SSimon J. GerratyTESTS+= # suffixes # broken by reverting POSIX changes 663841c287SSimon J. GerratyTESTS+= sunshcmd 673841c287SSimon J. GerratyTESTS+= sysv 683841c287SSimon J. GerratyTESTS+= ternary 693841c287SSimon J. GerratyTESTS+= unexport 703841c287SSimon J. GerratyTESTS+= unexport-env 713841c287SSimon J. GerratyTESTS+= varcmd 723841c287SSimon J. GerratyTESTS+= varmisc 733841c287SSimon J. GerratyTESTS+= varmod-edge 743841c287SSimon J. GerratyTESTS+= varquote 753841c287SSimon J. GerratyTESTS+= varshell 763841c287SSimon J. Gerraty 773841c287SSimon J. Gerraty# Override make flags for certain tests; default is -k. 783841c287SSimon J. GerratyFLAGS.doterror= # none 793841c287SSimon J. GerratyFLAGS.order= -j1 803841c287SSimon J. Gerraty 813841c287SSimon J. Gerraty# Some tests need extra post-processing. 823841c287SSimon J. GerratySED_CMDS.modmisc+= -e 's,\(substitution error:\).*,\1 (details omitted),' 833841c287SSimon J. GerratySED_CMDS.varshell+= -e 's,^[a-z]*sh: ,,' 843841c287SSimon J. GerratySED_CMDS.varshell+= -e '/command/s,No such.*,not found,' 853841c287SSimon J. Gerraty 863841c287SSimon J. Gerraty# End of the configuration section. 8749caa483SSimon J. Gerraty 8849caa483SSimon J. Gerraty.MAIN: all 8949caa483SSimon J. Gerraty 9049caa483SSimon J. Gerraty.-include "Makefile.config" 9149caa483SSimon J. Gerraty 9249caa483SSimon J. GerratyUNIT_TESTS:= ${.PARSEDIR} 9349caa483SSimon J. Gerraty.PATH: ${UNIT_TESTS} 9449caa483SSimon J. Gerraty 953841c287SSimon J. GerratyOUTFILES= ${TESTS:=.out} 9649caa483SSimon J. Gerraty 9749caa483SSimon J. Gerratyall: ${OUTFILES} 9849caa483SSimon J. Gerraty 9949caa483SSimon J. GerratyCLEANFILES+= *.rawout *.out *.status *.tmp *.core *.tmp 10049caa483SSimon J. GerratyCLEANFILES+= obj*.[och] lib*.a # posix1.mk 10149caa483SSimon J. GerratyCLEANFILES+= issue* .[ab]* # suffixes.mk 10249caa483SSimon J. GerratyCLEANRECURSIVE+= dir dummy # posix1.mk 10349caa483SSimon J. Gerraty 10449caa483SSimon J. Gerratyclean: 10549caa483SSimon J. Gerraty rm -f ${CLEANFILES} 10649caa483SSimon J. Gerraty.if !empty(CLEANRECURSIVE) 10749caa483SSimon J. Gerraty rm -rf ${CLEANRECURSIVE} 10849caa483SSimon J. Gerraty.endif 10949caa483SSimon J. Gerraty 11049caa483SSimon J. GerratyTEST_MAKE?= ${.MAKE} 11149caa483SSimon J. GerratyTOOL_SED?= sed 11249caa483SSimon J. GerratyTOOL_TR?= tr 11349caa483SSimon J. GerratyTOOL_DIFF?= diff 1143841c287SSimon J. GerratyDIFF_FLAGS?= -u 11549caa483SSimon J. Gerraty 11649caa483SSimon J. Gerraty.if defined(.PARSEDIR) 11749caa483SSimon J. Gerraty# ensure consistent results from sort(1) 11849caa483SSimon J. GerratyLC_ALL= C 11949caa483SSimon J. GerratyLANG= C 12049caa483SSimon J. Gerraty.export LANG LC_ALL 12149caa483SSimon J. Gerraty.endif 12249caa483SSimon J. Gerraty 12349caa483SSimon J. Gerraty# the tests are actually done with sub-makes. 12449caa483SSimon J. Gerraty.SUFFIXES: .mk .rawout .out 12549caa483SSimon J. Gerraty.mk.rawout: 1263841c287SSimon J. Gerraty @echo ${TEST_MAKE} ${FLAGS.${.TARGET:R}:U-k} -f ${.IMPSRC} 12749caa483SSimon J. Gerraty -@cd ${.OBJDIR} && \ 1283841c287SSimon J. Gerraty { ${TEST_MAKE} ${FLAGS.${.TARGET:R}:U-k} -f ${.IMPSRC} \ 12949caa483SSimon J. Gerraty 2>&1 ; echo $$? >${.TARGET:R}.status ; } > ${.TARGET}.tmp 13049caa483SSimon J. Gerraty @mv ${.TARGET}.tmp ${.TARGET} 13149caa483SSimon J. Gerraty 1323841c287SSimon J. Gerraty# Post-process the test output so that the results can be compared. 1333841c287SSimon J. Gerraty# 1343841c287SSimon J. Gerraty# always pretend .MAKE was called 'make' 1353841c287SSimon J. Gerraty_SED_CMDS+= -e 's,^${TEST_MAKE:T:S,.,\\.,g}[][0-9]*:,make:,' 1363841c287SSimon J. Gerraty_SED_CMDS+= -e 's,${TEST_MAKE:S,.,\\.,g},make,' 1373841c287SSimon J. Gerraty# replace anything after 'stopped in' with unit-tests 1383841c287SSimon J. Gerraty_SED_CMDS+= -e '/stopped/s, /.*, unit-tests,' 1393841c287SSimon J. Gerraty# strip ${.CURDIR}/ from the output 1403841c287SSimon J. Gerraty_SED_CMDS+= -e 's,${.CURDIR:S,.,\\.,g}/,,g' 1413841c287SSimon J. Gerraty_SED_CMDS+= -e 's,${UNIT_TESTS:S,.,\\.,g}/,,g' 1423841c287SSimon J. Gerraty 14349caa483SSimon J. Gerraty.rawout.out: 14449caa483SSimon J. Gerraty @echo postprocess ${.TARGET} 1453841c287SSimon J. Gerraty @${TOOL_SED} ${_SED_CMDS} ${SED_CMDS.${.TARGET:R}} \ 14649caa483SSimon J. Gerraty < ${.IMPSRC} > ${.TARGET}.tmp 14749caa483SSimon J. Gerraty @echo "exit status `cat ${.TARGET:R}.status`" >> ${.TARGET}.tmp 14849caa483SSimon J. Gerraty @mv ${.TARGET}.tmp ${.TARGET} 14949caa483SSimon J. Gerraty 15049caa483SSimon J. Gerraty# Compare all output files 15149caa483SSimon J. Gerratytest: ${OUTFILES} .PHONY 15249caa483SSimon J. Gerraty @failed= ; \ 1533841c287SSimon J. Gerraty for test in ${TESTS}; do \ 15449caa483SSimon J. Gerraty ${TOOL_DIFF} ${DIFF_FLAGS} ${UNIT_TESTS}/$${test}.exp $${test}.out \ 15549caa483SSimon J. Gerraty || failed="$${failed}$${failed:+ }$${test}" ; \ 15649caa483SSimon J. Gerraty done ; \ 15749caa483SSimon J. Gerraty if [ -n "$${failed}" ]; then \ 15849caa483SSimon J. Gerraty echo "Failed tests: $${failed}" ; false ; \ 15949caa483SSimon J. Gerraty else \ 16049caa483SSimon J. Gerraty echo "All tests passed" ; \ 16149caa483SSimon J. Gerraty fi 16249caa483SSimon J. Gerraty 16349caa483SSimon J. Gerratyaccept: 1643841c287SSimon J. Gerraty @for test in ${TESTS}; do \ 16549caa483SSimon J. Gerraty cmp -s ${UNIT_TESTS}/$${test}.exp $${test}.out \ 16649caa483SSimon J. Gerraty || { echo "Replacing $${test}.exp" ; \ 16749caa483SSimon J. Gerraty cp $${test}.out ${UNIT_TESTS}/$${test}.exp ; } \ 16849caa483SSimon J. Gerraty done 16949caa483SSimon J. Gerraty 17049caa483SSimon J. Gerraty.if exists(${TEST_MAKE}) 1713841c287SSimon J. Gerraty${TESTS:=.rawout}: ${TEST_MAKE} 17249caa483SSimon J. Gerraty.endif 17349caa483SSimon J. Gerraty 17449caa483SSimon J. Gerraty.-include <obj.mk> 175