The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
# $Id: 20_alt_fork.t 161 2006-11-15 07:22:26Z fil $

use strict;

# sub POE::Kernel::TRACE_REFCNT () { 1 }

sub DEBUG () { 0 }

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

use Test::More tests => 3;
use POE::Component::Generic;
use POE::Session;
use POE::Kernel;

my $N = 10;
if( $ENV{HARNESS_PERL_SWITCHES} ) {
    $N *= 5;
}


SKIP:
{

    if( $^O eq 'MSWin32' ) {
        skip "alt_fork not supported on MSWin32", 3;
    }
    unless( -x "/bin/sh" ) {
        skip "This test uses the Bourne shell (/bin/sh)", 3;
    }
    eval { chmod 0755, 't/alt-fork' };
    unless( -x "t/alt-fork" ) {
        skip "Your archive tool failed to make t/alt-fork executable", 3;
    }    

    my $delayed;
    my $generic;
    my $OK = 1;

    POE::Session->create(
        inline_states => {
          _start => sub {
              $poe_kernel->alias_set( 'worker' );
              # diag( "This test can take a little while" );
              $generic = POE::Component::Generic->spawn( 
                        alias 		=> 'first-x',
                        package 	=> 't::P10',
                        error       => 'sub_error',
                        methods		=> [ qw( new set_delay get_delay delay ) ],
                        object_options 	=> [ delay=>$N ],
                        alt_fork 		=> "t/alt-fork",
                        debug 		=> DEBUG
                    );

              $poe_kernel->delay( 'autoload', $N );
          },
          
          _stop => sub {
              DEBUG and warn "_stop";
          },
          
          ############
          autoload => sub {
              die "Timeout";
          },

          ############
          sub_error => sub {
              my( $kernel, $error ) = @_[ KERNEL, ARG0 ];
              if( $error->{stderr} ) {
		  if( $error->{stderr} eq 'LAST' ) {
		      pass( "Done" );
		      $kernel->yield( 'shutdown' );
		      return;
		  }
                  unless( $error->{stderr} =~ /# .+/ ) {
                      $OK = 0;
                      diag( $error->{stderr} );
		  }
              }
              elsif( ( $error->{errnum} == 32 && $error->{operation} eq 'write' ) 
                     ||
                     ( $error->{errnum} == 104 && $error->{operation} eq 'read' ) ) {
                diag( "Exited" );
                $kernel->yield( 'shutdown' );
              }
              else {
                
                die "Error: ", join "\n", map { "$_: $error->{$_}" }
                                            keys %$error;
              }
          },

        

          ############
          shutdown => sub {
              $poe_kernel->post( 'first-x' => 'shutdown' );
              $poe_kernel->alarm_remove_all( );
          }
        }
    );


    $poe_kernel->run();

    ok( $OK, "All output as expected" );
    pass( "Sane exit" );
    
}