File Coverage

blib/lib/Net/SSH/Any/Test/Isolated/_Base.pm
Criterion Covered Total %
statement 61 65 93.8
branch 9 16 56.2
condition 3 6 50.0
subroutine 15 16 93.7
pod n/a
total 88 103 85.4


line stmt bran cond sub pod time code
1             package Net::SSH::Any::Test::Isolated::_Base;
2              
3 1     1   674 use strict;
  1         1  
  1         22  
4 1     1   3 use warnings;
  1         1  
  1         22  
5 1     1   3 use feature 'say';
  1         1  
  1         70  
6 1     1   3 use Data::Dumper;
  1         1  
  1         39  
7 1     1   3 use Carp;
  1         1  
  1         48  
8              
9 1     1   615 BEGIN { *debug = \$Net::SSH::Any::Test::Isolated::debug }
10             our $debug;
11              
12             sub _debug {
13 112     112   118 my $self = shift;
14 112 50       239 print STDERR "$self->{side}> " . join(': ', @_) . "\n" if $debug;
15             }
16              
17             sub _new {
18 3     3   6 my ($class, $side, $in, $out) = @_;
19 3         13 my $self = { side => $side,
20             in => $in,
21             out => $out,
22             state => 'new'};
23 3         10 bless $self, $class;
24             }
25              
26             sub _send {
27 15     15   23 my ($self, $packet) = @_;
28 15         40 $self->_debug(send => $packet);
29 15         15 say {$self->{out}} $packet;
  15         171  
30             }
31              
32             sub _recv {
33 47     47   58 my $self = shift;
34 47         68 $self->_debug("waiting for data");
35 47         58 my $in = $self->{in};
36 47   50     402125 my $packet = <$in> // return;
37 47         373 $packet =~ s/[\r\n]+$//;
38 47         160 $self->_debug(recv => $packet);
39 47         141 $packet;
40             }
41              
42             sub _serialize {
43 9     9   12 my $self = shift;
44 9         166 my $dump = Data::Dumper->new([\@_], ['D']);
45 9         318 $dump->Terse(1)->Indent(0)->Useqq(1);
46 9         188 my $data = $dump->Dump;
47             # $self->_debug("serialized $data");
48 9         243 $data;
49             }
50              
51             sub _deserialize {
52 38     38   35 my $self = shift;
53 38         47 my ($r, $err);
54 38         31 do {
55 38         177 local ($@, $SIG{__DIE__});
56             #$self->_debug("deserializing $_[0]");
57 38   50     2861 $r = eval $_[0] // [];
58 38         195 $err = $@;
59             };
60 38 50       75 die $err if $err;
61             # $self->_debug("deserialized args", Dumper($r));
62 38 50       143 wantarray ? @$r : $r->[0];
63             }
64              
65             sub _recv_packet {
66 18     18   20 my $self = shift;
67 18         19 while (1) {
68 47   50     99 my $packet = $self->_recv // return;
69 47 100       297 if (my ($head, $args) = $packet =~ /^(\w+):\s+(.*)$/) {
    50          
    0          
70 38         96 my @args = $self->_deserialize($args);
71 38 100       87 if ($head eq 'log') {
72 29         108 $self->_log(@args);
73 29         9256 redo;
74             }
75 9         53 return ($head, @args);
76             }
77             elsif ($packet =~ /^\w+!$/) {
78 9         49 return $packet
79             }
80             elsif ($packet =~ /^\s*(?:#.*)?$/) {
81             # Ignore blank lines and comments.
82             }
83             else {
84 0         0 $self->_debug("unexpected data packet: $packet");
85 0         0 die "Internal error: unexpected data packet $packet";
86             }
87             }
88             }
89              
90             sub _send_packet {
91 9     9   18 my $self = shift;
92 9         13 my $head = shift;
93 9         26 my $args = $self->_serialize(@_);
94 9         32 $self->_send("$head: $args");
95             }
96              
97             sub _log {
98 0     0   0 my $self = shift;
99 0         0 print STDERR join(': ', log => @_);
100             }
101              
102             sub _check_state {
103 6     6   10 my ($self, $state) = @_;
104 6 50       21 $self->{state} eq $state or croak "invalid state for action, current state: $self->{state}, expected: $state";
105             }
106              
107             1;