1#!perl -w
2# Before `make install' is performed this script should be runnable with
3# `make test'. After `make install' it should work as `perl t/nonblock.t'
4
5
6use Net::SSLeay;
7use Socket;
8use IO::Socket::SSL;
9use IO::Select;
10use Errno qw(EAGAIN EINPROGRESS );
11use strict;
12
13use vars qw( $SSL_SERVER_ADDR );
14do "t/ssl_settings.req" || do "ssl_settings.req";
15
16if ( ! eval "use 5.006; use IO::Select; return 1" ) {
17    print "1..0 # Skipped: no support for nonblocking sockets\n";
18    exit;
19} 
20if ( grep { $^O =~m{$_} } qw( MacOS VOS vmesa riscos amigaos ) ) {
21    print "1..0 # Skipped: fork not implemented on this platform\n";
22    exit
23}
24    
25$|=1;
26print "1..9\n";
27
28
29my $server = IO::Socket::INET->new(
30    LocalAddr => $SSL_SERVER_ADDR,
31    Listen => 2,
32    ReuseAddr => 1,
33);
34
35print "not ok\n", exit if !$server;
36ok("Server Initialization");
37
38print "not " if (!defined fileno($server));
39ok("Server Fileno Check");
40
41my ($SSL_SERVER_PORT) = unpack_sockaddr_in( $server->sockname );
42
43
44defined( my $pid = fork() ) || die $!;
45if ( $pid == 0 ) {
46
47    close($server);
48
49    my %extra_options = $Net::SSLeay::VERSION>=1.16 ?
50	(
51	    SSL_key_file => "certs/server-key.enc", 
52	    SSL_passwd_cb => sub { return "bluebell" },
53#	    SSL_verify_callback => \&verify_sub
54	) : (
55	    SSL_key_file => "certs/server-key.pem"
56	);
57
58    my $client = IO::Socket::INET->new( "$SSL_SERVER_ADDR:$SSL_SERVER_PORT" )
59	|| print "not ";
60    ok( "client tcp connect" );
61
62    unless ( IO::Socket::SSL->start_SSL( $client,
63	SSL_version => 'TLSv1',
64	SSL_cipher_list => 'HIGH',
65	%extra_options
66    )) {
67	#DEBUG( $SSL_ERROR );
68	print "not ";
69    }
70    ok( "sslify client" );
71
72    UNIVERSAL::isa( $client,'IO::Socket::SSL' ) || print "not ";
73    ok( 'client reblessed as IO::Socket::SSL' );
74    
75    print $client "hannibal\n";
76
77    exit;
78}
79
80my $csock = $server->accept || print "not ";
81ok( "tcp accept" );
82
83my %extra_options = $Net::SSLeay::VERSION>=1.16 ?
84    (
85	SSL_key_file => "certs/client-key.enc", 
86	SSL_passwd_cb => sub { return "opossum" }
87    ) : (
88	SSL_key_file => "certs/client-key.pem"
89    );
90
91IO::Socket::SSL->start_SSL( $csock,
92    SSL_server => 1,
93    SSL_verify_mode => 0x00,
94    SSL_ca_file => "certs/test-ca.pem",
95    SSL_cert_file => "certs/client-cert.pem",
96    SSL_version => 'TLSv1',
97    SSL_cipher_list => 'HIGH',
98    %extra_options
99) || print "not ";
100#DEBUG( $IO::Socket::SSL::ERROR );
101ok( 'sslify server' );
102
103UNIVERSAL::isa( $csock,'IO::Socket::SSL' ) || print "not ";
104ok( 'server reblessed as IO::Socket::SSL' );
105
106my $l = <$csock>;
107#DEBUG($l);
108print "not " if $l ne "hannibal\n";
109ok( "received client message" );
110
111
112wait;
113
114
115
116sub ok { print "ok #$_[0]\n"; }
117
118