Beekeeper

 view release on metacpan or  search on metacpan

t/lib/Tests/Service/Worker.pm  view on Meta::CPAN

package Tests::Service::Worker;

use strict;
use warnings;

use Beekeeper::Worker ':log';
use base 'Beekeeper::Worker';

use Time::HiRes 'sleep';

=pod

=head1 Test worker

Simple worker used to test Beekeeper framework.

=cut

sub on_startup {
    my $self = shift;

    $self->accept_notifications(
        'test.signal' => 'signal',
        'test.fail'   => 'fail',
        'test.echo'   => 'echo',
        'test.*'      => 'catchall',
    );

    $self->accept_remote_calls(
        'test.signal' => 'signal',
        'test.fail'   => 'fail',
        'test.sleep'  => '_sleep',
        'test.fact'   => 'factorial',
        'test.fib1'   => 'fibonacci_1',
        'test.fib2'   => 'fibonacci_2',
        'test.fib3'   => 'fibonacci_3',
        'test.fib4'   => 'fibonacci_4',
        'test.echo'   => 'echo',
    );
}

sub authorize_request {
    my ($self, $req) = @_;

    return BKPR_REQUEST_AUTHORIZED;
}

sub catchall {
    my ($self, $params) = @_;
    $self->signal($params);
}

sub signal {
    my ($self, $params) = @_;

    my ($signal) = $params->{signal} =~ m/(\w+)/;  # untaint
    my ($pid)    = $params->{pid}    =~ m/(\d+)/;

    my $sleep = exists $params->{after} ? $params->{after} : rand() * 2;

    sleep $sleep;

    kill( $signal, $pid );
}

sub fail {
    my ($self, $params) = @_;

    warn $params->{warn} if $params->{warn};

    die $params->{die} if $params->{die};

    die Beekeeper::JSONRPC::Error->server_error( message => $params->{error}) if $params->{error};
}

sub echo {
    my ($self, $params) = @_;

    return $params;
}

sub _sleep {
    my ($self, $params) = @_;

    sleep $params;
}

sub factorial {
    my ($self, $n) = @_;

    return $n if ($n <= 2);

    my $resp = $self->call_remote(
        method  => 'test.fact',
        params  => $n - 1,
    );

    return $resp->result * $n;
}

sub fibonacci_1 {
    my ($self, $n) = @_;

    return $n if ($n <= 1);

    my $resp1 = $self->call_remote(
        method  => 'test.fib1',
        params  => $n - 1,
    );

    my $resp2 = $self->call_remote(
        method  => 'test.fib1',
        params  => $n - 2,
    );

    return $resp1->result + $resp2->result; 



( run in 1.432 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )