The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

use strict;
use IO::Socket::INET;

use Test::More tests => 9;
BEGIN {
    use_ok('RFID::Reader::TCP');
    use_ok('RFID::Reader::TestBase');
}

package RFID::Reader::TestBase::Derived;
our @ISA = qw(RFID::Reader::TestBase RFID::Reader);
sub new { bless({}, $_[0])->_init() }
sub _process_input { $_[0]->_add_output(@_[1..$#_]); ''; } # echo

package main;

my $test = RFID::Reader::TestBase::Derived->new;
ok($test);


my $listen = IO::Socket::INET->new(Proto => 'TCP',
				   Listen => 5,
				   LocalAddr => 0,
				   )
    or die "Couldn't create listening socket: $!\n";
my $port = $listen->sockport;




# Start up a server.
our $pid;
if ($pid = fork)
{
    # Parent
}
elsif (!defined($pid))
{
    # Error
    die "Fork error: $!\n";
}
else
{
    # Child
    $SIG{TERM}=sub { exit(0); }; # This is a normal exit.

    # Wrap in eval to avoid spewing errors when we're TERMed.
    eval {
	if (my $sock = $listen->accept)
    {
	$sock->autoflush(1);
	$test->run($sock,$sock);
    }
    };
    exit(0);
}

# Parent
close($listen);
our $obj;
eval {
    sleep(1);
    $SIG{ALRM}=sub { die "Timed out\n" };
    alarm(20); # Maximum time we'll wait.
    $obj = RFID::Reader::TCP->new(PeerAddr => 'localhost', 
				  PeerPort => $port,
				  Debug => $ENV{RFID_DEBUG},
				  );
    ok($obj);
    isa_ok($obj,'RFID::Reader::TCP');
    
    ok($obj->_writebytes("hello there\0hello again\n")==24);
    ok($obj->_readbytes(5) eq "hello");
    ok($obj->_readuntil("\0") eq " there");
    ok($obj->_readuntil("\n") eq "hello again");
};
warn $@ if $@;

undef $obj;

kill 'TERM',$pid;