commit 8c5e0d534e6a5eed8a7958953c17da6d6f5e9a21
parent 082b0ded9fcdca99beaa545efe8df4c3c30f6651
Author: kyle <kyle@0x30.net>
Date: Sat, 2 Jan 2016 14:00:38 -0700
tests: add new test for list reference counting
Diffstat:
4 files changed, 99 insertions(+), 1 deletion(-)
diff --git a/server/tests/list_reference_counting/Makefile b/server/tests/list_reference_counting/Makefile
@@ -0,0 +1 @@
+include ../test.mk
diff --git a/server/tests/list_reference_counting/server.log.good b/server/tests/list_reference_counting/server.log.good
@@ -0,0 +1,26 @@
+accepting connections on <ip>:<port> (pid = <digits>)
+new connection (pid = <digits>)
+ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256'
+new_device: success, <digits>:<base64> os <base64>
+join_list: device <base64>
+join_list: list <base64>
+join_list: device <base64> has been added to list <base64>
+list_get: gathering lists for <base64>
+list_get: found list <string> <base64>
+list_get: list has 1 members
+list_get: list has 0 items
+leave_list: device <base64>
+leave_list: list <base64>
+leave_list: device <base64> has been removed from list <base64>
+leave_list: list <base64> is empty... deleting
+disconnected!
+new connection (pid = <digits>)
+ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256'
+new_device: success, <digits>:<base64> os <base64>
+new_list: <string>
+new_list: adding first member devid = <base64>
+new_list: fingerprint = <base64>
+leave_list: device <base64>
+leave_list: list <base64>
+leave_list: device <base64> has been removed from list <base64>
+disconnected!
diff --git a/server/tests/list_reference_counting/test.pl b/server/tests/list_reference_counting/test.pl
@@ -0,0 +1,44 @@
+#!/usr/bin/perl -I../
+use strict;
+use warnings;
+use test;
+
+# this is a test for list lifetime, especially when the creator of the list
+# leaves. it makes sure that when A creates a list, then B joins, and then A
+# leaves, that the list does not get deleted and is still accessible to B.
+
+my ($sockets, $phnums, $device_ids) = create_devices(2);
+my $list_name = "this is a new list";
+
+# A creates a new list
+send_msg($$sockets[0], 'new_list', "$$device_ids[0]\0$list_name");
+my ($msg_data) = recv_msg($$sockets[0], 'new_list');
+
+my $msg = check_status($msg_data, 'ok');
+my ($list_id) = split("\0", $msg);
+
+# B joins the list
+send_msg($$sockets[1], 'join_list', "$$device_ids[1]\0$list_id");
+($msg_data) = recv_msg($$sockets[1], 'join_list');
+
+check_status($msg_data, 'ok');
+
+# A leaves the list
+send_msg($$sockets[0], 'leave_list', "$$device_ids[0]\0$list_id");
+($msg_data) = recv_msg($$sockets[0], 'leave_list');
+
+$msg = check_status($msg_data, 'ok');
+
+# B verifies its still in the list
+send_msg($$sockets[1], 'list_get', $$device_ids[1]);
+($msg_data) = recv_msg($$sockets[1], 'list_get');
+
+my $lists = check_status($msg_data, 'ok');
+my @lists = split("\n", $lists);
+fail "expected 1 list, got " . @lists if (@lists != 1);
+
+# B also leaves the list
+send_msg($$sockets[1], 'leave_list', "$$device_ids[1]\0$list_id");
+($msg_data) = recv_msg($$sockets[1], 'leave_list');
+
+$msg = check_status($msg_data, 'ok');
diff --git a/server/tests/test.pm b/server/tests/test.pm
@@ -11,7 +11,8 @@ use Time::HiRes qw(usleep);
require "msgs.pl";
our (%msg_num, @msg_str);
-our @EXPORT = qw(new_socket fail send_msg recv_msg %msg_num @msg_str check_status rand_phnum);
+our @EXPORT = qw(new_socket fail send_msg recv_msg %msg_num @msg_str
+ check_status rand_phnum create_devices);
sub fail {
my (undef, $file, $line) = caller;
@@ -19,6 +20,32 @@ sub fail {
exit 1;
}
+sub create_devices {
+ my ($count) = @_;
+
+ my @sockets;
+ my @phnums;
+ my @device_ids;
+
+ # $count can potentially be 0
+ for (1..$count) {
+ my $sock = new_socket();
+ my $phnum = rand_phnum();
+
+ send_msg($sock, 'new_device', "$phnum\0unix");
+ my ($msg) = recv_msg($sock, 'new_device');
+
+ my $device_id = check_status($msg, 'ok');
+
+ push @sockets, $sock;
+ push @phnums, $phnum;
+ push @device_ids, $device_id;
+ }
+
+ return (\@sockets, \@phnums, \@device_ids);
+}
+
+
my $string_gen = String::Random->new;
sub rand_phnum {
return $string_gen->randpattern('nnnnnnnnnn');