diff usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_compact_001_pos.ksh @ 13899:0bcf78798346

3311 Want a test framework for arbitrary OS unit tests 3312 Add a testrunner package for OS unit tests 3313 Add a testrunner package to convert ZFS tests from STF Reviewed by: Matt Ahrens <matthew.ahrens@delphix.com> Reviewed by: Will Guyette <will.guyette@delphix.com> Reviewed by: Dan Kimmel <dan.kimmel@delphix.com> Reviewed by: Adam Leventhal <ahl@delphix.com> Reviewed by: Henrik Mattson <henrik.mattson@delphix.com> Reviewed by: Sonu Pillai <sonu.pillai@delphix.com> Reviewed by: Christopher Siden <chris.siden@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Richard Lowe <richlowe@richlowe.net> Approved by: Richard Lowe <richlowe@richlowe.net>
author John Wren Kennedy <john.kennedy@delphix.com>
date Wed, 05 Dec 2012 22:04:50 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_compact_001_pos.ksh	Wed Dec 05 22:04:50 2012 -0500
@@ -0,0 +1,243 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2012 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/acl/acl_common.kshlib
+
+#
+# DESCRIPTION:
+#	chmod A{+|-|=} could set compact ACL correctly.
+#
+# STRATEGY:
+#	1. Loop root and non-root user.
+#	2. Get the random compact ACL string.
+#	4. Separately chmod +|-|=
+#	5. Check compact ACL display as expected
+#
+
+verify_runnable "both"
+
+log_assert "chmod A{+|=} should set compact ACL correctly."
+log_onexit cleanup
+
+typeset a_flag=('owner' 'group' 'everyone')
+typeset a_access=('r' 'w' 'x' 'p' 'd' 'D' 'a' 'A' 'R' 'W' 'c' 'C' 'o' 's')
+typeset a_inherit_object=('f' 'd')
+typeset a_inherit_strategy=('i' 'n')
+typeset a_type=('allow' 'deny')
+
+#
+# Get a random item from an array.
+#
+# $1 the base set
+#
+function random_select
+{
+	typeset arr_name=$1
+	typeset -i ind
+
+	eval typeset -i cnt=\${#${arr_name}[@]}
+	((ind = $RANDOM % cnt))
+
+	eval print \${${arr_name}[$ind]}
+}
+
+#
+# Create a random string according to array name, the item number and
+# separated tag.
+#
+# $1 array name where the function get the elements
+# $2 the items number which you want to form the random string
+# $3 the separated tag
+#
+function form_random_str
+{
+	typeset arr_name=$1
+	typeset -i count=${2:-1}
+	typeset sep=${3:-""}
+
+	typeset str=""
+	while ((count > 0)); do
+		str="${str}$(random_select $arr_name)${sep}"
+
+		((count -= 1))
+	done
+
+	print $str
+}
+
+#
+# According to the input ACE access,ACE type, and inherit flags, return the
+# expect compact ACE that could be used by chmod A0{+|=}'.
+#
+# $1 ACE flag which is owner, group, or everyone
+# $2 ACE access generated by the element of a_access
+# $3 ACE inherit_object generated by the element of a_inherit_object
+# $4 ACE inherit_strategy generated by the element of a_inherit_strategy
+# $5 ACE type which is allow or deny
+#
+function cal_ace
+{
+	typeset acl_flag=$1
+	typeset acl_access=$2
+	typeset acl_inherit_object=$3
+	typeset acl_inherit_strategy=$4
+	typeset acl_type=$5
+
+	tmp_ace=${acl_flag}@:
+
+	for element in ${a_access[@]} ; do
+		if [[ $acl_access == *"$element"* ]]; then
+			tmp_ace="${tmp_ace}${element}"
+		else
+			tmp_ace="${tmp_ace}-"
+		fi
+	done
+	tmp_ace=${tmp_ace}:
+
+	for element in ${a_inherit_object[@]} ; do
+		if [[ $acl_inherit_object == *"$element"* ]]; then
+			tmp_ace="${tmp_ace}${element}"
+		else
+			tmp_ace="${tmp_ace}-"
+		fi
+	done
+	for element in ${a_inherit_strategy[@]} ; do
+		if [[ $acl_inherit_strategy == *"$element"* ]]; then
+			tmp_ace="${tmp_ace}${element}"
+		else
+			tmp_ace="${tmp_ace}-"
+		fi
+	done
+
+	tmp_ace=${tmp_ace}---:${acl_type}
+
+	echo "${tmp_ace}"
+}
+
+#
+# Check if chmod set the compact ACE correctly.
+#
+function check_test_result
+{
+	typeset node=$1
+	typeset acl_flag=$2
+	typeset acl_access=$3
+	typeset acl_inherit_object=$4
+	typeset acl_inherit_strategy=$5
+	typeset acl_type=$6
+
+	typeset expect_ace=$(cal_ace "$acl_flag" "$acl_access" \
+	    "$acl_inherit_object" "$acl_inherit_strategy" "$acl_type")
+
+	typeset cur_ace=$(get_ACE $node 0 "compact")
+
+	if [[ $cur_ace != $expect_ace ]]; then
+		log_fail "FAIL: Current map($cur_ace) !=  \
+		    expected ace($expect_ace)"
+	fi
+}
+
+function test_chmod_map
+{
+	typeset node=$1
+	typeset acl_flag acl_access acl_inherit_object acl_inherit_strategy \
+	    acl_type
+	typeset -i cnt
+
+	if ((${#node} == 0)); then
+		log_fail "FAIL: file name or directroy name is not defined."
+	fi
+
+        # Get ACL flag, access & type
+	acl_flag=$(form_random_str a_flag)
+	((cnt = ($RANDOM % ${#a_access[@]}) + 1))
+	acl_access=$(form_random_str a_access $cnt)
+	acl_access=${acl_access%/}
+	acl_type=$(form_random_str a_type 1)
+
+	acl_spec=${acl_flag}@:${acl_access}
+	if [[ -d $node ]]; then
+		# Get ACL inherit_object & inherit_strategy
+		((cnt = ($RANDOM % ${#a_inherit_object[@]}) + 1))
+		acl_inherit_object=$(form_random_str a_inherit_object $cnt)
+		((cnt = ($RANDOM % ${#a_inherit_strategy[@]}) + 1))
+		acl_inherit_strategy=$(form_random_str a_inherit_strategy $cnt)
+		acl_spec=${acl_spec}:${acl_inherit_object}${acl_inherit_strategy}
+	fi
+	acl_spec=${acl_spec}:${acl_type}
+
+	# Set the initial map and back the initial ACEs
+	typeset orig_ace=/tmp/orig_ace.$$
+	typeset cur_ace=/tmp/cur_ace.$$
+
+	for operator in "A0+" "A0="; do
+		log_must usr_exec eval "$LS -Vd $node > $orig_ace"
+
+		# To "A=", firstly add one ACE which can't modify map
+		if [[ $operator == "A0=" ]]; then
+			log_must $CHMOD A0+user:$ZFS_ACL_OTHER1:execute:deny \
+			    $node
+		fi
+		log_must usr_exec $CHMOD ${operator}${acl_spec} $node
+
+		check_test_result "$node" "$acl_flag" "$acl_access" \
+		    "$acl_inherit_object" "$acl_inherit_strategy" "$acl_type"
+
+		# Check "chmod A-"
+		log_must usr_exec $CHMOD A0- $node
+		log_must usr_exec eval "$LS -Vd $node > $cur_ace"
+
+		$DIFF $orig_ace $cur_ace
+		[[ $? -ne 0 ]] && log_fail "FAIL: 'chmod A-' failed."
+	done
+
+	[[ -f $orig_ace ]] && log_must usr_exec $RM -f $orig_ace
+	[[ -f $cur_ace ]] && log_must usr_exec $RM -f $cur_ace
+}
+
+for user in root $ZFS_ACL_STAFF1; do
+	set_cur_usr $user
+
+	typeset -i loop_cnt=2
+	while ((loop_cnt > 0)); do
+		log_must usr_exec $TOUCH $testfile
+		test_chmod_map $testfile
+		log_must $RM -f $testfile
+
+		log_must usr_exec $MKDIR $testdir
+		test_chmod_map $testdir
+		log_must $RM -rf $testdir
+
+		((loop_cnt -= 1))
+	done
+done
+
+log_pass "chmod A{+|=} set compact ACL correctly."