2 # Copyright 2012 Google Inc.
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions are
9 # * Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer.
11 # * Redistributions in binary form must reproduce the above copyright
12 # notice, this list of conditions and the following disclaimer in the
13 # documentation and/or other materials provided with the distribution.
14 # * Neither the name of Google Inc. nor the names of its contributors
15 # may be used to endorse or promote products derived from this software
16 # without specific prior written permission.
18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 # Path to a local cvsroot for testing purposes.
32 MOCK_CVSROOT=":local:$(pwd)/cvsroot"
35 # Creates a fake program that records its invocations for later processing.
37 # The fake program, when invoked, will append its arguments to a commands.log
38 # file in the test case's work directory.
40 # \param binary The path to the program to create.
41 # \param delegate If set to 'yes', execute the real program afterwards.
42 create_mock_binary() {
43 local binary="${1}"; shift
45 [ ${#} -eq 0 ] || { delegate="${1}"; shift; }
47 cat >"${binary}" <<EOF
50 logfile="${HOME}/commands.log"
51 echo "Command: \${0##*/}" >>"\${logfile}"
52 echo "Directory: \$(pwd)" >>"\${logfile}"
53 for arg in "\${@}"; do
54 echo "Arg: \${arg}" >>"\${logfile}"
59 if [ "${delegate}" = yes ]; then
60 cat >>"${binary}" <<EOF
62 exec "\${0##*/}" "\${@}"
70 # Creates a fake CVS repository with a src and an xsrc module.
72 # \param repository Path to the repository to create.
73 create_mock_cvsroot() {
74 local repository="${1}"; shift
76 atf_check -o ignore -e ignore cvs -d "${repository}" init
80 create_mock_binary build.sh
81 echo "first revision" >file-in-src
82 cvs -d "${repository}" import -m "Import." src VENDOR_TAG release_tag
88 echo "first revision" >file-in-xsrc
89 cvs -d "${repository}" import -m "Import." xsrc VENDOR_TAG release_tag
95 atf_test_case build__custom_dirs
96 build__custom_dirs_body() {
97 create_mock_cvsroot "${MOCK_CVSROOT}"
99 create_mock_binary cvs yes
100 PATH="$(pwd):${PATH}"
104 CVSROOT=${MOCK_CVSROOT}
110 atf_check -o save:stdout -e save:stderr sysbuild -c test.conf build
114 Directory: ${HOME}/s/.cvs-checkout
115 Arg: -d${MOCK_CVSROOT}
122 Directory: ${HOME}/x/.cvs-checkout
123 Arg: -d${MOCK_CVSROOT}
131 Arg: -D${HOME}/b/$(uname -m)/destdir
132 Arg: -M${HOME}/b/$(uname -m)/obj
135 Arg: -T${HOME}/b/$(uname -m)/tools
143 atf_check -o file:expout cat commands.log
147 atf_test_case build__defaults
148 build__defaults_body() {
149 create_mock_cvsroot "${MOCK_CVSROOT}"
151 create_mock_binary cvs yes
152 PATH="$(pwd):${PATH}"
154 atf_check -o save:stdout -e save:stderr sysbuild \
155 -c /dev/null -o CVSROOT="${MOCK_CVSROOT}" build
159 Directory: ${HOME}/sysbuild/src/.cvs-checkout
160 Arg: -d${MOCK_CVSROOT}
167 Directory: ${HOME}/sysbuild/src
168 Arg: -D${HOME}/sysbuild/$(uname -m)/destdir
169 Arg: -M${HOME}/sysbuild/$(uname -m)/obj
171 Arg: -R${HOME}/sysbuild/release
172 Arg: -T${HOME}/sysbuild/$(uname -m)/tools
178 atf_check -o file:expout cat commands.log
182 atf_test_case build__remove_all
183 build__remove_all_body() {
184 create_mock_cvsroot "${MOCK_CVSROOT}"
187 atf_check -o ignore -e ignore cvs -d"${MOCK_CVSROOT}" checkout -P src
190 create_mock_binary cvs
191 PATH="$(pwd):${PATH}"
193 mkdir -p "sysbuild/$(uname -m)/destdir/a"
194 mkdir -p "sysbuild/$(uname -m)/obj/b"
195 mkdir -p "sysbuild/$(uname -m)/tools/c"
196 mkdir -p "sysbuild/$(uname -m)/keep-me"
198 atf_check -o save:stdout -e save:stderr sysbuild \
199 -c /dev/null -o CVSROOT="${MOCK_CVSROOT}" build
201 [ ! -d "sysbuild/$(uname -m)/destdir" ] || atf_fail "destdir not removed"
202 [ ! -d "sysbuild/$(uname -m)/obj" ] || atf_fail "obj not removed"
203 [ ! -d "sysbuild/$(uname -m)/tools" ] || atf_fail "tools not removed"
204 [ -d "sysbuild/$(uname -m)/keep-me" ] || atf_fail "All of buildroot removed"
208 atf_test_case build__fast_mode
209 build__fast_mode_body() {
210 create_mock_cvsroot "${MOCK_CVSROOT}"
213 atf_check -o ignore -e ignore cvs -d"${MOCK_CVSROOT}" checkout -P src
216 create_mock_binary cvs
217 PATH="$(pwd):${PATH}"
219 mkdir -p "sysbuild/$(uname -m)/destdir/bin"
220 mkdir -p "sysbuild/$(uname -m)/destdir/stand/$(uname -m)/1.2.3"
222 atf_check -o save:stdout -e save:stderr sysbuild \
223 -c /dev/null -o CVSROOT="${MOCK_CVSROOT}" build -f
227 Directory: ${HOME}/sysbuild/src
228 Arg: -D${HOME}/sysbuild/$(uname -m)/destdir
229 Arg: -M${HOME}/sysbuild/$(uname -m)/obj
231 Arg: -R${HOME}/sysbuild/release
232 Arg: -T${HOME}/sysbuild/$(uname -m)/tools
239 atf_check -o file:expout cat commands.log
241 [ -d "sysbuild/$(uname -m)/destdir/bin" ] \
242 || atf_fail "Deleted a directory that should not have been deleted"
243 [ ! -d "sysbuild/$(uname -m)/destdir/stand/$(uname -m)/1.2.3" ] \
244 || atf_fail "Obsolete modules not deleted"
248 atf_test_case build__many_machines
249 build__many_machines_body() {
250 create_mock_cvsroot "${MOCK_CVSROOT}"
252 create_mock_binary cvs yes
253 PATH="$(pwd):${PATH}"
255 atf_check -o save:stdout -e save:stderr sysbuild \
256 -c /dev/null -o CVSROOT="${MOCK_CVSROOT}" \
257 -o MACHINES="amd64 macppc shark" -o NJOBS=2 build
261 Directory: ${HOME}/sysbuild/src/.cvs-checkout
262 Arg: -d${MOCK_CVSROOT}
269 Directory: ${HOME}/sysbuild/src
270 Arg: -D${HOME}/sysbuild/amd64/destdir
271 Arg: -M${HOME}/sysbuild/amd64/obj
273 Arg: -R${HOME}/sysbuild/release
274 Arg: -T${HOME}/sysbuild/amd64/tools
281 Directory: ${HOME}/sysbuild/src
282 Arg: -D${HOME}/sysbuild/macppc/destdir
283 Arg: -M${HOME}/sysbuild/macppc/obj
285 Arg: -R${HOME}/sysbuild/release
286 Arg: -T${HOME}/sysbuild/macppc/tools
293 Directory: ${HOME}/sysbuild/src
294 Arg: -D${HOME}/sysbuild/shark/destdir
295 Arg: -M${HOME}/sysbuild/shark/obj
297 Arg: -R${HOME}/sysbuild/release
298 Arg: -T${HOME}/sysbuild/shark/tools
305 atf_check -o file:expout cat commands.log
309 atf_test_case build__with_x11
310 build__with_x11_body() {
311 create_mock_cvsroot "${MOCK_CVSROOT}"
313 create_mock_binary cvs yes
314 PATH="$(pwd):${PATH}"
316 atf_check -o save:stdout -e save:stderr sysbuild \
317 -c /dev/null -o CVSROOT="${MOCK_CVSROOT}" \
318 -o XSRCDIR="${HOME}/sysbuild/xsrc" build
322 Directory: ${HOME}/sysbuild/src/.cvs-checkout
323 Arg: -d${MOCK_CVSROOT}
330 Directory: ${HOME}/sysbuild/xsrc/.cvs-checkout
331 Arg: -d${MOCK_CVSROOT}
338 Directory: ${HOME}/sysbuild/src
339 Arg: -D${HOME}/sysbuild/$(uname -m)/destdir
340 Arg: -M${HOME}/sysbuild/$(uname -m)/obj
342 Arg: -R${HOME}/sysbuild/release
343 Arg: -T${HOME}/sysbuild/$(uname -m)/tools
345 Arg: -X${HOME}/sysbuild/xsrc
351 atf_check -o file:expout cat commands.log
355 atf_test_case build__some_args
356 build__some_args_body() {
357 create_mock_cvsroot "${MOCK_CVSROOT}"
359 create_mock_binary cvs yes
360 PATH="$(pwd):${PATH}"
362 atf_check -o save:stdout -e save:stderr sysbuild \
363 -c /dev/null -o CVSROOT="${MOCK_CVSROOT}" build a foo b
367 Directory: ${HOME}/sysbuild/src/.cvs-checkout
368 Arg: -d${MOCK_CVSROOT}
375 Directory: ${HOME}/sysbuild/src
376 Arg: -D${HOME}/sysbuild/$(uname -m)/destdir
377 Arg: -M${HOME}/sysbuild/$(uname -m)/obj
379 Arg: -R${HOME}/sysbuild/release
380 Arg: -T${HOME}/sysbuild/$(uname -m)/tools
388 atf_check -o file:expout cat commands.log
392 atf_test_case config__builtins
393 config__builtins_body() {
395 BUILD_ROOT = ${HOME}/sysbuild
396 BUILD_TARGETS = release
397 CVSROOT = :ext:anoncvs@anoncvs.NetBSD.org:/cvsroot
399 INCREMENTAL_BUILD = false
400 MACHINES = $(uname -m)
402 RELEASEDIR = ${HOME}/sysbuild/release
403 SRCDIR = ${HOME}/sysbuild/src
404 UPDATE_SOURCES = true
407 atf_check -o file:expout sysbuild -c /dev/null config
411 atf_test_case config__path__components
412 config__path__components_body() {
415 export SYSBUILD_ETCDIR="$(pwd)/system"
417 echo "BUILD_TARGETS=foo" >my-file
418 atf_check -o match:"BUILD_TARGETS = foo" sysbuild -c ./my-file config
422 atf_test_case config__path__extension
423 config__path__extension_body() {
426 export SYSBUILD_ETCDIR="$(pwd)/system"
428 echo "BUILD_TARGETS=bar" >my-file.conf
429 atf_check -o match:"BUILD_TARGETS = bar" sysbuild -c my-file.conf config
433 atf_test_case config__name__system_directory
434 config__name__system_directory_body() {
437 export SYSBUILD_ETCDIR="$(pwd)/system"
439 echo "BUILD_TARGETS='some value'" >system/foo.conf
440 atf_check -o match:"BUILD_TARGETS = some value" sysbuild -c foo config
444 atf_test_case config__name__user_directory
445 config__name__user_directory_body() {
448 export SYSBUILD_ETCDIR="$(pwd)/system"
450 echo "BUILD_TARGETS='some value'" >system/foo.conf
451 echo "BUILD_TARGETS='other value'" >.sysbuild/foo.conf
452 atf_check -o match:"BUILD_TARGETS = other value" sysbuild -c foo config
456 atf_test_case config__name__not_found
457 config__name__not_found_body() {
460 export SYSBUILD_ETCDIR="$(pwd)/system"
463 sysbuild: E: Cannot locate configuration named 'foobar'
464 Type 'man sysbuild' for help
466 atf_check -s exit:1 -o empty -e file:experr sysbuild -c foobar config
470 atf_test_case config__overrides
471 config__overrides_body() {
472 cat >custom.conf <<EOF
474 CVSTAG=the-tag-override
478 BUILD_ROOT = /tmp/test
479 BUILD_TARGETS = release
482 INCREMENTAL_BUILD = false
483 MACHINES = $(uname -m)
485 RELEASEDIR = ${HOME}/sysbuild/release
487 UPDATE_SOURCES = true
490 atf_check -o file:expout sysbuild -c custom.conf -o CVSROOT="foo bar" \
491 -o CVSTAG=the-new-tag -o SRCDIR= config
495 atf_test_case config__too_many_args
496 config__too_many_args_body() {
498 sysbuild: E: config does not take any arguments
499 Type 'man sysbuild' for help
501 atf_check -s exit:1 -e file:experr sysbuild -c /dev/null config foo
505 atf_test_case fetch__checkout__src_only
506 fetch__checkout__src_only_body() {
507 create_mock_cvsroot "${MOCK_CVSROOT}"
509 CVSROOT="${MOCK_CVSROOT}"
510 SRCDIR="$(pwd)/checkout/src"
514 atf_check -o ignore -e not-match:"xsrc" sysbuild -c test.conf fetch
515 test -f checkout/src/file-in-src || atf_fail "src not checked out"
516 test ! -d checkout/xsrc || atf_fail "xsrc checked out but not requested"
520 atf_test_case fetch__checkout__src_and_xsrc
521 fetch__checkout__src_and_xsrc_body() {
522 create_mock_cvsroot "${MOCK_CVSROOT}"
524 CVSROOT="${MOCK_CVSROOT}"
525 SRCDIR="$(pwd)/checkout/src"
526 XSRCDIR="$(pwd)/checkout/xsrc"
529 atf_check -o ignore -e ignore sysbuild -c test.conf fetch
530 test -f checkout/src/file-in-src || atf_fail "src not checked out"
531 test -f checkout/xsrc/file-in-xsrc || atf_fail "xsrc not checked out"
535 atf_test_case fetch__update__src_only
536 fetch__update__src_only_body() {
537 create_mock_cvsroot "${MOCK_CVSROOT}"
539 CVSROOT="${MOCK_CVSROOT}"
540 SRCDIR="$(pwd)/checkout/src"
546 atf_check -o ignore -e ignore cvs -d"${MOCK_CVSROOT}" checkout -P src
549 cp -rf checkout/src src-copy
551 echo "second revision" >file-in-src
552 cvs commit -m "Second revision."
555 test -f checkout/src/file-in-src || atf_fail "src not present yet"
556 if grep "second revision" checkout/src/file-in-src >/dev/null; then
557 atf_fail "second revision already present"
560 atf_check -o ignore -e not-match:"xsrc" sysbuild -c test.conf fetch
562 grep "second revision" checkout/src/file-in-src >/dev/null \
563 || atf_fail "src not updated"
564 test ! -d checkout/xsrc || atf_fail "xsrc checked out but not requested"
568 atf_test_case fetch__update__src_and_xsrc
569 fetch__update__src_and_xsrc_body() {
570 create_mock_cvsroot "${MOCK_CVSROOT}"
572 CVSROOT="${MOCK_CVSROOT}"
573 SRCDIR="$(pwd)/checkout/src"
574 XSRCDIR="$(pwd)/checkout/xsrc"
579 atf_check -o ignore -e ignore cvs -d"${MOCK_CVSROOT}" checkout -P src xsrc
582 cp -rf checkout/src src-copy
584 echo "second revision" >file-in-src
585 cvs commit -m "Second revision."
588 cp -rf checkout/xsrc xsrc-copy
590 echo "second revision" >file-in-xsrc
591 cvs commit -m "Second revision."
594 test -f checkout/src/file-in-src || atf_fail "src not present yet"
595 if grep "second revision" checkout/src/file-in-src >/dev/null; then
596 atf_fail "second revision already present"
598 test -f checkout/xsrc/file-in-xsrc || atf_fail "xsrc not present yet"
599 if grep "second revision" checkout/xsrc/file-in-xsrc >/dev/null; then
600 atf_fail "second revision already present"
603 atf_check -o ignore -e ignore sysbuild -c test.conf fetch
605 grep "second revision" checkout/src/file-in-src >/dev/null \
606 || atf_fail "src not updated"
607 grep "second revision" checkout/xsrc/file-in-xsrc >/dev/null \
608 || atf_fail "xsrc not updated"
612 atf_test_case fetch__too_many_args
613 fetch__too_many_args_body() {
615 sysbuild: E: fetch does not take any arguments
616 Type 'man sysbuild' for help
618 atf_check -s exit:1 -e file:experr sysbuild -c /dev/null fetch foo
622 atf_test_case no_command
625 sysbuild: E: No command specified
626 Type 'man sysbuild' for help
628 atf_check -s exit:1 -e file:experr sysbuild
632 atf_test_case unknown_command
633 unknown_command_body() {
635 sysbuild: E: Unknown command foo
636 Type 'man sysbuild' for help
638 atf_check -s exit:1 -e file:experr sysbuild foo
642 atf_test_case unknown_flag
643 unknown_flag_body() {
645 sysbuild: E: Unknown option -Z
646 Type 'man sysbuild' for help
648 atf_check -s exit:1 -e file:experr sysbuild -Z
652 atf_init_test_cases() {
653 atf_add_test_case build__custom_dirs
654 atf_add_test_case build__defaults
655 atf_add_test_case build__remove_all
656 atf_add_test_case build__fast_mode
657 atf_add_test_case build__many_machines
658 atf_add_test_case build__with_x11
659 atf_add_test_case build__some_args
661 atf_add_test_case config__builtins
662 atf_add_test_case config__path__components
663 atf_add_test_case config__path__extension
664 atf_add_test_case config__name__system_directory
665 atf_add_test_case config__name__user_directory
666 atf_add_test_case config__name__not_found
667 atf_add_test_case config__overrides
668 atf_add_test_case config__too_many_args
670 atf_add_test_case fetch__checkout__src_only
671 atf_add_test_case fetch__checkout__src_and_xsrc
672 atf_add_test_case fetch__update__src_only
673 atf_add_test_case fetch__update__src_and_xsrc
674 atf_add_test_case fetch__too_many_args
676 atf_add_test_case no_command
677 atf_add_test_case unknown_command
678 atf_add_test_case unknown_flag