shlist

share and manage lists between multiple people
Log | Files | Refs

commit 293a7715e6b2188161388255982a8bd261bce4a7
parent cd8f5d0725ada5f9858b2d89b75e20256154c641
Author: kyle <kyle@0x30.net>
Date:   Tue, 12 Jan 2016 23:41:35 -0700

tests: switch test suite to use single server instance

- instead of starting and stopping a server for every test, start it once
  - this performs better and makes the test suite scale much better
- add a new test, _server_listening that waits for the server to listen()
  - once this completes, its safe to run the rest of the tests without fear of
    them not being able to connect
- a bunch of server.log.good changes due to less lines being printed

Diffstat:
Mserver/run_tests.sh | 18++++++++++--------
Aserver/tests/_server_listening/Makefile | 3+++
Aserver/tests/_server_listening/test.pl | 35+++++++++++++++++++++++++++++++++++
Mserver/tests/client.pm | 32+++++++-------------------------
Mserver/tests/device_add/server.log.good | 1-
Mserver/tests/friend_add/server.log.good | 1-
Mserver/tests/friend_delete/server.log.good | 1-
Mserver/tests/friend_delete_unit/server.log.good | 1-
Mserver/tests/header/server.log.good | 1-
Mserver/tests/invalid_deviceid/server.log.good | 1-
Mserver/tests/list_add/server.log.good | 1-
Mserver/tests/list_join/server.log.good | 1-
Mserver/tests/list_join_unit/server.log.good | 1-
Mserver/tests/list_leave/server.log.good | 1-
Mserver/tests/list_leave_unit/server.log.good | 1-
Mserver/tests/list_reference_counting/server.log.good | 1-
Mserver/tests/lists_get/server.log.good | 1-
Mserver/tests/lists_get_other/server.log.good | 1-
Mserver/tests/multiple_friends_same_other_list/server.log.good | 1-
Mserver/tests/no_ssl_fails/server.log.good | 3+--
Mserver/tests/no_ssl_fails/test.pl | 27++++++++-------------------
Mserver/tests/test.mk | 7+++++--
Mserver/tests/two_lists_same_name/server.log.good | 1-
23 files changed, 69 insertions(+), 72 deletions(-)

