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 )