|
Packit |
b893dc |
#!/usr/bin/perl
|
|
Packit |
b893dc |
|
|
Packit |
b893dc |
use strict;
|
|
Packit |
b893dc |
use warnings;
|
|
Packit |
b893dc |
use Test::More;
|
|
Packit |
b893dc |
use Socket;
|
|
Packit |
b893dc |
use Symbol qw(gensym);
|
|
Packit |
b893dc |
use Net::SSLeay;
|
|
Packit |
b893dc |
use Config;
|
|
Packit |
b893dc |
|
|
Packit |
b893dc |
BEGIN {
|
|
Packit |
b893dc |
plan skip_all => "fork() not supported on $^O" unless $Config{d_fork};
|
|
Packit |
b893dc |
}
|
|
Packit |
b893dc |
|
|
Packit |
b893dc |
plan tests => 4;
|
|
Packit |
b893dc |
|
|
Packit |
b893dc |
my $sock;
|
|
Packit |
b893dc |
my $pid;
|
|
Packit |
b893dc |
|
|
Packit |
b893dc |
my $port = 1211;
|
|
Packit |
b893dc |
my $msg = 'ssleay-tcp-test';
|
|
Packit |
b893dc |
my $port_trials = 1000;
|
|
Packit |
b893dc |
{
|
|
Packit |
b893dc |
my $ip = "\x7F\0\0\x01";
|
|
Packit |
b893dc |
my $serv_params = sockaddr_in($port, $ip);
|
|
Packit |
b893dc |
$sock = gensym();
|
|
Packit |
b893dc |
socket($sock, AF_INET, SOCK_STREAM, 0) or die "socket failed: $!";
|
|
Packit |
b893dc |
# Try to find an available port to bind to
|
|
Packit |
b893dc |
my $i;
|
|
Packit |
b893dc |
for ($i = 0; $i < $port_trials; $i++)
|
|
Packit |
b893dc |
{
|
|
Packit |
b893dc |
my $serv_params = sockaddr_in($port, $ip);
|
|
Packit |
b893dc |
|
|
Packit |
b893dc |
last if bind($sock, $serv_params);
|
|
Packit |
b893dc |
$port++;
|
|
Packit |
b893dc |
}
|
|
Packit |
b893dc |
die "Could not find a port to bind to" if $i >= 1000;
|
|
Packit |
b893dc |
listen($sock, 2) or die "listen failed $!";
|
|
Packit |
b893dc |
}
|
|
Packit |
b893dc |
|
|
Packit |
b893dc |
{
|
|
Packit |
b893dc |
$pid = fork();
|
|
Packit |
b893dc |
die "fork failed: $!" unless defined $pid;
|
|
Packit |
b893dc |
if ($pid == 0) {
|
|
Packit |
b893dc |
my $addr = accept(Net::SSLeay::SSLCAT_S, $sock) or die "accept failed $!";
|
|
Packit |
b893dc |
|
|
Packit |
b893dc |
my $old_out = select(Net::SSLeay::SSLCAT_S);
|
|
Packit |
b893dc |
$| = 1;
|
|
Packit |
b893dc |
select($old_out);
|
|
Packit |
b893dc |
|
|
Packit |
b893dc |
my $got = Net::SSLeay::tcp_read_all();
|
|
Packit |
b893dc |
is($got, $msg, 'tcp_read_all');
|
|
Packit |
b893dc |
|
|
Packit |
b893dc |
ok(Net::SSLeay::tcp_write_all(uc($got)), 'tcp_write_all');
|
|
Packit |
b893dc |
|
|
Packit |
b893dc |
close Net::SSLeay::SSLCAT_S;
|
|
Packit |
b893dc |
close $sock;
|
|
Packit |
b893dc |
|
|
Packit |
b893dc |
exit;
|
|
Packit |
b893dc |
}
|
|
Packit |
b893dc |
}
|
|
Packit |
b893dc |
|
|
Packit |
b893dc |
my @results;
|
|
Packit |
b893dc |
{
|
|
Packit |
b893dc |
my ($got) = Net::SSLeay::tcpcat('127.0.0.1', $port, $msg);
|
|
Packit |
b893dc |
push @results, [ $got eq uc($msg), 'sent and received correctly' ];
|
|
Packit |
b893dc |
}
|
|
Packit |
b893dc |
|
|
Packit |
b893dc |
waitpid $pid, 0;
|
|
Packit |
b893dc |
push @results, [ $? == 0, 'server exited with 0' ];
|
|
Packit |
b893dc |
|
|
Packit |
b893dc |
END {
|
|
Packit |
b893dc |
Test::More->builder->current_test(2);
|
|
Packit |
b893dc |
for my $t (@results) {
|
|
Packit |
b893dc |
ok( $t->[0], $t->[1] );
|
|
Packit |
b893dc |
}
|
|
Packit |
b893dc |
}
|