295 lines
7.6 KiB
Bash
295 lines
7.6 KiB
Bash
# $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
|
|
}
|