xref: /freebsd/contrib/netbsd-tests/fs/psshfs/t_psshfs.sh (revision d370fd1cd8fc69e87dc63f4f4a82e5a8b4956c93)
1*cdebaff8SEnji Cooper# $NetBSD: t_psshfs.sh,v 1.8 2016/09/05 08:53:57 christos Exp $
257718be8SEnji Cooper#
357718be8SEnji Cooper# Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
457718be8SEnji Cooper# All rights reserved.
557718be8SEnji Cooper#
657718be8SEnji Cooper# Redistribution and use in source and binary forms, with or without
757718be8SEnji Cooper# modification, are permitted provided that the following conditions
857718be8SEnji Cooper# are met:
957718be8SEnji Cooper# 1. Redistributions of source code must retain the above copyright
1057718be8SEnji Cooper#    notice, this list of conditions and the following disclaimer.
1157718be8SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright
1257718be8SEnji Cooper#    notice, this list of conditions and the following disclaimer in the
1357718be8SEnji Cooper#    documentation and/or other materials provided with the distribution.
1457718be8SEnji Cooper#
1557718be8SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
1657718be8SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
1757718be8SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1857718be8SEnji Cooper# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
1957718be8SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2057718be8SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2157718be8SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2257718be8SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2357718be8SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2457718be8SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2557718be8SEnji Cooper# POSSIBILITY OF SUCH DAMAGE.
2657718be8SEnji Cooper#
2757718be8SEnji Cooper
2857718be8SEnji Cooper# -------------------------------------------------------------------------
2957718be8SEnji Cooper# Auxiliary functions.
3057718be8SEnji Cooper# -------------------------------------------------------------------------
3157718be8SEnji Cooper
3257718be8SEnji Cooper#
3357718be8SEnji Cooper# Skips the calling test case if puffs is not supported in the kernel
3457718be8SEnji Cooper# or if the calling user does not have the necessary permissions to mount
3557718be8SEnji Cooper# file systems.
3657718be8SEnji Cooper#
3757718be8SEnji Cooperrequire_puffs() {
3857718be8SEnji Cooper	case "$($(atf_get_srcdir)/h_have_puffs)" in
3957718be8SEnji Cooper		eacces)
4057718be8SEnji Cooper			atf_skip "Cannot open /dev/puffs for read/write access"
4157718be8SEnji Cooper			;;
4257718be8SEnji Cooper		enxio)
4357718be8SEnji Cooper			atf_skip "puffs support not built into the kernel"
4457718be8SEnji Cooper			;;
4557718be8SEnji Cooper		failed)
4657718be8SEnji Cooper			atf_skip "Unknown error trying to access /dev/puffs"
4757718be8SEnji Cooper			;;
4857718be8SEnji Cooper		yes)
4957718be8SEnji Cooper			;;
5057718be8SEnji Cooper		*)
5157718be8SEnji Cooper			atf_fail "Unknown value returned by h_have_puffs"
5257718be8SEnji Cooper			;;
5357718be8SEnji Cooper	esac
5457718be8SEnji Cooper
5557718be8SEnji Cooper	if [ $(id -u) -ne 0 -a $(sysctl -n vfs.generic.usermount) -eq 0 ]
5657718be8SEnji Cooper	then
5757718be8SEnji Cooper		atf_skip "Regular users cannot mount file systems" \
5857718be8SEnji Cooper		    "(vfs.generic.usermount is set to 0)"
5957718be8SEnji Cooper	fi
6057718be8SEnji Cooper}
6157718be8SEnji Cooper
6257718be8SEnji Cooper#
6357718be8SEnji Cooper# Starts a SSH server and sets up the client to access it.
6457718be8SEnji Cooper# Authentication is allowed and done using an RSA key exclusively, which
6557718be8SEnji Cooper# is generated on the fly as part of the test case.
6657718be8SEnji Cooper# XXX: Ideally, all the tests in this test program should be able to share
6757718be8SEnji Cooper# the generated key, because creating it can be a very slow process on some
6857718be8SEnji Cooper# machines.
6957718be8SEnji Cooper#
7057718be8SEnji Cooperstart_ssh() {
7157718be8SEnji Cooper	echo "Setting up SSH server configuration"
7257718be8SEnji Cooper	sed -e "s,@SRCDIR@,$(atf_get_srcdir),g" -e "s,@WORKDIR@,$(pwd),g" \
7357718be8SEnji Cooper	    $(atf_get_srcdir)/sshd_config.in >sshd_config || \
7457718be8SEnji Cooper	    atf_fail "Failed to create sshd_config"
7557718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty cp /usr/libexec/sftp-server .
7657718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty \
7757718be8SEnji Cooper	    cp $(atf_get_srcdir)/ssh_host_key .
7857718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty \
7957718be8SEnji Cooper	    cp $(atf_get_srcdir)/ssh_host_key.pub .
8057718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty chmod 400 ssh_host_key
8157718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty chmod 444 ssh_host_key.pub
8257718be8SEnji Cooper
8357718be8SEnji Cooper	/usr/sbin/sshd -e -f ./sshd_config >sshd.log 2>&1 &
8457718be8SEnji Cooper	while [ ! -f sshd.pid ]; do
8557718be8SEnji Cooper		sleep 0.01
8657718be8SEnji Cooper	done
8757718be8SEnji Cooper	echo "SSH server started (pid $(cat sshd.pid))"
8857718be8SEnji Cooper
8957718be8SEnji Cooper	echo "Setting up SSH client configuration"
9057718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty \
9157718be8SEnji Cooper	    ssh-keygen -f ssh_user_key -t rsa -b 1024 -N "" -q
9257718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty \
9357718be8SEnji Cooper	    cp ssh_user_key.pub authorized_keys
9457718be8SEnji Cooper	echo "[localhost]:10000,[127.0.0.1]:10000,[::1]:10000" \
9557718be8SEnji Cooper	    "$(cat $(atf_get_srcdir)/ssh_host_key.pub)" >known_hosts || \
9657718be8SEnji Cooper	    atf_fail "Failed to create known_hosts"
9757718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty chmod 600 authorized_keys
9857718be8SEnji Cooper	sed -e "s,@SRCDIR@,$(atf_get_srcdir),g" -e "s,@WORKDIR@,$(pwd),g" \
9957718be8SEnji Cooper	    $(atf_get_srcdir)/ssh_config.in >ssh_config || \
10057718be8SEnji Cooper	    atf_fail "Failed to create ssh_config"
10157718be8SEnji Cooper}
10257718be8SEnji Cooper
10357718be8SEnji Cooper#
10457718be8SEnji Cooper# Stops the SSH server spawned by start_ssh and prints diagnosis data.
10557718be8SEnji Cooper#
10657718be8SEnji Cooperstop_ssh() {
10757718be8SEnji Cooper	if [ -f sshd.pid ]; then
10857718be8SEnji Cooper		echo "Stopping SSH server (pid $(cat sshd.pid))"
10957718be8SEnji Cooper		kill $(cat sshd.pid)
11057718be8SEnji Cooper	fi
11157718be8SEnji Cooper	if [ -f sshd.log ]; then
11257718be8SEnji Cooper		echo "Server output was:"
11357718be8SEnji Cooper		sed -e 's,^,    ,' sshd.log
11457718be8SEnji Cooper	fi
11557718be8SEnji Cooper}
11657718be8SEnji Cooper
11757718be8SEnji Cooper#
11857718be8SEnji Cooper# Mounts the given source directory on the target directory using psshfs.
11957718be8SEnji Cooper# Both directories are supposed to live on the current directory.
12057718be8SEnji Cooper#
12157718be8SEnji Coopermount_psshfs() {
12257718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty \
12357718be8SEnji Cooper	    mount -t psshfs -o -F=$(pwd)/ssh_config localhost:$(pwd)/${1} ${2}
12457718be8SEnji Cooper}
12557718be8SEnji Cooper
12657718be8SEnji Cooper# -------------------------------------------------------------------------
12757718be8SEnji Cooper# The test cases.
12857718be8SEnji Cooper# -------------------------------------------------------------------------
12957718be8SEnji Cooper
13057718be8SEnji Cooperatf_test_case inode_nos cleanup
13157718be8SEnji Cooperinode_nos_head() {
13257718be8SEnji Cooper	atf_set "descr" "Checks that different files get different inode" \
13357718be8SEnji Cooper	    "numbers"
13457718be8SEnji Cooper}
13557718be8SEnji Cooperinode_nos_body() {
13657718be8SEnji Cooper	require_puffs
13757718be8SEnji Cooper
13857718be8SEnji Cooper	start_ssh
13957718be8SEnji Cooper
14057718be8SEnji Cooper	mkdir root
14157718be8SEnji Cooper	mkdir root/dir
14257718be8SEnji Cooper	touch root/dir/file1
14357718be8SEnji Cooper	touch root/dir/file2
14457718be8SEnji Cooper	touch root/file3
14557718be8SEnji Cooper	touch root/file4
14657718be8SEnji Cooper
14757718be8SEnji Cooper	cat >ne_inodes.sh <<EOF
14857718be8SEnji Cooper#! /bin/sh
14957718be8SEnji Cooper#
15057718be8SEnji Cooper# Compares the inodes of the two given files and returns true if they are
15157718be8SEnji Cooper# different; false otherwise.
15257718be8SEnji Cooper#
15357718be8SEnji Cooperset -e
15457718be8SEnji Cooperino1=\$(stat -f %i \${1})
15557718be8SEnji Cooperino2=\$(stat -f %i \${2})
15657718be8SEnji Coopertest \${ino1} -ne \${ino2}
15757718be8SEnji CooperEOF
15857718be8SEnji Cooper	chmod +x ne_inodes.sh
15957718be8SEnji Cooper
16057718be8SEnji Cooper	mkdir mnt
16157718be8SEnji Cooper	mount_psshfs root mnt
16257718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty \
16357718be8SEnji Cooper	    ./ne_inodes.sh root/dir root/dir/file1
16457718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty \
16557718be8SEnji Cooper	    ./ne_inodes.sh root/dir root/dir/file2
16657718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty \
16757718be8SEnji Cooper	    ./ne_inodes.sh root/dir/file1 root/dir/file2
16857718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty \
16957718be8SEnji Cooper	    ./ne_inodes.sh root/file3 root/file4
17057718be8SEnji Cooper}
17157718be8SEnji Cooperinode_nos_cleanup() {
17257718be8SEnji Cooper	umount mnt
17357718be8SEnji Cooper	stop_ssh
17457718be8SEnji Cooper}
17557718be8SEnji Cooper
17657718be8SEnji Cooperatf_test_case pwd cleanup
17757718be8SEnji Cooperpwd_head() {
17857718be8SEnji Cooper	atf_set "descr" "Checks that pwd works correctly"
17957718be8SEnji Cooper}
18057718be8SEnji Cooperpwd_body() {
18157718be8SEnji Cooper	require_puffs
18257718be8SEnji Cooper
18357718be8SEnji Cooper	start_ssh
18457718be8SEnji Cooper
18557718be8SEnji Cooper	mkdir root
18657718be8SEnji Cooper	mkdir root/dir
18757718be8SEnji Cooper
18857718be8SEnji Cooper	mkdir mnt
18957718be8SEnji Cooper	atf_check -s eq:0 -o save:stdout -e empty \
19057718be8SEnji Cooper	    -x 'echo $(cd mnt && /bin/pwd)/dir'
19157718be8SEnji Cooper	mv stdout expout
19257718be8SEnji Cooper	mount_psshfs root mnt
19357718be8SEnji Cooper	atf_check -s eq:0 -o file:expout -e empty \
19457718be8SEnji Cooper	    -x 'cd mnt/dir && ls .. >/dev/null && /bin/pwd'
19557718be8SEnji Cooper}
19657718be8SEnji Cooperpwd_cleanup() {
19757718be8SEnji Cooper	umount mnt
19857718be8SEnji Cooper	stop_ssh
19957718be8SEnji Cooper}
20057718be8SEnji Cooper
20157718be8SEnji Cooperatf_test_case ls cleanup
20257718be8SEnji Cooperls_head() {
20357718be8SEnji Cooper	atf_set "descr" "Uses ls, attempts to exercise puffs_cc"
20457718be8SEnji Cooper}
20557718be8SEnji Cooperls_body() {
20657718be8SEnji Cooper	require_puffs
20757718be8SEnji Cooper
20857718be8SEnji Cooper	start_ssh
20957718be8SEnji Cooper
21057718be8SEnji Cooper	mkdir mnt
21157718be8SEnji Cooper	mkdir root
21257718be8SEnji Cooper	mkdir root/dir
21357718be8SEnji Cooper	touch root/dir/file1
21457718be8SEnji Cooper	touch root/dir/file2
21557718be8SEnji Cooper	touch root/file3
21657718be8SEnji Cooper	touch root/file4
21757718be8SEnji Cooper
21857718be8SEnji Cooper	mount_psshfs root mnt
21957718be8SEnji Cooper
22057718be8SEnji Cooper	ls -l mnt &
22157718be8SEnji Cooper
22257718be8SEnji Cooper	IFS=' '
22357718be8SEnji Cooperlsout='dir
22457718be8SEnji Cooperfile3
22557718be8SEnji Cooperfile4
22657718be8SEnji Cooper
22757718be8SEnji Coopermnt/dir:
22857718be8SEnji Cooperfile1
22957718be8SEnji Cooperfile2
23057718be8SEnji Cooper'
23157718be8SEnji Cooper	atf_check -s exit:0 -o inline:"$lsout" ls -R mnt
23257718be8SEnji Cooper}
23357718be8SEnji Cooperls_cleanup() {
23457718be8SEnji Cooper	umount mnt
23557718be8SEnji Cooper	stop_ssh
23657718be8SEnji Cooper}
23757718be8SEnji Cooper
23857718be8SEnji Cooperatf_test_case setattr_cache cleanup
23957718be8SEnji Coopersetattr_cache_head() {
24057718be8SEnji Cooper	atf_set "descr" "Checks that setattr caches"
24157718be8SEnji Cooper	# Don't wait for the eternity that atf usually waits.  Twenty
24257718be8SEnji Cooper	# seconds should be good enough, except maybe on a VAX...
24357718be8SEnji Cooper	atf_set "timeout" 20
24457718be8SEnji Cooper}
24557718be8SEnji Coopersetattr_cache_body() {
24657718be8SEnji Cooper	require_puffs
24757718be8SEnji Cooper	start_ssh
24857718be8SEnji Cooper	atf_check -s exit:0 mkdir root
24957718be8SEnji Cooper	atf_check -s exit:0 mkdir mnt
25057718be8SEnji Cooper	mount_psshfs root mnt
25157718be8SEnji Cooper	atf_check -s exit:0 -x ': > mnt/loser'
25257718be8SEnji Cooper	atf_check -s exit:0 -o save:stat stat mnt/loser
25357718be8SEnji Cooper	# Oops -- this doesn't work.  We need to stop the child of the
25457718be8SEnji Cooper	# sshd that is handling the sftp session.
25557718be8SEnji Cooper	atf_check -s exit:0 kill -STOP $(cat sshd.pid)
25657718be8SEnji Cooper	atf_check -s exit:0 -x ': > mnt/loser'
25757718be8SEnji Cooper	atf_check -s exit:0 -o file:stat stat mnt/loser
25857718be8SEnji Cooper}
25957718be8SEnji Coopersetattr_cache_cleanup() {
26057718be8SEnji Cooper	umount mnt
26157718be8SEnji Cooper	kill -CONT $(cat sshd.pid)
26257718be8SEnji Cooper	stop_ssh
26357718be8SEnji Cooper}
26457718be8SEnji Cooper
265*cdebaff8SEnji Cooperatf_test_case read_empty_file cleanup
266*cdebaff8SEnji Cooperread_empty_file_head() {
267*cdebaff8SEnji Cooper	atf_set "descr" "Checks whether an empty file can be read"
268*cdebaff8SEnji Cooper	# This test is supposed to make sure psshfs does not hang
269*cdebaff8SEnji Cooper	# when reading from an empty file, hence the timeout.
270*cdebaff8SEnji Cooper	atf_set "timeout" 8
271*cdebaff8SEnji Cooper}
272*cdebaff8SEnji Cooperread_empty_file_body() {
273*cdebaff8SEnji Cooper	require_puffs
274*cdebaff8SEnji Cooper	start_ssh
275*cdebaff8SEnji Cooper	atf_check mkdir root mnt
276*cdebaff8SEnji Cooper	atf_check -x ': > root/empty'
277*cdebaff8SEnji Cooper	mount_psshfs root mnt
278*cdebaff8SEnji Cooper	atf_check cat mnt/empty
279*cdebaff8SEnji Cooper}
280*cdebaff8SEnji Cooperread_empty_file_cleanup() {
281*cdebaff8SEnji Cooper	umount mnt
282*cdebaff8SEnji Cooper	stop_ssh
283*cdebaff8SEnji Cooper}
284*cdebaff8SEnji Cooper
28557718be8SEnji Cooper# -------------------------------------------------------------------------
28657718be8SEnji Cooper# Initialization.
28757718be8SEnji Cooper# -------------------------------------------------------------------------
28857718be8SEnji Cooper
28957718be8SEnji Cooperatf_init_test_cases() {
29057718be8SEnji Cooper	atf_add_test_case inode_nos
29157718be8SEnji Cooper	atf_add_test_case pwd
29257718be8SEnji Cooper	atf_add_test_case ls
29357718be8SEnji Cooper	#atf_add_test_case setattr_cache
294*cdebaff8SEnji Cooper	atf_add_test_case read_empty_file
29557718be8SEnji Cooper}
296