[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