App-MultiModule
view release on metacpan or search on metacpan
t/repeated-task-crash.t view on Meta::CPAN
{ match => $OtherExternalModule->{match},
forwards => [
{ qname => $OtherExternalModule->{out_qname} }
]
},{ match => $OtherModule->{match},
forwards => [
{ qname => $OtherModule->{out_qname} }
]
},{ match => {
source => 'Incrementer',
},
forwards => [
{ qname => 'Incrementer_out' }
],
},{ match => {
source => 'StatelessProducer',
},
forwards => [
{ qname => 'Incrementer' }
],
}
],
}
},
}
};
ok IPC::Transit::send(qname => 'tqueue', message => $config);
sleep 35;
#make sure everything is flowing normally
$OtherExternalModule->send();
$OtherModule->send();
$OtherModule->receive(type => 'internal');
$OtherExternalModule->send();
$OtherExternalModule->receive(type => 'external');
$OtherExternalModule->send();
$OtherExternalModule->receive(type => 'external');
$OtherExternalModule->receive(type => 'external');
$OtherModule->send();
$OtherModule->send();
$OtherModule->receive(type => 'internal');
$OtherExternalModule->send();
$OtherExternalModule->receive(type => 'external');
$OtherModule->send();
$OtherModule->receive(type => 'internal');
$OtherModule->receive(type => 'internal');
my $crash = sub {
sleep 12; #give time for Router to route
my $crash_message = Storable::dclone $OtherExternalModule->{match};
$crash_message->{crash_me} = 1;
IPC::Transit::send(
qname => $OtherExternalModule->{task_name},
message => $crash_message
);
};
#crash it and validate it's back several times
for (1..10) {
my $rand = int rand 4;
print STDERR "\$rand=$rand\n";
ok $crash->() if $rand == 0;
print STDERR '$OtherExternalModule->send();' . "\n";
$OtherExternalModule->send();
ok $crash->() if $rand == 1;
print STDERR '$OtherModule->send();' . "\n";
$OtherModule->send();
ok $crash->() if $rand == 2;
print STDERR '$OtherExternalModule->receive(type => external);' . "\n";
$OtherExternalModule->receive(type => 'external');
ok $crash->() if $rand == 3;
print STDERR '$OtherModule->receive(type => internal);' . "\n";
$OtherModule->receive(type => 'internal');
}
#ask it to go away nicely
ok IPC::Transit::send(qname => 'tqueue', message => {
'.multimodule' => {
control => [
{ type => 'cleanly_exit',
exit_externals => 1,
}
],
}
});
sleep 6;
ok waitpid($daemon_pid, WNOHANG) == $daemon_pid;
ok not kill 9, $daemon_pid;
App::MultiModule::Test::finish();
done_testing();
( run in 0.624 second using v1.01-cache-2.11-cpan-140bd7fdf52 )