EV-Redis
view release on metacpan or search on metacpan
done_testing;
exit;
}
diag "Running TLS connection tests";
# Generate self-signed certificates
my $certdir = tempdir(CLEANUP => 1);
my $ca_key = "$certdir/ca.key";
my $ca_cert = "$certdir/ca.crt";
my $srv_key = "$certdir/server.key";
my $srv_cert = "$certdir/server.crt";
my $srv_csr = "$certdir/server.csr";
# Generate CA
unless (system("openssl genrsa -out $ca_key 2048 2>/dev/null") == 0 &&
system("openssl req -new -x509 -key $ca_key -out $ca_cert -days 1 -subj '/CN=Test CA' 2>/dev/null") == 0) {
diag "Failed to generate CA cert â skipping TLS connection tests";
done_testing;
exit;
}
# Generate server cert signed by CA
system("openssl genrsa -out $srv_key 2048 2>/dev/null") == 0
or die "Failed to generate server key";
system("openssl req -new -key $srv_key -out $srv_csr -subj '/CN=127.0.0.1' 2>/dev/null") == 0
or die "Failed to generate server CSR";
system("openssl x509 -req -in $srv_csr -CA $ca_cert -CAkey $ca_key -CAcreateserial -out $srv_cert -days 1 2>/dev/null") == 0
or die "Failed to sign server cert";
# Start Redis with TLS
my $tls_port = empty_port();
my $redis_pid;
eval {
$redis_pid = fork();
die "fork failed: $!" unless defined $redis_pid;
if ($redis_pid == 0) {
open STDOUT, '>/dev/null';
open STDERR, '>/dev/null';
exec('redis-server',
'--port', '0',
'--tls-port', $tls_port,
'--tls-cert-file', $srv_cert,
'--tls-key-file', $srv_key,
'--tls-ca-cert-file', $ca_cert,
'--tls-auth-clients', 'no',
'--bind', '127.0.0.1',
'--loglevel', 'warning',
'--save', '',
);
die "exec redis-server failed: $!";
}
};
if ($@ || !$redis_pid) {
diag "Failed to start TLS Redis: $@";
done_testing;
exit;
}
# Wait for Redis to be ready (check if process is alive and port is listening)
my $ready = 0;
for (1..50) {
# Check if the child process died (TLS not compiled, bad args, etc.)
my $kid = waitpid($redis_pid, POSIX::WNOHANG());
if ($kid > 0) {
$redis_pid = undef;
last;
}
# Try connecting with redis-cli over TLS
if (system("redis-cli -h 127.0.0.1 -p $tls_port --tls --insecure PING >/dev/null 2>&1") == 0) {
$ready = 1;
last;
}
select(undef, undef, undef, 0.1);
}
unless ($ready) {
if ($redis_pid) {
kill 'TERM', $redis_pid;
waitpid($redis_pid, 0);
$redis_pid = undef;
}
diag "Redis TLS server failed to start (TLS may not be compiled in)";
done_testing;
exit;
}
END {
if ($redis_pid) {
kill 'TERM', $redis_pid;
waitpid($redis_pid, 0);
}
}
# Test: TLS connection with CA cert
{
my ($connected, $error, $result) = (0, 0, undef);
my $r = EV::Redis->new(
host => '127.0.0.1',
port => $tls_port,
tls => 1,
tls_ca => $ca_cert,
);
$r->on_error(sub { $error++; $r->disconnect });
$r->on_connect(sub {
$connected++;
$r->ping(sub {
my ($res, $err) = @_;
$result = $res;
$r->disconnect;
});
});
EV::run;
is($connected, 1, 'TLS connection established');
is($error, 0, 'no connection error');
is($result, 'PONG', 'PING over TLS returns PONG');
}
# Test: SET/GET over TLS
( run in 1.136 second using v1.01-cache-2.11-cpan-5735350b133 )