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   6457 use Module::Runtime qw(use_module);
  14         20  
  14         79  
4 14     14   571 use Object::Remote::Future;
  14         17  
  14         642  
5 14     14   49 use Object::Remote::Logging qw(:log :dlog router);
  14         25  
  14         77  
6 14     14   66 use Moo::Role;
  14         23  
  14         67  
7              
8             requires '_open2_for';
9              
10             has timeout => (is => 'ro', default => sub { 10 });
11              
12 14     14   3838 BEGIN { router()->exclude_forwarding; }
13              
14             sub connect {
15 20     20 0 32 my $self = shift;
16 20     0   146 Dlog_debug { "Preparing to create connection with args of: $_" } @_;
  0         0  
17 20         351 my ($send_to_fh, $receive_from_fh, $child_pid) = $self->_open2_for(@_);
18 20         191 my $channel = use_module('Object::Remote::ReadChannel')->new(
19             fh => $receive_from_fh
20             );
21             return future {
22 20     20   370 log_trace { "Initializing connection for child pid '$child_pid'" };
  0         0  
23 20         228 my $f = shift;
24             $channel->on_line_call(sub {
25 19 50       75 if ($_[0] eq "Shere") {
26 19         207 log_trace { "Received 'Shere' from child pid '$child_pid'; setting done handler to create connection" };
  0         0  
27 19         459 $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         811 undef($channel);
39 20         194 });
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         140 });
45 20         130 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         11 Dlog_trace {"Connection timeout timer has fired for child pid '$child_pid'; is_ready: $_" } $f->is_ready;
  0         0  
51 1 50       12 unless($f->is_ready) {
52 1         9 log_warn { "Connection with child pid '$child_pid' has timed out" };
  0         0  
53 1 50       11 $f->fail("Connection timed out") unless $f->is_ready;
54             }
55 1         439 undef($channel);
56              
57             }
58 20         269 );
59 20         163 log_trace { "connection for child pid '$child_pid' has been initialized" };
  0         0  
60 20         237 $f;
61             }
62 20         467 }
63              
64             1;