]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sbin/bectl/tests/bectl_test.sh
MFC r340507-r340508, r340592-r340594, r340635-r340636: bectl(8) fixes
[FreeBSD/FreeBSD.git] / sbin / bectl / tests / bectl_test.sh
1 #
2 # SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 #
4 # Copyright (c) 2018 Kyle Evans <kevans@FreeBSD.org>
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
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.
14 #
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
25 # SUCH DAMAGE.
26 #
27 # $FreeBSD$
28
29 # Establishes a bectl_create zpool that can be used for some light testing; contains
30 # a 'default' BE and not much else.
31 bectl_create_setup()
32 {
33         zpool=$1
34         disk=$2
35         mnt=$3
36
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 \
43             ${zpool}/ROOT/default
44 }
45
46 bectl_cleanup()
47 {
48         zpool=$1
49
50         if zpool get health ${zpool} >/dev/null 2>&1; then
51                 zpool destroy ${zpool}
52         fi
53 }
54
55 atf_test_case bectl_create cleanup
56 bectl_create_head()
57 {
58
59         atf_set "descr" "Check the various forms of bectl create"
60         atf_set "require.user" root
61 }
62 bectl_create_body()
63 {
64         cwd=$(realpath .)
65         zpool=bectl_test
66         disk=${cwd}/disk.img
67         mount=${cwd}/mnt
68
69         bectl_create_setup ${zpool} ${disk} ${mount}
70         # Test standard creation, creation of a snapshot, and creation from a
71         # snapshot.
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
75 }
76 bectl_create_cleanup()
77 {
78
79         bectl_cleanup bectl_test
80 }
81
82 atf_test_case bectl_destroy cleanup
83 bectl_destroy_head()
84 {
85
86         atf_set "descr" "Check bectl destroy"
87         atf_set "require.user" root
88 }
89 bectl_destroy_body()
90 {
91         cwd=$(realpath .)
92         zpool=bectl_test
93         disk=${cwd}/disk.img
94         mount=${cwd}/mnt
95
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
101 }
102 bectl_destroy_cleanup()
103 {
104
105         bectl_cleanup bectl_test
106 }
107
108 atf_test_case bectl_export_import cleanup
109 bectl_export_import_head()
110 {
111
112         atf_set "descr" "Check bectl export and import"
113         atf_set "require.user" root
114 }
115 bectl_export_import_body()
116 {
117         cwd=$(realpath .)
118         zpool=bectl_test
119         disk=${cwd}/disk.img
120         mount=${cwd}/mnt
121
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
129 }
130 bectl_export_import_cleanup()
131 {
132
133         bectl_cleanup bectl_test
134 }
135
136 atf_test_case bectl_list cleanup
137 bectl_list_head()
138 {
139
140         atf_set "descr" "Check bectl list"
141         atf_set "require.user" root
142 }
143 bectl_list_body()
144 {
145         cwd=$(realpath .)
146         zpool=bectl_test
147         disk=${cwd}/disk.img
148         mount=${cwd}/mnt
149
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
164 }
165 bectl_list_cleanup()
166 {
167
168         bectl_cleanup bectl_test
169 }
170
171 atf_test_case bectl_mount cleanup
172 bectl_mount_head()
173 {
174
175         atf_set "descr" "Check bectl mount/unmount"
176         atf_set "require.user" root
177 }
178 bectl_mount_body()
179 {
180         cwd=$(realpath .)
181         zpool=bectl_test
182         disk=${cwd}/disk.img
183         mount=${cwd}/mnt
184         root=${mount}/root
185
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'"
193         # Then umount!
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'"
198 }
199 bectl_mount_cleanup()
200 {
201
202         bectl_cleanup bectl_test
203 }
204
205 atf_test_case bectl_rename cleanup
206 bectl_rename_head()
207 {
208
209         atf_set "descr" "Check bectl rename"
210         atf_set "require.user" root
211 }
212 bectl_rename_body()
213 {
214         cwd=$(realpath .)
215         zpool=bectl_test
216         disk=${cwd}/disk.img
217         mount=${cwd}/mnt
218
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
224 }
225 bectl_rename_cleanup()
226 {
227
228         bectl_cleanup bectl_test
229 }
230
231 atf_test_case bectl_jail cleanup
232 bectl_jail_head()
233 {
234
235         atf_set "descr" "Check bectl rename"
236         atf_set "require.user" root
237 }
238 bectl_jail_body()
239 {
240         cwd=$(realpath .)
241         zpool=bectl_test
242         disk=${cwd}/disk.img
243         mount=${cwd}/mnt
244         root=${mount}/root
245
246         if [ ! -f /rescue/rescue ]; then
247                 atf_skip "This test requires a rescue binary"
248         fi
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
256
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
264
265         # Batch mode tests
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}\""
270         # 'unjail' naming
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
277
278         # set+unset
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
283 }
284 bectl_jail_cleanup()
285 {
286
287         bectl_cleanup bectl_test
288 }
289
290 atf_init_test_cases()
291 {
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
299 }