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

use IO::Handle;
use Getopt::Long;

use FindBin;
use lib "$FindBin::Bin/lib";

autoflush STDOUT 1;


my %opt = ( exitval => 0 );

eval {

    local $SIG{__WARN__} = sub { die $_[0] };

    GetOptions(
        \%opt,
        qw[
          config=s
          cmdserver=s
          mode=s
          exitval=i
          R=s
          ]
    );
};

die if $@;

shift @ARGV if $ARGV[0] eq 'serve';

sub fail { die("failed\n") }

sub eof { exit 0 }

sub bad_hello_chan {

    require BadServer;
    BadServer::Hello::Chan->new->serve;

}

sub bad_hello_len {

    require BadServer;
    BadServer::Hello::Len->new->serve;

}

sub bad_hello_no_capabilities {

    require BadServer;
    BadServer::NoCapabilities->new->serve;
}

sub bad_hello_no_runcommand {

    require BadServer;
    BadServer::NoRunCommand->new->serve;

}

sub bad_hello_no_encoding {

    require BadServer;
    BadServer::NoEncoding->new->serve;

}

sub bad_bad_encoding {

    require BadServer;
    BadServer::BadEncoding->new->serve;

}

sub fail_with_stderr {

    require BadServer;
    BadServer::FailWithStderr->new->serve;

}
sub exit_with_stderr {

    require BadServer;
    BadServer::ExitWithStderr->new->serve;

}

sub badlen {
    print pack( 'A[1] l> A[2]', 'o', 3, 'aa' );
    <STDIN>;
 }


sub wait {

    <STDIN>;
}

sub basic {

    require Server::Basic;
    Server::Basic->new->serve;

}

sub full {

    require Server::Full;
    Server::Full->new->serve;

}


$_->() foreach @ARGV;

exit $opt{exitval};