shlist

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

commit 1765b5ab9774cefb672d750ae10490b7e937ca10
parent c61f9d8664ab493ecd41d12f69d21ed70bb0e696
Author: Kyle Milz <kyle@0x30.net>
Date:   Sat, 27 Feb 2016 17:48:25 -0700

server: make sure server dies when it should

- previously I thought $logger->fatal() called 'die' but it does not
- so replace fatal() with logdie(), which actually does die
- also start checking log messages in tests
  - this is essentially server log diffing

Diffstat:
Mserver/sl | 23+++++++++++++----------
Mserver/t/bad_payloads.t | 6+++---
Mserver/t/device_add.t | 7+++++--
Dserver/t/exp_output/bad_payloads.server.log | 6------
Dserver/t/exp_output/device_add.server.log | 9---------
Dserver/t/exp_output/device_update.server.log | 4----
Dserver/t/exp_output/friend_add.server.log | 12------------
Dserver/t/exp_output/friend_delete.server.log | 45---------------------------------------------
Dserver/t/exp_output/friend_delete_unit.server.log | 9---------
Dserver/t/exp_output/get_other_lists_filters_my_lists.server.log | 27---------------------------
Dserver/t/exp_output/header.server.log | 15---------------
Dserver/t/exp_output/invalid_deviceid.server.log | 24------------------------
Dserver/t/exp_output/leave_list_your_not_in.server.log | 12------------
Dserver/t/exp_output/list_add.server.log | 17-----------------
Dserver/t/exp_output/list_join.server.log | 25-------------------------
Dserver/t/exp_output/list_join_unit.server.log | 9---------
Dserver/t/exp_output/list_leave.server.log | 13-------------
Dserver/t/exp_output/list_leave_unit.server.log | 6------
Dserver/t/exp_output/list_reference_counting.server.log | 25-------------------------
Dserver/t/exp_output/list_update.server.log | 28----------------------------
Dserver/t/exp_output/lists_get.server.log | 23-----------------------
Dserver/t/exp_output/lists_get_other.server.log | 21---------------------
Dserver/t/exp_output/multiple_friends_same_other_list.server.log | 36------------------------------------
Dserver/t/exp_output/two_lists_same_name.server.log | 17-----------------
Dserver/t/exp_output/update_list_youre_not_in.server.log | 12------------
Dserver/t/exp_output/utf8.server.log | 11-----------
Dserver/t/exp_output/zero_payload.server.log | 15---------------
Mserver/t/friend_add.t | 5++++-
Mserver/t/friend_delete_unit.t | 7+++++--
Mserver/t/header.t | 14++++++++------
Mserver/t/invalid_deviceid.t | 20++++++++++++++------
Mserver/t/leave_list_your_not_in.t | 5+++--
Mserver/t/list_join_unit.t | 4+++-
Mserver/t/list_leave_unit.t | 4+++-
Mserver/t/list_update.t | 4+++-
Mserver/t/no_ssl_fails.t | 9++-------
Mserver/t/response_too_large.t | 3++-
Mserver/t/update_list_youre_not_in.t | 3++-
Mserver/t/zero_payload.t | 5++++-
39 files changed, 74 insertions(+), 466 deletions(-)

