lemonldap-ng/lemonldap-ng-portal/t/separate-handler.pm

61 lines
1.2 KiB
Perl

use IO::Pipe;
use IO::Select;
our ( $in, $out ) = ( IO::Pipe->new, IO::Pipe->new );
our ( $rin, $rout ) = ( IO::Pipe->new, IO::Pipe->new );
my $pid = fork;
unless ( defined $pid ) {
plan skip_all => 'Unable to fork';
exit;
}
unless ($pid) {
{
no warnings;
}
$in->reader;
$out->writer;
$rin->writer;
$rout->reader;
$out->autoflush(1);
$rin->autoflush(1);
use lib 't/lib/';
require Lemonldap::NG::Handler::Test;
Lemonldap::NG::Handler::Test::init();
Lemonldap::NG::Handler::Test::run();
exit;
}
$in->writer;
$out->reader;
$rin->reader;
$rout->writer;
$in->autoflush(1);
$rout->autoflush(1);
my $s = IO::Select->new();
$s->add($out);
$s->add($rin);
sub handler {
my (%args) = @_;
print $in JSON::to_json( $args{req} ) . "\n";
while ( my @ready = $s->can_read ) {
foreach $fh (@ready) {
if ( $fh == $out ) {
my $res = <$out>;
return JSON::from_json($res);
}
else {
my $res = <$rin>;
$res = $args{sub}->( JSON::from_json($res) );
print $rout JSON::to_json($res) . "\n";
}
}
}
}
sub end_handler {
print $in "END\n";
}
1;