shlist

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

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:
Aserver/tests/list_reference_counting/Makefile | 1+
Aserver/tests/list_reference_counting/server.log.good | 26++++++++++++++++++++++++++
Aserver/tests/list_reference_counting/test.pl | 44++++++++++++++++++++++++++++++++++++++++++++
Mserver/tests/test.pm | 29++++++++++++++++++++++++++++-
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');