Skip to content
Permalink
Browse files

improve coverage for verbose without dry-run

  • Loading branch information...
mgerdts committed Jul 9, 2019
1 parent b318f3b commit e3cf0dde39ce054a0ac3e1e2d1d721856fb9ac8a
@@ -143,7 +143,7 @@ tests = ['zfs_create_001_pos', 'zfs_create_002_pos', 'zfs_create_003_pos',
'zfs_create_007_pos', 'zfs_create_008_neg', 'zfs_create_009_neg',
'zfs_create_010_neg', 'zfs_create_011_pos', 'zfs_create_012_pos',
'zfs_create_013_pos', 'zfs_create_014_pos', 'zfs_create_encrypted',
'zfs_create_crypt_combos', 'zfs_create_dryrun']
'zfs_create_crypt_combos', 'zfs_create_dryrun', 'zfs_create_verbose']
tags = ['functional', 'cli_root', 'zfs_create']

[tests/functional/cli_root/zfs_destroy]
@@ -18,7 +18,8 @@ dist_pkgdata_SCRIPTS = \
zfs_create_014_pos.ksh \
zfs_create_encrypted.ksh \
zfs_create_crypt_combos.ksh \
zfs_create_dryrun.ksh
zfs_create_dryrun.ksh \
zfs_create_verbose.ksh

dist_pkgdata_DATA = \
properties.kshlib \
@@ -0,0 +1,165 @@
#!/bin/ksh -p
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#

#
# Copyright 2019 Joyent, Inc.
#

. $STF_SUITE/include/libtest.shlib
. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create_common.kshlib

#
# DESCRIPTION:
# zfs create -P without -n should be verbose about dataset creation.
#
# STRATEGY:
# 1. Attempt to create a file system and a volume using various properties
# and -P
# 2. Exercise the combination of -p and -P.
#

verify_runnable "both"

#
# Verifies that non dry-run commands with parseable output
# - succeed
# - create datasets
# - generate parseable output on stdout
# - output matches expectations
#
function dry_create_parseable
{
typeset -n exp=$1
shift
typeset -a cmd=(zfs create -P "$@")
typeset ds=${cmd[${#cmd[@]} - 1]}
typeset out
typeset -a toks
typeset -a props
typeset found_create=false
typeset create_ancestors=
typeset opt

# Parse the arguments to see if -p was used.
while getopts :PV:b:ospv opt; do
case $opt in
p) create_ancestors=needed ;;
*) continue ;;
esac
done

log_note "$0: ${cmd[@]}"
out=$("${cmd[@]}")
(( $? == 0 )) ||
log_fail "unexpected failure getting stdout from '${cmd[@]}'"
datasetexists "$TESTPOOL/$TESTFS1" ||
log_fail "$TESTPOOL/$TESTFS1 unexpectedly created by '${cmd[@]}'"
echo "$out" | while IFS=$'\t' read -A toks; do
log_note "verifying ${toks[@]}"
case ${toks[0]} in
create_ancestors)
case "$create_ancestors" in
needed)
log_must test "${toks[1]}" == "$ds"
create_ancestors="found ${toks[1]}"
;;
found*)
log_fail "multiple ancestor creation" \
"$create_ancestors and ${toks[1]}"
;;
"")
log_fail "unexpected create_ancestors"
;;
*)
log_fail "impossible error: fix the test"
;;
esac
;;
create)
log_must test "${#toks[@]}" -eq 2
log_must test "${toks[1]}" == "$ds"
found_create="yes, I found create"
;;
property)
log_must test "${#toks[@]}" -eq 3
typeset prop=${toks[1]}
typeset val=${toks[2]}
if [[ -z "${exp[$prop]}" ]]; then
log_fail "unexpectedly got property '$prop'"
fi
# We may not know the exact value a property will take
# on. This is the case for at least refreservation.
if [[ ${exp[$prop]} != "*" ]]; then
log_must test "${exp[$prop]}" == "$val"
fi
unset exp[$prop]
;;
*)
log_fail "Unexpected line ${toks[@]}"
;;
esac
done

log_must test "$found_create" == "yes, I found create"
log_must test "extra props: ${!exp[@]}" == "extra props: "

case "$create_ancestors" in
"")
log_must_busy zfs destroy "$ds"
;;
"found $ds")
log_must_busy zfs destroy -r "$(echo "$ds" | cut -d/ -f1-2)"
;;
needed)
log_fail "Expected but did not find create_ancestors"
;;
*)
log_fail "Unexpected value for create_ancestors:" \
"$create_ancestors"
;;
esac
}

function cleanup
{
if datasetexists "$TESTPOOL/$TESTFS1"; then
log_must_busy zfs destroy -r "$TESTPOOL/$TESTFS1"
fi
}
log_onexit cleanup

log_assert "zfs create -v creates datasets verbosely"

# Parseable output should be parseable.
typeset -A expect
expect=([compression]=on)
dry_create_parseable expect -o compression=on "$TESTPOOL/$TESTFS1"

# Ancestor creation with -p should emit relevant line
expect=([compression]=on)
dry_create_parseable expect -p -o compression=on "$TESTPOOL/$TESTFS1"
expect=([compression]=on)
dry_create_parseable expect -p -o compression=on "$TESTPOOL/$TESTFS1/$TESTVOL"

# Sparse volumes should not get a gratuitous refreservation
expect=([volblocksize]=4096 [volsize]=$((1024 * 1024 * 10)))
dry_create_parseable expect -b 4k -V 10m -s "$TESTPOOL/$TESTFS1"

# Non-sparse volumes should have refreservation
expect=(
[volblocksize]=4096
[volsize]=$((1024 * 1024 * 10))
[refreservation]="*"
)
dry_create_parseable expect -b 4k -V 10m "$TESTPOOL/$TESTFS1"

log_pass "zfs create -v creates datasets verbosely"

0 comments on commit e3cf0dd

Please sign in to comment.
You can’t perform that action at this time.