2 # SPDX-License-Identifier: BSD-2-Clause
4 # Copyright (c) 2018 Kyle Evans <kevans@FreeBSD.org>
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
9 # 1. Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer.
11 # 2. 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.
15 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 ZPOOL_NAME_FILE=zpool_name
35 mktemp -u bectl_test_XXXXXX > $ZPOOL_NAME_FILE
39 # Establishes a bectl_create zpool that can be used for some light testing; contains
40 # a 'default' BE and not much else.
47 # Sanity check to make sure `make_zpool_name` succeeded
48 atf_check test -n "$zpool"
50 kldload -n -q zfs || atf_skip "ZFS module not loaded on the current system"
51 if ! getconf MIN_HOLE_SIZE "$(pwd)"; then
52 echo "getconf MIN_HOLE_SIZE $(pwd) failed; sparse files " \
53 "probably not supported by file system"
55 atf_skip "Test's work directory does not support sparse files;" \
56 "try with a different TMPDIR?"
58 atf_check mkdir -p ${mnt}
59 atf_check truncate -s 1G ${disk}
60 atf_check zpool create -R ${mnt} ${zpool} ${disk}
61 atf_check zfs create -o mountpoint=none ${zpool}/ROOT
62 atf_check zfs create -o mountpoint=/ -o canmount=noauto \
65 bectl_create_deep_setup()
71 # Sanity check to make sure `make_zpool_name` succeeded
72 atf_check test -n "$zpool"
74 bectl_create_setup ${zpool} ${disk} ${mnt}
75 atf_check mkdir -p ${root}
76 atf_check -o ignore bectl -r ${zpool}/ROOT mount default ${root}
77 atf_check mkdir -p ${root}/usr
78 atf_check zfs create -o mountpoint=/usr -o canmount=noauto \
79 ${zpool}/ROOT/default/usr
80 atf_check -o ignore bectl -r ${zpool}/ROOT umount default
86 if [ -z "$zpool" ]; then
87 echo "Skipping cleanup; zpool not set up"
88 elif zpool get health ${zpool} >/dev/null 2>&1; then
89 zpool destroy -f ${zpool}
93 atf_test_case bectl_create cleanup
96 atf_set "descr" "Check the various forms of bectl create"
97 atf_set "require.user" root
101 if [ "$(atf_config_get ci false)" = "true" ] && \
102 [ "$(uname -p)" = "i386" ]; then
103 atf_skip "https://bugs.freebsd.org/249055"
106 if [ "$(atf_config_get ci false)" = "true" ] && \
107 [ "$(uname -p)" = "armv7" ]; then
108 atf_skip "https://bugs.freebsd.org/249229"
112 zpool=$(make_zpool_name)
116 bectl_create_setup ${zpool} ${disk} ${mount}
118 # Create a child dataset that will be used to test creation
119 # of recursive and non-recursive boot environments.
120 atf_check zfs create -o mountpoint=/usr -o canmount=noauto \
121 ${zpool}/ROOT/default/usr
123 # BE datasets with spaces are not bootable, PR 254441.
124 atf_check -e not-empty -s not-exit:0 \
125 bectl -r ${zpool}/ROOT create "foo bar"
127 # Test standard creation, creation of a snapshot, and creation from a
129 atf_check bectl -r ${zpool}/ROOT create -e default default2
130 atf_check bectl -r ${zpool}/ROOT create default2@test_snap
131 atf_check bectl -r ${zpool}/ROOT create -e default2@test_snap default3
133 # Test standard creation, creation of a snapshot, and creation from a
134 # snapshot for recursive boot environments.
135 atf_check bectl -r ${zpool}/ROOT create -r -e default recursive
136 atf_check bectl -r ${zpool}/ROOT create -r recursive@test_snap
137 atf_check bectl -r ${zpool}/ROOT create -r -e recursive@test_snap recursive-snap
139 # Test that non-recursive boot environments have no child datasets.
140 atf_check -e not-empty -s not-exit:0 \
141 zfs list "${zpool}/ROOT/default2/usr"
142 atf_check -e not-empty -s not-exit:0 \
143 zfs list "${zpool}/ROOT/default3/usr"
145 # Test that recursive boot environments have child datasets.
146 atf_check -o not-empty \
147 zfs list "${zpool}/ROOT/recursive/usr"
148 atf_check -o not-empty \
149 zfs list "${zpool}/ROOT/recursive-snap/usr"
151 bectl_create_cleanup()
153 bectl_cleanup $(get_zpool_name)
156 atf_test_case bectl_destroy cleanup
159 atf_set "descr" "Check bectl destroy"
160 atf_set "require.user" root
164 if [ "$(atf_config_get ci false)" = "true" ] && \
165 [ "$(uname -p)" = "i386" ]; then
166 atf_skip "https://bugs.freebsd.org/249055"
169 if [ "$(atf_config_get ci false)" = "true" ] && \
170 [ "$(uname -p)" = "armv7" ]; then
171 atf_skip "https://bugs.freebsd.org/249229"
175 zpool=$(make_zpool_name)
180 bectl_create_setup ${zpool} ${disk} ${mount}
181 atf_check bectl -r ${zpool}/ROOT create -e default default2
182 atf_check -o not-empty zfs get mountpoint ${zpool}/ROOT/default2
183 atf_check -e ignore bectl -r ${zpool}/ROOT destroy default2
184 atf_check -e not-empty -s not-exit:0 zfs get mountpoint ${zpool}/ROOT/default2
186 # Test origin snapshot deletion when the snapshot to be destroyed
187 # belongs to a mounted dataset, see PR 236043.
188 atf_check mkdir -p ${root}
189 atf_check -o not-empty bectl -r ${zpool}/ROOT mount default ${root}
190 atf_check bectl -r ${zpool}/ROOT create -e default default3
191 atf_check bectl -r ${zpool}/ROOT destroy -o default3
192 atf_check bectl -r ${zpool}/ROOT unmount default
194 # create two be from the same parent and destroy the parent
195 atf_check bectl -r ${zpool}/ROOT create -e default default2
196 atf_check bectl -r ${zpool}/ROOT create -e default default3
197 atf_check bectl -r ${zpool}/ROOT destroy default
198 atf_check bectl -r ${zpool}/ROOT destroy default2
199 atf_check bectl -r ${zpool}/ROOT rename default3 default
201 # Create a BE, have it be the parent for another and repeat, then start
202 # deleting environments. Arbitrarily chose default3 as the first.
203 # Sleeps are required to prevent conflicting snapshots- libbe will
204 # use the time with a serial at the end as needed to prevent collisions,
205 # but as BEs get promoted the snapshot names will convert and conflict
206 # anyways. libbe should perhaps consider adding something extra to the
207 # default name to prevent collisions like this, but the default name
208 # includes down to the second and creating BEs this rapidly is perhaps
210 atf_check bectl -r ${zpool}/ROOT create -e default default2
212 atf_check bectl -r ${zpool}/ROOT create -e default2 default3
214 atf_check bectl -r ${zpool}/ROOT create -e default3 default4
215 atf_check bectl -r ${zpool}/ROOT destroy default3
216 atf_check bectl -r ${zpool}/ROOT destroy default2
217 atf_check bectl -r ${zpool}/ROOT destroy default4
219 # Create two BEs, then create an unrelated snapshot on the originating
220 # BE and destroy it. We shouldn't have promoted the second BE, and it's
221 # only possible to tell if we promoted it by making sure we didn't
222 # demote the first BE at some point -- if we did, it's origin will no
224 atf_check bectl -r ${zpool}/ROOT create -e default default2
225 atf_check bectl -r ${zpool}/ROOT create default@test
227 atf_check bectl -r ${zpool}/ROOT destroy default@test
228 atf_check -o inline:"-\n" zfs get -Ho value origin ${zpool}/ROOT/default
229 atf_check bectl -r ${zpool}/ROOT destroy default2
231 # As observed by beadm, if we explicitly try to destroy a snapshot that
232 # leads to clones, we shouldn't have allowed it.
233 atf_check bectl -r ${zpool}/ROOT create default@test
234 atf_check bectl -r ${zpool}/ROOT create -e default@test default2
236 atf_check -e not-empty -s not-exit:0 bectl -r ${zpool}/ROOT destroy \
239 bectl_destroy_cleanup()
241 bectl_cleanup $(get_zpool_name)
244 atf_test_case bectl_export_import cleanup
245 bectl_export_import_head()
247 atf_set "descr" "Check bectl export and import"
248 atf_set "require.user" root
250 bectl_export_import_body()
252 if [ "$(atf_config_get ci false)" = "true" ] && \
253 [ "$(uname -p)" = "i386" ]; then
254 atf_skip "https://bugs.freebsd.org/249055"
257 if [ "$(atf_config_get ci false)" = "true" ] && \
258 [ "$(uname -p)" = "armv7" ]; then
259 atf_skip "https://bugs.freebsd.org/249229"
263 zpool=$(make_zpool_name)
267 bectl_create_setup ${zpool} ${disk} ${mount}
268 atf_check -o save:exported bectl -r ${zpool}/ROOT export default
269 atf_check -x "bectl -r ${zpool}/ROOT import default2 < exported"
270 atf_check -o not-empty zfs get mountpoint ${zpool}/ROOT/default2
271 atf_check -e ignore bectl -r ${zpool}/ROOT destroy default2
272 atf_check -e not-empty -s not-exit:0 zfs get mountpoint \
273 ${zpool}/ROOT/default2
275 bectl_export_import_cleanup()
277 bectl_cleanup $(get_zpool_name)
280 atf_test_case bectl_list cleanup
283 atf_set "descr" "Check bectl list"
284 atf_set "require.user" root
288 if [ "$(atf_config_get ci false)" = "true" ] && \
289 [ "$(uname -p)" = "i386" ]; then
290 atf_skip "https://bugs.freebsd.org/249055"
293 if [ "$(atf_config_get ci false)" = "true" ] && \
294 [ "$(uname -p)" = "armv7" ]; then
295 atf_skip "https://bugs.freebsd.org/249229"
299 zpool=$(make_zpool_name)
303 bectl_create_setup ${zpool} ${disk} ${mount}
304 # Test the list functionality, including that BEs come and go away
305 # as they're created and destroyed. Creation and destruction tests
306 # use the 'zfs' utility to verify that they're actually created, so
307 # these are just light tests that 'list' is picking them up.
308 atf_check -o save:list.out bectl -r ${zpool}/ROOT list
309 atf_check -o not-empty grep 'default' list.out
310 atf_check bectl -r ${zpool}/ROOT create -e default default2
311 atf_check -o save:list.out bectl -r ${zpool}/ROOT list
312 atf_check -o not-empty grep 'default2' list.out
313 atf_check -e ignore bectl -r ${zpool}/ROOT destroy default2
314 atf_check -o save:list.out bectl -r ${zpool}/ROOT list
315 atf_check -s not-exit:0 grep 'default2' list.out
316 # XXX TODO: Formatting checks
320 bectl_cleanup $(get_zpool_name)
323 atf_test_case bectl_mount cleanup
326 atf_set "descr" "Check bectl mount/unmount"
327 atf_set "require.user" root
331 if [ "$(atf_config_get ci false)" = "true" ] && \
332 [ "$(uname -p)" = "i386" ]; then
333 atf_skip "https://bugs.freebsd.org/249055"
336 if [ "$(atf_config_get ci false)" = "true" ] && \
337 [ "$(uname -p)" = "armv7" ]; then
338 atf_skip "https://bugs.freebsd.org/249229"
342 zpool=$(make_zpool_name)
347 bectl_create_deep_setup ${zpool} ${disk} ${mount}
348 atf_check mkdir -p ${root}
349 # Test unmount first...
350 atf_check -o not-empty bectl -r ${zpool}/ROOT mount default ${root}
351 atf_check -o not-empty -x "mount | grep '^${zpool}/ROOT/default'"
352 atf_check bectl -r ${zpool}/ROOT unmount default
353 atf_check -s not-exit:0 -x "mount | grep '^${zpool}/ROOT/default'"
355 atf_check -o not-empty bectl -r ${zpool}/ROOT mount default ${root}
356 atf_check -o not-empty -x "mount | grep '^${zpool}/ROOT/default'"
357 atf_check bectl -r ${zpool}/ROOT umount default
358 atf_check -s not-exit:0 -x "mount | grep '^${zpool}/ROOT/default'"
360 bectl_mount_cleanup()
362 bectl_cleanup $(get_zpool_name)
365 atf_test_case bectl_rename cleanup
368 atf_set "descr" "Check bectl rename"
369 atf_set "require.user" root
373 if [ "$(atf_config_get ci false)" = "true" ] && \
374 [ "$(uname -p)" = "i386" ]; then
375 atf_skip "https://bugs.freebsd.org/249055"
378 if [ "$(atf_config_get ci false)" = "true" ] && \
379 [ "$(uname -p)" = "armv7" ]; then
380 atf_skip "https://bugs.freebsd.org/249229"
384 zpool=$(make_zpool_name)
388 bectl_create_setup ${zpool} ${disk} ${mount}
389 atf_check bectl -r ${zpool}/ROOT rename default default2
390 atf_check -o not-empty zfs get mountpoint ${zpool}/ROOT/default2
391 atf_check -e not-empty -s not-exit:0 zfs get mountpoint \
392 ${zpool}/ROOT/default
394 bectl_rename_cleanup()
396 bectl_cleanup $(get_zpool_name)
399 atf_test_case bectl_jail cleanup
402 atf_set "descr" "Check bectl rename"
403 atf_set "require.user" root
404 atf_set "require.progs" jail
408 if [ "$(atf_config_get ci false)" = "true" ] && \
409 [ "$(uname -p)" = "i386" ]; then
410 atf_skip "https://bugs.freebsd.org/249055"
413 if [ "$(atf_config_get ci false)" = "true" ] && \
414 [ "$(uname -p)" = "armv7" ]; then
415 atf_skip "https://bugs.freebsd.org/249229"
419 zpool=$(make_zpool_name)
424 if [ ! -f /rescue/rescue ]; then
425 atf_skip "This test requires a rescue binary"
427 bectl_create_deep_setup ${zpool} ${disk} ${mount}
428 # Prepare our minimal BE... plop a rescue binary into it
429 atf_check mkdir -p ${root}
430 atf_check -o ignore bectl -r ${zpool}/ROOT mount default ${root}
431 atf_check mkdir -p ${root}/rescue
432 atf_check cp /rescue/rescue ${root}/rescue/rescue
433 atf_check bectl -r ${zpool}/ROOT umount default
435 # Prepare some more boot environments
436 atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT create -e default target
437 atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT create -e default 1234
439 # Attempt to unjail a BE with numeric name; jail_getid at one point
440 # did not validate that the input was a valid jid before returning the
442 atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT jail -b 1234
443 atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT unjail 1234
445 # When a jail name is not explicit, it should match the jail id.
446 atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT jail -b -o jid=233637 default
447 atf_check -o inline:"233637\n" -s exit:0 -x "jls -j 233637 name"
448 atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT unjail default
450 # Basic command-mode tests, with and without jail cleanup
451 atf_check -o inline:"rescue\nusr\n" bectl -r ${zpool}/ROOT \
452 jail default /rescue/rescue ls -1
453 atf_check -o inline:"rescue\nusr\n" bectl -r ${zpool}/ROOT \
454 jail -Uo path=${root} default /rescue/rescue ls -1
455 atf_check [ -f ${root}/rescue/rescue ]
456 atf_check bectl -r ${zpool}/ROOT ujail default
459 atf_check bectl -r ${zpool}/ROOT jail -bo path=${root} default
460 atf_check -o not-empty -x "jls | grep -F \"${root}\""
461 atf_check bectl -r ${zpool}/ROOT ujail default
462 atf_check -s not-exit:0 -x "jls | grep -F \"${root}\""
464 atf_check bectl -r ${zpool}/ROOT jail -b default
465 atf_check bectl -r ${zpool}/ROOT unjail default
466 atf_check -s not-exit:0 -x "jls | grep -F \"${root}\""
467 # 'unjail' by BE name. Force bectl to lookup jail id by the BE name.
468 atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT jail -b default
469 atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT jail -b -o name=bectl_test target
470 atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT unjail target
471 atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT unjail default
472 # cannot unjail an unjailed BE (by either command name)
473 atf_check -e ignore -s not-exit:0 bectl -r ${zpool}/ROOT ujail default
474 atf_check -e ignore -s not-exit:0 bectl -r ${zpool}/ROOT unjail default
477 atf_check bectl -r ${zpool}/ROOT jail -b -o path=${root} -u path default
478 # Ensure that it didn't mount at ${root}
479 atf_check -s not-exit:0 -x "mount | grep -F '${root}'"
480 atf_check bectl -r ${zpool}/ROOT ujail default
483 # If a test has failed, it's possible that the boot environment hasn't
484 # been 'unjail'ed. We want to remove the jail before 'bectl_cleanup'
485 # attempts to destroy the zpool.
488 if [ "$(atf_config_get ci false)" = "true" ] && \
489 [ "$(uname -p)" = "i386" ]; then
490 atf_skip "https://bugs.freebsd.org/249055"
493 if [ "$(atf_config_get ci false)" = "true" ] && \
494 [ "$(uname -p)" = "armv7" ]; then
495 atf_skip "https://bugs.freebsd.org/249229"
498 zpool=$(get_zpool_name)
499 for bootenv in "default" "target" "1234"; do
500 # mountpoint of the boot environment
501 mountpoint="$(bectl -r ${zpool}/ROOT list -H | grep ${bootenv} | awk '{print $3}')"
503 # see if any jail paths match the boot environment mountpoint
504 jailid="$(jls | grep ${mountpoint} | awk '{print $1}')"
506 if [ -z "$jailid" ]; then
512 bectl_cleanup ${zpool}
515 atf_test_case bectl_promotion cleanup
516 bectl_promotion_head()
518 atf_set "descr" "Check bectl promotion upon activation"
519 atf_set "require.user" root
521 bectl_promotion_body()
523 if [ "$(atf_config_get ci false)" = "true" ] && \
524 [ "$(uname -p)" = "i386" ]; then
525 atf_skip "https://bugs.freebsd.org/249055"
528 if [ "$(atf_config_get ci false)" = "true" ] && \
529 [ "$(uname -p)" = "armv7" ]; then
530 atf_skip "https://bugs.freebsd.org/249229"
534 zpool=$(make_zpool_name)
539 bectl_create_deep_setup ${zpool} ${disk} ${mount}
540 atf_check mkdir -p ${root}
542 # Sleeps interspersed to workaround some naming quirks; notably,
543 # bectl will append a serial if two snapshots were created within
544 # the same second, but it can only do that for the one root it's
545 # operating on. It won't check that other roots don't have a snapshot
546 # with the same name, and the promotion will fail.
547 atf_check bectl -r ${zpool}/ROOT rename default A
549 atf_check bectl -r ${zpool}/ROOT create -r -e A B
551 atf_check bectl -r ${zpool}/ROOT create -r -e B C
553 # C should be a clone of B to start with
554 atf_check -o not-inline:"-" zfs list -Hr -o origin ${zpool}/ROOT/C
556 # Activating it should then promote it all the way out of clone-hood.
557 # This entails two promotes internally, as the first would promote it to
558 # a snapshot of A before finally promoting it the second time out of
560 atf_check -o not-empty bectl -r ${zpool}/ROOT activate C
561 atf_check -o inline:"-\n-\n" zfs list -Hr -o origin ${zpool}/ROOT/C
563 bectl_promotion_cleanup()
565 bectl_cleanup $(get_zpool_name)
568 atf_test_case bectl_destroy_bootonce cleanup
569 bectl_destroy_bootonce_head()
571 atf_set "descr" "Check bectl destroy (bootonce)"
572 atf_set "require.user" root
574 bectl_destroy_bootonce_body()
576 if [ "$(atf_config_get ci false)" = "true" ] && \
577 [ "$(uname -p)" = "i386" ]; then
578 atf_skip "https://bugs.freebsd.org/249055"
581 if [ "$(atf_config_get ci false)" = "true" ] && \
582 [ "$(uname -p)" = "armv7" ]; then
583 atf_skip "https://bugs.freebsd.org/249229"
587 zpool=$(make_zpool_name)
594 bectl_create_setup ${zpool} ${disk} ${mount}
595 atf_check -s exit:0 -o empty bectl -r ${zpool}/ROOT create -e default ${be}
597 # Create boot environment and bootonce activate it
598 atf_check -s exit:0 -o ignore bectl -r ${zpool}/ROOT activate -t ${be}
599 atf_check -s exit:0 -o inline:"zfs:${zpool}/ROOT/${be}:\n" zfsbootcfg -z ${zpool}
602 atf_check -s exit:0 -o ignore bectl -r ${zpool}/ROOT destroy ${be}
605 atf_check -s exit:0 -o empty zfsbootcfg -z ${zpool}
607 bectl_destroy_bootonce_cleanup()
609 bectl_cleanup $(get_zpool_name)
612 atf_test_case bectl_rename_bootonce cleanup
613 bectl_rename_bootonce_head()
615 atf_set "descr" "Check bectl destroy (bootonce)"
616 atf_set "require.user" root
618 bectl_rename_bootonce_body()
620 if [ "$(atf_config_get ci false)" = "true" ] && \
621 [ "$(uname -p)" = "i386" ]; then
622 atf_skip "https://bugs.freebsd.org/249055"
625 if [ "$(atf_config_get ci false)" = "true" ] && \
626 [ "$(uname -p)" = "armv7" ]; then
627 atf_skip "https://bugs.freebsd.org/249229"
631 zpool=$(make_zpool_name)
638 bectl_create_setup ${zpool} ${disk} ${mount}
639 atf_check -s exit:0 -o empty bectl -r ${zpool}/ROOT create -e default ${be}
641 # Create boot environment and bootonce activate it
642 atf_check -s exit:0 -o ignore bectl -r ${zpool}/ROOT activate -t ${be}
643 atf_check -s exit:0 -o inline:"zfs:${zpool}/ROOT/${be}:\n" zfsbootcfg -z ${zpool}
646 atf_check -s exit:0 -o ignore bectl -r ${zpool}/ROOT rename ${be} ${be}_renamed
649 atf_check -s exit:0 -o inline:"zfs:${zpool}/ROOT/${be}_renamed:\n" zfsbootcfg -z ${zpool}
651 bectl_rename_bootonce_cleanup()
653 bectl_cleanup $(get_zpool_name)
656 atf_init_test_cases()
658 atf_add_test_case bectl_create
659 atf_add_test_case bectl_destroy
660 atf_add_test_case bectl_export_import
661 atf_add_test_case bectl_list
662 atf_add_test_case bectl_mount
663 atf_add_test_case bectl_rename
664 atf_add_test_case bectl_jail
665 atf_add_test_case bectl_promotion
666 atf_add_test_case bectl_destroy_bootonce
667 atf_add_test_case bectl_rename_bootonce