diff --git a/server/sl b/server/sl @@ -9,7 +9,7 @@ use Getopt::Std; use IO::Socket::SSL; use IO::Socket::UNIX; use JSON::XS; -use Log::Log4perl qw(:easy); +use Log::Log4perl qw(:easy :no_extra_logdie_message); use Scalar::Util qw(looks_like_number); use SL::Database; @@ -30,7 +30,7 @@ if ($args{v}) { } else { Log::Log4perl->easy_init($ERROR); } -my $logger = Log::Log4perl->get_logger('shlist.server'); +my $logger = get_logger('shlist.server'); $logger->info("using database '$db_file'\n"); @@ -85,7 +85,7 @@ while (my $client_socket = $server_socket->accept()) { SSL_cert_file => 'certs/cert_chain.pem', SSL_key_file => 'certs/privkey.pem' ); - $logger->fatal("error: $SSL_ERROR\n") unless ($ret); + $logger->logdie("error: $SSL_ERROR\n") unless ($ret); my $ssl_ver = $client_socket->get_sslversion(); my $ssl_cipher = $client_socket->get_cipher(); @@ -153,6 +153,8 @@ sub handle_message { # Don't send notifications when there was en error return if ($response->{status} eq 'err'); + return if (@{ $notify->{devices} } == 0); + # Encode the notification message and find its size my $msg = encode_json($notify); my $msg_len = length($msg); @@ -224,8 +226,8 @@ sub recv_msg { my ($version, $msg_type, $payload_size) = unpack("nnn", $header); # Check version and message type are in range - $logger->fatal("error: unsupported protocol version $version\n") if ($version != 0); - $logger->fatal("error: unknown message type $msg_type\n") if ($msg_type >= @msg_str); + $logger->logdie("error: unsupported protocol version $version\n") if ($version != 0); + $logger->logdie("error: unknown message type $msg_type\n") if ($msg_type >= @msg_str); # Add logging message type prefix #$log->set_msg($msg_str[$msg_type]); @@ -233,7 +235,7 @@ sub recv_msg { # Server requests are limited to 4KB size, a 0 byte payload will not be # valid JSON so reject that here if ($payload_size > 4096 || $payload_size == 0) { - $logger->fatal("error: $payload_size byte payload invalid\n"); + $logger->logdie("error: $payload_size byte payload invalid\n"); } # Now that we know the size of the message we can try and read the @@ -244,7 +246,7 @@ sub recv_msg { my $request = decode_json($payload); if (ref($request) ne "HASH") { - $logger->fatal("error: json payload didn't have dictionary root\n"); + $logger->logdie("error: json payload didn't have dictionary root\n"); } return ($version, $msg_type, $request); } @@ -259,8 +261,8 @@ sub read_all { while ($bytes_total > 0) { my $read = $sock->sysread($data, $bytes_total, $bytes_read); - $logger->fatal("error: read failed: $!\n") if (!defined $read); - die "disconnected!\n" if ($read == 0); + $logger->logdie("error: read failed: $!\n") if (!defined $read); + $logger->logdie("disconnected!\n") && exit 0 if ($read == 0); $bytes_total -= $read; $bytes_read += $read; @@ -290,6 +292,7 @@ sub send_msg { my $err = make_error("response too large"); # If the new error we pass here is greater than the maximum # payload length this will infinitely recurse. + $logger->error("error: $payload_len byte response too large to send"); return send_msg($sock, $ver, $msg_type, $err); } @@ -312,7 +315,7 @@ sub send_all { while ($bytes_total) { my $wrote = $socket->syswrite($data, $bytes_total, $bytes_written); - $logger->fatal("error: write failed: $!\n") unless (defined $wrote); + $logger->logdie("error: write failed: $!\n") unless (defined $wrote); $bytes_total -= $wrote; $bytes_written += $wrote; diff --git a/server/t/bad_payloads.t b/server/t/bad_payloads.t @@ -2,16 +2,16 @@ use strict; use Test; use SL::Test; -BEGIN { plan tests => 1 } +BEGIN { plan tests => 2 } my $s = SL::Test::Server->new(); # Send a straight up unparsable json string my $client = SL::Test::Client->new(1); $client->send_all(pack('nnnZ*', 0, 0, 2, "{"), 8); +ok($s->readline(), "/expected, at character offset 1 \\(before \"/"); # Send an empty array back (which is valid json but we don't use this) $client = SL::Test::Client->new(1); $client->send_all(pack('nnnZ*', 0, 0, 2, "[]"), 9); - -ok(1); +ok($s->readline(), '/json payload didn\'t have dictionary root/'); diff --git a/server/t/device_add.t b/server/t/device_add.t @@ -2,9 +2,9 @@ use strict; use Test; use SL::Test; -BEGIN { plan tests => 12 } +BEGIN { plan tests => 15 } -my $server = SL::Test::Server->new(); +my $s = SL::Test::Server->new(); my $A = SL::Test::Client->new(); # Constructor automatically calls device_add so no need to do it here @@ -16,14 +16,17 @@ ok($length, 43); # Duplicate phone number my $err = $A->device_add({ phone_number => $A->phnum, os => 'unix' }, 'err'); ok($err, 'the sent phone number already exists'); +ok($s->readline(), "/phone number '.*' already exists/"); # Bad phone number $err = $A->device_add({ phone_number => '403867530&', os => 'unix' }, 'err'); ok($err, 'the sent phone number is not a number'); +ok($s->readline(), "/phone number invalid/"); # Bad operating system $err = $A->device_add({ phone_number => 12345, os => 'bados' }, 'err'); ok($err, 'operating system not supported'); +ok($s->readline(), "/unknown operating system 'bados'/"); # Good operating systems $A->device_add({ phone_number => 678910, os => 'android' }); diff --git a/server/t/exp_output/bad_payloads.server.log b/server/t/exp_output/bad_payloads.server.log @@ -1,6 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: error: payload wasn't json -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: error: json payload didn't have dictionary root diff --git a/server/t/exp_output/device_add.server.log b/server/t/exp_output/device_add.server.log @@ -1,9 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: success, <digits>:<base64> os <base64> -device_add: phone number <digits> already exists -device_add: phone number invalid -device_add: unknown operating system <base64> -device_add: success, <digits>:<base64> os <base64> -device_add: success, <digits>:<base64> os <base64> -disconnected! diff --git a/server/t/exp_output/device_update.server.log b/server/t/exp_output/device_update.server.log @@ -1,4 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: success, <digits>:<base64> os <base64> -disconnected! diff --git a/server/t/exp_output/friend_add.server.log b/server/t/exp_output/friend_add.server.log @@ -1,12 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: success, <digits>:<base64> os <base64> -friend_add: <base64> adding <digits> -friend_add: <base64> adding <digits> -friend_add: <base64> adding <base64> -friend_add: bad friends number <base64> -friend_add: <base64> adding <digits> -friend_add: bad friends number <digits> -friend_add: <base64> adding <digits> -friend_add: device <base64> tried adding itself -disconnected! diff --git a/server/t/exp_output/friend_delete.server.log b/server/t/exp_output/friend_delete.server.log @@ -1,45 +0,0 @@ -device_add: success, <digits>:<base64> os <base64> -device_add: success, <digits>:<base64> os <base64> -disconnected! -disconnected! -friend_add: <base64> adding <digits> -friend_add: <base64> adding <digits> -friend_add: added friend is a member -friend_add: added friend is a member -friend_add: found mutual friendship -friend_add: friends device id is <base64> -friend_add: friends device id is <base64> -friend_delete: also removing mutual friend relationship -friend_delete: removing <digits> from friends list -list_add: device <base64> -list_add: device <base64> -list_add: device <base64> -list_add: new list name <string>s first list' -list_add: new list name <string>s first list' -list_add: new list name <string>s second list' -list_add: new list number is <digits> -list_add: new list number is <digits> -list_add: new list number is <digits> -list_join: device <base64> -list_join: device <base64> has been added to list <digits> -list_join: list <digits> -lists_get: found list <digits>:<string>s first list' -lists_get: found list <digits>:<string>s first list' -lists_get: found list <digits>:<string>s first list' -lists_get: found list <digits>:<string>s second list' -lists_get: gathering lists for <base64> -lists_get: gathering lists for <base64> -lists_get: list has 0 items -lists_get: list has 0 items -lists_get: list has 0 items -lists_get: list has 0 items -lists_get: list has 1 members -lists_get: list has 1 members -lists_get: list has 2 members -lists_get: list has 2 members -lists_get_other: gathering lists for <base64> -lists_get_other: gathering lists for <base64> -new connection (pid = <digits>) -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' diff --git a/server/t/exp_output/friend_delete_unit.server.log b/server/t/exp_output/friend_delete_unit.server.log @@ -1,9 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: success, <digits>:<base64> os <base64> -friend_delete: tried deleting friend <digits> but they weren't a friend -friend_delete: bad friends number <base64> -friend_delete: bad friends number <digits> -friend_add: <base64> adding <digits> -friend_delete: removing <digits> from friends list -disconnected! diff --git a/server/t/exp_output/get_other_lists_filters_my_lists.server.log b/server/t/exp_output/get_other_lists_filters_my_lists.server.log @@ -1,27 +0,0 @@ -device_add: success, <digits>:<base64> os <base64> -device_add: success, <digits>:<base64> os <base64> -disconnected! -disconnected! -friend_add: <base64> adding <digits> -friend_add: <base64> adding <digits> -friend_add: added friend is a member -friend_add: added friend is a member -friend_add: found mutual friendship -friend_add: friends device id is <base64> -friend_add: friends device id is <base64> -list_add: device <base64> -list_add: device <base64> -list_add: new list name <string> -list_add: new list name <string> -list_add: new list number is <digits> -list_add: new list number is <digits> -list_join: device <base64> -list_join: device <base64> has been added to list <digits> -list_join: list <digits> -lists_get_other: found list <string> -lists_get_other: found mutual friend <digits> -lists_get_other: gathering lists for <base64> -new connection (pid = <digits>) -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' diff --git a/server/t/exp_output/header.server.log b/server/t/exp_output/header.server.log @@ -1,15 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -error: unknown message type 47837 -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -error: unsupported protocol version 101 -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: error: 25143 byte payload invalid -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: disconnected! -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -disconnected! diff --git a/server/t/exp_output/invalid_deviceid.server.log b/server/t/exp_output/invalid_deviceid.server.log @@ -1,24 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -friend_add: bad device id -friend_delete: bad device id -list_add: bad device id -list_join: bad device id -list_leave: bad device id -lists_get: bad device id -lists_get_other: bad device id -friend_add: bad device id -friend_delete: bad device id -list_add: bad device id -list_join: bad device id -list_leave: bad device id -lists_get: bad device id -lists_get_other: bad device id -friend_add: unknown device <base64> -friend_delete: unknown device <base64> -list_add: unknown device <base64> -list_join: unknown device <base64> -list_leave: unknown device <base64> -lists_get: unknown device <base64> -lists_get_other: unknown device <base64> -disconnected! diff --git a/server/t/exp_output/leave_list_your_not_in.server.log b/server/t/exp_output/leave_list_your_not_in.server.log @@ -1,12 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: success, <digits>:<base64> os <base64> -list_leave: tried to leave a list the user was not in for device <base64> and list <digits> -disconnected! -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: success, <digits>:<base64> os <base64> -list_add: device <base64> -list_add: new list name <string> -list_add: new list number is <digits> -disconnected! diff --git a/server/t/exp_output/list_add.server.log b/server/t/exp_output/list_add.server.log @@ -1,17 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: success, <digits>:<base64> os <base64> -list_add: device <base64> -list_add: new list name <string> -list_add: new list number is <digits> -list_add: device <base64> -list_add: new list name <digits> -list_add: new list number is <digits> -lists_get: gathering lists for <base64> -lists_get: found list <digits>:<string> -lists_get: list has 1 members -lists_get: list has 0 items -lists_get: found list <digits>:<digits> -lists_get: list has 1 members -lists_get: list has 0 items -disconnected! diff --git a/server/t/exp_output/list_join.server.log b/server/t/exp_output/list_join.server.log @@ -1,25 +0,0 @@ -device_add: success, <digits>:<base64> os <base64> -device_add: success, <digits>:<base64> os <base64> -disconnected! -disconnected! -friend_add: <base64> adding <digits> -friend_add: <base64> adding <digits> -friend_add: added friend is a member -friend_add: added friend is a member -friend_add: found mutual friendship -friend_add: friends device id is <base64> -friend_add: friends device id is <base64> -list_add: device <base64> -list_add: new list name <string> -list_add: new list number is <digits> -list_join: device <base64> -list_join: device <base64> has been added to list <digits> -list_join: list <digits> -lists_get: found list <digits>:<string> -lists_get: gathering lists for <base64> -lists_get: list has 0 items -lists_get: list has 2 members -new connection (pid = <digits>) -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' diff --git a/server/t/exp_output/list_join_unit.server.log b/server/t/exp_output/list_join_unit.server.log @@ -1,9 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: success, <digits>:<base64> os <base64> -list_join: unknown list number <digits> -list_add: device <base64> -list_add: new list name <string> -list_add: new list number is <digits> -list_join: tried to create a duplicate list member entry for device <base64> and list <digits> -disconnected! diff --git a/server/t/exp_output/list_leave.server.log b/server/t/exp_output/list_leave.server.log @@ -1,13 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: success, <digits>:<base64> os <base64> -list_add: device <base64> -list_add: new list name <string> -list_add: new list number is <digits> -list_leave: device <base64> has been removed from list <digits> -list_leave: list <digits> is empty... deleting -list_leave: device <base64> -list_leave: list <digits> -lists_get: gathering lists for <base64> -lists_get_other: gathering lists for <base64> -disconnected! diff --git a/server/t/exp_output/list_leave_unit.server.log b/server/t/exp_output/list_leave_unit.server.log @@ -1,6 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: success, <digits>:<base64> os <base64> -list_leave: unknown list number <digits> -list_leave: <digits> is not a number -disconnected! diff --git a/server/t/exp_output/list_reference_counting.server.log b/server/t/exp_output/list_reference_counting.server.log @@ -1,25 +0,0 @@ -device_add: success, <digits>:<base64> os <base64> -device_add: success, <digits>:<base64> os <base64> -disconnected! -disconnected! -list_add: device <base64> -list_add: new list name <string> -list_add: new list number is <digits> -list_join: device <base64> -list_join: device <base64> has been added to list <digits> -list_join: list <digits> -list_leave: device <base64> -list_leave: device <base64> -list_leave: device <base64> has been removed from list <digits> -list_leave: device <base64> has been removed from list <digits> -list_leave: list <digits> -list_leave: list <digits> -list_leave: list <digits> is empty... deleting -lists_get: found list <digits>:<string> -lists_get: gathering lists for <base64> -lists_get: list has 0 items -lists_get: list has 1 members -new connection (pid = <digits>) -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' diff --git a/server/t/exp_output/list_update.server.log b/server/t/exp_output/list_update.server.log @@ -1,28 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: success, <digits>:<base64> os <base64> -list_update: list number key not found -list_update: unknown list number <digits> -list_add: device <base64> -list_add: new list name <string> -list_add: new list number is <digits> -list_update: num = <digits> -list_update: name = <string> -lists_get: gathering lists for <base64> -lists_get: found list <digits>:<string> -lists_get: list has 1 members -lists_get: list has 0 items -list_update: num = <digits> -list_update: date = 12345 -lists_get: gathering lists for <base64> -lists_get: found list <digits>:<string> -lists_get: list has 1 members -lists_get: list has 0 items -list_update: num = <digits> -list_update: name = <string> -list_update: date = 54321 -lists_get: gathering lists for <base64> -lists_get: found list <digits>:<string> -lists_get: list has 1 members -lists_get: list has 0 items -disconnected! diff --git a/server/t/exp_output/lists_get.server.log b/server/t/exp_output/lists_get.server.log @@ -1,23 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: success, <digits>:<base64> os <base64> -list_add: device <base64> -list_add: new list name <string> -list_add: new list number is <digits> -list_add: device <base64> -list_add: new list name <string> -list_add: new list number is <digits> -list_add: device <base64> -list_add: new list name <string> -list_add: new list number is <digits> -lists_get: gathering lists for <base64> -lists_get: found list <digits>:<string> -lists_get: list has 1 members -lists_get: list has 0 items -lists_get: found list <digits>:<string> -lists_get: list has 1 members -lists_get: list has 0 items -lists_get: found list <digits>:<string> -lists_get: list has 1 members -lists_get: list has 0 items -disconnected! diff --git a/server/t/exp_output/lists_get_other.server.log b/server/t/exp_output/lists_get_other.server.log @@ -1,21 +0,0 @@ -device_add: success, <digits>:<base64> os <base64> -device_add: success, <digits>:<base64> os <base64> -disconnected! -disconnected! -friend_add: <base64> adding <digits> -friend_add: <base64> adding <digits> -friend_add: added friend is a member -friend_add: added friend is a member -friend_add: found mutual friendship -friend_add: friends device id is <base64> -friend_add: friends device id is <base64> -list_add: device <base64> -list_add: new list name <string> -list_add: new list number is <digits> -lists_get_other: found list <string> -lists_get_other: found mutual friend <digits> -lists_get_other: gathering lists for <base64> -new connection (pid = <digits>) -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' diff --git a/server/t/exp_output/multiple_friends_same_other_list.server.log b/server/t/exp_output/multiple_friends_same_other_list.server.log @@ -1,36 +0,0 @@ -device_add: success, <digits>:<base64> os <base64> -device_add: success, <digits>:<base64> os <base64> -device_add: success, <digits>:<base64> os <base64> -disconnected! -disconnected! -disconnected! -friend_add: <base64> adding <digits> -friend_add: <base64> adding <digits> -friend_add: <base64> adding <digits> -friend_add: <base64> adding <digits> -friend_add: added friend is a member -friend_add: added friend is a member -friend_add: added friend is a member -friend_add: added friend is a member -friend_add: found mutual friendship -friend_add: found mutual friendship -friend_add: friends device id is <base64> -friend_add: friends device id is <base64> -friend_add: friends device id is <base64> -friend_add: friends device id is <base64> -list_add: device <base64> -list_add: new list name <string> -list_add: new list number is <digits> -list_join: device <base64> -list_join: device <base64> has been added to list <digits> -list_join: list <digits> -lists_get_other: found list <string> -lists_get_other: found mutual friend <digits> -lists_get_other: found mutual friend <digits> -lists_get_other: gathering lists for <base64> -new connection (pid = <digits>) -new connection (pid = <digits>) -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' diff --git a/server/t/exp_output/two_lists_same_name.server.log b/server/t/exp_output/two_lists_same_name.server.log @@ -1,17 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: success, <digits>:<base64> os <base64> -list_add: device <base64> -list_add: new list name <string> -list_add: new list number is <digits> -list_add: device <base64> -list_add: new list name <string> -list_add: new list number is <digits> -lists_get: gathering lists for <base64> -lists_get: found list <digits>:<string> -lists_get: list has 1 members -lists_get: list has 0 items -lists_get: found list <digits>:<string> -lists_get: list has 1 members -lists_get: list has 0 items -disconnected! diff --git a/server/t/exp_output/update_list_youre_not_in.server.log b/server/t/exp_output/update_list_youre_not_in.server.log @@ -1,12 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: success, <digits>:<base64> os <base64> -list_update: device <base64> not in list <digits> -disconnected! -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: success, <digits>:<base64> os <base64> -list_add: device <base64> -list_add: new list name <string> -list_add: new list number is <digits> -disconnected! diff --git a/server/t/exp_output/utf8.server.log b/server/t/exp_output/utf8.server.log @@ -1,11 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: success, <digits>:<base64> os <base64> -list_add: device <base64> -list_add: new list name '“ æ 😸' -list_add: new list number is <digits> -lists_get: gathering lists for <base64> -lists_get: found list <digits>:'“ æ 😸' -lists_get: list has 1 members -lists_get: list has 0 items -disconnected! diff --git a/server/t/exp_output/zero_payload.server.log b/server/t/exp_output/zero_payload.server.log @@ -1,15 +0,0 @@ -new connection (pid = <digits>) -ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -device_add: phone number invalid -device_update: bad request, missing key 'device_id' -friend_add: bad request, missing key 'device_id' -friend_delete: bad request, missing key 'device_id' -list_add: bad request, missing key 'device_id' -list_update: bad request, missing key 'device_id' -list_join: bad request, missing key 'device_id' -list_leave: bad request, missing key 'device_id' -lists_get: bad request, missing key 'device_id' -lists_get_other: bad request, missing key 'device_id' -list_items_get: bad request, missing key 'device_id' -list_item_add: bad request, missing key 'device_id' -disconnected! diff --git a/server/t/friend_add.t b/server/t/friend_add.t @@ -2,7 +2,7 @@ use strict; use Test; use SL::Test; -BEGIN { plan tests => 10 } +BEGIN { plan tests => 13 } my $s = SL::Test::Server->new(); my $A = SL::Test::Client->new(); @@ -16,11 +16,14 @@ $A->friend_add('54321'); # Non numeric phone number my $err = $A->friend_add('123asdf', 'err'); ok($err, 'friends phone number is not a valid phone number'); +ok( $s->readline(), "/bad friends number '.*'/" ); # Empty phone number $err = $A->friend_add('', 'err'); ok($err, 'friends phone number is not a valid phone number'); +ok( $s->readline(), "/bad friends number '.*'/" ); # Friending yourself $err = $A->friend_add($A->phnum(), 'err'); ok($err, 'device cannot add itself as a friend'); +ok( $s->readline(), "/device '.*' tried adding itself/" ); diff --git a/server/t/friend_delete_unit.t b/server/t/friend_delete_unit.t @@ -2,22 +2,25 @@ use strict; use Test; use SL::Test; -BEGIN { plan tests => 10 } +BEGIN { plan tests => 13 } -my $server = SL::Test::Server->new(); +my $s = SL::Test::Server->new(); my $A = SL::Test::Client->new(); # Someone who is not your friend my $err = $A->friend_delete('12345', 'err'); ok($err, 'friend sent for deletion was not a friend'); +ok($s->readline(), "/tried deleting friend '.*' but they weren't a friend/"); # Non numeric friends phone number $err = $A->friend_delete('asdf123', 'err'); ok($err, 'friends phone number is not a valid phone number'); +ok($s->readline(), "/bad friends number '.*'/"); # Empty phone number $err = $A->friend_delete('', 'err'); ok($err, 'friends phone number is not a valid phone number'); +ok($s->readline(), "/bad friends number '.*'/"); # Add/delete cycle works $A->friend_add('12345'); diff --git a/server/t/header.t b/server/t/header.t @@ -2,24 +2,25 @@ use strict; use Test; use SL::Test; -# XXX: This test isn't very good -# - needs to check that server disconnects on these messages -BEGIN { plan tests => 1 } +BEGIN { plan tests => 6 } # Need a new connection every time because server disconnects on header errors. -my $server = SL::Test::Server->new(); +my $s = SL::Test::Server->new(); # Invalid message number my $client = SL::Test::Client->new(1); $client->send_all(pack('nnn', 0, 47837, 0), 6); +ok($s->readline(), '/error: unknown message type 47837/'); # Bad protocol version $client = SL::Test::Client->new(1); $client->send_all(pack('nnn', 101, 0, 0), 6); +ok($s->readline(), '/error: unsupported protocol version 101/'); # Payload length that's too long $client = SL::Test::Client->new(1); $client->send_all(pack('nnn', 0, 0, 25143), 6); +ok($s->readline(), '/error: 25143 byte payload invalid/'); # Advertised payload length longer than actual data length $client = SL::Test::Client->new(1); @@ -28,9 +29,10 @@ $client->send_all(pack('nnnZ*', 0, 0, 5, 'ab'), 9); # Truncated header $client = SL::Test::Client->new(1); $client->send_all(pack('nn', 101, 69), 4); +ok($s->readline(), '/disconnected!/'); # Zero bytes payload $client = SL::Test::Client->new(1); $client->send_all(pack('nnn', 0, 0, 0), 6); - -ok(1); +ok($s->readline(), '/disconnected!/'); +ok($s->readline(), '/error: 0 byte payload invalid/'); diff --git a/server/t/invalid_deviceid.t b/server/t/invalid_deviceid.t @@ -2,11 +2,11 @@ use strict; use Test; use SL::Test; -BEGIN { plan tests => 42 } +BEGIN { plan tests => 63 } # Test that sending invalid device id's results in errors -my $server = SL::Test::Server->new(); +my $s = SL::Test::Server->new(); # Don't register my $A = SL::Test::Client->new(1); @@ -15,6 +15,7 @@ my @good_msgs = ('the client sent a device id that was not base64', 'the client sent a device id that was not base64', 'the client sent an unknown device id' ); +my @good_logs = ('/bad device id/', '/bad device id/', "/unknown device 'legit'/"); for (0..2) { $A->set_device_id($device_ids[$_]); @@ -22,23 +23,30 @@ for (0..2) { # for messages that send 2 arguments, send an empty 2nd argument my $err = $A->friend_add('', 'err'); ok( $err, $good_msgs[$_] ); + ok( $s->readline(), $good_logs[$_]); $err = $A->friend_delete('', 'err'); ok( $err, $good_msgs[$_] ); + ok( $s->readline(), $good_logs[$_]); $err = $A->list_add('', 'err'); ok( $err, $good_msgs[$_] ); + ok( $s->readline(), $good_logs[$_]); $err = $A->list_join('', 'err'); - ok( $good_msgs[$_], $err ); + ok( $err, $good_msgs[$_] ); + ok( $s->readline(), $good_logs[$_]); $err = $A->list_leave('', 'err'); - ok( $good_msgs[$_], $err ); + ok( $err, $good_msgs[$_] ); + ok( $s->readline(), $good_logs[$_]); # messages that send 1 argument $err = $A->lists_get('err'); - ok( $good_msgs[$_], $err ); + ok( $err, $good_msgs[$_] ); + ok( $s->readline(), $good_logs[$_]); $err = $A->lists_get_other('err'); - ok( $good_msgs[$_], $err ); + ok( $err, $good_msgs[$_] ); + ok( $s->readline(), $good_logs[$_]); } diff --git a/server/t/leave_list_your_not_in.t b/server/t/leave_list_your_not_in.t @@ -2,11 +2,11 @@ use strict; use Test; use SL::Test; -BEGIN { plan tests => 7 } +BEGIN { plan tests => 8 } # Send a leave_list message that contains a valid list id but the requesting # device is not currently a member of. -my $server = SL::Test::Server->new(); +my $s = SL::Test::Server->new(); my $A = SL::Test::Client->new(); my $B = SL::Test::Client->new(); @@ -16,3 +16,4 @@ my $list = $A->list_add({ name => 'only a can see this list', date => 0 }); # Who knows how B got this list id, but he did my $err = $B->list_leave($list->{num}, 'err'); ok($err, 'the client was not a member of the list'); +ok($s->readline(), '/tried to leave a list the user was not in for device/'); diff --git a/server/t/list_join_unit.t b/server/t/list_join_unit.t @@ -2,7 +2,7 @@ use strict; use Test; use SL::Test; -BEGIN { plan tests => 7 } +BEGIN { plan tests => 9 } my $s = SL::Test::Server->new(); my $A = SL::Test::Client->new(); @@ -10,8 +10,10 @@ my $A = SL::Test::Client->new(); # Try joining a list that doesn't exist my $err = $A->list_join('12345678', 'err'); ok($err, 'the client sent an unknown list number'); +ok($s->readline(), "/unknown list number '.*'/"); # Test joining a list your already in my $list = $A->list_add({ name => 'my new test list', date => 0 }); $err = $A->list_join($list->{num}, 'err'); ok($err, 'the device is already part of this list'); +ok($s->readline(), "/tried to create a duplicate list member entry for device '.*' and list '.*'/"); diff --git a/server/t/list_leave_unit.t b/server/t/list_leave_unit.t @@ -2,7 +2,7 @@ use strict; use Test; use SL::Test; -BEGIN { plan tests => 6 } +BEGIN { plan tests => 8 } my $s = SL::Test::Server->new(); my $A = SL::Test::Client->new(); @@ -10,7 +10,9 @@ my $A = SL::Test::Client->new(); # Try leaving a list your not in my $err = $A->list_leave('1234567', 'err'); ok($err, 'the client sent an unknown list number'); +ok($s->readline(), "/unknown list number '.*'/"); # Try leaving the empty list $err = $A->list_leave('', 'err'); ok($err, 'the client sent a list number that was not a number'); +ok($s->readline(), "/'' is not a number/"); diff --git a/server/t/list_update.t b/server/t/list_update.t @@ -2,7 +2,7 @@ use strict; use Test; use SL::Test; -BEGIN { plan tests => 19 } +BEGIN { plan tests => 21 } my $s = SL::Test::Server->new(); my $A = SL::Test::Client->new(); @@ -10,10 +10,12 @@ my $A = SL::Test::Client->new(); # Test sending a request with no 'num' key my $err = $A->list_update({ name => 'some name' }, 'err'); ok( $err, 'the client did not send a list number' ); +ok( $s->readline(), "/list number key not found/" ); # Try and update a list that doesn't exist $err = $A->list_update({ num => 123456, name => 'some name' }, 'err'); ok( $err, 'the client sent an unknown list number' ); +ok( $s->readline(), "/unknown list number '.*'/" ); # All checks after this require a valid list, create one now my $list = $A->list_add({ name => 'this is a new list', date => 0 }); diff --git a/server/t/no_ssl_fails.t b/server/t/no_ssl_fails.t @@ -15,15 +15,10 @@ while (!defined $socket) { $socket = new IO::Socket::INET( PeerHost => 'localhost', PeerPort => 4729, - ); - usleep(100 * 1000); + ) or usleep(100 * 1000); } my $good_errno = 'Illegal seek'; $socket->syswrite("a\0\0\0" x 787); -#my $ret = $socket->sysread(my $buf, 6); -ok(1); -#fail "expected errno '$good_errno' but got '$!'" if ($! ne $good_errno); -#fail "sysread returned '$ret', expected '0'" if ($ret != 0); -#print STDERR $server->readline(); +ok($s->readline(), '/SSL accept attempt failed error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol/'); diff --git a/server/t/response_too_large.t b/server/t/response_too_large.t @@ -2,7 +2,7 @@ use strict; use Test; use SL::Test; -BEGIN { plan tests => 24 } +BEGIN { plan tests => 25 } # Test that a message greater than 65KB doesn't get sent my $s = SL::Test::Server->new(); @@ -13,3 +13,4 @@ $A->list_add({ name => 'a' x 4000, date => 0 }) for (1..20); # This request should be 20 * 4000 Bytes = ~80KB my $err = $A->lists_get('err'); ok($err, 'response too large'); +ok($s->readline(), "/error: 82135 byte response too large to send/"); diff --git a/server/t/update_list_youre_not_in.t b/server/t/update_list_youre_not_in.t @@ -2,7 +2,7 @@ use strict; use Test; use SL::Test; -BEGIN { plan tests => 7 } +BEGIN { plan tests => 8 } my $s = SL::Test::Server->new(); @@ -17,3 +17,4 @@ my $list = $A->list_add({ name => 'this is a new list for a', date => 0 }); my $request = { num => $list->{num}, name => 'some new name', date => 1 }; my $err = $B->list_update($request, 'err'); ok($err, 'client tried to update a list it was not in'); +ok($s->readline(), '/device \'.*\' not in list \'.*\'/'); diff --git a/server/t/zero_payload.t b/server/t/zero_payload.t @@ -2,7 +2,7 @@ use strict; use Test; use SL::Test; -BEGIN { plan tests => 12 } +BEGIN { plan tests => 24 } # Create new device, turn off automatic device_add my $s = SL::Test::Server->new(); @@ -11,12 +11,15 @@ my $A = SL::Test::Client->new(1); # Send size zero payload to all message types for ( $A->msg_str() ) { my $msg_good = 'a missing message argument was required'; + my $log_good = "/bad request, missing key 'device_id'/"; if ($_ eq 'device_add') { $msg_good = 'the sent phone number is not a number'; + $log_good = "/phone number invalid/"; } # Send empty dictionary $A->send_msg($_, {} ); my $response = $A->recv_msg($_); ok( $response->{reason}, $msg_good ); + ok( $s->readline(), $log_good ); }