2 # SPDX-License-Identifier: BSD-2-Clause-FreeBSD
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
29 # Establishes a bectl_create zpool that can be used for some light testing; contains
30 # a 'default' BE and not much else.
37 kldload -n -q zfs || atf_skip "ZFS module not loaded on the current system"
38 atf_check mkdir -p ${mnt}
39 atf_check truncate -s 1G ${disk}
40 atf_check zpool create -o altroot=${mnt} ${zpool} ${disk}
41 atf_check zfs create -o mountpoint=none ${zpool}/ROOT
42 atf_check zfs create -o mountpoint=/ -o canmount=noauto \
50 if zpool get health ${zpool} >/dev/null 2>&1; then
51 zpool destroy ${zpool}
55 atf_test_case bectl_create cleanup
59 atf_set "descr" "Check the various forms of bectl create"
60 atf_set "require.user" root
69 bectl_create_setup ${zpool} ${disk} ${mount}
70 # Test standard creation, creation of a snapshot, and creation from a
72 atf_check bectl -r ${zpool}/ROOT create -e default default2
73 atf_check bectl -r ${zpool}/ROOT create default2@test_snap
74 atf_check bectl -r ${zpool}/ROOT create -e default2@test_snap default3
76 bectl_create_cleanup()
79 bectl_cleanup bectl_test
82 atf_test_case bectl_destroy cleanup
86 atf_set "descr" "Check bectl destroy"
87 atf_set "require.user" root
96 bectl_create_setup ${zpool} ${disk} ${mount}
97 atf_check bectl -r ${zpool}/ROOT create -e default default2
98 atf_check -o not-empty zfs get mountpoint ${zpool}/ROOT/default2
99 atf_check bectl -r ${zpool}/ROOT destroy default2
100 atf_check -e not-empty -s not-exit:0 zfs get mountpoint ${zpool}/ROOT/default2
102 bectl_destroy_cleanup()
105 bectl_cleanup bectl_test
108 atf_test_case bectl_export_import cleanup
109 bectl_export_import_head()
112 atf_set "descr" "Check bectl export and import"
113 atf_set "require.user" root
115 bectl_export_import_body()
122 bectl_create_setup ${zpool} ${disk} ${mount}
123 atf_check -o save:exported bectl -r ${zpool}/ROOT export default
124 atf_check -x "bectl -r ${zpool}/ROOT import default2 < exported"
125 atf_check -o not-empty zfs get mountpoint ${zpool}/ROOT/default2
126 atf_check bectl -r ${zpool}/ROOT destroy default2
127 atf_check -e not-empty -s not-exit:0 zfs get mountpoint \
128 ${zpool}/ROOT/default2
130 bectl_export_import_cleanup()
133 bectl_cleanup bectl_test
136 atf_test_case bectl_list cleanup
140 atf_set "descr" "Check bectl list"
141 atf_set "require.user" root
150 bectl_create_setup ${zpool} ${disk} ${mount}
151 # Test the list functionality, including that BEs come and go away
152 # as they're created and destroyed. Creation and destruction tests
153 # use the 'zfs' utility to verify that they're actually created, so
154 # these are just light tests that 'list' is picking them up.
155 atf_check -o save:list.out bectl -r ${zpool}/ROOT list
156 atf_check -o not-empty grep 'default' list.out
157 atf_check bectl -r ${zpool}/ROOT create -e default default2
158 atf_check -o save:list.out bectl -r ${zpool}/ROOT list
159 atf_check -o not-empty grep 'default2' list.out
160 atf_check bectl -r ${zpool}/ROOT destroy default2
161 atf_check -o save:list.out bectl -r ${zpool}/ROOT list
162 atf_check -s not-exit:0 grep 'default2' list.out
163 # XXX TODO: Formatting checks
168 bectl_cleanup bectl_test
171 atf_test_case bectl_mount cleanup
175 atf_set "descr" "Check bectl mount/unmount"
176 atf_set "require.user" root
186 bectl_create_setup ${zpool} ${disk} ${mount}
187 atf_check mkdir -p ${root}
188 # Test unmount first...
189 atf_check -o not-empty bectl -r ${zpool}/ROOT mount default ${root}
190 atf_check -o not-empty -x "mount | grep '^${zpool}/ROOT/default'"
191 atf_check bectl -r ${zpool}/ROOT unmount default
192 atf_check -s not-exit:0 -x "mount | grep '^${zpool}/ROOT/default'"
194 atf_check -o not-empty bectl -r ${zpool}/ROOT mount default ${root}
195 atf_check -o not-empty -x "mount | grep '^${zpool}/ROOT/default'"
196 atf_check bectl -r ${zpool}/ROOT umount default
197 atf_check -s not-exit:0 -x "mount | grep '^${zpool}/ROOT/default'"
199 bectl_mount_cleanup()
202 bectl_cleanup bectl_test
205 atf_test_case bectl_rename cleanup
209 atf_set "descr" "Check bectl rename"
210 atf_set "require.user" root
219 bectl_create_setup ${zpool} ${disk} ${mount}
220 atf_check bectl -r ${zpool}/ROOT rename default default2
221 atf_check -o not-empty zfs get mountpoint ${zpool}/ROOT/default2
222 atf_check -e not-empty -s not-exit:0 zfs get mountpoint \
223 ${zpool}/ROOT/default
225 bectl_rename_cleanup()
228 bectl_cleanup bectl_test
231 atf_test_case bectl_jail cleanup
235 atf_set "descr" "Check bectl rename"
236 atf_set "require.user" root
246 if [ ! -f /rescue/rescue ]; then
247 atf_skip "This test requires a rescue binary"
249 bectl_create_setup ${zpool} ${disk} ${mount}
250 # Prepare our minimal BE... plop a rescue binary into it
251 atf_check mkdir -p ${root}
252 atf_check -o ignore bectl -r ${zpool}/ROOT mount default ${root}
253 atf_check mkdir -p ${root}/rescue
254 atf_check cp /rescue/rescue ${root}/rescue/rescue
255 atf_check bectl -r ${zpool}/ROOT umount default
257 # Basic command-mode tests, with and without jail cleanup
258 atf_check -o inline:"rescue\n" bectl -r ${zpool}/ROOT \
259 jail default /rescue/rescue ls -1
260 atf_check -o inline:"rescue\n" bectl -r ${zpool}/ROOT \
261 jail -Uo path=${root} default /rescue/rescue ls -1
262 atf_check [ -f ${root}/rescue/rescue ]
263 atf_check bectl -r ${zpool}/ROOT ujail default
266 atf_check bectl -r ${zpool}/ROOT jail -bo path=${root} default
267 atf_check -o not-empty -x "jls | grep -F \"${root}\""
268 atf_check bectl -r ${zpool}/ROOT ujail default
269 atf_check -s not-exit:0 -x "jls | grep -F \"${root}\""
271 atf_check bectl -r ${zpool}/ROOT jail -b default
272 atf_check bectl -r ${zpool}/ROOT unjail default
273 atf_check -s not-exit:0 -x "jls | grep -F \"${root}\""
274 # cannot unjail an unjailed BE (by either command name)
275 atf_check -e ignore -s not-exit:0 bectl -r ${zpool}/ROOT ujail default
276 atf_check -e ignore -s not-exit:0 bectl -r ${zpool}/ROOT unjail default
279 atf_check bectl -r ${zpool}/ROOT jail -b -o path=${root} -u path default
280 # Ensure that it didn't mount at ${root}
281 atf_check -s not-exit:0 -x "mount | grep -F '${root}'"
282 atf_check bectl -r ${zpool}/ROOT ujail default
287 bectl_cleanup bectl_test
290 atf_init_test_cases()
292 atf_add_test_case bectl_create
293 atf_add_test_case bectl_destroy
294 atf_add_test_case bectl_export_import
295 atf_add_test_case bectl_list
296 atf_add_test_case bectl_mount
297 atf_add_test_case bectl_rename
298 atf_add_test_case bectl_jail