# # # vim: syntax=perl use warnings; use strict; use Test::More 'no_plan'; BEGIN { use_ok 'POE'; use_ok 'Sprocket'; use_ok 'POE::Filter::Line'; use_ok 'POE::Filter::Stream'; use_ok 'POE::Wheel::Run'; use_ok 'Scalar::Util'; } SKIP: { eval "use File::FDpasser"; skip "File::FDpasser is unavilable" if ( $@ ); use_ok 'Sprocket::Util::FDpasser'; my %opts = ( LogLevel => 1, TimeOut => 0, ); unlink( "fdpasser" ) if ( -e "fdpasser" ); my $passer = Sprocket::Util::FDpasser->new( EndpointFile => 'fdpasser', ); POE::Session->create( inline_states => { _start => sub { $poe_kernel->delay( shutdown => 5 => 1 ); $poe_kernel->alias_set( 'test' ); $passer->attach_hook( 'sprocket.fdpasser.accept', $sprocket->callback( $_[SESSION] => 'fdpass' ) ); $_[HEAP]->{wheel} = POE::Wheel::Run->new( Program => sub { my $ls = endp_connect("fdpasser") || die "endp_create: $!"; send_file( $ls, *STDIN{IO} ) || die "send_file: $!"; close(STDIN); }, StdinEvent => 'stdin', # Flushed all data to the child's STDIN. StdoutEvent => 'stdout', # Received data from the child's STDOUT. StderrEvent => 'stderr', # Received data from the child's STDERR. ErrorEvent => 'oops', # An I/O error occurred. CloseEvent => 'child_closed', # Child closed all output handles. StderrFilter => POE::Filter::Line->new(), # Child errors are lines. StdioFilter => POE::Filter::Line->new(), # Or some other filter. ); $_[HEAP]->{wheel_pid} = $_[HEAP]->{wheel}->PID(); if ( $poe_kernel->can( "sig_child" ) ) { $poe_kernel->sig_child( $_[HEAP]->{wheel_pid} => 'sig_child' ); } else { $poe_kernel->sig( 'CHLD', 'sig_child' ); } }, sig_child => sub { delete $_[HEAP]->{wheel_pid}; $_[KERNEL]->sig_handled(); }, stdin => sub { # warn "stdin:".$_[ARG0]."\n"; }, stdout => sub { # warn "Stdout:".$_[ARG0]."\n"; }, stderr => sub { # warn "stderr:".$_[ARG0]."\n"; }, oops => sub { # warn "oops:".$_[ARG0]."\n"; }, child_closed => sub { $poe_kernel->yield( 'shutdown' ); }, fdpass => sub { my ( $self, $event ) = @_[ OBJECT, ARG0 ]; if ( $event->{fh} && Scalar::Util::reftype( $event->{fh} ) eq 'GLOB' ) { Test::More::pass("file handle passed is a glob"); } else { Test::More::fail("file handle passed is NOT a glob"); } # warn "event: ".$event->hook." with ".$event->{fh}; }, shutdown => sub { my $failed = $_[ ARG0 ]; Test::More::fail("test failed") if ( $failed ); $_[HEAP]->{wheel}->kill(9) if ( $_[HEAP]->{wheel} ); delete $_[HEAP]->{wheel}; $poe_kernel->alias_remove( 'test' ); $poe_kernel->alarm_remove_all(); $sprocket->shutdown_all(); return; }, _stop => sub { } } ); $poe_kernel->run(); unlink( "fdpasser" ) if ( -e "fdpasser" ); }