summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.inc137
-rw-r--r--UPDATING6
-rw-r--r--etc/Makefile6
-rw-r--r--etc/mtree/BSD.tests.dist12
-rw-r--r--etc/mtree/Makefile4
-rw-r--r--lib/Makefile12
-rw-r--r--lib/libcrypt/Makefile5
-rw-r--r--lib/libcrypt/tests/Makefile2
-rw-r--r--lib/tests/Makefile10
-rw-r--r--libexec/Makefile8
-rw-r--r--share/doc/Makefile2
-rw-r--r--share/man/man1/Makefile2
-rw-r--r--share/man/man4/Makefile2
-rw-r--r--share/man/man7/Makefile4
-rw-r--r--share/man/man7/hier.76
-rw-r--r--share/man/man7/tests.7199
-rw-r--r--share/mk/Makefile2
-rw-r--r--share/mk/bsd.own.mk15
-rw-r--r--tests/Kyuafile52
-rw-r--r--tests/Makefile10
-rw-r--r--tests/README55
-rw-r--r--tests/lib/Makefile13
-rw-r--r--tools/build/mk/OptionalObsoleteFiles.inc105
-rw-r--r--tools/build/options/WITHOUT_TESTS2
-rw-r--r--usr.bin/Makefile8
25 files changed, 499 insertions, 80 deletions
diff --git a/Makefile.inc1 b/Makefile.inc1
index 6fd6835..13c676a 100644
--- a/Makefile.inc1
+++ b/Makefile.inc1
@@ -85,6 +85,9 @@ SUBDIR+=secure
SUBDIR+=share
.endif
SUBDIR+=sys usr.bin usr.sbin
+.if ${MK_TESTS} != "no"
+SUBDIR+= tests
+.endif
.if ${MK_OFED} != "no"
SUBDIR+=contrib/ofed
.endif
@@ -489,6 +492,10 @@ _worldtmp:
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
-p ${WORLDTMP}/usr/lib >/dev/null
.endif
+.if ${MK_TESTS} != "no"
+ mtree -deU -f ${.CURDIR}/etc/mtree/BSD.tests.dist \
+ -p ${WORLDTMP}${TESTSBASE} >/dev/null
+.endif
.for _mtree in ${LOCAL_MTREE}
mtree -deU -f ${.CURDIR}/${_mtree} -p ${WORLDTMP} > /dev/null
.endfor
@@ -1487,7 +1494,7 @@ _prebuild_libs= ${_kerberos5_lib_libasn1} \
${_secure_lib_libcrypto} ${_lib_libldns} \
${_secure_lib_libssh} ${_secure_lib_libssl}
-.if ${MK_ATF} != "no"
+.if ${MK_TESTS} != "no"
_lib_atf_libatf_c= lib/atf/libatf-c
.endif
@@ -1597,10 +1604,12 @@ ${_lib}__PL: .PHONY .MAKE
.if exists(${.CURDIR}/${_lib})
${_+_}@${ECHODIR} "===> ${_lib} (obj,depend,all,install)"; \
cd ${.CURDIR}/${_lib} && \
- ${MAKE} DIRPRFX=${_lib}/ obj && \
- ${MAKE} DIRPRFX=${_lib}/ depend && \
- ${MAKE} -DNO_PROFILE -DNO_PIC DIRPRFX=${_lib}/ all && \
- ${MAKE} -DNO_PROFILE -DNO_PIC DIRPRFX=${_lib}/ install
+ ${MAKE} -DNO_TESTS DIRPRFX=${_lib}/ obj && \
+ ${MAKE} -DNO_TESTS DIRPRFX=${_lib}/ depend && \
+ ${MAKE} -DNO_TESTS -DNO_PROFILE -DNO_PIC \
+ DIRPRFX=${_lib}/ all && \
+ ${MAKE} -DNO_TESTS -DNO_PROFILE -DNO_PIC \
+ DIRPRFX=${_lib}/ install
.endif
.endfor
@@ -1609,10 +1618,10 @@ ${_lib}__L: .PHONY .MAKE
.if exists(${.CURDIR}/${_lib})
${_+_}@${ECHODIR} "===> ${_lib} (obj,depend,all,install)"; \
cd ${.CURDIR}/${_lib} && \
- ${MAKE} DIRPRFX=${_lib}/ obj && \
- ${MAKE} DIRPRFX=${_lib}/ depend && \
- ${MAKE} DIRPRFX=${_lib}/ all && \
- ${MAKE} DIRPRFX=${_lib}/ install
+ ${MAKE} -DNO_TESTS DIRPRFX=${_lib}/ obj && \
+ ${MAKE} -DNO_TESTS DIRPRFX=${_lib}/ depend && \
+ ${MAKE} -DNO_TESTS DIRPRFX=${_lib}/ all && \
+ ${MAKE} -DNO_TESTS DIRPRFX=${_lib}/ install
.endif
.endfor
@@ -1622,10 +1631,12 @@ ${_lib}__L: .PHONY .MAKE
lib/libpam__L: .PHONY .MAKE
${_+_}@${ECHODIR} "===> lib/libpam (obj,depend,all,install)"; \
cd ${.CURDIR}/lib/libpam && \
- ${MAKE} DIRPRFX=lib/libpam/ obj && \
- ${MAKE} DIRPRFX=lib/libpam/ depend && \
- ${MAKE} DIRPRFX=lib/libpam/ -D_NO_LIBPAM_SO_YET all && \
- ${MAKE} DIRPRFX=lib/libpam/ -D_NO_LIBPAM_SO_YET install
+ ${MAKE} -DNO_TESTS DIRPRFX=lib/libpam/ obj && \
+ ${MAKE} -DNO_TESTS DIRPRFX=lib/libpam/ depend && \
+ ${MAKE} -DNO_TESTS DIRPRFX=lib/libpam/ \
+ -D_NO_LIBPAM_SO_YET all && \
+ ${MAKE} -DNO_TESTS DIRPRFX=lib/libpam/ \
+ -D_NO_LIBPAM_SO_YET install
_prereq_libs: ${_prereq_libs:S/$/__PL/}
_startup_libs: ${_startup_libs:S/$/__L/}
diff --git a/UPDATING b/UPDATING
index cee1817..0638cc6 100644
--- a/UPDATING
+++ b/UPDATING
@@ -27,6 +27,12 @@ older version of current is a bit fragile.
big-endian integer in accordance with RFC 4402.
__FreeBSD_version is bumped to 1000701.
+20131108:
+ The WITHOUT_ATF build knob has been removed and its functionality
+ has been subsumed into the more generic WITHOUT_TESTS. If you were
+ using the former to disable the build of the ATF libraries, you
+ should change your settings to use the latter.
+
20131031:
The default version of mtree is nmtree which is obtained from
NetBSD. The output is generally the same, but may vary
diff --git a/etc/Makefile b/etc/Makefile
index 0370b99..d763df6 100644
--- a/etc/Makefile
+++ b/etc/Makefile
@@ -139,6 +139,9 @@ BIN1+= regdomain.xml
BIN2= netstart pccard_ether rc.suspend rc.resume
MTREE= BSD.include.dist BSD.root.dist BSD.usr.dist BSD.var.dist
+.if ${MK_TESTS} != "no"
+MTREE+= BSD.tests.dist
+.endif
.if ${MK_SENDMAIL} != "no"
MTREE+= BSD.sendmail.dist
.endif
@@ -317,6 +320,9 @@ MTREES+= mtree/BSD.debug.dist /usr/lib
.if ${MK_GROFF} != "no"
MTREES+= mtree/BSD.groff.dist /usr
.endif
+.if ${MK_TESTS} != "no"
+MTREES+= mtree/BSD.tests.dist ${TESTSBASE}
+.endif
.if ${MK_SENDMAIL} != "no"
MTREES+= mtree/BSD.sendmail.dist /
.endif
diff --git a/etc/mtree/BSD.tests.dist b/etc/mtree/BSD.tests.dist
new file mode 100644
index 0000000..37f37e9
--- /dev/null
+++ b/etc/mtree/BSD.tests.dist
@@ -0,0 +1,12 @@
+# $FreeBSD$
+#
+# Please see the file src/etc/mtree/README before making changes to this file.
+#
+
+/set type=dir uname=root gname=wheel mode=0755
+.
+ lib
+ libcrypt
+ ..
+ ..
+..
diff --git a/etc/mtree/Makefile b/etc/mtree/Makefile
index 3228c6c..f24867b 100644
--- a/etc/mtree/Makefile
+++ b/etc/mtree/Makefile
@@ -6,6 +6,7 @@ FILES= ${_BSD.debug.dist} \
BSD.include.dist \
BSD.root.dist \
${_BSD.sendmail.dist} \
+ ${_BSD.tests.dist} \
BSD.usr.dist \
BSD.var.dist
@@ -18,6 +19,9 @@ _BSD.groff.dist= BSD.groff.dist
.if ${MK_SENDMAIL} != "no"
_BSD.sendmail.dist= BSD.sendmail.dist
.endif
+.if ${MK_TESTS} != "no"
+_BSD.tests.dist= BSD.tests.dist
+.endif
NO_OBJ=
FILESDIR= /etc/mtree
diff --git a/lib/Makefile b/lib/Makefile
index 1ededec..e78ff8f 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -127,7 +127,8 @@ SUBDIR= ${SUBDIR_ORDERED} \
libyaml \
libz \
${_atf} \
- ${_clang}
+ ${_clang} \
+ ${_tests}
.if exists(${.CURDIR}/csu/${MACHINE_ARCH}-elf)
_csu=csu/${MACHINE_ARCH}-elf
@@ -141,10 +142,6 @@ _csu=csu
# NB: keep these sorted by MK_* knobs
-.if ${MK_ATF} != "no"
-_atf= atf
-.endif
-
.if ${MK_ATM} != "no"
_libngatm= libngatm
.endif
@@ -254,6 +251,11 @@ _libsmutil= libsmutil
_libtelnet= libtelnet
.endif
+.if ${MK_TESTS} != "no"
+_atf= atf
+_tests= tests
+.endif
+
.if ${MK_UNBOUND} != "no"
_libunbound= libunbound
.endif
diff --git a/lib/libcrypt/Makefile b/lib/libcrypt/Makefile
index 7274e28..798b4b6 100644
--- a/lib/libcrypt/Makefile
+++ b/lib/libcrypt/Makefile
@@ -37,4 +37,9 @@ WARNS?= 2
PRECIOUSLIB=
+.if ${MK_TESTS} != "no"
+SUBDIR+= tests
+.endif
+
.include <bsd.lib.mk>
+.include <bsd.subdir.mk>
diff --git a/lib/libcrypt/tests/Makefile b/lib/libcrypt/tests/Makefile
index 8c818bd..51adc2d 100644
--- a/lib/libcrypt/tests/Makefile
+++ b/lib/libcrypt/tests/Makefile
@@ -2,6 +2,8 @@
# exercise libcrypt
+TESTSDIR= ${TESTSBASE}/lib/libcrypt
+
ATF_TESTS_C= crypt_tests
CFLAGS+= -I${.CURDIR:H}
diff --git a/lib/tests/Makefile b/lib/tests/Makefile
new file mode 100644
index 0000000..935fd70
--- /dev/null
+++ b/lib/tests/Makefile
@@ -0,0 +1,10 @@
+# $FreeBSD$
+
+.include <bsd.own.mk>
+
+TESTSDIR= ${TESTSBASE}/lib
+
+.PATH: ${.CURDIR:H:H}/tests
+KYUAFILE= yes
+
+.include <bsd.test.mk>
diff --git a/libexec/Makefile b/libexec/Makefile
index 0b9c961..576335f 100644
--- a/libexec/Makefile
+++ b/libexec/Makefile
@@ -33,10 +33,6 @@ SUBDIR= ${_atf} \
ulog-helper \
${_ypxfr}
-.if ${MK_ATF} != "no"
-_atf= atf
-.endif
-
.if ${MK_AT} != "no"
_atrun= atrun
.endif
@@ -76,4 +72,8 @@ _smrsh= smrsh
_telnetd= telnetd
.endif
+.if ${MK_TESTS} != "no"
+_atf= atf
+.endif
+
.include <bsd.subdir.mk>
diff --git a/share/doc/Makefile b/share/doc/Makefile
index 1ec57e8..a4fe61d 100644
--- a/share/doc/Makefile
+++ b/share/doc/Makefile
@@ -9,7 +9,7 @@ SUBDIR= ${_IPv6} \
${_llvm} \
${_roffdocs}
-.if ${MK_ATF} != "no"
+.if ${MK_TESTS} != "no"
_atf= atf
.endif
diff --git a/share/man/man1/Makefile b/share/man/man1/Makefile
index 23bc1d8..97885a6 100644
--- a/share/man/man1/Makefile
+++ b/share/man/man1/Makefile
@@ -5,7 +5,7 @@
MAN= builtin.1 intro.1
-.if ${MK_ATF} != "no"
+.if ${MK_TESTS} != "no"
ATF= ${.CURDIR}/../../../contrib/atf
.PATH: ${ATF}/doc
MAN+= atf-test-program.1
diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile
index 260b9b5..f3e8a54 100644
--- a/share/man/man4/Makefile
+++ b/share/man/man4/Makefile
@@ -827,7 +827,7 @@ _nvram2env.4= nvram2env.4
SUBDIR= man4.${MACHINE_CPUARCH}
.endif
-.if ${MK_ATF} != "no"
+.if ${MK_TESTS} != "no"
ATF= ${.CURDIR}/../../../contrib/atf
.PATH: ${ATF}/doc
_atf_test_case.4= atf-test-case.4
diff --git a/share/man/man7/Makefile b/share/man/man7/Makefile
index 7e9c43b..6b9402c 100644
--- a/share/man/man7/Makefile
+++ b/share/man/man7/Makefile
@@ -29,6 +29,10 @@ MAN= adding_user.7 \
sticky.7 \
tuning.7
+.if ${MK_TESTS} != "no"
+MAN+= tests.7
+.endif
+
MLINKS= intro.7 miscellaneous.7
MLINKS+= security.7 securelevel.7
MLINKS+= c99.7 c.7
diff --git a/share/man/man7/hier.7 b/share/man/man7/hier.7
index 9c4f14b..b113787 100644
--- a/share/man/man7/hier.7
+++ b/share/man/man7/hier.7
@@ -702,6 +702,12 @@ source code for files in
source code for files in
.Pa /usr/sbin
.El
+.Pp
+.It Pa tests/
+The
+.Fx
+test suite.
+See tests(7) for more details.
.El
.It Pa /var/
multi-purpose log, temporary, transient, and spool files
diff --git a/share/man/man7/tests.7 b/share/man/man7/tests.7
new file mode 100644
index 0000000..1570d50
--- /dev/null
+++ b/share/man/man7/tests.7
@@ -0,0 +1,199 @@
+.\" $FreeBSD$
+.\" $NetBSD: tests.kyua.7,v 1.2 2013/07/20 21:39:59 wiz Exp $
+.\"
+.\" Copyright (c) 2010 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+.\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+.\" IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd October 19, 2013
+.Dt TESTS 7
+.Os
+.Sh NAME
+.Nm tests
+.Nd introduction to the FreeBSD test suite
+.Sh DESCRIPTION
+The
+.Fx
+test suite provides a collection of automated tests for two major purposes.
+On the one hand, the test suite aids
+.Em developers
+in catching bugs and regressions in the code when they performing modifications
+to the source tree.
+On the other hand, the test suite allows
+.Em end users
+(and, in particular, system administrators) to verify that fresh installations
+of the
+.Fx
+operating system behave correctly in their hardware platform and also to ensure
+that the system does not suffer from regressions during regular system
+operation and maintenance.
+.Pp
+The
+.Fx
+test suite is installed under the
+.Pa /usr/tests
+hierarchy.
+.Pp
+This manual page describes how to execute the test suite and how to configure
+some of its optional features.
+.Ss When to run the tests?
+Before diving into the details of how to run the test suite, here are some
+scenarios in which you should be running them:
+.Bl -bullet -offset indent
+.It
+After a fresh installation of
+.Fx
+to ensure that the system works correctly on your hardware platform.
+.It
+After an upgrade of
+.Fx
+to a different version to ensure that the new code works well on your
+hardware platform and that the upgrade did not introduce regressions in your
+configuration.
+.It
+After performing changes to the source tree to catch any bugs and/or regressions
+introduced by the modifications.
+.It
+Periodically, maybe from a
+.Xr cron 8
+job, to ensure that any changes to the system (such as the installation of
+third-party packages or manual modifications to configuration files) do not
+introduce unexpected failures.
+.El
+.Ss Running the tests
+First of all, you will need to install the
+.Sq ports/devel/kyua
+package.
+.Pp
+Use the following command to run the whole test suite:
+.Bd -literal -offset indent
+$ kyua test -k /usr/tests/Kyuafile
+.Ed
+.Pp
+The above will go through all test programs in
+.Pa /usr/tests
+recursively, execute them, store their results and debugging data in Kyua
+database (by default in
+.Pa ~/.kyua/store.db ) ,
+and print a summary of the results.
+This summary includes a brief count of all total tests run and how many of
+them failed.
+.Pp
+It is possible to restrict which tests to run by providing their names in
+the command line.
+For example, this would execute the tests for the
+.Xr cp 1
+and
+.Xr cut 1
+utilities:
+.Bd -literal -offset indent
+$ kyua test -k /usr/tests/Kyuafile bin/cp usr.bin/cut
+.Ed
+.Ss Obtaining reports of the tests execution
+Additional information of the results of the execution can be later extracted
+from the database by using the various reporting commands of Kyua.
+For example, the following would extract a plain-text report of the executed
+tests and show which ones failed:
+.Bd -literal -offset indent
+$ kyua report
+.Ed
+.Pp
+This other example would generate an HTML report ready to be published on a
+web server:
+.Bd -literal -offset indent
+$ kyua report-html --output ~/public_html/tests
+.Ed
+.Pp
+For further details on the command-line interface of Kyua, please refer
+to its manual page
+.Xr kyua 1 .
+.\".Ss Configuring the tests
+.\"Some test cases in the
+.\".Fx
+.\"test suite require the administrator to manually set up some configuration
+.\"properties before they can run.
+.\"Unless these properties are defined, the tests that require them will be marked
+.\"as skipped and thus they will not be really executed.
+.\".Pp
+.\"Test suites are configured by defining the values to their configuration
+.\"variables in
+.\".Pa /usr/local/etc/kyua/kyua.conf .
+.\"The format of this file is detailed in
+.\".Xr kyua.conf 5 .
+.\".Pp
+.\"The following configuration variables are available in the
+.\".Fx
+.\"test suite:
+.\".Bl -tag
+.\".It NONE REGISTERED YET
+.\"TBD.
+.Ss What to do if something fails?
+If there is
+.Em any failure
+during the execution of the test suite, please considering reporting it to the
+.Fx
+developers so that the failure can be analyzed and fixed.
+To do so, either send a message to the appropriate mailing list or file a
+problem report.
+For more details please refer to:
+.Bl -bullet -offset indent -compact
+.It
+.Lk http://lists.freebsd.org/ "FreeBSD Mailing Lists"
+.It
+.Lk http://www.freebsd.org/send-pr.html "Submit a FreeBSD Problem Report"
+.El
+.Sh FILES
+.Bl -tag -compact -width usrXlocalXetcXkyuaXkyuaXconfXX
+.It Pa /usr/local/etc/kyua/kyua.conf
+System-wide configuration file for
+.Xr kyua 1 .
+.It Pa ~/.kyua/kyua.conf
+User-specific configuration file for
+.Xr kyua 1 ;
+overrides the system file.
+.It Pa ~/.kyua/store.db
+Default database used by Kyua to maintain the data of the executed tests.
+.It Pa /usr/tests/
+Location of the
+.Fx
+test suite.
+.It Pa /usr/tests/Kyuafile
+Top-level test suite definition file.
+.El
+.Sh SEE ALSO
+.Xr kyua 1 .
+.Sh HISTORY
+The collection of test programs in
+.Pa /usr/tests
+first appeared in
+.Fx 11.0 .
+.Pp
+The
+.Nm
+manual page first appeared in
+.Nx 6.0
+and was later ported to
+.Fx 11.0 .
+.Sh AUTHORS
+.An Julio Merino Aq Mt jmmv@google.com
diff --git a/share/mk/Makefile b/share/mk/Makefile
index d07402b..c776134 100644
--- a/share/mk/Makefile
+++ b/share/mk/Makefile
@@ -43,7 +43,7 @@ FILES= \
NO_OBJ=
FILESDIR= ${BINDIR}/mk
-.if ${MK_ATF} != "no"
+.if ${MK_TESTS} != "no"
FILES+= atf.test.mk
FILES+= plain.test.mk
FILES+= tap.test.mk
diff --git a/share/mk/bsd.own.mk b/share/mk/bsd.own.mk
index 972a526..c292d6e 100644
--- a/share/mk/bsd.own.mk
+++ b/share/mk/bsd.own.mk
@@ -376,6 +376,7 @@ __DEFAULT_NO_OPTIONS = \
PKGTOOLS \
SHARED_TOOLCHAIN \
SVN \
+ TESTS \
USB_GADGET_EXAMPLES
#
@@ -555,6 +556,20 @@ MK_CLANG_FULL:= no
MK_LLDB:= no
.endif
+.if defined(NO_TESTS)
+# This should be handled above along the handling of all other NO_* options.
+# However, the above is broken when WITH_*=yes are passed to make(1) as
+# command line arguments. See PR bin/183762.
+#
+# Because the TESTS option is new and it will default to yes, it's likely
+# that people will pass WITHOUT_TESTS=yes to make(1) directly and get a broken
+# build. So, just in case, it's better to explicitly handle this case here.
+#
+# TODO(jmmv): Either fix make to allow us putting this override where it
+# belongs above or fix this file to cope with the make bug.
+MK_TESTS:= no
+.endif
+
#
# Set defaults for the MK_*_SUPPORT variables.
#
diff --git a/tests/Kyuafile b/tests/Kyuafile
new file mode 100644
index 0000000..10cf039
--- /dev/null
+++ b/tests/Kyuafile
@@ -0,0 +1,52 @@
+-- $FreeBSD$
+--
+-- Copyright 2011 Google Inc.
+-- All rights reserved.
+--
+-- Redistribution and use in source and binary forms, with or without
+-- modification, are permitted provided that the following conditions are
+-- met:
+--
+-- * Redistributions of source code must retain the above copyright
+-- notice, this list of conditions and the following disclaimer.
+-- * Redistributions in binary form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+-- * Neither the name of Google Inc. nor the names of its contributors
+-- may be used to endorse or promote products derived from this software
+-- without specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+-- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+-- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+-- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+-- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+-- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+-- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+-- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+-- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+-- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-- Automatically recurses into any subdirectory that holds a Kyuafile.
+-- As such, this Kyuafile is suitable for installation into the root of
+-- the tests hierarchy as well as into any other subdirectory that needs
+-- "auto-discovery" of tests.
+--
+-- This file is based on the Kyuafile.top sample file distributed in the
+-- kyua-cli package.
+
+syntax(2)
+
+local directory = fs.dirname(current_kyuafile())
+for file in fs.files(directory) do
+ if file == "." or file == ".." then
+ -- Skip these special entries.
+ else
+ local kyuafile_relative = fs.join(file, "Kyuafile")
+ local kyuafile_absolute = fs.join(directory, kyuafile_relative)
+ if fs.exists(kyuafile_absolute) then
+ include(kyuafile_relative)
+ end
+ end
+end
diff --git a/tests/Makefile b/tests/Makefile
new file mode 100644
index 0000000..88386eb
--- /dev/null
+++ b/tests/Makefile
@@ -0,0 +1,10 @@
+# $FreeBSD$
+
+.include <bsd.own.mk>
+
+SUBDIR= # still empty
+
+TESTSDIR= ${TESTSBASE}
+KYUAFILE= yes
+
+.include <bsd.test.mk>
diff --git a/tests/README b/tests/README
new file mode 100644
index 0000000..416cea7
--- /dev/null
+++ b/tests/README
@@ -0,0 +1,55 @@
+src/tests: The FreeBSD test suite
+=================================
+
+This file describes the build infrastructure of the FreeBSD test suite.
+If you are only interested in using the test suite itself, please refer
+to tests(7) instead.
+
+The build of the test suite is organized in the following manner:
+
+* The build of all test artifacts is protected by the MK_TESTS knob.
+ The user can disable these with the WITHOUT_TESTS setting in
+ src.conf(5).
+
+* The goal for /usr/tests/ (the installed test programs) is to follow
+ the same hierarchy as /usr/src/ wherever possible, which in turn drives
+ several of the design decisions described below. This simplifies the
+ discoverability of tests. We want a mapping such as:
+
+ /usr/src/bin/cp/ -> /usr/tests/bin/cp/
+ /usr/src/lib/libc/ -> /usr/tests/lib/libc/
+ /usr/src/usr.bin/cut/ -> /usr/tests/usr.bin/cut/
+ ... and many more ...
+
+* Test programs for specific utilities and libraries are located next
+ to the source code of such programs. For example, the tests for the
+ src/lib/libcrypt/ library live in src/lib/libcrypt/tests/. The tests/
+ subdirectory is optional and should, in general, be avoided.
+
+* The src/tests/ hierarchy (this directory) provides generic test
+ infrastructure and glue code to join all test programs together into
+ a single test suite definition.
+
+* The src/tests/ hierarchy also includes cross-functional test programs:
+ i.e. test programs that cover more than a single utility or library
+ and thus don't fit anywhere else in the tree. Consider this to follow
+ the same rationale as src/share/man/: this directory contains generic
+ manual pages while the manual pages that are specific to individual
+ tools or libraries live next to the source code.
+
+In order to keep the src/tests/ hierarchy decoupled from the actual test
+programs being installed --which is a worthy goal because it simplifies
+the addition of new test programs and simplifies the maintenance of the
+tree-- the top-level Kyuafile does not know which subdirectories may
+exist upfront. Instead, such Kyuafile automatically detects, at
+run-time, which */Kyuafile files exist and uses those directly.
+
+Similarly, every directory in src/ that wants to install a Kyuafile to
+just recurse into other subdirectories reuses this Kyuafile with
+auto-discovery features. As an example, take a look at src/lib/tests/
+whose sole purpose is to install a Kyuafile into /usr/tests/lib/.
+The goal in this specific case is for /usr/tests/lib/ to be generated
+entirely from src/lib/.
+
+--
+$FreeBSD$
diff --git a/tests/lib/Makefile b/tests/lib/Makefile
new file mode 100644
index 0000000..29b85b3
--- /dev/null
+++ b/tests/lib/Makefile
@@ -0,0 +1,13 @@
+# $FreeBSD$
+
+.include <bsd.own.mk>
+
+TESTSDIR= ${TESTSBASE}/lib
+
+KYUAFILE= yes
+
+CLEANFILES+= Kyuafile
+Kyuafile: ${.CURDIR}/../Kyuafile
+ cp -f ${.CURDIR}/../Kyuafile .
+
+.include <bsd.test.mk>
diff --git a/tools/build/mk/OptionalObsoleteFiles.inc b/tools/build/mk/OptionalObsoleteFiles.inc
index 82d83733..c9e1c02 100644
--- a/tools/build/mk/OptionalObsoleteFiles.inc
+++ b/tools/build/mk/OptionalObsoleteFiles.inc
@@ -68,56 +68,6 @@ OLD_FILES+=usr/share/man/man1/batch.1.gz
OLD_FILES+=usr/share/man/man8/atrun.8.gz
.endif
-.if ${MK_ATF} == no
-OLD_FILES+=usr/bin/atf-sh
-OLD_DIRS+=usr/include/atf-c
-OLD_FILES+=usr/include/atf-c/build.h
-OLD_FILES+=usr/include/atf-c/check.h
-OLD_FILES+=usr/include/atf-c/config.h
-OLD_FILES+=usr/include/atf-c/defs.h
-OLD_FILES+=usr/include/atf-c/error.h
-OLD_FILES+=usr/include/atf-c/error_fwd.h
-OLD_FILES+=usr/include/atf-c/macros.h
-OLD_FILES+=usr/include/atf-c/tc.h
-OLD_FILES+=usr/include/atf-c/tp.h
-OLD_FILES+=usr/include/atf-c/utils.h
-OLD_FILES+=usr/include/atf-c/atf-c.h
-OLD_FILES+=usr/include/atf-c.h
-OLD_DIRS+=usr/include/atf-c++
-OLD_FILES+=usr/include/atf-c++/build.hpp
-OLD_FILES+=usr/include/atf-c++/check.hpp
-OLD_FILES+=usr/include/atf-c++/config.hpp
-OLD_FILES+=usr/include/atf-c++/macros.hpp
-OLD_FILES+=usr/include/atf-c++/tests.hpp
-OLD_FILES+=usr/include/atf-c++/utils.hpp
-OLD_FILES+=usr/include/atf-c++/atf-c++.hpp
-OLD_FILES+=usr/include/atf-c++.hpp
-OLD_FILES+=usr/lib/libatf-c_p.a
-OLD_FILES+=usr/lib/libatf-c.so.1
-OLD_FILES+=usr/lib/libatf-c.so
-OLD_FILES+=usr/lib/libatf-c++.a
-OLD_FILES+=usr/lib/libatf-c++_p.a
-OLD_FILES+=usr/lib/libatf-c++.so.1
-OLD_FILES+=usr/lib/libatf-c++.so
-OLD_FILES+=usr/lib/libatf-c.a
-OLD_FILES+=usr/libexec/atf-check
-OLD_DIRS+=usr/share/atf
-OLD_FILES+=usr/share/atf/libatf-sh.subr
-OLD_DIRS+=usr/share/doc/atf
-OLD_FILES+=usr/share/doc/atf/AUTHORS
-OLD_FILES+=usr/share/doc/atf/COPYING
-OLD_FILES+=usr/share/doc/atf/NEWS
-OLD_FILES+=usr/share/doc/atf/README
-OLD_FILES+=usr/share/man/man1/atf-check.1.gz
-OLD_FILES+=usr/share/man/man1/atf-sh.1.gz
-OLD_FILES+=usr/share/man/man1/atf-test-program.1.gz
-OLD_FILES+=usr/share/man/man3/atf-c-api.3.gz
-OLD_FILES+=usr/share/man/man3/atf-c++-api.3.gz
-OLD_FILES+=usr/share/man/man3/atf-sh-api.3.gz
-OLD_FILES+=usr/share/man/man4/atf-test-case.4.gz
-OLD_FILES+=usr/share/mk/atf.test.mk
-.endif
-
.if ${MK_ATM} == no
OLD_FILES+=rescue/atmconfig
OLD_FILES+=sbin/atmconfig
@@ -4141,6 +4091,61 @@ OLD_FILES+=usr/share/man/man1/telnet.1.gz
OLD_FILES+=usr/share/man/man8/telnetd.8.gz
.endif
+.if ${MK_TESTS} == no
+# ATF libraries.
+OLD_FILES+=usr/bin/atf-sh
+OLD_DIRS+=usr/include/atf-c
+OLD_FILES+=usr/include/atf-c/build.h
+OLD_FILES+=usr/include/atf-c/check.h
+OLD_FILES+=usr/include/atf-c/config.h
+OLD_FILES+=usr/include/atf-c/defs.h
+OLD_FILES+=usr/include/atf-c/error.h
+OLD_FILES+=usr/include/atf-c/error_fwd.h
+OLD_FILES+=usr/include/atf-c/macros.h
+OLD_FILES+=usr/include/atf-c/tc.h
+OLD_FILES+=usr/include/atf-c/tp.h
+OLD_FILES+=usr/include/atf-c/utils.h
+OLD_FILES+=usr/include/atf-c.h
+OLD_DIRS+=usr/include/atf-c++
+OLD_FILES+=usr/include/atf-c++/build.hpp
+OLD_FILES+=usr/include/atf-c++/check.hpp
+OLD_FILES+=usr/include/atf-c++/config.hpp
+OLD_FILES+=usr/include/atf-c++/macros.hpp
+OLD_FILES+=usr/include/atf-c++/tests.hpp
+OLD_FILES+=usr/include/atf-c++/utils.hpp
+OLD_FILES+=usr/include/atf-c++.hpp
+OLD_FILES+=usr/lib/libatf-c_p.a
+OLD_FILES+=usr/lib/libatf-c.so.1
+OLD_FILES+=usr/lib/libatf-c.so
+OLD_FILES+=usr/lib/libatf-c++.a
+OLD_FILES+=usr/lib/libatf-c++_p.a
+OLD_FILES+=usr/lib/libatf-c++.so.1
+OLD_FILES+=usr/lib/libatf-c++.so
+OLD_FILES+=usr/lib/libatf-c.a
+OLD_FILES+=usr/libexec/atf-check
+OLD_DIRS+=usr/share/atf
+OLD_FILES+=usr/share/atf/libatf-sh.subr
+OLD_DIRS+=usr/share/doc/atf
+OLD_FILES+=usr/share/doc/atf/AUTHORS
+OLD_FILES+=usr/share/doc/atf/COPYING
+OLD_FILES+=usr/share/doc/atf/NEWS
+OLD_FILES+=usr/share/doc/atf/README
+OLD_FILES+=usr/share/man/man1/atf-check.1.gz
+OLD_FILES+=usr/share/man/man1/atf-sh.1.gz
+OLD_FILES+=usr/share/man/man1/atf-test-program.1.gz
+OLD_FILES+=usr/share/man/man3/atf-c-api.3.gz
+OLD_FILES+=usr/share/man/man3/atf-c++-api.3.gz
+OLD_FILES+=usr/share/man/man3/atf-sh-api.3.gz
+OLD_FILES+=usr/share/man/man4/atf-test-case.4.gz
+OLD_FILES+=usr/share/mk/atf.test.mk
+
+# Test suite.
+TESTS_DIRS!=find ${DESTDIR}/usr/tests -type d | sed -e 's,^${DESTDIR}/,,'
+OLD_DIRS+=${TESTS_DIRS}
+TESTS_FILES!=find ${DESTDIR}/usr/tests \! -type d | sed -e 's,^${DESTDIR}/,,'
+OLD_FILES+=${TESTS_FILES}
+.endif
+
#.if ${MK_TOOLCHAIN} == no
# to be filled in
#.endif
diff --git a/tools/build/options/WITHOUT_TESTS b/tools/build/options/WITHOUT_TESTS
new file mode 100644
index 0000000..05aeeb8
--- /dev/null
+++ b/tools/build/options/WITHOUT_TESTS
@@ -0,0 +1,2 @@
+.\" $FreeBSD$
+Set to not build any test programs nor install them in /usr/tests.
diff --git a/usr.bin/Makefile b/usr.bin/Makefile
index 92958ae..cbee3fb 100644
--- a/usr.bin/Makefile
+++ b/usr.bin/Makefile
@@ -210,10 +210,6 @@ SUBDIR= alias \
SUBDIR+= at
.endif
-.if ${MK_ATF} != "no"
-_atf= atf
-.endif
-
.if ${MK_ATM} != "no"
SUBDIR+= atm
.endif
@@ -332,6 +328,10 @@ SUBDIR+= vacation
SUBDIR+= telnet
.endif
+.if ${MK_TESTS} != "no"
+_atf= atf
+.endif
+
.if ${MK_TEXTPROC} != "no"
SUBDIR+= checknr
SUBDIR+= colcrt
OpenPOWER on IntegriCloud