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