|
Packit |
bd23c0 |
#!perl
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
use 5.008001;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
use strict;
|
|
Packit |
bd23c0 |
use warnings;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
BEGIN {
|
|
Packit |
bd23c0 |
if (!eval { require Socket }) {
|
|
Packit |
bd23c0 |
print "1..0 # no Socket\n"; exit 0;
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
if (ord('A') == 193 && !eval { require Convert::EBCDIC }) {
|
|
Packit |
bd23c0 |
print "1..0 # EBCDIC but no Convert::EBCDIC\n"; exit 0;
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
$INC{'IO/Socket.pm'} = 1;
|
|
Packit |
bd23c0 |
$INC{'IO/Select.pm'} = 1;
|
|
Packit |
bd23c0 |
$INC{'IO/Socket/INET.pm'} = 1;
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
(my $libnet_t = __FILE__) =~ s/time.t/libnet_t.pl/;
|
|
Packit |
bd23c0 |
require $libnet_t;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
print "1..12\n";
|
|
Packit |
bd23c0 |
# cannot use(), otherwise it will use IO::Socket and IO::Select
|
|
Packit |
bd23c0 |
eval{ require Net::Time; };
|
|
Packit |
bd23c0 |
ok( !$@, 'should be able to require() Net::Time safely' );
|
|
Packit |
bd23c0 |
ok( exists $INC{'Net/Time.pm'}, 'should be able to use Net::Time' );
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# force the socket to fail
|
|
Packit |
bd23c0 |
make_fail('IO::Socket::INET', 'new');
|
|
Packit |
bd23c0 |
my $badsock = Net::Time::_socket('foo', 1, 'bar', 'baz');
|
|
Packit |
bd23c0 |
is( $badsock, undef, '_socket() should fail if Socket creation fails' );
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# if socket is created with protocol UDP (default), it will send a newline
|
|
Packit |
bd23c0 |
my $sock = Net::Time::_socket('foo', 2, 'bar');
|
|
Packit |
bd23c0 |
ok( $sock->isa('IO::Socket::INET'), 'should be an IO::Socket::INET object' );
|
|
Packit |
bd23c0 |
is( $sock->{sent}, "\n", 'should send \n with UDP protocol set' );
|
|
Packit |
bd23c0 |
is( $sock->{timeout}, 120, 'timeout should default to 120' );
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# now try it with a custom timeout and a different protocol
|
|
Packit |
bd23c0 |
$sock = Net::Time::_socket('foo', 3, 'bar', 'tcp', 11);
|
|
Packit |
bd23c0 |
ok( $sock->isa('IO::Socket::INET'), 'should be an IO::Socket::INET object' );
|
|
Packit |
bd23c0 |
is( $sock->{sent}, undef, '_socket() should send nothing unless UDP protocol' );
|
|
Packit |
bd23c0 |
is( $sock->{PeerAddr}, 'bar', '_socket() should set PeerAddr in socket' );
|
|
Packit |
bd23c0 |
is( $sock->{timeout}, 11, '_socket() should respect custom timeout value' );
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# inet_daytime
|
|
Packit |
bd23c0 |
# check for correct args (daytime, 13)
|
|
Packit |
bd23c0 |
IO::Socket::INET::set_message('z');
|
|
Packit |
bd23c0 |
is( Net::Time::inet_daytime('bob'), 'z', 'inet_daytime() should receive data' );
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# magic numbers defined in Net::Time
|
|
Packit |
bd23c0 |
my $offset = $^O eq 'MacOS' ?
|
|
Packit |
bd23c0 |
(4 * 31536000) : (70 * 31536000 + 17 * 86400);
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# check for correct args (time, 13)
|
|
Packit |
bd23c0 |
# pretend it is only six seconds since the offset, create a fake message
|
|
Packit |
bd23c0 |
# inet_time
|
|
Packit |
bd23c0 |
IO::Socket::INET::set_message(pack("N", $offset + 6));
|
|
Packit |
bd23c0 |
is( Net::Time::inet_time('foo'), 6,
|
|
Packit |
bd23c0 |
'inet_time() should calculate time since offset for time()' );
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
my %fail;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
sub make_fail {
|
|
Packit |
bd23c0 |
my ($pack, $func, $num) = @_;
|
|
Packit |
bd23c0 |
$num = 1 unless defined $num;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
$fail{$pack}{$func} = $num;
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
package IO::Socket::INET;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
$fail{'IO::Socket::INET'} = {
|
|
Packit |
bd23c0 |
new => 0,
|
|
Packit |
bd23c0 |
'send' => 0,
|
|
Packit |
bd23c0 |
};
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
sub new {
|
|
Packit |
bd23c0 |
my $class = shift;
|
|
Packit |
bd23c0 |
return if $fail{$class}{new} and $fail{$class}{new}--;
|
|
Packit |
bd23c0 |
bless( { @_ }, $class );
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
sub send {
|
|
Packit |
bd23c0 |
my $self = shift;
|
|
Packit |
bd23c0 |
my $class = ref($self);
|
|
Packit |
bd23c0 |
return if $fail{$class}{'send'} and $fail{$class}{'send'}--;
|
|
Packit |
bd23c0 |
$self->{sent} .= shift;
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
my $msg;
|
|
Packit |
bd23c0 |
sub set_message {
|
|
Packit |
bd23c0 |
if (ref($_[0])) {
|
|
Packit |
bd23c0 |
$_[0]->{msg} = $_[1];
|
|
Packit |
bd23c0 |
} else {
|
|
Packit |
bd23c0 |
$msg = shift;
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
sub do_recv {
|
|
Packit |
bd23c0 |
my ($len, $msg) = @_[1,2];
|
|
Packit |
bd23c0 |
$_[0] .= substr($msg, 0, $len);
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
sub recv {
|
|
Packit |
bd23c0 |
my ($self, $buf, $length, $flags) = @_;
|
|
Packit |
bd23c0 |
my $message = exists $self->{msg} ?
|
|
Packit |
bd23c0 |
$self->{msg} : $msg;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
if (defined($message)) {
|
|
Packit |
bd23c0 |
do_recv($_[1], $length, $message);
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
1;
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
package IO::Select;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
sub new {
|
|
Packit |
bd23c0 |
my $class = shift;
|
|
Packit |
bd23c0 |
return if defined $fail{$class}{new} and $fail{$class}{new}--;
|
|
Packit |
bd23c0 |
bless({sock => shift}, $class);
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
sub can_read {
|
|
Packit |
bd23c0 |
my ($self, $timeout) = @_;
|
|
Packit |
bd23c0 |
my $class = ref($self);
|
|
Packit |
bd23c0 |
return if defined $fail{$class}{can_read} and $fail{class}{can_read}--;
|
|
Packit |
bd23c0 |
$self->{sock}{timeout} = $timeout;
|
|
Packit |
bd23c0 |
1;
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
1;
|