diff options
Diffstat (limited to 'tests')
-rwxr-xr-x | tests/12_socket_remove.sh | 38 | ||||
-rwxr-xr-x | tests/13_socket_add.sh | 34 | ||||
-rwxr-xr-x | tests/14_socket_diff.sh | 38 | ||||
-rw-r--r-- | tests/sockbind.c | 70 | ||||
-rw-r--r-- | tests/test_lib.sh | 61 |
5 files changed, 228 insertions, 13 deletions
diff --git a/tests/12_socket_remove.sh b/tests/12_socket_remove.sh new file mode 100755 index 0000000..db44380 --- /dev/null +++ b/tests/12_socket_remove.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +TEST_ID="12" +TEST_NAME="Socket device removal" + +CREATE=`pwd`/$1 +DEPLOY=`pwd`/$2 +TEST_TOOLS=$3 + +. ./test_lib.sh + +############# Test specific code ############ +# sockets can only be moved, linked or removed by the file system +# creation is only performed by the program that acts as the server +# tbdiff won't be doing that so the only sensible operation is removal +SOCKBIND=`mktemp` +setup () { + # sockbind creates a socket then writes any data written to it to stdout + # have to fork it because it will never stop, have to wait for it to + # make the socket + gcc sockbind.c -o $SOCKBIND 2>/dev/null >/dev/null + $SOCKBIND "$ORIGIN/toremove" & + SOCKBINDPID=$! + until test -S "$ORIGIN/toremove"; do :; done + kill $SOCKBINDPID && wait $SOCKBINDPID 2>/dev/null + rm -f $SOCKBIND +} + +create_test_return () { + test $1 = 0 +} + +check_results () { + test ! -S "$ORIGIN/toremove" +} + +############################################# +main $@ diff --git a/tests/13_socket_add.sh b/tests/13_socket_add.sh new file mode 100755 index 0000000..daa4f8f --- /dev/null +++ b/tests/13_socket_add.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +TEST_ID="13" +TEST_NAME="Socket device addition" + +CREATE=`pwd`/$1 +DEPLOY=`pwd`/$2 +TEST_TOOLS=$3 + +. ./test_lib.sh + +############# Test specific code ############ +# sockets can't be added sensibly, test that it hasn't been +SOCKBIND=`mktemp` +setup () { + gcc sockbind.c -o $SOCKBIND 2>/dev/null >/dev/null + $SOCKBIND "$TARGET/toadd" & + SOCKBINDPID=$! + until test -S "$TARGET/toadd"; do :; done + kill $SOCKBINDPID && wait $SOCKBINDPID 2>/dev/null + rm -f $SOCKBIND +} + +#tbdiff-create should fail when it would have to add a socket +create_test_return () { + test "$1" != "0" +} + +check_results () { + false #test should never reach this +} + +############################################# +main $@ diff --git a/tests/14_socket_diff.sh b/tests/14_socket_diff.sh new file mode 100755 index 0000000..9cf9195 --- /dev/null +++ b/tests/14_socket_diff.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +TEST_ID="14" +TEST_NAME="Socket device difference" + +CREATE=`pwd`/$1 +DEPLOY=`pwd`/$2 +TEST_TOOLS=$3 + +. ./test_lib.sh + +############# Test specific code ############ +# sockets can't be changed sensibly, test that it hasn't been + +SOCKBIND=`mktemp` +setup () { + gcc sockbind.c -o $SOCKBIND 2>/dev/null >/dev/null + $SOCKBIND "$ORIGIN/tochange" & + SOCKBINDPID1=$! + $SOCKBIND "$TARGET/tochange" & + SOCKBINDPID2=$! + until test -S "$TARGET/tochange" -a -S "$ORIGIN/tochange"; do :; done + kill $SOCKBINDPID1 $SOCKBINDPID2 && + wait $SOCKBINDPID1 $SOCKBINDPID2 2>/dev/null #surpress terminated output + rm -f $SOCKBIND +} + +#tbdiff-create should fail to make a patch if it would have to change a socket +create_test_return () { + test "$1" != 0 +} + +check_results () { + false #test should never reach this +} + +############################################# +main $@ diff --git a/tests/sockbind.c b/tests/sockbind.c new file mode 100644 index 0000000..f98b5ed --- /dev/null +++ b/tests/sockbind.c @@ -0,0 +1,70 @@ +#include <stdio.h> +#include <stddef.h> +#include <string.h> +#include <assert.h> +#include <unistd.h> +#include <sys/socket.h> +#include <sys/un.h> + +#define MAX_CLIENTS 1 +#ifdef DEBUG +#define DEBUGPRINT(fmt, ...) fprintf(stderr, "DEBUG: %s %s %d: " fmt, \ + __FILE__, __func__, __LINE__, __VA_ARGS__) +#else +#define DEBUGPRINT(...) (void)0 +#endif + +int main(int argc, char *argv[]){ + struct sockaddr_un sock = { + .sun_family = AF_UNIX + }; + int sfd; + if (argc < 1){ + fprintf(stderr, "Usage: %s PATH\n", argv[0]); + return 1; + } + strncpy(sock.sun_path, argv[1], sizeof(sock) - offsetof(struct sockaddr_un, sun_path)); + DEBUGPRINT("%s", "Constructed socket address\n"); + if ((sfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1){ + perror("socket"); + return 2; + } + DEBUGPRINT("Created socket fd=%d\n", sfd); + if (bind(sfd, (struct sockaddr*)&sock, sizeof(sock)) == -1){ + perror("bind"); + return 3; + } + if (listen(sfd, MAX_CLIENTS) == -1){ + perror("listen"); + return 4; + } + DEBUGPRINT("Listening to %d clients\n", MAX_CLIENTS); + { + struct sockaddr_un client_address; + socklen_t client_size = sizeof(client_address); + int cfd; + while ((cfd = accept(sfd, (struct sockaddr*)&client_address, + &client_size)) != -1) { + char buf[BUFSIZ]; + ssize_t rdcount = -1; + DEBUGPRINT("Listening to client fd=%d\n", cfd); + while ((rdcount = read(cfd, buf, sizeof(buf))) > 0) { + DEBUGPRINT("Read %zi bytes from client, " + "message was:\n%.*s", rdcount, + rdcount, buf); + write(STDOUT_FILENO, buf, rdcount); + } + assert(rdcount == 0 || rdcount == -1); + if (rdcount == -1) { + perror("read"); + return 5; + } + DEBUGPRINT("Finished listening to fd=%d\n", cfd); + close(cfd); + } + } + + close(sfd); + unlink(argv[1]); + return 0; +} diff --git a/tests/test_lib.sh b/tests/test_lib.sh index 4645166..5112cea 100644 --- a/tests/test_lib.sh +++ b/tests/test_lib.sh @@ -41,6 +41,46 @@ check_group () { test $(stat -c %G $1) = $2 } +#declare -f is faster, but won't work in dash +is_function () { + type $1 2>/dev/null | grep 'function' +} + +#check_command COMMAND_STRING TEST_COMMAND COMMAND_DESCRIPTION +check_command () { + COMMAND_STRING=$1 + TEST_COMMAND=$2 + COMMAND_DESCRIPTION="$3" + eval $COMMAND_STRING + RETVAL=$? + if is_function "$TEST_COMMAND"; then #test explicitly checks return + if $TEST_COMMAND $RETVAL; then + if [ "$RETVAL" != "0" ]; then + echo $COMMAND_STRING expected failure in \ + $COMMAND_DESCRIPTION >&2 + echo $OK + exit 0 + fi + else + if [ "$RETVAL" = "0" ]; then + echo $COMMAND_STRING Unexpected success in \ + $COMMAND_DESCRIPTION >&2 + echo $FAIL + cleanup_and_exit + else + echo $COMMAND_STRING Unexpected failure in \ + $COMMAND_DESCRIPTION >&2 + echo $FAIL + cleanup_and_exit + fi + fi + elif [ "$RETVAL" != "0" ]; then #return value expected to be 0 + echo $COMMAND_STRING Unexpected failure $COMMAND_DESCRIPTION >&2 + echo $FAIL + cleanup_and_exit + fi +} + start () { if [ $# -ne 2 ] then @@ -88,20 +128,15 @@ main () { echo $OK echo "$TEST_ID Performing $TEST_NAME image creation and deployment: " - CWD=$(pwd) - $CREATE $IMGFILE $ORIGIN $TARGET && \ - cd $ORIGIN && \ - $DEPLOY $IMGFILE && \ - RETVAL=$? - cd $CWD - if test "x$RETVAL" != "x0" - then - echo $FAIL - echo "Could not create and deploy image." 1>&2 - cleanup_and_exit - fi - echo $OK + CWD=$(pwd) && + check_command "$CREATE $IMGFILE $ORIGIN $TARGET" 'create_test_return' \ + "$TEST_ID-$TEST_NAME: creating image" + cd $ORIGIN && + check_command "$DEPLOY $IMGFILE" 'deploy_test_return' \ + "$TEST_ID-$TEST_NAME: deploying image" + + cd $CWD echo -n "$TEST_ID Checking $TEST_NAME results: " check_results if test "x$?" != "x0" |