File Coverage

blib/lib/Object/Remote/Role/Connector.pm
Criterion Covered Total %
statement 35 49 71.4
branch 3 6 50.0
condition n/a
subroutine 7 8 87.5
pod 0 1 0.0
total 45 64 70.3


line stmt bran cond sub pod time code
1             package Object::Remote::Role::Connector;
2              
3 14     14   6738 use Module::Runtime qw(use_module);
  14         32  
  14         112  
4 14     14   672 use Object::Remote::Future;
  14         62  
  14         650  
5 14     14   71 use Object::Remote::Logging qw(:log :dlog router);
  14         68  
  14         78  
6 14     14   199 use Moo::Role;
  14         28  
  14         139  
7              
8             requires '_open2_for';
9              
10             has timeout => (is => 'ro', default => sub { 10 });
11              
12 14     14   5885 BEGIN { router()->exclude_forwarding; }
13              
14             sub connect {
15 20     20 0 44 my $self = shift;
16 20     0   222 Dlog_debug { "Preparing to create connection with args of: $_" } @_;
  0         0  
17 20         375 my ($send_to_fh, $receive_from_fh, $child_pid) = $self->_open2_for(@_);
18 20         546 my $channel = use_module('Object::Remote::ReadChannel')->new(
19             fh => $receive_from_fh
20             );
21             return future {
22 20     20   1066 log_trace { "Initializing connection for child pid '$child_pid'" };
  0         0  
23 20         218 my $f = shift;
24             $channel->on_line_call(sub {
25 19 50       84 if ($_[0] eq "Shere") {
26 19         348 log_trace { "Received 'Shere' from child pid '$child_pid'; setting done handler to create connection" };
  0         0  
27 19         279 $f->done(
28             use_module('Object::Remote::Connection')->new(
29             send_to_fh => $send_to_fh,
30             read_channel => $channel,
31             child_pid => $child_pid,
32             )
33             );
34             } else {
35 0         0 log_warn { "'Shere' was not found in connection data for child pid '$child_pid'" };
  0         0  
36 0         0 $f->fail("Expected Shere from remote but received: $_[0]");
37             }
38 19         620 undef($channel);
39 20         392 });
40             $channel->on_close_call(sub {
41 0         0 log_trace { "Connection has been closed" };
  0         0  
42 0         0 $f->fail("Channel closed without seeing Shere: $_[0]");
43 0         0 undef($channel);
44 20         281 });
45 20         165 log_trace { "initialized events on channel for child pid '$child_pid'; creating timeout" };
  0         0  
46             Object::Remote->current_loop
47             ->watch_time(
48             after => $self->timeout,
49             code => sub {
50 1         10 Dlog_trace {"Connection timeout timer has fired for child pid '$child_pid'; is_ready: $_" } $f->is_ready;
  0         0  
51 1 50       14 unless($f->is_ready) {
52 1         22 log_warn { "Connection with child pid '$child_pid' has timed out" };
  0         0  
53 1 50       12 $f->fail("Connection timed out") unless $f->is_ready;
54             }
55 1         24 undef($channel);
56              
57             }
58 20         296 );
59 20         275 log_trace { "connection for child pid '$child_pid' has been initialized" };
  0         0  
60 20         202 $f;
61             }
62 20         846 }
63              
64             1;