diff options
author | David Howells <dhowells@redhat.com> | 2019-10-31 13:22:22 +0000 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2020-07-07 16:58:00 +0100 |
commit | 1570dce7a114e8b907e7b80c56bb798a888675c6 (patch) | |
tree | c23664ef9f594a6dabb1ab917fb542e08b73e3c8 | |
parent | 1276eac95470369bfc1de3ae26103992ab8e4e9a (diff) | |
download | keyutils-1570dce7a114e8b907e7b80c56bb798a888675c6.tar.gz |
test: Use notifications in testing
Make the testing infrastructure do automatic checking for notifications as
tests manipulate keys.
Signed-off-by: David Howells <dhowells@redhat.com>
-rw-r--r-- | tests/prepare.inc.sh | 28 | ||||
-rw-r--r-- | tests/toolbox.inc.sh | 340 |
2 files changed, 348 insertions, 20 deletions
diff --git a/tests/prepare.inc.sh b/tests/prepare.inc.sh index a306ed0..0b66237 100644 --- a/tests/prepare.inc.sh +++ b/tests/prepare.inc.sh @@ -5,10 +5,32 @@ includes=${BASH_SOURCE[0]} includes=${includes%/*}/ # --- need to run in own session keyring -if [ "x`keyctl rdescribe @s | sed 's/.*;//'`" != "xRHTS/keyctl/$$" ] +watch_fd=0 +if [ "$1" != "--inside-test-session" ] then - echo "Running with session keyring RHTS/keyctl/$$" - exec keyctl session "RHTS/keyctl/$$" bash $0 $@ || exit 8 + session_name=RHTS/keyctl/$$ + if keyctl supports notify >&/dev/null + then + # Create a session keyring and set up a watcher on it. The watch queue + # is exposed on fd 9 inside the child process. + echo "Running with watched session keyring $session_name" + export watch_log=$PWD/watch.out + export gc_log=$PWD/gc.out + watch_fd=9 + echo "starting" >$watch_log + echo "starting" >$gc_log + exec keyctl watch_session -n $session_name $watch_log $gc_log $watch_fd \ + bash $0 --inside-test-session $@ || exit 8 + else + echo "Running with session keyring $session_name" + exec keyctl session $session_name bash $0 --inside-test-session $@ || exit 8 + fi +else + shift + if [ "$KEYCTL_WATCH_FD" != "" ] + then + watch_fd=$KEYCTL_WATCH_FD + fi fi # Set up for the Red Hat Test System diff --git a/tests/toolbox.inc.sh b/tests/toolbox.inc.sh index 63175d9..81d639c 100644 --- a/tests/toolbox.inc.sh +++ b/tests/toolbox.inc.sh @@ -59,6 +59,10 @@ function marker () { echo -e "+++ \e[33m$*\e[0m" echo +++ $* >>$OUTPUTFILE + if [ "$watch_log" != "" ] + then + echo +++ $* >>$watch_log + fi } function failed() @@ -194,6 +198,100 @@ function expect_error () ############################################################################### # +# Watch a key for notifications. +# +############################################################################### +function watch_add_key () +{ + my_keyid=$1 + + if [ $watch_fd = 0 ]; then return; fi + + keyctl watch_add $watch_fd $my_keyid || failed +} + +############################################################################### +# +# Check for a notification on the last or last-but-one lines of the +# notification log. +# +############################################################################### +function check_notify () +{ + if [ $watch_fd = 0 ]; then return; fi + + keyctl watch_sync $watch_fd || failed + + if [ "$1" = "-2" ] + then + shift + my_logline="`tail -2 $watch_log | head -1`" + else + my_logline="`tail -1 $watch_log`" + fi + + my_subtype=$1 + case $my_subtype in + revoked) + my_key1=$2 + ;; + invalidated) + my_key1=$2 + ;; + *) + case $2 in + @*) + my_key1=`keyctl id $2` + ;; + *) + my_key1=$2 + esac + ;; + esac + my_key2=$3 + + case $my_subtype in + instantiated) + exp="$my_key1 inst" + ;; + updated) + exp="$my_key1 upd" + ;; + linked) + exp="$my_key1 link $my_key2" + ;; + unlinked) + exp="$my_key1 unlk $my_key2" + ;; + cleared) + exp="$my_key1 clr" + ;; + revoked) + exp="$my_key1 rev" + ;; + invalidated) + exp="$my_key1 inv" + ;; + setattr) + exp="$my_key1 attr" + ;; + *) + echo "INCORRECT check_notify SUBTYPE" >&2 + failed + ;; + esac + + if [ "$exp" != "$my_logline" ] + then + echo "\"$exp\"" != "\"$my_logline\"" + echo "check_notify: \"$exp\"" != "\"$my_logline\"" >>$OUTPUTFILE + echo "^^^ failed ^^^" >>$watch_log + failed + fi +} + +############################################################################### +# # wait for a key to be destroyed (get removed from /proc/keys) # ############################################################################### @@ -335,6 +433,12 @@ function request_key () if [ $my_keyid == v ] then eval $my_varname=$got_keyid + watch_add_key $got_keyid + fi + + if [ $# = 3 ] + then + check_notify linked $my_keyring $got_keyid fi else echo "CAN'T EXTRACT KEY ID FROM create_key OUTPUT" >&2 @@ -392,6 +496,16 @@ function request_key_callout () if [ $my_keyid == v ] then eval $my_varname=$got_keyid + watch_add_key $got_keyid + if [ $# = 4 ] + then + check_notify -2 linked $my_keyring $got_keyid + fi + else + if [ $# = 4 ] + then + check_notify linked $my_keyring $got_keyid + fi fi else echo "CAN'T EXTRACT KEY ID FROM create_key OUTPUT" >&2 @@ -428,7 +542,7 @@ function prequest_key_callout () my_keyid=x ;; *) - echo "BAD request_key_callout ARGUMENT" >&2 + echo "BAD prequest_key_callout ARGUMENT" >&2 failed return ;; @@ -453,6 +567,16 @@ function prequest_key_callout () if [ $my_keyid == v ] then eval $my_varname=$got_keyid + watch_add_key $got_keyid + if [ $# = 4 ] + then + check_notify -2 linked $my_keyring $got_keyid + fi + else + if [ $# = 3 ] + then + check_notify linked $my_keyring $got_keyid + fi fi else echo "CAN'T EXTRACT KEY ID FROM create_key OUTPUT" >&2 @@ -515,6 +639,10 @@ function create_key () if [ $my_keyid == v ] then eval $my_varname=$got_keyid + watch_add_key $got_keyid + check_notify linked $my_keyring $got_keyid + else + check_notify updated $got_keyid fi else @@ -580,6 +708,10 @@ function pcreate_key () if [ $my_keyid == v ] then eval $my_varname=$got_keyid + watch_add_key $got_keyid + check_notify linked $my_keyring $got_keyid + else + check_notify updated $got_keyid fi else @@ -616,7 +748,7 @@ function pcreate_key_by_size () my_keyid=x ;; *) - echo "BAD create_key ARGUMENT" >&2 + echo "BAD pcreate_key_by_size ARGUMENT" >&2 failed return ;; @@ -639,6 +771,10 @@ function pcreate_key_by_size () if [ $my_keyid == v ] then eval $my_varname=$got_keyid + watch_add_key $got_keyid + check_notify linked $my_keyring $got_keyid + else + check_notify updated $got_keyid fi else @@ -671,7 +807,7 @@ function create_keyring () my_keyid=x ;; *) - echo "BAD create_key ARGUMENT" >&2 + echo "BAD create_keyring ARGUMENT" >&2 failed return ;; @@ -690,6 +826,8 @@ function create_keyring () if expr "$got_keyid" : '[1-9][0-9]*' >&/dev/null then eval $my_varname=$got_keyid + watch_add_key $got_keyid + check_notify linked $my_keyring $got_keyid else echo "CAN'T EXTRACT KEY ID FROM create_keyring OUTPUT" >&2 eval $my_varname=no @@ -992,8 +1130,14 @@ function revoke_key () echo keyctl revoke $1 >>$OUTPUTFILE keyctl revoke $1 >>$OUTPUTFILE 2>&1 - if [ $? != $my_exitval ] + e=$? + if [ $e == $my_exitval ] then + if [ $e = 0 ] + then + check_notify revoked $1 + fi + else failed fi } @@ -1021,8 +1165,14 @@ function unlink_key () echo keyctl unlink $1 $2 >>$OUTPUTFILE keyctl unlink $1 $2 >>$OUTPUTFILE 2>&1 - if [ $? != $my_exitval ] + e=$? + if [ $e = $my_exitval ] then + if [ $e == 0 -a $# = 2 ] + then + check_notify unlinked $2 $1 + fi + else failed fi @@ -1074,8 +1224,18 @@ function update_key () echo keyctl update "$@" >>$OUTPUTFILE keyctl update "$@" >>$OUTPUTFILE 2>&1 - if [ $? != $my_exitval ] + e=$? + if [ $e == $my_exitval ] then + if [ $e = 0 ] + then + if [ "$1" = "-x" ] + then + shift + fi + check_notify updated $1 + fi + else failed fi } @@ -1096,8 +1256,14 @@ function pupdate_key () echo keyctl pupdate "$@" >>$OUTPUTFILE keyctl pupdate "$@" >>$OUTPUTFILE 2>&1 - if [ $? != $my_exitval ] + e=$? + if [ $e == $my_exitval ] then + if [ $e = 0 ] + then + check_notify updated $1 + fi + else failed fi } @@ -1118,8 +1284,14 @@ function clear_keyring () echo keyctl clear $1 >>$OUTPUTFILE keyctl clear $1 >>$OUTPUTFILE 2>&1 - if [ $? != $my_exitval ] + e=$? + if [ $e == $my_exitval ] then + if [ $e = 0 ] + then + check_notify cleared $1 + fi + else failed fi } @@ -1162,8 +1334,14 @@ function link_key () echo keyctl link $1 $2 >>$OUTPUTFILE keyctl link $1 $2 >>$OUTPUTFILE 2>&1 - if [ $? != $my_exitval ] + e=$? + if [ $e == $my_exitval ] then + if [ $e == 0 ] + then + check_notify linked $2 $1 + fi + else failed fi } @@ -1186,7 +1364,7 @@ function search_for_key () my_keyid=x ;; *) - echo "BAD create_key ARGUMENT" >&2 + echo "BAD search_for_key ARGUMENT" >&2 failed return ;; @@ -1205,7 +1383,10 @@ function search_for_key () then if [ $got_keyid = $my_keyid ] then - : + if [ $e == 0 -a $# == 4 ] + then + check_notify linked $4 $got_keyid + fi else echo "KEY MISMATCH $got_keyid != $my_keyid" >&2 failed @@ -1237,8 +1418,14 @@ function set_key_perm () echo keyctl setperm "$@" >>$OUTPUTFILE keyctl setperm "$@" >>$OUTPUTFILE 2>&1 - if [ $? != $my_exitval ] + e=$? + if [ $e == $my_exitval ] then + if [ $e = 0 ] + then + check_notify setattr $1 + fi + else failed fi } @@ -1259,8 +1446,14 @@ function chown_key () echo keyctl chown "$@" >>$OUTPUTFILE keyctl chown "$@" >>$OUTPUTFILE 2>&1 - if [ $? != $my_exitval ] + e=$? + if [ $e == $my_exitval ] then + if [ $e = 0 ] + then + check_notify setattr $1 + fi + else failed fi } @@ -1281,8 +1474,14 @@ function chgrp_key () echo keyctl chgrp "$@" >>$OUTPUTFILE keyctl chgrp "$@" >>$OUTPUTFILE 2>&1 - if [ $? != $my_exitval ] + e=$? + if [ $e == $my_exitval ] then + if [ $e = 0 ] + then + check_notify setattr $1 + fi + else failed fi } @@ -1438,8 +1637,14 @@ function timeout_key () echo keyctl timeout $1 $2 >>$OUTPUTFILE keyctl timeout $1 $2 >>$OUTPUTFILE 2>&1 - if [ $? != $my_exitval ] + e=$? + if [ $e == $my_exitval ] then + if [ $e = 0 ] + then + check_notify setattr $1 + fi + else failed fi } @@ -1460,8 +1665,14 @@ function invalidate_key () echo keyctl invalidate $1 >>$OUTPUTFILE keyctl invalidate $1 >>$OUTPUTFILE 2>&1 - if [ $? != $my_exitval ] + e=$? + if [ $e == $my_exitval ] then + if [ $e = 0 ] + then + check_notify invalidated $1 + fi + else failed fi } @@ -1548,8 +1759,16 @@ function move_key () echo keyctl move $* >>$OUTPUTFILE keyctl move $* >>$OUTPUTFILE 2>&1 - if [ $? != $my_exitval ] + e=$? + if [ $e = $my_exitval ] then + if [ "x$1" = "x-f" ]; then shift; fi + if [ $e = 0 -a $2 != $3 ] + then + check_notify -2 unlinked $2 $1 + check_notify linked $3 $1 + fi + else failed fi } @@ -1612,3 +1831,90 @@ function set_gc_delay() echo "Set $key_gc_delay_file to $delay, orig: $orig_gc_delay" fi } + +############################################################################### +# +# Note the creation of a new key +# +# expect_new_key <variable_name> <keyring> [<expected_id>] +# +############################################################################### +function xxx_expect_new_key () +{ + my_varname=$1 + my_keyring=$2 + + my_keyid="`tail -1 $OUTPUTFILE`" + if expr "$my_keyid" : '[1-9][0-9]*' >&/dev/null + then + eval $my_varname=$my_keyid + + if [ $# = 3 -a "x$my_keyid" != "x$2" ] + then + failed + fi + + watch_add_key $my_keyid + check_notify linked $my_keyring $my_keyid + else + eval $my_varname=no + result=FAIL + fi +} + +############################################################################### +# +# Note implicit update of a key +# +# implicit_update <key_id> +# +############################################################################### +function xxx_implicit_update () +{ + my_keyid=$1 + + got_keyid="`tail -1 $OUTPUTFILE`" + if expr "$got_keyid" : '[1-9][0-9]*' >&/dev/null + then + if [ "x$got_keyid" == "x$my_keyid" ] + then + check_notify updated $my_keyid + else + failed + fi + else + result=FAIL + fi +} + +############################################################################### +# +# Note the explicit update of new key +# +############################################################################### +function xxx_key_updated () +{ + my_keyid=$1 + + check_notify updated $my_keyid +} + +############################################################################### +# +# extract a key ID from the log file +# +############################################################################### +function xxx_expect_found_key () +{ + my_keyid="`tail -1 $OUTPUTFILE`" + if expr "$my_keyid" : '[1-9][0-9]*' >&/dev/null + then + if [ "x$my_keyid" != "x$1" ] + then + failed + fi + else + eval $my_varname=no + result=FAIL + fi +} |