|
Packit |
4e8bc4 |
#!/usr/bin/perl
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
use strict;
|
|
Packit |
4e8bc4 |
use Test::More tests => 24;
|
|
Packit |
4e8bc4 |
use FindBin qw($Bin);
|
|
Packit |
4e8bc4 |
use lib "$Bin/lib";
|
|
Packit |
4e8bc4 |
use MemcachedTest;
|
|
Packit |
4e8bc4 |
use Carp qw(croak);
|
|
Packit |
4e8bc4 |
use Socket qw(sockaddr_in INADDR_ANY PF_INET SOCK_STREAM);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
use Cwd;
|
|
Packit |
4e8bc4 |
my $builddir = getcwd;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
$ENV{'MEMCACHED_PORT_FILENAME'} = "/tmp/ports.$$";
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
sub read_ports {
|
|
Packit |
4e8bc4 |
my %rv = ();
|
|
Packit |
4e8bc4 |
open(my $f, "/tmp/ports.$$") || die("Can't open ports file.");
|
|
Packit |
4e8bc4 |
while(<$f>) {
|
|
Packit |
4e8bc4 |
my ($type, $port) = split(/:\s+/);
|
|
Packit |
4e8bc4 |
$rv{$type} = $port + 0;
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
unlink "/tmp/ports.$$";
|
|
Packit |
4e8bc4 |
return %rv;
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
sub validate_port {
|
|
Packit |
4e8bc4 |
my ($name, $got, $expected) = @_;
|
|
Packit |
4e8bc4 |
# diag "Wanted $expected, got $got";
|
|
Packit |
4e8bc4 |
if ($expected == -1) {
|
|
Packit |
4e8bc4 |
ok(!defined($got), "$name expected no port, got $got");
|
|
Packit |
4e8bc4 |
} elsif ($expected == 0) {
|
|
Packit |
4e8bc4 |
ok(defined($got) && $got != 11211, "$name expected random port (got $got)");
|
|
Packit |
4e8bc4 |
} else {
|
|
Packit |
4e8bc4 |
is($got, $expected, "$name");
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
sub skip_if_default_addr_in_use(&) {
|
|
Packit |
4e8bc4 |
my ($block) = @_;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
socket(my $socket, PF_INET, SOCK_STREAM, 0) or die $!;
|
|
Packit |
4e8bc4 |
my $addr_in_use = !bind($socket, sockaddr_in(11211, INADDR_ANY));
|
|
Packit |
4e8bc4 |
close($socket);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
SKIP: {
|
|
Packit |
4e8bc4 |
skip 'Default address is in use. Do you have a running instance?', 2 if $addr_in_use;
|
|
Packit |
4e8bc4 |
return $block->();
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
sub run_server {
|
|
Packit |
4e8bc4 |
my ($args) = @_;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $exe = "$builddir/memcached-debug";
|
|
Packit |
4e8bc4 |
croak("memcached binary doesn't exist. Haven't run 'make' ?\n") unless -e $exe;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $childpid = fork();
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $root = '';
|
|
Packit |
4e8bc4 |
$root = "-u root" if ($< == 0);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# test build requires more privileges
|
|
Packit |
4e8bc4 |
$args .= " -o relaxed_privileges";
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $cmd = "$builddir/timedrun 10 $exe $root $args";
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
unless($childpid) {
|
|
Packit |
4e8bc4 |
exec $cmd;
|
|
Packit |
4e8bc4 |
exit; # NOTREACHED
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
for (1..20) {
|
|
Packit |
4e8bc4 |
if (-f "/tmp/ports.$$") {
|
|
Packit |
4e8bc4 |
return Memcached::Handle->new(pid => $childpid);
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
select undef, undef, undef, 0.10;
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
croak "Failed to start server.";
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
sub when {
|
|
Packit |
4e8bc4 |
my ($name, $params, $expected_tcp, $expected_udp) = @_;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $server = run_server($params);
|
|
Packit |
4e8bc4 |
my %ports = read_ports();
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
validate_port($name, $ports{'TCP INET'}, $expected_tcp);
|
|
Packit |
4e8bc4 |
validate_port($name, $ports{'UDP INET'}, $expected_udp);
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
skip_if_default_addr_in_use { when('no arguments', '', 11211, -1) };
|
|
Packit |
4e8bc4 |
when('specifying tcp port', '-p 11212', 11212, -1);
|
|
Packit |
4e8bc4 |
when('specifying udp port', '-U 11222', 11222, 11222);
|
|
Packit |
4e8bc4 |
when('specifying tcp ephemeral port', '-p -1', 0, -1);
|
|
Packit |
4e8bc4 |
when('specifying udp ephemeral port', '-U -1', 0, 0);
|
|
Packit |
4e8bc4 |
when('tcp port disabled', '-p 0', -1, -1);
|
|
Packit |
4e8bc4 |
skip_if_default_addr_in_use { when('udp port disabled', '-U 0', 11211, -1) };
|
|
Packit |
4e8bc4 |
when('specifying tcp and udp ports', '-p 11232 -U 11233', 11232, 11233);
|
|
Packit |
4e8bc4 |
when('specifying tcp and disabling udp', '-p 11242 -U 0', 11242, -1);
|
|
Packit |
4e8bc4 |
when('specifying udp and disabling tcp', '-p -1 -U 11252', 0, 11252);
|
|
Packit |
4e8bc4 |
when('specifying tcp and ephemeral udp', '-p 11262 -U -1', 11262, 0);
|
|
Packit |
4e8bc4 |
when('specifying udp and ephemeral tcp', '-p -1 -U 11272', 0, 11272);
|