From e2197f8018d99844d7ab3502e8c196b637d2c1ea Mon Sep 17 00:00:00 2001 From: Rui Paulo Date: Fri, 25 Oct 2013 05:25:19 +0000 Subject: [PATCH] Set up the /usr/tests hierarchy. Populate /usr/tests with the only test programs that currently live in the tree (those in lib/libcrypt/tests/) and add all the build machinery to accompany this change. In particular: - Add a WITHOUT_TESTS variable that users can define to request that no tests be put in /usr/tests. - Add a top-level Kyuafile for /usr/tests and a way to create similar Kyuafiles in top-level subdirectories. - Add a BSD.tests.dist file to define the directory layout of /usr/tests. Submitted by: Julio Merino jmmv google.com Reviewed by: sjg MFC after: 2 weeks --- Makefile.inc1 | 7 +++++ etc/Makefile | 6 ++++ etc/mtree/BSD.tests.dist | 12 ++++++++ lib/libcrypt/Makefile | 5 ++++ lib/libcrypt/tests/Makefile | 2 ++ share/mk/bsd.own.mk | 1 + tests/Kyuafile | 52 ++++++++++++++++++++++++++++++++++ tests/Makefile | 11 ++++++++ tests/README | 56 +++++++++++++++++++++++++++++++++++++ tests/lib/Makefile | 13 +++++++++ 10 files changed, 165 insertions(+) create mode 100644 etc/mtree/BSD.tests.dist create mode 100644 tests/Kyuafile create mode 100644 tests/Makefile create mode 100644 tests/README create mode 100644 tests/lib/Makefile diff --git a/Makefile.inc1 b/Makefile.inc1 index 728ea844525e..03bdecc5f84a 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 diff --git a/etc/Makefile b/etc/Makefile index 130b16891af4..7e8e23f9dbed 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 @@ -314,6 +317,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 000000000000..37f37e91800f --- /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/lib/libcrypt/Makefile b/lib/libcrypt/Makefile index 7274e287bded..798b4b6350d4 100644 --- a/lib/libcrypt/Makefile +++ b/lib/libcrypt/Makefile @@ -37,4 +37,9 @@ WARNS?= 2 PRECIOUSLIB= +.if ${MK_TESTS} != "no" +SUBDIR+= tests +.endif + .include +.include diff --git a/lib/libcrypt/tests/Makefile b/lib/libcrypt/tests/Makefile index 8c818bdda230..51adc2dccf5e 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/share/mk/bsd.own.mk b/share/mk/bsd.own.mk index 5b7dc4322149..b406cbbf53fa 100644 --- a/share/mk/bsd.own.mk +++ b/share/mk/bsd.own.mk @@ -350,6 +350,7 @@ __DEFAULT_YES_OPTIONS = \ SYSINSTALL \ TCSH \ TELNET \ + TESTS \ TEXTPROC \ TOOLCHAIN \ UNBOUND \ diff --git a/tests/Kyuafile b/tests/Kyuafile new file mode 100644 index 000000000000..10cf039ae041 --- /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 000000000000..1e2595470fdd --- /dev/null +++ b/tests/Makefile @@ -0,0 +1,11 @@ +# $FreeBSD$ + +.include + +TESTS_SUBDIRS= lib + +TESTSDIR= ${TESTSBASE} + +KYUAFILE= yes + +.include diff --git a/tests/README b/tests/README new file mode 100644 index 000000000000..2dfbc764da1f --- /dev/null +++ b/tests/README @@ -0,0 +1,56 @@ +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 category subdirectory within src/tests/ provides the +same Kyuafile with auto-discovery features. For example: src/tests/lib/ +holds a generic Makefile to install test-suite related material but such +directory does not know upfront which libraries within src/lib/ will +install tests. For this reason, the Kyuafile in src/tests/lib/ has to +also use the auto-discovery features. The same applies for any other +category subdirectory (e.g. bin, usr.sbin, etc.). + +-- +$FreeBSD$ diff --git a/tests/lib/Makefile b/tests/lib/Makefile new file mode 100644 index 000000000000..29b85b3f2f42 --- /dev/null +++ b/tests/lib/Makefile @@ -0,0 +1,13 @@ +# $FreeBSD$ + +.include + +TESTSDIR= ${TESTSBASE}/lib + +KYUAFILE= yes + +CLEANFILES+= Kyuafile +Kyuafile: ${.CURDIR}/../Kyuafile + cp -f ${.CURDIR}/../Kyuafile . + +.include