AnyEvent-Memcached

 view release on metacpan or  search on metacpan

t/lib/Test/AE/MD.pm  view on Meta::CPAN

package #hide
	Test::AE::MD;

# MemcacheDB test class

use AnyEvent::Impl::Perl;
use AnyEvent;
use AnyEvent::Socket;
use AnyEvent::Memcached;
use common::sense;
use utf8;
use Test::More;
use lib::abs;

sub import {
	*{caller().'::runtest'} = \&runtest;
	@_ = 'Test::More';
	goto &{ Test::More->can('import') };
}

sub runtest(&) {
	my $cx = shift;
	my $code = sub {
		alarm 10;
		$cx->(@_,cas => 0, noreply => 0,);
	};
	my ($host,$port);
	if (defined $ENV{MEMCACHEDB_SERVER}) {
		my $testaddr = $ENV{MEMCACHEDB_SERVER};
		($host,$port) = split ':',$testaddr;$host ||= '127.0.0.1'; # allow *_SERVER=:port
		my $do;
		my $cv = AE::cv;
		$port;
		my $cg;$cg = tcp_connect $host,$port, sub {
			undef $cg;
			@_ or plan skip_all => "No memcachedb instance running at $testaddr\n";
			$cv->send; #connect
		}, sub { 1 };
		$cv->recv;
		$code->($host,$port);
	} else {
		use version;
		my $v = `memcachedb -h 2>&1`;
		$? == 0 or plan skip_all => "Can't run memcachedb: $!";
		my ($ver,$sub) = $v =~ m{.*?([\d.]+)(-\w+)?};
		qv($ver) ge qv "1.2.1" or plan skip_all => "Memcachedb too old: $ver";
		diag "using memcachedb $ver$sub";
		
		eval q{use Test::TCP;1} or plan skip_all => "No Test::TCP";
		$host = "127.0.0.1";
		my $db = lib::abs::path('tdb');
		$db .= '1' while -e $db;
		mkdir $db or plan skip_all => "Can't create test db $db: $!";
		test_tcp(
			client => sub {
				$port = shift;
				my $pid = shift;
				$code->($host,$port);
				kill TERM => $pid;
				kill KILL => $pid; # Don't like to kill it, but should.
			},
			server => sub {
				my $port = shift;
				close STDERR;
				exec("memcachedb -l $host -p $port -H $db") or
					plan skip_all => "Can't run memcachedb";
			},
		);
		unlink $_ for (<$db/*>);
		rmdir $db;
		
	}
}



( run in 1.874 second using v1.01-cache-2.11-cpan-99c4e6809bf )