# $NetBSD: t_simplehook.sh,v 1.1 2021/09/30 02:00:20 yamaguchi Exp $ # # Copyright (c) 2021 Internet Initiative Japan Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # DEBUG=${DEBUG:-false} SOCK=unix://commsock HIJACKING="env LD_PRELOAD=/usr/lib/librumphijack.so \ RUMPHIJACK=path=/rump,socket=all:nolocal,sysctl=yes" atf_sysctl_rd() { local sysctl_key=$1 local expected=$2 atf_check -s exit:0 -o match:"$expected" \ rump.sysctl -n $sysctl_key } atf_sysctl_wr() { local sysctl_key=$1 local value=$2 atf_check -s exit:0 -o ignore rump.sysctl -w $sysctl_key=$value } atf_sysctl_wait() { local sysctl_key=$1 local expected=$2 local n=10 local i local v for i in $(seq $n); do v=$(rump.sysctl -n $sysctl_key) if [ x"$v" = x"$expected" ]; then return fi sleep 0.5 done atf_fail "Couldn't get the value for $n seconds." } atf_test_case simplehook_basic cleanup simplehook_basic_head() { atf_set "descr" "tests for basically functions of simplehook" atf_set "require.progs" "rump_server" } simplehook_basic_body() { local key_hklist="kern.simplehook_tester.hook_list" local key_hk0="kern.simplehook_tester.hook0" local key_hk1="kern.simplehook_tester.hook1" rump_server -lrumpkern_simplehook_tester $SOCK export RUMP_SERVER=$SOCK $DEBUG && rump.sysctl -e kern.simplehook_tester atf_check -s exit:0 -o ignore rump.sysctl -e kern.simplehook_tester # create and destroy atf_sysctl_rd ${key_hklist}.created '0' atf_sysctl_wr ${key_hklist}.created '1' atf_sysctl_wr ${key_hklist}.created '0' $DEBUG && rump.sysctl -e kern.simplehook_tester # establish one hook atf_sysctl_wr ${key_hklist}.created '1' atf_sysctl_wr ${key_hk0}.established '1' atf_sysctl_wr ${key_hk0}.count '0' atf_sysctl_wr ${key_hklist}.dohooks '1' atf_sysctl_wr ${key_hklist}.dohooks '0' atf_sysctl_rd ${key_hk0}.count '1' atf_sysctl_wr ${key_hk0}.established '0' atf_sysctl_wr ${key_hklist}.created '0' # establish two hooks atf_sysctl_wr ${key_hklist}.created '1' atf_sysctl_wr ${key_hk0}.established '1' atf_sysctl_wr ${key_hk1}.established '1' atf_sysctl_wr ${key_hk0}.count '0' atf_sysctl_wr ${key_hk1}.count '0' atf_sysctl_wr ${key_hklist}.dohooks '1' atf_sysctl_wr ${key_hklist}.dohooks '0' atf_sysctl_rd ${key_hk0}.count '1' atf_sysctl_rd ${key_hk1}.count '1' atf_sysctl_wr ${key_hk0}.established '0' atf_sysctl_wr ${key_hk1}.established '0' atf_sysctl_wr ${key_hklist}.created '0' } simplehook_basic_cleanup() { export RUMP_SERVER=$SOCK $DEBUG && rump.sysctl -e kern.simplehook_tester $DEBUG && $HIJACKING dmesg rump.halt } atf_test_case simplehook_disestablish cleanup simplehook_disestablish_head() { atf_set "descr" "tests for disestablish of simplehook" atf_set "require.progs" "rump_server" } simplehook_disestablish_body() { local key_hklist="kern.simplehook_tester.hook_list" local key_hk0="kern.simplehook_tester.hook0" local key_hk1="kern.simplehook_tester.hook1" rump_server -lrumpkern_simplehook_tester $SOCK export RUMP_SERVER=$SOCK $DEBUG && rump.sysctl -e kern.simplehook_tester atf_check -s exit:0 -o ignore rump.sysctl -e kern.simplehook_tester # # disestablish on the running hook # atf_sysctl_wr ${key_hklist}.created '1' atf_sysctl_wr ${key_hk0}.established '1' atf_sysctl_wr ${key_hk0}.disestablish_in_hook '1' atf_sysctl_wr ${key_hklist}.dohooks '1' atf_sysctl_wr ${key_hklist}.dohooks '0' # already disestablished atf_sysctl_rd ${key_hk0}.established '0' atf_sysctl_wr ${key_hk0}.disestablish_in_hook '0' atf_sysctl_wr ${key_hklist}.created '0' # # disestablish called hook while doing other hook # atf_sysctl_wr ${key_hklist}.created '1' atf_sysctl_wr ${key_hk0}.established '1' atf_sysctl_wr ${key_hk1}.established '1' atf_sysctl_wr ${key_hk0}.count '0' atf_sysctl_wr ${key_hk1}.count '0' atf_sysctl_wr ${key_hk0}.stopping '1' # calls hook1 -> hook0 atf_sysctl_wr ${key_hklist}.dohooks '1' # stop in hook0 atf_sysctl_wait ${key_hk0}.stopped '1' atf_sysctl_rd ${key_hk1}.count '1' atf_sysctl_wr ${key_hk1}.established '0' # wakeup hook0 atf_sysctl_wr ${key_hk0}.stopping '0' atf_sysctl_wr ${key_hklist}.dohooks '0' atf_sysctl_wr ${key_hk0}.established '0' atf_sysctl_wr ${key_hklist}.created '0' # # disestablish a hook in running hook list # atf_sysctl_wr ${key_hklist}.created '1' atf_sysctl_wr ${key_hk0}.established '1' atf_sysctl_wr ${key_hk1}.established '1' atf_sysctl_wr ${key_hk0}.count '0' atf_sysctl_wr ${key_hk1}.count '0' atf_sysctl_wr ${key_hk1}.stopping '1' # calls hook1 -> hook0 atf_sysctl_wr ${key_hklist}.dohooks '1' # stop in hook1 atf_sysctl_wait ${key_hk1}.stopped '1' atf_sysctl_wr ${key_hk0}.established '0' # wakeup hook1 atf_sysctl_wr ${key_hk1}.stopping '0' atf_sysctl_wr ${key_hklist}.dohooks '0' # hook0 is not called atf_sysctl_rd ${key_hk0}.count '0' atf_sysctl_wr ${key_hk1}.established '0' atf_sysctl_wr ${key_hklist}.created '0' # # disestablish the running hook # atf_sysctl_wr ${key_hklist}.created '1' atf_sysctl_wr ${key_hk0}.established '1' atf_sysctl_wr ${key_hk0}.stopping '1' atf_sysctl_wr ${key_hklist}.dohooks '1' atf_sysctl_wait ${key_hk0}.stopped '1' atf_sysctl_wr ${key_hk0}.established '0' atf_sysctl_wr ${key_hklist}.dohooks '0' atf_sysctl_wr ${key_hklist}.created '0' } simplehook_disestablish_cleanup() { export RUMP_SERVER=$SOCK $DEBUG && rump.sysctl -e kern.simplehook_tester $DEBUG && $HIJACKING dmesg rump.halt } atf_test_case simplehook_nolock cleanup simplehook_nolock_head() { atf_set "descr" "tests for hook that does not use lock in it" atf_set "require.progs" "rump_server" } simplehook_nolock_body() { local key_hklist="kern.simplehook_tester.hook_list" local key_hk="kern.simplehook_tester.nbhook" rump_server -lrumpkern_simplehook_tester $SOCK export RUMP_SERVER=$SOCK $DEBUG && rump.sysctl -e kern.simplehook_tester atf_check -s exit:0 -o ignore rump.sysctl -e kern.simplehook_tester atf_sysctl_wr ${key_hklist}.created '1' atf_sysctl_wr ${key_hk}.established '1' atf_sysctl_wr ${key_hklist}.dohooks '1' atf_sysctl_wr ${key_hk}.established '0' atf_sysctl_wr ${key_hklist}.dohooks '0' atf_sysctl_wr ${key_hklist}.created '0' } simplehook_nolock_cleanup() { export RUMP_SERVER=$SOCK $DEBUG && rump.sysctl -e kern.simplehook_tester $DEBUG && $HIJACKING dmesg rump.halt } atf_init_test_cases() { atf_add_test_case simplehook_basic atf_add_test_case simplehook_disestablish atf_add_test_case simplehook_nolock }