summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2019-08-28 14:01:43 +0100
committerDavid Howells <dhowells@redhat.com>2020-07-06 18:00:28 +0100
commit9419ac428efe8385cb2c19680d6b90c90e5335d1 (patch)
treea8f846827ab63f9a2a27325eb41667a9463ab213
parent1aafbdcf1d60c5c9eb34fe404f9a9195c8ea415e (diff)
downloadkeyutils-9419ac428efe8385cb2c19680d6b90c90e5335d1.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.sh28
-rw-r--r--tests/toolbox.inc.sh340
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
+}