Current File : //usr/local/share/perl5/POE/Test/Loops/z_steinert_signal_integrity.pm
#!/usr/bin/perl -w
# vim: ts=2 sw=2 expandtab

# Jonathan Steinert produced a patch to fix POE::Wheel destruction
# timing, and possibly other things, when they're passed as arguments
# to an event handler.  It didn't take into consideration a subtle and
# obscure aspect of recursive signal dispatch.  This regression test
# makes sure nested signal dispatches receive the proper parameters.

use strict;

sub POE::Kernel::ASSERT_DEFAULT () { 1 }

BEGIN {
  eval "sub POE::Kernel::TRACE_DEFAULT () { 1 }" if (
    exists $INC{'Devel/Cover.pm'}
  );
}

use POE;
use POE::Wheel::ReadWrite;
use POE::Pipe::OneWay;

use Test::More tests => 2;

my $session_count = 0;

sub start_session {
  $session_count++;
  POE::Session->create(
    inline_states => {
      _start     => \&setup,
      got_signal => \&handle_signal,
      timed_out  => \&timed_out,
      # To pacify assertions.
      _stop      => sub { },
      _parent    => sub { },
      _child     => sub { },
    }
  );
}

start_session();
$poe_kernel->signal($poe_kernel, MOO => 99);
POE::Kernel->run();

### End of main code.  Beginning of subroutines.

sub setup {
  start_session() if $session_count < 2;
  $_[KERNEL]->sig(MOO => "got_signal");
  $_[KERNEL]->delay(timed_out => 2);
}

sub handle_signal {
  ok(
    ($_[ARG0] eq "MOO") &&
    ($_[ARG1] == 99),
    "signal parameters: ('$_[ARG0]' eq 'MOO', $_[ARG1] == 99)"
  );

  # Wait just a little bit, in case of spurious signal.
  POE::Kernel->delay( timed_out => 0.250 );
}

sub timed_out {
  $_[KERNEL]->sig(MOO => undef);
}

1;