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