[memcached] bradfitz, r325: start of tests
commits at code.sixapart.com
commits at code.sixapart.com
Mon Sep 4 00:47:21 UTC 2006
start of tests
A trunk/server/test/00-startup.t
A trunk/server/test/getset.t
A trunk/server/test/lib/
A trunk/server/test/lib/MemcachedTest.pm
Added: trunk/server/test/00-startup.t
===================================================================
--- trunk/server/test/00-startup.t 2006-09-03 23:57:20 UTC (rev 324)
+++ trunk/server/test/00-startup.t 2006-09-04 00:47:19 UTC (rev 325)
@@ -0,0 +1,11 @@
+#!/usr/bin/perl
+
+use strict;
+use Test::More tests => 1;
+use FindBin qw($Bin);
+use lib "$Bin/lib";
+use MemcachedTest;
+
+my $server = new_memcached();
+
+ok($server, "started the server");
Property changes on: trunk/server/test/00-startup.t
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/server/test/getset.t
===================================================================
--- trunk/server/test/getset.t 2006-09-03 23:57:20 UTC (rev 324)
+++ trunk/server/test/getset.t 2006-09-04 00:47:19 UTC (rev 325)
@@ -0,0 +1,60 @@
+#!/usr/bin/perl
+
+use strict;
+use Test::More tests => 1;
+use FindBin qw($Bin);
+use lib "$Bin/lib";
+use MemcachedTest;
+
+my $server = new_memcached();
+my $sock = $server->sock;
+
+# set foo (and should get it)
+print $sock "set foo 0 0 6\r\nfooval\r\n";
+is(scalar <$sock>, "STORED\r\n", "stored foo");
+print $sock "get foo\n";
+is(scalar <$sock>, "VALUE foo 0 6\r\n", "got FOO value");
+is(scalar <$sock>, "fooval\r\n", "got fooval");
+is(scalar <$sock>, "END\r\n", "got END");
+
+# add bar (and should get it)
+print $sock "add bar 0 0 6\r\nbarval\r\n";
+is(scalar <$sock>, "STORED\r\n", "stored barval");
+print $sock "get bar\n";
+is(scalar <$sock>, "VALUE bar 0 6\r\n", "got bar value");
+is(scalar <$sock>, "barval\r\n", "got barval");
+is(scalar <$sock>, "END\r\n", "got END");
+
+# add foo (but shouldn't get new value)
+print $sock "add foo 0 0 5\r\nfoov2\r\n";
+is(scalar <$sock>, "NOT_STORED\r\n", "not stored");
+print $sock "get foo\n";
+is(scalar <$sock>, "VALUE foo 0 6\r\n", "got FOO value");
+is(scalar <$sock>, "fooval\r\n", "got fooval");
+is(scalar <$sock>, "END\r\n", "got END");
+
+# replace bar (should work)
+print $sock "replace bar 0 0 6\r\nbarva2\r\n";
+is(scalar <$sock>, "STORED\r\n", "replaced barval 2");
+
+# replace notexist (shouldn't work)
+print $sock "replace notexist 0 0 6\r\nbarva2\r\n";
+is(scalar <$sock>, "NOT_STORED\r\n", "didn't replace notexist");
+
+# delete foo.
+print $sock "delete foo\r\n";
+is(scalar <$sock>, "DELETED\r\n", "deleted foo");
+
+# delete foo again. not found this time.
+print $sock "delete foo\r\n";
+is(scalar <$sock>, "NOT_FOUND\r\n", "deleted foo, but not found");
+
+# pipeling is okay
+print $sock "set foo 0 0 6\r\nfooval\r\ndelete foo\r\nset foo 0 0 6\r\nfooval\r\ndelete foo\r\n";
+is(scalar <$sock>, "STORED\r\n", "pipeline set");
+is(scalar <$sock>, "DELETED\r\n", "pipeline delete");
+is(scalar <$sock>, "STORED\r\n", "pipeline set");
+is(scalar <$sock>, "DELETED\r\n", "pipeline delete");
+
+
+
Property changes on: trunk/server/test/getset.t
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/server/test/lib/MemcachedTest.pm
===================================================================
--- trunk/server/test/lib/MemcachedTest.pm 2006-09-03 23:57:20 UTC (rev 324)
+++ trunk/server/test/lib/MemcachedTest.pm 2006-09-04 00:47:19 UTC (rev 325)
@@ -0,0 +1,77 @@
+package MemcachedTest;
+use strict;
+use IO::Socket::INET;
+use Exporter 'import';
+use FindBin qw($Bin);
+use Carp qw(croak);
+use vars qw(@EXPORT);
+
+ at EXPORT = qw(new_memcached);
+
+sub free_port {
+ my $sock;
+ my $port;
+ while (!$sock) {
+ $port = int(rand(20000)) + 30000;
+ $sock = IO::Socket::INET->new(LocalAddr => '127.0.0.1',
+ LocalPort => $port,
+ Proto => 'tcp',
+ ReuseAddr => 1);
+ }
+ return $port;
+}
+
+sub new_memcached {
+ my $args = shift || "";
+ my $port = free_port();
+ $args .= " -p $port";
+ my $childpid = fork();
+
+ my $exe = "$Bin/../memcached";
+ croak("memcached binary doesn't exist. Haven't run 'make' ?\n") unless -e $exe;
+ croak("memcached binary not executable\n") unless -x _;
+
+ unless ($childpid) {
+ exec "$exe $args";
+ exit; # never gets here.
+ }
+
+ for (1..20) {
+ my $conn = IO::Socket::INET->new(PeerAddr => "127.0.0.1:$port");
+ if ($conn) {
+ return Memcached::Handle->new(pid => $childpid,
+ conn => $conn,
+ port => $port);
+ }
+ select undef, undef, undef, 0.10;
+ }
+ croak("Failed to startup/connect to memcached server.");
+
+}
+
+############################################################################
+package Memcached::Handle;
+sub new {
+ my ($class, %params) = @_;
+ return bless \%params, $class;
+}
+
+sub DESTROY {
+ my $self = shift;
+ kill 9, $self->{pid};
+}
+
+sub port { $_[0]{port} }
+
+sub sock {
+ my $self = shift;
+ return $self->{conn} if $self->{conn} && getpeername($self->{conn});
+ return $self->new_sock;
+}
+
+sub new_sock {
+ my $self = shift;
+ return IO::Socket::INET->new(PeerAddr => "127.0.0.1:$self->{port}");
+}
+
+1;
More information about the memcached-commits
mailing list