use strict;
use warnings;
use Test::More;
use IPC::PubSub;
use IO::Socket::INET;
use File::Temp ':POSIX';
my @backends = qw(PlainHash);
unshift @backends, 'DBM_Deep' if eval { require DBM::Deep };
unshift @backends, 'JiftyDBI' if eval { require Jifty::DBI };
unshift @backends, 'Memcached' if eval { require Cache::Memcached } and IO::Socket::INET->new('127.0.0.1:11211');
plan tests => 15 * scalar @backends;
my $tmp = tmpnam();
END { unlink $tmp }
my %init_args = (
DBM_Deep => [ $tmp ],
JiftyDBI => [ db_init => 1 ],
Memcached => [ rand() . $$ ],
);
SKIP: for my $backend (@backends) {
diag("Testing backend $backend");
my $bus = IPC::PubSub->new($backend, @{$init_args{$backend}});
my @sub; $sub[0] = $bus->new_subscriber;
is_deeply([map {$_->[1]} @{$sub[0]->get_all->{''}}], [], 'get_all worked when there is no pubs');
is_deeply([$sub[0]->get], [], 'get_all worked when there is no pubs');
my $pub = $bus->new_publisher;
$pub->msg('foo');
$sub[1] = $bus->new_subscriber;
$pub->msg(['bar', 'bar']);
$pub->msg('baz');
my $got = $sub[0]->get;
is($got->[0], 'foo', 'get worked');
is($got->[1][0], 'bar', 'get worked');
is($got->[1][1], 'bar', 'get worked');
is($got->[2], 'baz', 'get worked');
is_deeply([$sub[0]->get], [], 'get emptied the cache');
is_deeply([map {ref($_) ? [@$_] : $_} map {$_->[1]} @{$sub[1]->get_all->{''}}], [['bar', 'bar'], 'baz'], 'get_all worked');
is_deeply([map {ref($_) ? [@$_] : $_} map {$_->[1]} @{$sub[1]->get_all->{''}}], [], 'get_all emptied the cache');
is($bus->modify('key'), undef, 'modify (1)');
is($bus->modify('key' => 'val'), 'val', 'modify (2)');
is($bus->modify('key'), 'val', 'modify (3)');
is($bus->modify('key' => sub { s/v/h/ }), 1, 'modify (4)');
is($bus->modify('key'), 'hal', 'modify (5)');
is($bus->modify('key' => undef), undef, 'modify (6)');
}