File Coverage

blib/lib/Couchbase/Test/Async.pm
Criterion Covered Total %
statement 57 101 56.4
branch 0 4 0.0
condition n/a
subroutine 19 30 63.3
pod 0 9 0.0
total 76 144 52.7


line stmt bran cond sub pod time code
1             package Couchbase::Test::Async;
2 2     2   1410 use strict;
  2         2  
  2         226  
3 2     2   8 use warnings;
  2         4  
  2         54  
4              
5 2     2   10 use base qw(Couchbase::Test::Common);
  2         2  
  2         164  
6 2     2   8 use base qw(POE::Sugar::Attributes);
  2         4  
  2         1842  
7 2     2   295182 use Test::More;
  2         4  
  2         24  
8 2     2   2316 use Couchbase::Client::Async;
  2         6  
  2         60  
9 2     2   10 use Couchbase::Client::Errors;
  2         4  
  2         230  
10 2     2   12 use Couchbase::Client::IDXConst;
  2         6  
  2         466  
11 2     2   12 use Array::Assign;
  2         6  
  2         150  
12 2     2   12 use Data::Dumper;
  2         4  
  2         96  
13 2     2   10 use Log::Fu;
  2         4  
  2         10  
14              
15             my $loop_session = "cbc_test_async";
16             my $client_session = 'our_client';
17             my $poe_kernel = 'POE::Kernel';
18              
19             my $can_async = eval {
20 2     2   1840 use Couchbase::Test::Async::Loop;
  2         8  
  2         114  
21 2     2   12 use POE::Kernel; 1;
  2         6  
  2         20  
22             };
23              
24             if(!$can_async) {
25             __PACKAGE__->SKIP_CLASS("Can't run async tests: $@");
26             }
27              
28             if($^O eq 'netbsd') {
29             __PACKAGE__->SKIP_CLASS("Skipping Async tests on netbsd ".
30             "due to weird kernel bug");
31             }
32             $poe_kernel->run();
33              
34              
35             my $ReadyReceived = 0;
36             my $Return = undef;
37             my $Errnum;
38              
39             sub setup_async :Test(startup) {
40 0     0 0 0 my $self = shift;
41 0         0 $self->mock_init();
42              
43             Couchbase::Test::Async::Loop->spawn($loop_session,
44             on_ready => \&loop_ready,
45 0     0   0 on_error => sub { $Errnum = $_[0]; diag "Grrr!"; },
  0         0  
46 0         0 %{$self->common_options}
  0         0  
47             );
48 2     2   380 }
  2         4  
  2         8  
49              
50             sub loop_ready {
51 0     0 0   $ReadyReceived = 1;
52             }
53              
54             sub _run_poe {
55 0     0     $poe_kernel->run_one_timeslice() while ($ReadyReceived == 0);
56             }
57              
58             sub cb_result_single {
59 0     0 0   my ($key,$return,$errnum) = @_;
60 0 0         if($errnum >= 0) {
61 0           is($return->errnum, $errnum,
62             "Got return for key $key (expected=$errnum)");
63             }
64 0           $Return = $return;
65             }
66              
67             sub reset_vars :Test(setup) {
68 0     0 0 0 $ReadyReceived = 0;
69 0         0 $Return = undef;
70 0         0 $Errnum = -1;
71 2     2   712 }
  2         2  
  2         8  
72              
73             sub post_to_loop {
74 0     0 0   my ($self,$command,$opargs,$errnum) = @_;
75 0           reset_vars();
76 0           $poe_kernel->post($loop_session, $command, $opargs,
77             {callback => \&cb_result_single, arg => $errnum });
78 0           _run_poe();
79 0           ok($Return, "Have return object");
80 0           return $Return;
81             }
82              
83             sub T10_connect :Test(no_plan) {
84 0     0 0 0 my $self = shift;
85 0         0 $poe_kernel->run_one_timeslice() while ($ReadyReceived == 0);
86            
87 0         0 ok($ReadyReceived, "Eventually connected..");
88 0         0 ok($Errnum <= 0, "Got no errors ($Errnum)");
89 0 0       0 if($Errnum > 0) {
90 0         0 die("Got errors. Cannot continue");
91 0         0 $self->FAIL_ALL("Async tests cannot continue without hanging");
92             }
93 2     2   734 }
  2         2  
  2         10  
94              
95             sub T11_set :Test(no_plan) {
96 0     0 0 0 my $self = shift;
97 0         0 my $key = "async_key";
98 0         0 my $value = $self->k2v($key);
99 0         0 $self->post_to_loop(set => [ $key, $value ], COUCHBASE_SUCCESS);
100 2     2   604 }
  2         4  
  2         8  
101              
102             sub T12_get :Test(no_plan) {
103 0     0 0 0 my $self = shift;
104 0         0 my $key = "async_key";
105            
106 0         0 my $ret = $self->post_to_loop(get => "async_key", COUCHBASE_SUCCESS);
107 0         0 is($ret->value, $self->k2v($key), "Got expected value");
108 2     2   584 }
  2         4  
  2         8  
109              
110             sub T14_arith_ext :Test(no_plan) {
111 0     0 0   my $self = shift;
112 0           my $key = "async_key";
113            
114 0           my $ret;
115 0           $self->post_to_loop(remove => [$key], -1);
116            
117 0           $ret = $self->post_to_loop(
118             arithmetic => [ $key, 42, undef ], COUCHBASE_KEY_ENOENT);
119 0           is($ret->value, undef, "Didn't get value for missing initial value");
120            
121 0           $ret = $self->post_to_loop(
122             arithmetic => [ $key, 9999, 42 ], COUCHBASE_SUCCESS);
123            
124 0           is($Return->value, 42, "Initial value set via arithmetic");
125            
126 2     2   700 }
  2         4  
  2         10  
127              
128             1;