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