# tests for functions documented in memcached_get.pod
# (except for memcached_fetch_result)
use strict;
use warnings;
use Test::More;
use Memcached::libmemcached
# functions explicitly tested by this file
qw(
memcached_get
memcached_mget
memcached_fetch
),
# other functions used by the tests
qw(
memcached_set
);
use lib 't/lib';
use libmemcached_test;
my $memc = libmemcached_test_create();
my $items = 5;
plan tests => ($items * 3) + 3
+ 2 * (1 + $items * 2 + 1)
+ $items + 6
+ $items + 7
+ 1;
my ($rv, $rc, $flags, $tmp);
my $t1= time();
my %data = map { ("k$_.$t1" => "v$_.$t1") } (1..$items-2);
# add extra long and extra short items to help spot buffer issues
$data{"kL.LLLLLLLLLLLLLLLLLL"} = "vLLLLLLLLLLLLLLLLLLLL";
$data{"kS.S"} = "vS";
ok memcached_set($memc, $_, $data{$_})
for keys %data;
is memcached_get($memc, $_), $data{$_}
for keys %data;
is $memc->get($_), $data{$_}
for keys %data;
ok !memcached_mget($memc, undef);
ok !memcached_mget($memc, 0);
ok !memcached_mget($memc, 1);
for my $keys_ref (
[ keys %data ],
{ % data },
) {
ok memcached_mget($memc, $keys_ref);
my %got;
my $key;
while (defined( my $value = memcached_fetch($memc, $key, $flags, $rc) )) {
ok $rc, 'rc should be true';
is $flags, 0, 'flags should be 0';
print "memcached_fetch($key) => $value\n";
$got{ $key } = $value;
}
is_deeply \%got, \%data;
}
print "mget_into_hashref\n";
# tweak data so it's different from previous tests
%data = map { $_ . "a" } %data;
#use Data::Dumper; warn Dumper(\%data);
ok memcached_set($memc, $_, $data{$_})
for keys %data;
ok $memc->mget_into_hashref([ ], {}),
'should return true, even if no keys';
{
my %h = ();
ok $memc->mget_into_hashref([ 'none_such_foo' ], \%h),
'should return true, even if no results';
is_deeply \%h, {},
'results should be empty';
}
my %extra = ( foo => 'bar' );
# reset got data, but not to empty so we check the hash isn't erased
my %got = %extra;
ok $memc->mget_into_hashref([ keys %data ], \%got),
'should return true';
is_deeply \%got, { %data, %extra };
# refetch with duplicate keys, mainly to trigger realloc of key buffers
ok $memc->mget_into_hashref([ (keys %data) x 10 ], \%got),
'should return true';
is_deeply \%got, { %data, %extra };
print "get_multi\n";
# tweak data so it's different from previous tests
%data = map { $_ . "b" } %data;
ok memcached_set($memc, $_, $data{$_})
for keys %data;
is_deeply $memc->get_multi(), {},
'should return empty hash for no keys';
is_deeply $memc->get_multi('none_such_foo'), {},
'should return empty hash if no results';
$tmp = $memc->get_multi(keys %data);
ok $tmp;
is ref $tmp, 'HASH';
is scalar keys %$tmp, scalar keys %data;
is_deeply $tmp, \%data,
'results should match';
# refetch with duplicate keys, mainly to trigger realloc of key buffers
is_deeply $memc->get_multi((keys %data) x 10), \%data,
'should return true';