1*a629ded1SLOLi#!/bin/ksh -p
2*a629ded1SLOLi#
3*a629ded1SLOLi# This file and its contents are supplied under the terms of the
4*a629ded1SLOLi# Common Development and Distribution License ("CDDL"), version 1.0.
5*a629ded1SLOLi# You may only use this file in accordance with the terms of version
6*a629ded1SLOLi# 1.0 of the CDDL.
7*a629ded1SLOLi#
8*a629ded1SLOLi# A full copy of the text of the CDDL should have accompanied this
9*a629ded1SLOLi# source.  A copy of the CDDL is also available via the Internet at
10*a629ded1SLOLi# http://www.illumos.org/license/CDDL.
11*a629ded1SLOLi#
12*a629ded1SLOLi
13*a629ded1SLOLi#
14*a629ded1SLOLi# Copyright 2017, loli10K <ezomori.nozomu@gmail.com>. All rights reserved.
15*a629ded1SLOLi# Copyright 2019 Joyent, Inc.
16*a629ded1SLOLi#
17*a629ded1SLOLi
18*a629ded1SLOLi. $STF_SUITE/include/libtest.shlib
19*a629ded1SLOLi
20*a629ded1SLOLi#
21*a629ded1SLOLi# DESCRIPTION:
22*a629ded1SLOLi# 'zfs diff -F' shows different object types correctly.
23*a629ded1SLOLi#
24*a629ded1SLOLi# STRATEGY:
25*a629ded1SLOLi# 1. Prepare a dataset
26*a629ded1SLOLi# 2. Create different objects and verify 'zfs diff -F' shows the correct type
27*a629ded1SLOLi#
28*a629ded1SLOLi
29*a629ded1SLOLiverify_runnable "both"
30*a629ded1SLOLi
31*a629ded1SLOLifunction cleanup
32*a629ded1SLOLi{
33*a629ded1SLOLi	log_must zfs destroy -r "$DATASET"
34*a629ded1SLOLi	rm -f "$FILEDIFF"
35*a629ded1SLOLi}
36*a629ded1SLOLi
37*a629ded1SLOLi#
38*a629ded1SLOLi# Verify object at $path is of type $symbol using 'zfs diff -F'
39*a629ded1SLOLi# Valid types are:
40*a629ded1SLOLi# * B (Block device)
41*a629ded1SLOLi# * C (Character device)
42*a629ded1SLOLi# * / (Directory)
43*a629ded1SLOLi# * > (Door)
44*a629ded1SLOLi# * | (Named pipe)
45*a629ded1SLOLi# * @ (Symbolic link)
46*a629ded1SLOLi# * P (Event port)
47*a629ded1SLOLi# * = (Socket)
48*a629ded1SLOLi# * F (Regular file)
49*a629ded1SLOLi#
50*a629ded1SLOLifunction verify_object_class # <path> <symbol>
51*a629ded1SLOLi{
52*a629ded1SLOLi	path="$1"
53*a629ded1SLOLi	symbol="$2"
54*a629ded1SLOLi
55*a629ded1SLOLi	log_must eval "zfs diff -F $TESTSNAP1 $TESTSNAP2 > $FILEDIFF"
56*a629ded1SLOLi	diffsym="$(nawk -v path="$path" '$NF == path { print $2 }' < $FILEDIFF)"
57*a629ded1SLOLi	if [[ "$diffsym" != "$symbol" ]]; then
58*a629ded1SLOLi		log_fail "Unexpected type for $path ('$diffsym' != '$symbol')"
59*a629ded1SLOLi	else
60*a629ded1SLOLi		log_note "Object $path type is correctly displayed as '$symbol'"
61*a629ded1SLOLi	fi
62*a629ded1SLOLi
63*a629ded1SLOLi	log_must zfs destroy "$TESTSNAP1"
64*a629ded1SLOLi	log_must zfs destroy "$TESTSNAP2"
65*a629ded1SLOLi}
66*a629ded1SLOLi
67*a629ded1SLOLilog_assert "'zfs diff -F' should show different object types correctly."
68*a629ded1SLOLilog_onexit cleanup
69*a629ded1SLOLi
70*a629ded1SLOLiDATASET="$TESTPOOL/$TESTFS/fs"
71*a629ded1SLOLiTESTSNAP1="$DATASET@snap1"
72*a629ded1SLOLiTESTSNAP2="$DATASET@snap2"
73*a629ded1SLOLiFILEDIFF="$TESTDIR/zfs-diff.txt"
74*a629ded1SLOLiMAJOR=$(stat -c %t /dev/null)
75*a629ded1SLOLiMINOR=$(stat -c %T /dev/null)
76*a629ded1SLOLi
77*a629ded1SLOLi# 1. Prepare a dataset
78*a629ded1SLOLilog_must zfs create $DATASET
79*a629ded1SLOLiMNTPOINT="$(get_prop mountpoint $DATASET)"
80*a629ded1SLOLilog_must zfs set devices=on $DATASET
81*a629ded1SLOLilog_must zfs set xattr=on $DATASET
82*a629ded1SLOLi
83*a629ded1SLOLi# 2. Create different objects and verify 'zfs diff -F' shows the correct type
84*a629ded1SLOLi# 2. F (Regular file)
85*a629ded1SLOLilog_must zfs snapshot "$TESTSNAP1"
86*a629ded1SLOLilog_must touch "$MNTPOINT/file"
87*a629ded1SLOLilog_must zfs snapshot "$TESTSNAP2"
88*a629ded1SLOLiverify_object_class "$MNTPOINT/file" "F"
89*a629ded1SLOLi
90*a629ded1SLOLi# 2. @ (Symbolic link)
91*a629ded1SLOLilog_must zfs snapshot "$TESTSNAP1"
92*a629ded1SLOLilog_must ln -s "$MNTPOINT/file" "$MNTPOINT/link"
93*a629ded1SLOLilog_must zfs snapshot "$TESTSNAP2"
94*a629ded1SLOLiverify_object_class "$MNTPOINT/link" "@"
95*a629ded1SLOLi
96*a629ded1SLOLi# 2. B (Block device)
97*a629ded1SLOLilog_must zfs snapshot "$TESTSNAP1"
98*a629ded1SLOLilog_must mknod "$MNTPOINT/bdev" b $MAJOR $MINOR
99*a629ded1SLOLilog_must zfs snapshot "$TESTSNAP2"
100*a629ded1SLOLiverify_object_class "$MNTPOINT/bdev" "B"
101*a629ded1SLOLi
102*a629ded1SLOLi# 2. C (Character device)
103*a629ded1SLOLilog_must zfs snapshot "$TESTSNAP1"
104*a629ded1SLOLilog_must mknod "$MNTPOINT/cdev" c $MAJOR $MINOR
105*a629ded1SLOLilog_must zfs snapshot "$TESTSNAP2"
106*a629ded1SLOLiverify_object_class "$MNTPOINT/cdev" "C"
107*a629ded1SLOLi
108*a629ded1SLOLi# 2. | (Named pipe)
109*a629ded1SLOLilog_must zfs snapshot "$TESTSNAP1"
110*a629ded1SLOLilog_must mknod "$MNTPOINT/fifo" p
111*a629ded1SLOLilog_must zfs snapshot "$TESTSNAP2"
112*a629ded1SLOLiverify_object_class "$MNTPOINT/fifo" "|"
113*a629ded1SLOLi
114*a629ded1SLOLi# 2. / (Directory)
115*a629ded1SLOLilog_must zfs snapshot "$TESTSNAP1"
116*a629ded1SLOLilog_must mkdir "$MNTPOINT/dir"
117*a629ded1SLOLilog_must zfs snapshot "$TESTSNAP2"
118*a629ded1SLOLiverify_object_class "$MNTPOINT/dir" "/"
119*a629ded1SLOLi
120*a629ded1SLOLi# 2. = (Socket)
121*a629ded1SLOLilog_must zfs snapshot "$TESTSNAP1"
122*a629ded1SLOLilog_must $STF_SUITE/tests/functional/cli_root/zfs_diff/socket "$MNTPOINT/sock"
123*a629ded1SLOLilog_must zfs snapshot "$TESTSNAP2"
124*a629ded1SLOLiverify_object_class "$MNTPOINT/sock" "="
125*a629ded1SLOLi
126*a629ded1SLOLilog_pass "'zfs diff -F' shows different object types correctly."
127