Blame t/cas.t

Packit 4e8bc4
#!/usr/bin/perl
Packit 4e8bc4
Packit 4e8bc4
use strict;
Packit 4e8bc4
use Test::More tests => 43;
Packit 4e8bc4
use FindBin qw($Bin);
Packit 4e8bc4
use lib "$Bin/lib";
Packit 4e8bc4
use MemcachedTest;
Packit 4e8bc4
Packit 4e8bc4
Packit 4e8bc4
my $server = new_memcached();
Packit 4e8bc4
my $sock = $server->sock;
Packit 4e8bc4
my $sock2 = $server->new_sock;
Packit 4e8bc4
Packit 4e8bc4
my @result;
Packit 4e8bc4
my @result2;
Packit 4e8bc4
Packit 4e8bc4
ok($sock != $sock2, "have two different connections open");
Packit 4e8bc4
Packit 4e8bc4
sub check_args {
Packit 4e8bc4
    my ($line, $name) = @_;
Packit 4e8bc4
Packit 4e8bc4
    my $svr = new_memcached();
Packit 4e8bc4
    my $s = $svr->sock;
Packit 4e8bc4
Packit 4e8bc4
    print $s $line;
Packit 4e8bc4
    is(scalar <$s>, "CLIENT_ERROR bad command line format\r\n", $name);
Packit 4e8bc4
    undef $svr;
Packit 4e8bc4
}
Packit 4e8bc4
Packit 4e8bc4
check_args "cas bad blah 0 0 0\r\n\r\n", "bad flags";
Packit 4e8bc4
check_args "cas bad 0 blah 0 0\r\n\r\n", "bad exp";
Packit 4e8bc4
check_args "cas bad 0 0 blah 0\r\n\r\n", "bad cas";
Packit 4e8bc4
check_args "cas bad 0 0 0 blah\r\n\r\n", "bad size";
Packit 4e8bc4
Packit 4e8bc4
# gets foo (should not exist)
Packit 4e8bc4
print $sock "gets foo\r\n";
Packit 4e8bc4
is(scalar <$sock>, "END\r\n", "gets failed");
Packit 4e8bc4
Packit 4e8bc4
# set foo
Packit 4e8bc4
print $sock "set foo 0 0 6\r\nbarval\r\n";
Packit 4e8bc4
is(scalar <$sock>, "STORED\r\n", "stored barval");
Packit 4e8bc4
Packit 4e8bc4
# gets foo and verify identifier exists
Packit 4e8bc4
@result = mem_gets($sock, "foo");
Packit 4e8bc4
mem_gets_is($sock,$result[0],"foo","barval");
Packit 4e8bc4
Packit 4e8bc4
# cas fail
Packit 4e8bc4
print $sock "cas foo 0 0 6 123\r\nbarva2\r\n";
Packit 4e8bc4
is(scalar <$sock>, "EXISTS\r\n", "cas failed for foo");
Packit 4e8bc4
Packit 4e8bc4
# gets foo - success
Packit 4e8bc4
@result = mem_gets($sock, "foo");
Packit 4e8bc4
mem_gets_is($sock,$result[0],"foo","barval");
Packit 4e8bc4
Packit 4e8bc4
# cas success
Packit 4e8bc4
print $sock "cas foo 0 0 6 $result[0]\r\nbarva2\r\n";
Packit 4e8bc4
is(scalar <$sock>, "STORED\r\n", "cas success, set foo");
Packit 4e8bc4
Packit 4e8bc4
# cas failure (reusing the same key)
Packit 4e8bc4
print $sock "cas foo 0 0 6 $result[0]\r\nbarva2\r\n";
Packit 4e8bc4
is(scalar <$sock>, "EXISTS\r\n", "reusing a CAS ID");
Packit 4e8bc4
Packit 4e8bc4
# delete foo
Packit 4e8bc4
print $sock "delete foo\r\n";
Packit 4e8bc4
is(scalar <$sock>, "DELETED\r\n", "deleted foo");
Packit 4e8bc4
Packit 4e8bc4
# cas missing
Packit 4e8bc4
print $sock "cas foo 0 0 6 $result[0]\r\nbarva2\r\n";
Packit 4e8bc4
is(scalar <$sock>, "NOT_FOUND\r\n", "cas failed, foo does not exist");
Packit 4e8bc4
Packit 4e8bc4
# cas empty
Packit 4e8bc4
print $sock "cas foo 0 0 6 \r\nbarva2\r\n";
Packit 4e8bc4
is(scalar <$sock>, "ERROR\r\n", "cas empty, throw error");
Packit 4e8bc4
# cant parse barval2\r\n
Packit 4e8bc4
is(scalar <$sock>, "ERROR\r\n", "error out on barval2 parsing");
Packit 4e8bc4
Packit 4e8bc4
# set foo1
Packit 4e8bc4
print $sock "set foo1 0 0 1\r\n1\r\n";
Packit 4e8bc4
is(scalar <$sock>, "STORED\r\n", "set foo1");
Packit 4e8bc4
# set foo2
Packit 4e8bc4
print $sock "set foo2 0 0 1\r\n2\r\n";
Packit 4e8bc4
is(scalar <$sock>, "STORED\r\n", "set foo2");
Packit 4e8bc4
Packit 4e8bc4
# gets foo1 check
Packit 4e8bc4
print $sock "gets foo1\r\n";
Packit 4e8bc4
ok(scalar <$sock> =~ /VALUE foo1 0 1 (\d+)\r\n/, "gets foo1 regexp success");
Packit 4e8bc4
my $foo1_cas = $1;
Packit 4e8bc4
is(scalar <$sock>, "1\r\n","gets foo1 data is 1");
Packit 4e8bc4
is(scalar <$sock>, "END\r\n","gets foo1 END");
Packit 4e8bc4
Packit 4e8bc4
# gets foo2 check
Packit 4e8bc4
print $sock "gets foo2\r\n";
Packit 4e8bc4
ok(scalar <$sock> =~ /VALUE foo2 0 1 (\d+)\r\n/,"gets foo2 regexp success");
Packit 4e8bc4
my $foo2_cas = $1;
Packit 4e8bc4
is(scalar <$sock>, "2\r\n","gets foo2 data is 2");
Packit 4e8bc4
is(scalar <$sock>, "END\r\n","gets foo2 END");
Packit 4e8bc4
Packit 4e8bc4
# validate foo1 != foo2
Packit 4e8bc4
ok($foo1_cas != $foo2_cas,"foo1 != foo2 single-gets success");
Packit 4e8bc4
Packit 4e8bc4
# multi-gets
Packit 4e8bc4
print $sock "gets foo1 foo2\r\n";
Packit 4e8bc4
ok(scalar <$sock> =~ /VALUE foo1 0 1 (\d+)\r\n/, "validating first set of data is foo1");
Packit 4e8bc4
$foo1_cas = $1;
Packit 4e8bc4
is(scalar <$sock>, "1\r\n", "validating foo1 set of data is 1");
Packit 4e8bc4
ok(scalar <$sock> =~ /VALUE foo2 0 1 (\d+)\r\n/, "validating second set of data is foo2");
Packit 4e8bc4
$foo2_cas = $1;
Packit 4e8bc4
is(scalar <$sock>, "2\r\n", "validating foo2 set of data is 2");
Packit 4e8bc4
is(scalar <$sock>, "END\r\n","validating foo1,foo2 gets is over - END");
Packit 4e8bc4
Packit 4e8bc4
# validate foo1 != foo2
Packit 4e8bc4
ok($foo1_cas != $foo2_cas, "foo1 != foo2 multi-gets success");
Packit 4e8bc4
Packit 4e8bc4
### simulate race condition with cas
Packit 4e8bc4
Packit 4e8bc4
# gets foo1 - success
Packit 4e8bc4
@result = mem_gets($sock, "foo1");
Packit 4e8bc4
ok($result[0] != "", "sock - gets foo1 is not empty");
Packit 4e8bc4
Packit 4e8bc4
# gets foo2 - success
Packit 4e8bc4
@result2 = mem_gets($sock2, "foo1");
Packit 4e8bc4
ok($result2[0] != "","sock2 - gets foo1 is not empty");
Packit 4e8bc4
Packit 4e8bc4
print $sock "cas foo1 0 0 6 $result[0]\r\nbarva2\r\n";
Packit 4e8bc4
print $sock2 "cas foo1 0 0 5 $result2[0]\r\napple\r\n";
Packit 4e8bc4
Packit 4e8bc4
my $res1 = <$sock>;
Packit 4e8bc4
my $res2 = <$sock2>;
Packit 4e8bc4
Packit 4e8bc4
ok( ( $res1 eq "STORED\r\n" && $res2 eq "EXISTS\r\n") ||
Packit 4e8bc4
    ( $res1 eq "EXISTS\r\n" && $res2 eq "STORED\r\n"),
Packit 4e8bc4
    "cas on same item from two sockets");