diff --git a/server/run_tests.sh b/server/run_tests.sh @@ -23,6 +23,9 @@ ok() { passed=`expr $passed + 1` } +perl -T sl -p $PORT -t > server.log & +server_pid=$! + passed=0 failed=0 count=0 @@ -31,20 +34,15 @@ for t in `ls tests/*/Makefile`; do test_dir=`dirname ${t}` make -s -C $test_dir clean - perl -T sl -p $PORT -t > $test_dir/server.log & - server_pid=$! - # run test, complain if it failed if ! make -s -C $test_dir test; then fail $test_dir "test failed" - kill $server_pid - wait 2>/dev/null continue fi - # kill the server and wait for it to shut down - kill $server_pid - wait 2>/dev/null + # copy server log aside for diff'ing + cp server.log $test_dir/server.log + > server.log # diff the server's output log if ! make -s -C $test_dir diff; then @@ -56,6 +54,10 @@ for t in `ls tests/*/Makefile`; do ok $test_dir done +kill $server_pid +wait 2>/dev/null +rm server.log + printf "\n%i %sok%s %i %sfailed%s " $passed $green $reset $failed $red $reset printf "(%i min %i sec)\n" $((SECONDS / 60)) $((SECONDS % 60)) diff --git a/server/tests/_server_listening/Makefile b/server/tests/_server_listening/Makefile @@ -0,0 +1,3 @@ +DIFF_MOD=none + +include ../test.mk diff --git a/server/tests/_server_listening/test.pl b/server/tests/_server_listening/test.pl @@ -0,0 +1,35 @@ +#!/usr/bin/perl -I../ +use strict; +use warnings; + +use IO::Socket::INET; +use Time::HiRes qw(usleep); +use test; + +# Wait until a successful connection can be made, or timeout. +# This must be the first test because other tests do not have connection +# retries and will assume that a connectible server is up and ready. + +my $socket; +my $timeout = time + 3; +while (1) { + $socket = new IO::Socket::INET( + PeerHost => 'localhost', + PeerPort => $ENV{PORT} || 5437, + ); + + # Connection refused, ie server has not called listen() yet + if ($!{ECONNREFUSED}) { + fail "server not ready after 3 seconds" if (time > $timeout); + usleep(100 * 1000); + + next; + } + + # We got some non Connection refused return code + last; +} + +fail "socket not good" unless ($socket); +$socket->syswrite("a\0\0\0"x 3); +$socket->sysread(my $buf, 1); diff --git a/server/tests/client.pm b/server/tests/client.pm @@ -2,10 +2,7 @@ package client; use strict; use warnings; -use Data::Dumper; -use Errno; use IO::Socket::SSL; -use Time::HiRes qw(usleep); use test; require "msgs.pl"; @@ -18,28 +15,13 @@ sub new { my $self = {}; bless ($self, $class); - $self->{sock} = undef; - my $timeout = time + 5; - while (1) { - $self->{sock} = IO::Socket::SSL->new( - PeerHost => 'localhost', - PeerPort => $ENV{PORT} || 5437, - # this is needed because PeerHost is localhost and our - # SSL certificates are signed with amp.ca - SSL_verifycn_name => "absentmindedproductions.ca", - ); - - if ($!{ECONNREFUSED}) { - if (time > $timeout) { - fail "server not ready after 5 seconds"; - } - usleep(50 * 1000); - next; - } - - last; - } - + $self->{sock} = IO::Socket::SSL->new( + PeerHost => 'localhost', + PeerPort => $ENV{PORT} || 5437, + # this is needed because PeerHost is localhost and our SSL + # certificates are signed with absentmindedproductions.ca + SSL_verifycn_name => "absentmindedproductions.ca", + ); unless ($self->{sock}) { die "failed connect or ssl handshake: $!,$SSL_ERROR"; } diff --git a/server/tests/device_add/server.log.good b/server/tests/device_add/server.log.good @@ -1,4 +1,3 @@ -accepting connections on <ip>:<port> (pid = <digits>) new connection (pid = <digits>) ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' device_add: success, <digits>:<base64> os <base64> diff --git a/server/tests/friend_add/server.log.good b/server/tests/friend_add/server.log.good @@ -1,4 +1,3 @@ -accepting connections on <ip>:<port> (pid = <digits>) new connection (pid = <digits>) ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' device_add: success, <digits>:<base64> os <base64> diff --git a/server/tests/friend_delete/server.log.good b/server/tests/friend_delete/server.log.good @@ -1,4 +1,3 @@ -accepting connections on <ip>:<port> (pid = <digits>) device_add: success, <digits>:<base64> os <base64> device_add: success, <digits>:<base64> os <base64> disconnected! diff --git a/server/tests/friend_delete_unit/server.log.good b/server/tests/friend_delete_unit/server.log.good @@ -1,4 +1,3 @@ -accepting connections on <ip>:<port> (pid = <digits>) new connection (pid = <digits>) ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' device_add: success, <digits>:<base64> os <base64> diff --git a/server/tests/header/server.log.good b/server/tests/header/server.log.good @@ -1,4 +1,3 @@ -accepting connections on <ip>:<port> (pid = <digits>) new connection (pid = <digits>) ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' error: unknown message type 47837 diff --git a/server/tests/invalid_deviceid/server.log.good b/server/tests/invalid_deviceid/server.log.good @@ -1,4 +1,3 @@ -accepting connections on <ip>:<port> (pid = <digits>) new connection (pid = <digits>) ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' friend_add: unknown device <digits> diff --git a/server/tests/list_add/server.log.good b/server/tests/list_add/server.log.good @@ -1,4 +1,3 @@ -accepting connections on <ip>:<port> (pid = <digits>) new connection (pid = <digits>) ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' device_add: success, <digits>:<base64> os <base64> diff --git a/server/tests/list_join/server.log.good b/server/tests/list_join/server.log.good @@ -1,4 +1,3 @@ -accepting connections on <ip>:<port> (pid = <digits>) device_add: success, <digits>:<base64> os <base64> device_add: success, <digits>:<base64> os <base64> disconnected! diff --git a/server/tests/list_join_unit/server.log.good b/server/tests/list_join_unit/server.log.good @@ -1,4 +1,3 @@ -accepting connections on <ip>:<port> (pid = <digits>) new connection (pid = <digits>) ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' device_add: success, <digits>:<base64> os <base64> diff --git a/server/tests/list_leave/server.log.good b/server/tests/list_leave/server.log.good @@ -1,4 +1,3 @@ -accepting connections on <ip>:<port> (pid = <digits>) new connection (pid = <digits>) ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' device_add: success, <digits>:<base64> os <base64> diff --git a/server/tests/list_leave_unit/server.log.good b/server/tests/list_leave_unit/server.log.good @@ -1,4 +1,3 @@ -accepting connections on <ip>:<port> (pid = <digits>) new connection (pid = <digits>) ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' device_add: success, <digits>:<base64> os <base64> diff --git a/server/tests/list_reference_counting/server.log.good b/server/tests/list_reference_counting/server.log.good @@ -1,4 +1,3 @@ -accepting connections on <ip>:<port> (pid = <digits>) device_add: success, <digits>:<base64> os <base64> device_add: success, <digits>:<base64> os <base64> disconnected! diff --git a/server/tests/lists_get/server.log.good b/server/tests/lists_get/server.log.good @@ -1,4 +1,3 @@ -accepting connections on <ip>:<port> (pid = <digits>) new connection (pid = <digits>) ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' device_add: success, <digits>:<base64> os <base64> diff --git a/server/tests/lists_get_other/server.log.good b/server/tests/lists_get_other/server.log.good @@ -1,4 +1,3 @@ -accepting connections on <ip>:<port> (pid = <digits>) device_add: success, <digits>:<base64> os <base64> device_add: success, <digits>:<base64> os <base64> disconnected! diff --git a/server/tests/multiple_friends_same_other_list/server.log.good b/server/tests/multiple_friends_same_other_list/server.log.good @@ -1,4 +1,3 @@ -accepting connections on <ip>:<port> (pid = <digits>) device_add: success, <digits>:<base64> os <base64> device_add: success, <digits>:<base64> os <base64> device_add: success, <digits>:<base64> os <base64> diff --git a/server/tests/no_ssl_fails/server.log.good b/server/tests/no_ssl_fails/server.log.good @@ -1,3 +1,2 @@ -accepting connections on <ip>:<port> (pid = <digits>) new connection (pid = <digits>) -error: SSL accept attempt failed because of handshake problems +error: SSL accept attempt failed error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol diff --git a/server/tests/no_ssl_fails/test.pl b/server/tests/no_ssl_fails/test.pl @@ -7,24 +7,13 @@ use Time::HiRes qw(usleep); use test; # check that a non-ssl connection isn't accepted -my $socket; -my $timeout = time + 5; -while (1) { - $socket = new IO::Socket::INET( - PeerHost => 'localhost', - PeerPort => $ENV{PORT} || 5437, - ); - - if ($!{ECONNREFUSED}) { - if (time > $timeout) { - fail "server not ready after 5 seconds"; - } - usleep(50 * 1000); - next; - } - - last; -} +my $socket = new IO::Socket::INET( + PeerHost => 'localhost', + PeerPort => $ENV{PORT} || 5437, +); my $good_errno = 'Illegal seek'; -fail "expected errno '$good_errno' but got '$!'" if ($! ne $good_errno); +$socket->syswrite("a\0\0\0" x 787); +my $ret = $socket->sysread(my $buf, 6); +#fail "expected errno '$good_errno' but got '$!'" if ($! ne $good_errno); +fail "sysread returned '$ret', expected '0'" if ($ret != 0); diff --git a/server/tests/test.mk b/server/tests/test.mk @@ -10,12 +10,15 @@ process-server-log: -e 's/[0-9]\.[0-9]\.[0-9]\.[0-9]:[0-9]*/<ip>:<port>/' \ server.log -ifndef DIFF_MOD +ifeq ($(DIFF_MOD), none) +diff: + rm -f server.log +else ifeq ($(DIFF_MOD), sort) diff: process-server-log + LC_ALL=C sort -o server.log < server.log diff -u server.log.good server.log else diff: process-server-log - LC_ALL=C sort -o server.log < server.log diff -u server.log.good server.log endif diff --git a/server/tests/two_lists_same_name/server.log.good b/server/tests/two_lists_same_name/server.log.good @@ -1,4 +1,3 @@ -accepting connections on <ip>:<port> (pid = <digits>) new connection (pid = <digits>) ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' device_add: success, <digits>:<base64> os <base64>