xref: /freebsd/contrib/pjdfstest/tests/misc.sh (revision 531c2d7af3cd2e64eec94aa1b19c4b2f16fce515)
140a8ac8fSEnji Cooper# $FreeBSD$
240a8ac8fSEnji Cooper
340a8ac8fSEnji Cooperntest=1
440a8ac8fSEnji Cooper
5*3416500aSEnji Cooperconfdir=${dir:-$(dirname "$0")}
6*3416500aSEnji Coopermaindir=${dir:-$(dirname "$0")}
7*3416500aSEnji Cooperwhile [ ! -r "$confdir/conf" -a "$confdir" != / ]; do
8*3416500aSEnji Cooper	confdir=$(cd $confdir/..; pwd)
9*3416500aSEnji Cooperdone
10*3416500aSEnji Cooperwhile [ "$maindir" != / ]; do
11*3416500aSEnji Cooper	if [ -f "$maindir/pjdfstest" -a -x "$maindir/pjdfstest" ]; then
12*3416500aSEnji Cooper		break
13*3416500aSEnji Cooper	fi
14*3416500aSEnji Cooper	maindir=$(cd $maindir/../; pwd)
15*3416500aSEnji Cooperdone
16*3416500aSEnji Cooperfstest="${maindir}/pjdfstest"
17*3416500aSEnji Cooperif ! . ${confdir}/conf; then
18*3416500aSEnji Cooper	echo "not ok - could not source configuration file"
19*3416500aSEnji Cooper	exit 1
20*3416500aSEnji Cooperfi
21*3416500aSEnji Cooperif [ ! -x $fstest ]; then
22*3416500aSEnji Cooper	echo "not ok - could not find pjdfstest app"
23*3416500aSEnji Cooper	exit 1
24*3416500aSEnji Cooperfi
25*3416500aSEnji Cooper
26*3416500aSEnji Cooperrequires_root()
27*3416500aSEnji Cooper{
28*3416500aSEnji Cooper	case "$(id -u)" in
29*3416500aSEnji Cooper	0)
30*3416500aSEnji Cooper		return 0
3140a8ac8fSEnji Cooper		;;
3240a8ac8fSEnji Cooper	*)
33*3416500aSEnji Cooper		echo "not ok ${ntest} not root"
34*3416500aSEnji Cooper		return 1
3540a8ac8fSEnji Cooper		;;
3640a8ac8fSEnji Cooper	esac
37*3416500aSEnji Cooper}
3840a8ac8fSEnji Cooper
3940a8ac8fSEnji Cooperexpect()
4040a8ac8fSEnji Cooper{
4140a8ac8fSEnji Cooper	e="${1}"
4240a8ac8fSEnji Cooper	shift
4340a8ac8fSEnji Cooper	r=`${fstest} $* 2>/dev/null | tail -1`
4440a8ac8fSEnji Cooper	echo "${r}" | ${GREP} -Eq '^'${e}'$'
4540a8ac8fSEnji Cooper	if [ $? -eq 0 ]; then
4640a8ac8fSEnji Cooper		if [ -z "${todomsg}" ]; then
4740a8ac8fSEnji Cooper			echo "ok ${ntest}"
4840a8ac8fSEnji Cooper		else
4940a8ac8fSEnji Cooper			echo "ok ${ntest} # TODO ${todomsg}"
5040a8ac8fSEnji Cooper		fi
5140a8ac8fSEnji Cooper	else
5240a8ac8fSEnji Cooper		if [ -z "${todomsg}" ]; then
5340a8ac8fSEnji Cooper			echo "not ok ${ntest} - tried '$*', expected ${e}, got ${r}"
5440a8ac8fSEnji Cooper		else
5540a8ac8fSEnji Cooper			echo "not ok ${ntest} # TODO ${todomsg}"
5640a8ac8fSEnji Cooper		fi
5740a8ac8fSEnji Cooper	fi
5840a8ac8fSEnji Cooper	todomsg=""
5940a8ac8fSEnji Cooper	ntest=$((ntest+1))
6040a8ac8fSEnji Cooper}
6140a8ac8fSEnji Cooper
6240a8ac8fSEnji Cooperjexpect()
6340a8ac8fSEnji Cooper{
6440a8ac8fSEnji Cooper	s="${1}"
6540a8ac8fSEnji Cooper	d="${2}"
6640a8ac8fSEnji Cooper	e="${3}"
67*3416500aSEnji Cooper
6840a8ac8fSEnji Cooper	shift 3
69*3416500aSEnji Cooper	r=`jail -s ${s} / pjdfstest 127.0.0.1 /bin/sh -c "cd ${d} && ${fstest} $* 2>/dev/null" 2>/dev/null | tail -1`
7040a8ac8fSEnji Cooper	echo "${r}" | ${GREP} -Eq '^'${e}'$'
7140a8ac8fSEnji Cooper	if [ $? -eq 0 ]; then
7240a8ac8fSEnji Cooper		if [ -z "${todomsg}" ]; then
7340a8ac8fSEnji Cooper			echo "ok ${ntest}"
7440a8ac8fSEnji Cooper		else
7540a8ac8fSEnji Cooper			echo "ok ${ntest} # TODO ${todomsg}"
7640a8ac8fSEnji Cooper		fi
7740a8ac8fSEnji Cooper	else
7840a8ac8fSEnji Cooper		if [ -z "${todomsg}" ]; then
7940a8ac8fSEnji Cooper			echo "not ok ${ntest} - tried '$*', expected ${e}, got ${r}"
8040a8ac8fSEnji Cooper		else
8140a8ac8fSEnji Cooper			echo "not ok ${ntest} # TODO ${todomsg}"
8240a8ac8fSEnji Cooper		fi
8340a8ac8fSEnji Cooper	fi
8440a8ac8fSEnji Cooper	todomsg=""
8540a8ac8fSEnji Cooper	ntest=$((ntest+1))
8640a8ac8fSEnji Cooper}
8740a8ac8fSEnji Cooper
8840a8ac8fSEnji Coopertest_check()
8940a8ac8fSEnji Cooper{
9040a8ac8fSEnji Cooper	if [ $* ]; then
9140a8ac8fSEnji Cooper		if [ -z "${todomsg}" ]; then
9240a8ac8fSEnji Cooper			echo "ok ${ntest}"
9340a8ac8fSEnji Cooper		else
9440a8ac8fSEnji Cooper			echo "ok ${ntest} # TODO ${todomsg}"
9540a8ac8fSEnji Cooper		fi
9640a8ac8fSEnji Cooper	else
9740a8ac8fSEnji Cooper		if [ -z "${todomsg}" ]; then
9840a8ac8fSEnji Cooper			echo "not ok ${ntest}"
9940a8ac8fSEnji Cooper		else
10040a8ac8fSEnji Cooper			echo "not ok ${ntest} # TODO ${todomsg}"
10140a8ac8fSEnji Cooper		fi
10240a8ac8fSEnji Cooper	fi
10340a8ac8fSEnji Cooper	todomsg=""
10440a8ac8fSEnji Cooper	ntest=$((ntest+1))
10540a8ac8fSEnji Cooper}
10640a8ac8fSEnji Cooper
10740a8ac8fSEnji Coopertodo()
10840a8ac8fSEnji Cooper{
10940a8ac8fSEnji Cooper	if [ "${os}" = "${1}" -o "${os}:${fs}" = "${1}" ]; then
11040a8ac8fSEnji Cooper		todomsg="${2}"
11140a8ac8fSEnji Cooper	fi
11240a8ac8fSEnji Cooper}
11340a8ac8fSEnji Cooper
11440a8ac8fSEnji Coopernamegen()
11540a8ac8fSEnji Cooper{
11640a8ac8fSEnji Cooper	echo "pjdfstest_`dd if=/dev/urandom bs=1k count=1 2>/dev/null | openssl md5 | awk '{print $NF}'`"
11740a8ac8fSEnji Cooper}
11840a8ac8fSEnji Cooper
11940a8ac8fSEnji Coopernamegen_len()
12040a8ac8fSEnji Cooper{
12140a8ac8fSEnji Cooper	len="${1}"
12240a8ac8fSEnji Cooper
12340a8ac8fSEnji Cooper	name=""
12440a8ac8fSEnji Cooper	while :; do
12540a8ac8fSEnji Cooper		namepart="`dd if=/dev/urandom bs=64 count=1 2>/dev/null | openssl md5 | awk '{print $NF}'`"
12640a8ac8fSEnji Cooper		name="${name}${namepart}"
12740a8ac8fSEnji Cooper		curlen=`printf "%s" "${name}" | wc -c`
12840a8ac8fSEnji Cooper		[ ${curlen} -lt ${len} ] || break
12940a8ac8fSEnji Cooper	done
13040a8ac8fSEnji Cooper	name=`echo "${name}" | cut -b -${len}`
13140a8ac8fSEnji Cooper	printf "%s" "${name}"
13240a8ac8fSEnji Cooper}
13340a8ac8fSEnji Cooper
13440a8ac8fSEnji Cooper# POSIX:
13540a8ac8fSEnji Cooper# {NAME_MAX}
13640a8ac8fSEnji Cooper#     Maximum number of bytes in a filename (not including terminating null).
13740a8ac8fSEnji Coopernamegen_max()
13840a8ac8fSEnji Cooper{
13940a8ac8fSEnji Cooper	name_max=`${fstest} pathconf . _PC_NAME_MAX`
14040a8ac8fSEnji Cooper	namegen_len ${name_max}
14140a8ac8fSEnji Cooper}
14240a8ac8fSEnji Cooper
14340a8ac8fSEnji Cooper# POSIX:
14440a8ac8fSEnji Cooper# {PATH_MAX}
14540a8ac8fSEnji Cooper#     Maximum number of bytes in a pathname, including the terminating null character.
14640a8ac8fSEnji Cooperdirgen_max()
14740a8ac8fSEnji Cooper{
14840a8ac8fSEnji Cooper	name_max=`${fstest} pathconf . _PC_NAME_MAX`
14940a8ac8fSEnji Cooper	complen=$((name_max/2))
15040a8ac8fSEnji Cooper	path_max=`${fstest} pathconf . _PC_PATH_MAX`
15140a8ac8fSEnji Cooper	# "...including the terminating null character."
15240a8ac8fSEnji Cooper	path_max=$((path_max-1))
15340a8ac8fSEnji Cooper
15440a8ac8fSEnji Cooper	name=""
15540a8ac8fSEnji Cooper	while :; do
15640a8ac8fSEnji Cooper		name="${name}`namegen_len ${complen}`/"
15740a8ac8fSEnji Cooper		curlen=`printf "%s" "${name}" | wc -c`
15840a8ac8fSEnji Cooper		[ ${curlen} -lt ${path_max} ] || break
15940a8ac8fSEnji Cooper	done
16040a8ac8fSEnji Cooper	name=`echo "${name}" | cut -b -${path_max}`
16140a8ac8fSEnji Cooper	name=`echo "${name}" | sed -E 's@/$@x@'`
16240a8ac8fSEnji Cooper	printf "%s" "${name}"
16340a8ac8fSEnji Cooper}
16440a8ac8fSEnji Cooper
16540a8ac8fSEnji Cooperquick_exit()
16640a8ac8fSEnji Cooper{
16740a8ac8fSEnji Cooper	echo "1..1"
16840a8ac8fSEnji Cooper	echo "ok 1"
16940a8ac8fSEnji Cooper	exit 0
17040a8ac8fSEnji Cooper}
17140a8ac8fSEnji Cooper
17240a8ac8fSEnji Coopersupported()
17340a8ac8fSEnji Cooper{
17440a8ac8fSEnji Cooper	case "${1}" in
17540a8ac8fSEnji Cooper	lchmod)
17640a8ac8fSEnji Cooper		if [ "${os}" != "FreeBSD" ]; then
17740a8ac8fSEnji Cooper			return 1
17840a8ac8fSEnji Cooper		fi
17940a8ac8fSEnji Cooper		;;
18040a8ac8fSEnji Cooper	chflags)
18140a8ac8fSEnji Cooper		if [ "${os}" != "FreeBSD" ]; then
18240a8ac8fSEnji Cooper			return 1
18340a8ac8fSEnji Cooper		fi
18440a8ac8fSEnji Cooper		;;
18540a8ac8fSEnji Cooper	chflags_SF_SNAPSHOT)
18640a8ac8fSEnji Cooper		if [ "${os}" != "FreeBSD" -o "${fs}" != "UFS" ]; then
18740a8ac8fSEnji Cooper			return 1
18840a8ac8fSEnji Cooper		fi
18940a8ac8fSEnji Cooper		;;
190*3416500aSEnji Cooper	posix_fallocate)
191*3416500aSEnji Cooper		if [ "${os}" != "FreeBSD" ]; then
192*3416500aSEnji Cooper			return 1
193*3416500aSEnji Cooper		fi
194*3416500aSEnji Cooper		;;
195*3416500aSEnji Cooper	stat_st_birthtime)
196*3416500aSEnji Cooper		case "${os}" in
197*3416500aSEnji Cooper		Darwin|FreeBSD)
198*3416500aSEnji Cooper			;;
199*3416500aSEnji Cooper		*)
200*3416500aSEnji Cooper			return 1
201*3416500aSEnji Cooper			;;
202*3416500aSEnji Cooper		esac
203*3416500aSEnji Cooper		;;
204*3416500aSEnji Cooper	utimensat)
205*3416500aSEnji Cooper		case ${os} in
206*3416500aSEnji Cooper		Darwin)
207*3416500aSEnji Cooper			return 1
208*3416500aSEnji Cooper			;;
209*3416500aSEnji Cooper		esac
210*3416500aSEnji Cooper		;;
21140a8ac8fSEnji Cooper	esac
21240a8ac8fSEnji Cooper	return 0
21340a8ac8fSEnji Cooper}
21440a8ac8fSEnji Cooper
21540a8ac8fSEnji Cooperrequire()
21640a8ac8fSEnji Cooper{
21740a8ac8fSEnji Cooper	if supported ${1}; then
21840a8ac8fSEnji Cooper		return
21940a8ac8fSEnji Cooper	fi
22040a8ac8fSEnji Cooper	quick_exit
22140a8ac8fSEnji Cooper}
22240a8ac8fSEnji Cooper
223*3416500aSEnji Cooperif [ "${os}" = "FreeBSD" ]; then
224*3416500aSEnji Coopermountpoint()
225*3416500aSEnji Cooper{
226*3416500aSEnji Cooper	df $1 | tail -1 | awk '{ print $6 }'
227*3416500aSEnji Cooper}
228*3416500aSEnji Cooper
229*3416500aSEnji Coopermount_options()
230*3416500aSEnji Cooper{
231*3416500aSEnji Cooper	mount -p | awk '$2 == "'$(mountpoint .)'" { print $4 }' | sed -e 's/,/ /g'
232*3416500aSEnji Cooper}
233*3416500aSEnji Cooper
234*3416500aSEnji Coopernfsv4acls()
235*3416500aSEnji Cooper{
236*3416500aSEnji Cooper	if mount_options | grep -q nfsv4acls; then
237*3416500aSEnji Cooper		return 0
238*3416500aSEnji Cooper	fi
239*3416500aSEnji Cooper	return 1
240*3416500aSEnji Cooper}
241*3416500aSEnji Cooper
242*3416500aSEnji Coopernoexec()
243*3416500aSEnji Cooper{
244*3416500aSEnji Cooper	if mount_options | grep -q noexec; then
245*3416500aSEnji Cooper		return 0
246*3416500aSEnji Cooper	fi
247*3416500aSEnji Cooper	return 1
248*3416500aSEnji Cooper}
249*3416500aSEnji Cooper
250*3416500aSEnji Coopernosuid()
251*3416500aSEnji Cooper{
252*3416500aSEnji Cooper	if mount_options | grep -q nosuid; then
253*3416500aSEnji Cooper		return 0
254*3416500aSEnji Cooper	fi
255*3416500aSEnji Cooper	return 1
256*3416500aSEnji Cooper}
257*3416500aSEnji Cooperelse
258*3416500aSEnji Coopermountpoint()
259*3416500aSEnji Cooper{
260*3416500aSEnji Cooper	return 1
261*3416500aSEnji Cooper}
262*3416500aSEnji Coopermount_options()
263*3416500aSEnji Cooper{
264*3416500aSEnji Cooper	return 1
265*3416500aSEnji Cooper}
266*3416500aSEnji Coopernfsv4acls()
267*3416500aSEnji Cooper{
268*3416500aSEnji Cooper	return 1
269*3416500aSEnji Cooper}
270*3416500aSEnji Coopernoexec()
271*3416500aSEnji Cooper{
272*3416500aSEnji Cooper	return 1
273*3416500aSEnji Cooper}
274*3416500aSEnji Coopernosuid()
275*3416500aSEnji Cooper{
276*3416500aSEnji Cooper	return 1
277*3416500aSEnji Cooper}
278*3416500aSEnji Cooperfi
279*3416500aSEnji Cooper
28040a8ac8fSEnji Cooper# usage:
28140a8ac8fSEnji Cooper#	create_file <type> <name>
28240a8ac8fSEnji Cooper#	create_file <type> <name> <mode>
28340a8ac8fSEnji Cooper#	create_file <type> <name> <uid> <gid>
28440a8ac8fSEnji Cooper#	create_file <type> <name> <mode> <uid> <gid>
28540a8ac8fSEnji Coopercreate_file() {
28640a8ac8fSEnji Cooper	type="${1}"
28740a8ac8fSEnji Cooper	name="${2}"
28840a8ac8fSEnji Cooper
28940a8ac8fSEnji Cooper	case "${type}" in
29040a8ac8fSEnji Cooper	none)
29140a8ac8fSEnji Cooper		return
29240a8ac8fSEnji Cooper		;;
29340a8ac8fSEnji Cooper	regular)
29440a8ac8fSEnji Cooper		expect 0 create ${name} 0644
29540a8ac8fSEnji Cooper		;;
29640a8ac8fSEnji Cooper	dir)
29740a8ac8fSEnji Cooper		expect 0 mkdir ${name} 0755
29840a8ac8fSEnji Cooper		;;
29940a8ac8fSEnji Cooper	fifo)
30040a8ac8fSEnji Cooper		expect 0 mkfifo ${name} 0644
30140a8ac8fSEnji Cooper		;;
30240a8ac8fSEnji Cooper	block)
30340a8ac8fSEnji Cooper		expect 0 mknod ${name} b 0644 1 2
30440a8ac8fSEnji Cooper		;;
30540a8ac8fSEnji Cooper	char)
30640a8ac8fSEnji Cooper		expect 0 mknod ${name} c 0644 1 2
30740a8ac8fSEnji Cooper		;;
30840a8ac8fSEnji Cooper	socket)
30940a8ac8fSEnji Cooper		expect 0 bind ${name}
31040a8ac8fSEnji Cooper		;;
31140a8ac8fSEnji Cooper	symlink)
31240a8ac8fSEnji Cooper		expect 0 symlink test ${name}
31340a8ac8fSEnji Cooper		;;
31440a8ac8fSEnji Cooper	esac
31540a8ac8fSEnji Cooper	if [ -n "${3}" -a -n "${4}" -a -n "${5}" ]; then
316*3416500aSEnji Cooper		if [ "${type}" = symlink ]; then
31740a8ac8fSEnji Cooper			expect 0 lchmod ${name} ${3}
318*3416500aSEnji Cooper		else
319*3416500aSEnji Cooper			expect 0 chmod ${name} ${3}
320*3416500aSEnji Cooper		fi
32140a8ac8fSEnji Cooper		expect 0 lchown ${name} ${4} ${5}
32240a8ac8fSEnji Cooper	elif [ -n "${3}" -a -n "${4}" ]; then
32340a8ac8fSEnji Cooper		expect 0 lchown ${name} ${3} ${4}
32440a8ac8fSEnji Cooper	elif [ -n "${3}" ]; then
325*3416500aSEnji Cooper		if [ "${type}" = symlink ]; then
32640a8ac8fSEnji Cooper			expect 0 lchmod ${name} ${3}
327*3416500aSEnji Cooper		else
328*3416500aSEnji Cooper			expect 0 chmod ${name} ${3}
329*3416500aSEnji Cooper		fi
33040a8ac8fSEnji Cooper	fi
33140a8ac8fSEnji Cooper}
33245dc13f1SEnji Cooper
33345dc13f1SEnji Cooper# Tests for whether or not a filesystem is mounted with a particular option
33445dc13f1SEnji Cooper# with -o, e.g. `mount -o noexec`.
33545dc13f1SEnji Cooper#
33645dc13f1SEnji Cooper# Parameters:
33745dc13f1SEnji Cooper# - mount_option - noatime, noexec, etc.
33845dc13f1SEnji Cooper#
33945dc13f1SEnji Cooper# Returns:
34045dc13f1SEnji Cooper# - 0 if mounted with the option.
34145dc13f1SEnji Cooper# - 1 otherwise.
34245dc13f1SEnji Cooperhas_mount_option()
34345dc13f1SEnji Cooper{
34445dc13f1SEnji Cooper	local IFS=,
34545dc13f1SEnji Cooper	local mount_opt
34645dc13f1SEnji Cooper
34745dc13f1SEnji Cooper	local mount_option_search=$1
34845dc13f1SEnji Cooper
34945dc13f1SEnji Cooper	# XXX: mountpoint is defined in .../tests/sys/pjdfstest/tests/conf
35045dc13f1SEnji Cooper	for mount_opt in $(mount -d -p | awk '$2 == "'$mountpoint'" { print $4 }'); do
35145dc13f1SEnji Cooper		if [ "$mount_opt" = "$mount_option_search" ]; then
35245dc13f1SEnji Cooper			return 0
35345dc13f1SEnji Cooper		fi
35445dc13f1SEnji Cooper	done
35545dc13f1SEnji Cooper	return 1
35645dc13f1SEnji Cooper}
35745dc13f1SEnji Cooper
35845dc13f1SEnji Cooper# Filesystem must be mounted with -o exec
35945dc13f1SEnji Cooperrequires_exec()
36045dc13f1SEnji Cooper{
36145dc13f1SEnji Cooper	if has_mount_option noexec; then
36245dc13f1SEnji Cooper		echo "1..0 # SKIP filesystem mounted with -o noexec"
36345dc13f1SEnji Cooper		exit 0
36445dc13f1SEnji Cooper	fi
36545dc13f1SEnji Cooper}
366