DR-TarantoolQueue

 view release on metacpan or  search on metacpan

t/010-tarantool-1.5/010-dr-tqueue.t  view on Meta::CPAN


my $task1 = $q->take;
isa_ok $task1 => 'DR::TarantoolQueue::Task';
my $task2 = $q->take;
isa_ok $task2 => 'DR::TarantoolQueue::Task';
my $task3 = $q->take;
isa_ok $task3 => 'DR::TarantoolQueue::Task';

$meta = $task2->get_meta;

is $task1->status, 'taken', 'task1 is taken';
is $task2->status, 'taken', 'task2 is taken';
is $task3->status, 'taken', 'task3 is taken';

$task1_t = $task1->release(delay => 10);
isa_ok $task1_t => 'DR::TarantoolQueue::Task';
$task2_t = $task2->release(delay => 20, ttl => 30);
isa_ok $task1_t => 'DR::TarantoolQueue::Task';
$task3_t = $task3->release;
isa_ok $task1_t => 'DR::TarantoolQueue::Task';

is $task1_t->status, 'delayed', 'task1 released as delayed';
is $task1->status, 'delayed', 'task1 released as delayed';
is $task2_t->status, 'delayed', 'task2 released as delayed';
is $task2->status, 'delayed', 'task2 released as delayed';
is $task3_t->status, 'ready', 'task3 released as ready';
is $task3->status, 'ready', 'task3 released as ready';

cmp_ok $task2->get_meta->{ttl}, '<', $meta->{ttl}, 'release updated ttl';
cmp_ok $task2->get_meta->{ttl}, '>=', (30+20) * 1_000_000,
    'ttl is more than 50s';
cmp_ok $task2->get_meta->{ttl}, '<', (30+30) * 1_000_000,
    'ttl is less than 60s';


$task1 = $q->take;
isa_ok $task1 => 'DR::TarantoolQueue::Task';
is $task1->status, 'taken', 'task1 is taken';
$task1_t = $task1->done(data => {'превед', 'медвед'});
is $task1->status, 'done', 'task1 is done';
is_deeply $task1->data, { 'превед', 'медвед' }, 'task1 is done';
isa_ok $task1_t => 'DR::TarantoolQueue::Task';
is $task1_t->status, 'done', 'task is done';
is_deeply $task1_t->data, { 'превед', 'медвед' }, 'task.data';


my $task4 = $q->put(tube    => 'utftube', data    => [ 3, 4, 'привет' ]);
like $task4->id, qr[^[0-9a-fA-F]{32}$], 'task3.id';
is_deeply $task4->data, [ 3, 4, 'привет' ],
    "put(data => arrayref)";

my $task5 =
    $q->urgent(tube => 'utftube', data => [ 3, 4, encode utf8 => 'медвед' ]);
like $task5->id, qr[^[0-9a-fA-F]{32}$], 'task3.id';
is_deeply $task5->data, [ 3, 4, encode utf8 => 'медвед' ],
    "urgent(data => arrayref)";

my $task5_t = $q->take(tube => 'utftube');
my $task4_t = $q->take(tube => 'utftube');

is_deeply $task4->data, $task4_t->data, 'Task and decoded utf data';
is_deeply $task5->data, $task5_t->data, 'Task and encoded utf data';

SKIP: {
    my $task_unique1 = eval {
        $q->put_unique(tube => 'utftube_unique',
            data => [ 3, 4, 'привет' ]);
    };
    skip 'tarantool is not configured for put_unique', 1
        if !$task_unique1 and $@ =~ /put_unique/;
    my $task_unique2 = $q->put_unique(tube => 'utftube_unique',
        data    => [ 3, 4, 'привет' ]);

    is_deeply $task_unique1->id, $task_unique2->id,
        'Unique tasks putting has equal ids';

}
{
    use Scalar::Util 'refaddr';
    $q = DR::TarantoolQueue->new(
        host    => '127.0.0.1',
        port    => $t->primary_port,
        space   => 0,
        tube    => 'test_queue',
        coro    => 1
    );
    ok $q, 'queue instance is created';
    is $q->{tnt}, undef, 'connection is not created yet';

    my (@clist, @f);
    for (1 .. 100) {
        push @f => async { $q->put(data => $_) };
        push @clist => $q->{tnt};
    }
    $_->join for @f;
    is_deeply [ map { refaddr $_ } @clist ],
        [ map { refaddr $clist[0] } 1 .. 100 ],
        'Only one connection established';


}
END {
    note $t->log if $ENV{DEBUG};
}



( run in 0.347 second using v1.01-cache-2.11-cpan-14f38c9f855 )