|
Packit |
4e8bc4 |
#!/usr/bin/perl
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
use strict;
|
|
Packit |
4e8bc4 |
use Test::More tests => 108;
|
|
Packit |
4e8bc4 |
use FindBin qw($Bin);
|
|
Packit |
4e8bc4 |
use lib "$Bin/lib";
|
|
Packit |
4e8bc4 |
use MemcachedTest;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $server = new_memcached("-o no_lru_crawler,no_lru_maintainer");
|
|
Packit |
4e8bc4 |
my $sock = $server->sock;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
## Output looks like this:
|
|
Packit |
4e8bc4 |
##
|
|
Packit |
4e8bc4 |
## STAT pid 22969
|
|
Packit |
4e8bc4 |
## STAT uptime 13
|
|
Packit |
4e8bc4 |
## STAT time 1259170891
|
|
Packit |
4e8bc4 |
## STAT version 1.4.3
|
|
Packit |
4e8bc4 |
## STAT libevent 1.4.13-stable.
|
|
Packit |
4e8bc4 |
## see doc/protocol.txt for others
|
|
Packit |
4e8bc4 |
# note that auth stats are tested in auth specific tests
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Test number of keys
|
|
Packit |
4e8bc4 |
if (MemcachedTest::enabled_tls_testing()) {
|
|
Packit |
4e8bc4 |
# when TLS is enabled, stats contains time_since_server_cert_refresh
|
|
Packit |
4e8bc4 |
is(scalar(keys(%$stats)), 72, "expected count of stats values");
|
|
Packit |
4e8bc4 |
} else {
|
|
Packit |
4e8bc4 |
is(scalar(keys(%$stats)), 71, "expected count of stats values");
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Test initial state
|
|
Packit |
4e8bc4 |
foreach my $key (qw(curr_items total_items bytes cmd_get cmd_set get_hits evictions get_misses get_expired
|
|
Packit |
4e8bc4 |
bytes_written delete_hits delete_misses incr_hits incr_misses decr_hits get_flushed
|
|
Packit |
4e8bc4 |
decr_misses listen_disabled_num lrutail_reflocked time_in_listen_disabled_us)) {
|
|
Packit |
4e8bc4 |
is($stats->{$key}, 0, "initial $key is zero");
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
is($stats->{accepting_conns}, 1, "initial accepting_conns is one");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Do some operations
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $sock "set foo 0 0 6\r\nfooval\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "STORED\r\n", "stored foo");
|
|
Packit |
4e8bc4 |
mem_get_is($sock, "foo", "fooval");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
foreach my $key (qw(total_items curr_items cmd_get cmd_set get_hits)) {
|
|
Packit |
4e8bc4 |
is($stats->{$key}, 1, "after one set/one get $key is 1");
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $cache_dump = mem_stats($sock, " cachedump 1 100");
|
|
Packit |
4e8bc4 |
ok(defined $cache_dump->{'foo'}, "got foo from cachedump");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $sock "delete foo\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "DELETED\r\n", "deleted foo");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
is($stats->{delete_hits}, 1);
|
|
Packit |
4e8bc4 |
is($stats->{delete_misses}, 0);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $sock "delete foo\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "NOT_FOUND\r\n", "shouldn't delete foo again");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
is($stats->{delete_hits}, 1);
|
|
Packit |
4e8bc4 |
is($stats->{delete_misses}, 1);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# incr stats
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
sub check_incr_stats {
|
|
Packit |
4e8bc4 |
my ($ih, $im, $dh, $dm) = @_;
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
is($stats->{incr_hits}, $ih);
|
|
Packit |
4e8bc4 |
is($stats->{incr_misses}, $im);
|
|
Packit |
4e8bc4 |
is($stats->{decr_hits}, $dh);
|
|
Packit |
4e8bc4 |
is($stats->{decr_misses}, $dm);
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $sock "incr i 1\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "NOT_FOUND\r\n", "shouldn't incr a missing thing");
|
|
Packit |
4e8bc4 |
check_incr_stats(0, 1, 0, 0);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $sock "decr d 1\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "NOT_FOUND\r\n", "shouldn't decr a missing thing");
|
|
Packit |
4e8bc4 |
check_incr_stats(0, 1, 0, 1);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $sock "set n 0 0 1\r\n0\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "STORED\r\n", "stored n");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $sock "incr n 3\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "3\r\n", "incr works");
|
|
Packit |
4e8bc4 |
check_incr_stats(1, 1, 0, 1);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $sock "decr n 1\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "2\r\n", "decr works");
|
|
Packit |
4e8bc4 |
check_incr_stats(1, 1, 1, 1);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# cas stats
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
sub check_cas_stats {
|
|
Packit |
4e8bc4 |
my ($ch, $cm, $cb) = @_;
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
is($stats->{cas_hits}, $ch);
|
|
Packit |
4e8bc4 |
is($stats->{cas_misses}, $cm);
|
|
Packit |
4e8bc4 |
is($stats->{cas_badval}, $cb);
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
check_cas_stats(0, 0, 0);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $sock "cas c 0 0 1 99999999\r\nz\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "NOT_FOUND\r\n", "missed cas");
|
|
Packit |
4e8bc4 |
check_cas_stats(0, 1, 0);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $sock "set c 0 0 1\r\nx\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "STORED\r\n", "stored c");
|
|
Packit |
4e8bc4 |
my ($id, $v) = mem_gets($sock, 'c');
|
|
Packit |
4e8bc4 |
is('x', $v, 'got the expected value');
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $sock "cas c 0 0 1 99999999\r\nz\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "EXISTS\r\n", "missed cas");
|
|
Packit |
4e8bc4 |
check_cas_stats(0, 1, 1);
|
|
Packit |
4e8bc4 |
my ($newid, $v) = mem_gets($sock, 'c');
|
|
Packit |
4e8bc4 |
is('x', $v, 'got the expected value');
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $sock "cas c 0 0 1 $id\r\nz\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "STORED\r\n", "good cas");
|
|
Packit |
4e8bc4 |
check_cas_stats(1, 1, 1);
|
|
Packit |
4e8bc4 |
my ($newid, $v) = mem_gets($sock, 'c');
|
|
Packit |
4e8bc4 |
is('z', $v, 'got the expected value');
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $settings = mem_stats($sock, ' settings');
|
|
Packit |
4e8bc4 |
is(1024, $settings->{'maxconns'});
|
|
Packit |
4e8bc4 |
# we run SSL tests over TCP; hence the domain_socket
|
|
Packit |
4e8bc4 |
# is expected to be NULL.
|
|
Packit |
4e8bc4 |
if (enabled_tls_testing()) {
|
|
Packit |
4e8bc4 |
is('NULL', $settings->{'domain_socket'});
|
|
Packit |
4e8bc4 |
} else {
|
|
Packit |
4e8bc4 |
isnt('NULL', $settings->{'domain_socket'});
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
is('on', $settings->{'evictions'});
|
|
Packit |
4e8bc4 |
is('yes', $settings->{'cas_enabled'});
|
|
Packit |
4e8bc4 |
is('no', $settings->{'auth_enabled_sasl'});
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $sock "stats reset\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "RESET\r\n", "good stats reset");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
is(0, $stats->{'cmd_get'});
|
|
Packit |
4e8bc4 |
is(0, $stats->{'cmd_set'});
|
|
Packit |
4e8bc4 |
is(0, $stats->{'get_hits'});
|
|
Packit |
4e8bc4 |
is(0, $stats->{'get_misses'});
|
|
Packit |
4e8bc4 |
is(0, $stats->{'get_expired'});
|
|
Packit |
4e8bc4 |
is(0, $stats->{'get_flushed'});
|
|
Packit |
4e8bc4 |
is(0, $stats->{'delete_misses'});
|
|
Packit |
4e8bc4 |
is(0, $stats->{'delete_hits'});
|
|
Packit |
4e8bc4 |
is(0, $stats->{'incr_misses'});
|
|
Packit |
4e8bc4 |
is(0, $stats->{'incr_hits'});
|
|
Packit |
4e8bc4 |
is(0, $stats->{'decr_misses'});
|
|
Packit |
4e8bc4 |
is(0, $stats->{'decr_hits'});
|
|
Packit |
4e8bc4 |
is(0, $stats->{'cas_misses'});
|
|
Packit |
4e8bc4 |
is(0, $stats->{'cas_hits'});
|
|
Packit |
4e8bc4 |
is(0, $stats->{'cas_badval'});
|
|
Packit |
4e8bc4 |
is(0, $stats->{'evictions'});
|
|
Packit |
4e8bc4 |
is(0, $stats->{'reclaimed'});
|
|
Packit |
4e8bc4 |
is(0, $stats->{'lrutail_reflocked'});
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# item expired
|
|
Packit |
4e8bc4 |
print $sock "set should_expire 0 2678400 6\r\nfooval\r\n"; #2678400 = 31 days in seconds
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "STORED\r\n", "set item to expire");
|
|
Packit |
4e8bc4 |
print $sock "get should_expire\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "END\r\n", "item not returned");
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
is(1, $stats->{'get_expired'}, "get_expired counter is 1");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $sock "set should_be_flushed 0 0 6\r\nbooval\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "STORED\r\n", "set item to flush");
|
|
Packit |
4e8bc4 |
print $sock "flush_all\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "OK\r\n", "flushed");
|
|
Packit |
4e8bc4 |
print $sock "get should_be_flushed\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "END\r\n", "flushed item not returned");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
is($stats->{cmd_flush}, 1, "after one flush cmd_flush is 1");
|
|
Packit |
4e8bc4 |
is($stats->{get_flushed}, 1, "after flush and a get, get_flushed is 1");
|