#!/usr/bin/perl use warnings; use strict; use utf8; use open qw(:std :utf8); use lib qw(lib ../lib); use lib qw(blib/lib blib/arch ../blib/lib ../blib/arch); use constant PLAN => 33; use Test::More tests => PLAN; use Encode qw(decode encode); BEGIN { # Подготовка объекта тестирования для работы с utf8 my $builder = Test::More->builder; binmode $builder->output, ":utf8"; binmode $builder->failure_output, ":utf8"; binmode $builder->todo_output, ":utf8"; use_ok 'DR::Tarantool::LLClient', 'tnt_connect'; use_ok 'DR::Tarantool::StartTest'; use_ok 'DR::Tarantool', ':all'; use_ok 'File::Spec::Functions', 'catfile'; use_ok 'File::Basename', 'dirname', 'basename'; use_ok 'AnyEvent'; use_ok 'DR::Tarantool::SyncClient'; } my $cfg_dir = catfile dirname(__FILE__), 'test-data'; ok -d $cfg_dir, 'directory with test data'; my $tcfg = catfile $cfg_dir, 'llc-easy2.cfg'; ok -r $tcfg, $tcfg; my $tnt = run DR::Tarantool::StartTest( cfg => $tcfg ); my $spaces = { 0 => { name => 'first_space', fields => [ { name => 'id', type => 'NUM', }, { name => 'name', type => 'UTF8STR', }, { name => 'key', type => 'INT', }, { name => 'password', type => 'STR', }, { name => 'balance', type => 'MONEY', } ], indexes => { 0 => 'id', 1 => 'name', 2 => [ 'key', 'password' ], }, } }; SKIP: { unless ($tnt->started and !$ENV{SKIP_TNT}) { diag $tnt->log unless $ENV{SKIP_TNT}; skip "tarantool isn't started", PLAN - 9; } my $client = tarantool( port => $tnt->primary_port, spaces => $spaces ); isa_ok $client => 'DR::Tarantool::SyncClient'; ok $client->ping, '* tarantool ping'; my $t = $client->insert( first_space => [1, 'привет', 11, 'password', '1.23'], TNT_FLAG_RETURN ); isa_ok $t => 'DR::Tarantool::Tuple'; is $t->balance, '1.23', 'money(1.23)'; is $t->key, 11, 'key(11)'; $t = $client->update(first_space => 1 => [ [ balance => add => '1.12' ], [ key => add => 101 ], ], TNT_FLAG_RETURN ); isa_ok $t => 'DR::Tarantool::Tuple'; is $t->balance, '2.35', 'money(2.35)'; is $t->key, 112, 'key(112)'; $t = $client->update(first_space => 1 => [ [ balance => add => '-3.17' ], [ key => add => -222 ], ], TNT_FLAG_RETURN ); isa_ok $t => 'DR::Tarantool::Tuple'; is $t->balance, '-0.82', 'money(-0.82)'; is $t->key, -110, 'key(-110)'; # second key $t = $client->insert( first_space => [2, 'привет2', -121, 'password2', '-2.34'], TNT_FLAG_RETURN ); isa_ok $t => 'DR::Tarantool::Tuple'; is $t->key, '-121', 'key(-121)'; is $t->balance, '-2.34', 'money(-2.34)'; $t = $client->update(first_space => 2 => [ [ balance => add => '-1.12' ], [ key => add => -101 ], ], TNT_FLAG_RETURN ); isa_ok $t => 'DR::Tarantool::Tuple'; is $t->key, '-222', 'key(-222)'; is $t->balance, '-3.46', 'money(-3.46)'; $t = $client->update(first_space => 2 => [ [ balance => add => '5.17' ], [ key => add => 777 ], ], TNT_FLAG_RETURN ); isa_ok $t => 'DR::Tarantool::Tuple'; is $t->key, '555', 'key(555)'; is $t->balance, '1.71', 'money(1.71)'; # connect for my $cv (condvar AnyEvent) { DR::Tarantool::AsyncClient->connect( port => $tnt->primary_port, reconnect_period => 0.1, spaces => $spaces, cb => sub { $client = shift; $cv->send; } ); $cv->recv; } unless ( isa_ok $client => 'DR::Tarantool::AsyncClient' ) { diag eval { decode utf8 => $client } || $client; last; } # ping for my $cv (condvar AnyEvent) { $client->ping( sub { my ($status) = @_; is $status, 'ok', '* async_tarantool ping'; $cv->send; } ); $cv->recv; } eval "require Coro"; skip "Coro isn't installed", 2 if $@; $client = coro_tarantool port => $tnt->primary_port, spaces => $spaces ; isa_ok $client => 'DR::Tarantool::CoroClient'; ok $client->ping, '* coro_tarantool ping'; }