1*85723e5eSloli#!/bin/ksh -p
2*85723e5eSloli#
3*85723e5eSloli# CDDL HEADER START
4*85723e5eSloli#
5*85723e5eSloli# This file and its contents are supplied under the terms of the
6*85723e5eSloli# Common Development and Distribution License ("CDDL"), version 1.0.
7*85723e5eSloli# You may only use this file in accordance with the terms of version
8*85723e5eSloli# 1.0 of the CDDL.
9*85723e5eSloli#
10*85723e5eSloli# A full copy of the text of the CDDL should have accompanied this
11*85723e5eSloli# source.  A copy of the CDDL is also available via the Internet at
12*85723e5eSloli# http://www.illumos.org/license/CDDL.
13*85723e5eSloli#
14*85723e5eSloli# CDDL HEADER END
15*85723e5eSloli#
16*85723e5eSloli
17*85723e5eSloli#
18*85723e5eSloli# Copyright 2017, loli10K. All rights reserved.
19*85723e5eSloli#
20*85723e5eSloli
21*85723e5eSloli. $STF_SUITE/include/libtest.shlib
22*85723e5eSloli. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib
23*85723e5eSloli
24*85723e5eSloli#
25*85723e5eSloli# DESCRIPTION:
26*85723e5eSloli# Verify ZFS successfully receive and restore properties.
27*85723e5eSloli#
28*85723e5eSloli# STRATEGY:
29*85723e5eSloli# 1. Create a filesystem.
30*85723e5eSloli# 2. Create a full stream with properties and receive it.
31*85723e5eSloli# 3. Create also an incremental stream without some properties and a truncated
32*85723e5eSloli#    stream.
33*85723e5eSloli# 4. Fail to receive the truncated incremental stream and verify previously
34*85723e5eSloli#    received properties are still present.
35*85723e5eSloli# 5. Receive the complete incremental send stream and verify that sent
36*85723e5eSloli#    properties are successfully received.
37*85723e5eSloli#
38*85723e5eSloli
39*85723e5eSloliverify_runnable "both"
40*85723e5eSloli
41*85723e5eSloliorig=$TESTPOOL/$TESTFS1
42*85723e5eSlolidest=$TESTPOOL/$TESTFS2
43*85723e5eSlolitypeset userprop=$(valid_user_property 8)
44*85723e5eSlolitypeset userval=$(user_property_value 8)
45*85723e5eSlolitypeset streamfile_full=$TESTDIR/streamfile_full.$$
46*85723e5eSlolitypeset streamfile_incr=$TESTDIR/streamfile_incr.$$
47*85723e5eSlolitypeset streamfile_trun=$TESTDIR/streamfile_trun.$$
48*85723e5eSloli
49*85723e5eSlolifunction cleanup
50*85723e5eSloli{
51*85723e5eSloli	log_must rm $streamfile_full
52*85723e5eSloli	log_must rm $streamfile_incr
53*85723e5eSloli	log_must rm $streamfile_trun
54*85723e5eSloli	log_must zfs destroy -rf $orig
55*85723e5eSloli	log_must zfs destroy -rf $dest
56*85723e5eSloli}
57*85723e5eSloli
58*85723e5eSloli#
59*85723e5eSloli# Verify property $2 is set from source $4 on dataset $1 and has value $3.
60*85723e5eSloli#
61*85723e5eSloli# $1 checked dataset
62*85723e5eSloli# $2 user property
63*85723e5eSloli# $3 property value
64*85723e5eSloli# $4 source
65*85723e5eSloli#
66*85723e5eSlolifunction check_prop_source
67*85723e5eSloli{
68*85723e5eSloli	typeset dataset=$1
69*85723e5eSloli	typeset prop=$2
70*85723e5eSloli	typeset value=$3
71*85723e5eSloli	typeset source=$4
72*85723e5eSloli	typeset chk_value=$(get_prop "$prop" "$dataset")
73*85723e5eSloli	typeset chk_source=$(get_source "$prop" "$dataset")
74*85723e5eSloli	if [[ "$chk_value" != "$value" || \
75*85723e5eSloli	    "$chk_source" != "$4" ]]
76*85723e5eSloli	then
77*85723e5eSloli		return 1
78*85723e5eSloli	else
79*85723e5eSloli		return 0
80*85723e5eSloli	fi
81*85723e5eSloli}
82*85723e5eSloli
83*85723e5eSlolilog_assert "ZFS successfully receive and restore properties."
84*85723e5eSlolilog_onexit cleanup
85*85723e5eSloli
86*85723e5eSloli# 1. Create a filesystem.
87*85723e5eSlolilog_must eval "zfs create $orig"
88*85723e5eSlolimntpnt=$(get_prop mountpoint $orig)
89*85723e5eSloli
90*85723e5eSloli# 2. Create a full stream with properties and receive it.
91*85723e5eSlolilog_must eval "zfs set compression='gzip-1' $orig"
92*85723e5eSlolilog_must eval "zfs set '$userprop'='$userval' $orig"
93*85723e5eSlolilog_must eval "zfs snapshot $orig@snap1"
94*85723e5eSlolilog_must eval "zfs send -p $orig@snap1 > $streamfile_full"
95*85723e5eSlolilog_must eval "zfs recv $dest < $streamfile_full"
96*85723e5eSlolilog_must eval "check_prop_source $dest compression 'gzip-1' received"
97*85723e5eSlolilog_must eval "check_prop_source $dest '$userprop' '$userval' received"
98*85723e5eSloli
99*85723e5eSloli# 3. Create also an incremental stream without some properties and a truncated
100*85723e5eSloli#    stream.
101*85723e5eSlolilog_must eval "zfs set compression='gzip-2' $orig"
102*85723e5eSlolilog_must eval "zfs inherit '$userprop' $orig"
103*85723e5eSlolilog_must eval "dd if=/dev/urandom of=$mntpnt/file bs=1024k count=10"
104*85723e5eSlolilog_must eval "zfs snapshot $orig@snap2"
105*85723e5eSlolilog_must eval "zfs send -p -i $orig@snap1 $orig@snap2 > $streamfile_incr"
106*85723e5eSlolilog_must eval "dd if=$streamfile_incr of=$streamfile_trun bs=1024k count=9"
107*85723e5eSlolilog_must eval "zfs snapshot $orig@snap3"
108*85723e5eSlolilog_must eval "zfs send -p -i $orig@snap1 $orig@snap3 > $streamfile_incr"
109*85723e5eSloli
110*85723e5eSloli# 4. Fail to receive the truncated incremental stream and verify previously
111*85723e5eSloli#    received properties are still present.
112*85723e5eSlolilog_mustnot eval "zfs recv -F $dest < $streamfile_trun"
113*85723e5eSlolilog_must eval "check_prop_source $dest compression 'gzip-1' received"
114*85723e5eSlolilog_must eval "check_prop_source $dest '$userprop' '$userval' received"
115*85723e5eSloli
116*85723e5eSloli# 5. Receive the complete incremental send stream and verify that sent
117*85723e5eSloli#    properties are successfully received.
118*85723e5eSlolilog_must eval "zfs recv -F $dest < $streamfile_incr"
119*85723e5eSlolilog_must eval "check_prop_source $dest compression 'gzip-2' received"
120*85723e5eSlolilog_must eval "check_prop_source $dest '$userprop' '-' '-'"
121*85723e5eSloli
122*85723e5eSlolilog_pass "ZFS properties are successfully received and restored."
123