Packit 4e8bc4
Packit 4e8bc4
### bug 15: http://code.google.com/p/memcached/issues/detail?id=15
Packit 4e8bc4
Packit 4e8bc4
# set foo
Packit 4e8bc4
print $sock "set bug15 0 0 1\r\n0\r\n";
Packit 4e8bc4
is(scalar <$sock>, "STORED\r\n", "stored 0");
Packit 4e8bc4
Packit 4e8bc4
# Check out the first gets.
Packit 4e8bc4
print $sock "gets bug15\r\n";
Packit 4e8bc4
ok(scalar <$sock> =~ /VALUE bug15 0 1 (\d+)\r\n/, "gets bug15 regexp success");
Packit 4e8bc4
my $bug15_cas = $1;
Packit 4e8bc4
is(scalar <$sock>, "0\r\n", "gets bug15 data is 0");
Packit 4e8bc4
is(scalar <$sock>, "END\r\n","gets bug15 END");
Packit 4e8bc4
Packit 4e8bc4
# Increment
Packit 4e8bc4
print $sock "incr bug15 1\r\n";
Packit 4e8bc4
is(scalar <$sock>, "1\r\n", "incr worked");
Packit 4e8bc4
Packit 4e8bc4
# Validate a changed CAS
Packit 4e8bc4
print $sock "gets bug15\r\n";
Packit 4e8bc4
ok(scalar <$sock> =~ /VALUE bug15 0 1 (\d+)\r\n/, "gets bug15 regexp success");
Packit 4e8bc4
my $next_bug15_cas = $1;
Packit 4e8bc4
is(scalar <$sock>, "1\r\n", "gets bug15 data is 1");
Packit 4e8bc4
is(scalar <$sock>, "END\r\n","gets bug15 END");
Packit 4e8bc4
Packit 4e8bc4
ok($bug15_cas != $next_bug15_cas, "CAS changed");