Update hardening rules.
[awesomized/libmemcached] / memcached / t / stats.t
1 #!/usr/bin/perl
2
3 use strict;
4 use Test::More tests => 95;
5 use FindBin qw($Bin);
6 use lib "$Bin/lib";
7 use MemcachedTest;
8
9 my $server = new_memcached();
10 my $sock = $server->sock;
11
12
13 ## Output looks like this:
14 ##
15 ## STAT pid 22969
16 ## STAT uptime 13
17 ## STAT time 1259170891
18 ## STAT version 1.4.3
19 ## STAT libevent 1.4.13-stable.
20 ## STAT pointer_size 32
21 ## STAT rusage_user 0.001198
22 ## STAT rusage_system 0.003523
23 ## STAT curr_connections 10
24 ## STAT total_connections 11
25 ## STAT connection_structures 11
26 ## STAT cmd_get 0
27 ## STAT cmd_set 0
28 ## STAT cmd_flush 0
29 ## STAT get_hits 0
30 ## STAT get_misses 0
31 ## STAT delete_misses 0
32 ## STAT delete_hits 0
33 ## STAT incr_misses 0
34 ## STAT incr_hits 0
35 ## STAT decr_misses 0
36 ## STAT decr_hits 0
37 ## STAT cas_misses 0
38 ## STAT cas_hits 0
39 ## STAT cas_badval 0
40 ## STAT auth_cmds 0
41 ## STAT auth_unknowns 0
42 ## STAT bytes_read 7
43 ## STAT bytes_written 0
44 ## STAT limit_maxbytes 67108864
45 ## STAT accepting_conns 1
46 ## STAT listen_disabled_num 0
47 ## STAT threads 4
48 ## STAT conn_yields 0
49 ## STAT bytes 0
50 ## STAT curr_items 0
51 ## STAT total_items 0
52 ## STAT evictions 0
53 ## STAT reclaimed 0
54
55 # note that auth stats are tested in auth specfic tests
56
57
58 my $stats = mem_stats($sock);
59
60 # Test number of keys
61 is(scalar(keys(%$stats)), 48, "48 stats values");
62
63 # Test initial state
64 foreach my $key (qw(curr_items total_items bytes cmd_get cmd_set get_hits evictions get_misses
65 bytes_written delete_hits delete_misses incr_hits incr_misses decr_hits
66 decr_misses listen_disabled_num)) {
67 is($stats->{$key}, 0, "initial $key is zero");
68 }
69 is($stats->{accepting_conns}, 1, "initial accepting_conns is one");
70
71 # Do some operations
72
73 print $sock "set foo 0 0 6\r\nfooval\r\n";
74 is(scalar <$sock>, "STORED\r\n", "stored foo");
75 mem_get_is($sock, "foo", "fooval");
76
77 my $stats = mem_stats($sock);
78
79 foreach my $key (qw(total_items curr_items cmd_get cmd_set get_hits)) {
80 is($stats->{$key}, 1, "after one set/one get $key is 1");
81 }
82
83 my $cache_dump = mem_stats($sock, " cachedump 1 100");
84 ok(defined $cache_dump->{'foo'}, "got foo from cachedump");
85
86 print $sock "delete foo\r\n";
87 is(scalar <$sock>, "DELETED\r\n", "deleted foo");
88
89 my $stats = mem_stats($sock);
90 is($stats->{delete_hits}, 1);
91 is($stats->{delete_misses}, 0);
92
93 print $sock "delete foo\r\n";
94 is(scalar <$sock>, "NOT_FOUND\r\n", "shouldn't delete foo again");
95
96 my $stats = mem_stats($sock);
97 is($stats->{delete_hits}, 1);
98 is($stats->{delete_misses}, 1);
99
100 # incr stats
101
102 sub check_incr_stats {
103 my ($ih, $im, $dh, $dm) = @_;
104 my $stats = mem_stats($sock);
105
106 is($stats->{incr_hits}, $ih);
107 is($stats->{incr_misses}, $im);
108 is($stats->{decr_hits}, $dh);
109 is($stats->{decr_misses}, $dm);
110 }
111
112 print $sock "incr i 1\r\n";
113 is(scalar <$sock>, "NOT_FOUND\r\n", "shouldn't incr a missing thing");
114 check_incr_stats(0, 1, 0, 0);
115
116 print $sock "decr d 1\r\n";
117 is(scalar <$sock>, "NOT_FOUND\r\n", "shouldn't decr a missing thing");
118 check_incr_stats(0, 1, 0, 1);
119
120 print $sock "set n 0 0 1\r\n0\r\n";
121 is(scalar <$sock>, "STORED\r\n", "stored n");
122
123 print $sock "incr n 3\r\n";
124 is(scalar <$sock>, "3\r\n", "incr works");
125 check_incr_stats(1, 1, 0, 1);
126
127 print $sock "decr n 1\r\n";
128 is(scalar <$sock>, "2\r\n", "decr works");
129 check_incr_stats(1, 1, 1, 1);
130
131 # cas stats
132
133 sub check_cas_stats {
134 my ($ch, $cm, $cb) = @_;
135 my $stats = mem_stats($sock);
136
137 is($stats->{cas_hits}, $ch);
138 is($stats->{cas_misses}, $cm);
139 is($stats->{cas_badval}, $cb);
140 }
141
142 check_cas_stats(0, 0, 0);
143
144 print $sock "cas c 0 0 1 99999999\r\nz\r\n";
145 is(scalar <$sock>, "NOT_FOUND\r\n", "missed cas");
146 check_cas_stats(0, 1, 0);
147
148 print $sock "set c 0 0 1\r\nx\r\n";
149 is(scalar <$sock>, "STORED\r\n", "stored c");
150 my ($id, $v) = mem_gets($sock, 'c');
151 is('x', $v, 'got the expected value');
152
153 print $sock "cas c 0 0 1 99999999\r\nz\r\n";
154 is(scalar <$sock>, "EXISTS\r\n", "missed cas");
155 check_cas_stats(0, 1, 1);
156 my ($newid, $v) = mem_gets($sock, 'c');
157 is('x', $v, 'got the expected value');
158
159 print $sock "cas c 0 0 1 $id\r\nz\r\n";
160 is(scalar <$sock>, "STORED\r\n", "good cas");
161 check_cas_stats(1, 1, 1);
162 my ($newid, $v) = mem_gets($sock, 'c');
163 is('z', $v, 'got the expected value');
164
165 my $settings = mem_stats($sock, ' settings');
166 is(1024, $settings->{'maxconns'});
167 is('NULL', $settings->{'domain_socket'});
168 is('on', $settings->{'evictions'});
169 is('yes', $settings->{'cas_enabled'});
170 is('no', $settings->{'auth_enabled_sasl'});
171
172 print $sock "stats reset\r\n";
173 is(scalar <$sock>, "RESET\r\n", "good stats reset");
174
175 my $stats = mem_stats($sock);
176 is(0, $stats->{'cmd_get'});
177 is(0, $stats->{'cmd_set'});
178 is(0, $stats->{'get_hits'});
179 is(0, $stats->{'get_misses'});
180 is(0, $stats->{'delete_misses'});
181 is(0, $stats->{'delete_hits'});
182 is(0, $stats->{'incr_misses'});
183 is(0, $stats->{'incr_hits'});
184 is(0, $stats->{'decr_misses'});
185 is(0, $stats->{'decr_hits'});
186 is(0, $stats->{'cas_misses'});
187 is(0, $stats->{'cas_hits'});
188 is(0, $stats->{'cas_badval'});
189 is(0, $stats->{'evictions'});
190 is(0, $stats->{'reclaimed'});
191
192 print $sock "flush_all\r\n";
193 is(scalar <$sock>, "OK\r\n", "flushed");
194
195 my $stats = mem_stats($sock);
196 is($stats->{cmd_flush}, 1, "after one flush cmd_flush is 1");