1#!perl 2 3use 5.008001; 4 5use strict; 6use warnings; 7 8use Test::More; 9 10BEGIN { 11 if (!eval { require Socket }) { 12 plan skip_all => "no Socket"; 13 } 14 elsif (ord('A') == 193 && !eval { require Convert::EBCDIC }) { 15 plan skip_all => "EBCDIC but no Convert::EBCDIC"; 16 } 17 else { 18 plan tests => 54; 19 } 20} 21 22BEGIN { 23 package Foo; 24 25 use IO::File; 26 use Net::Cmd; 27 our @ISA = qw(Net::Cmd IO::File); 28 29 sub timeout { 0 } 30 31 sub new { 32 my $fh = shift->new_tmpfile; 33 binmode($fh); 34 $fh; 35 } 36 37 sub output { 38 my $self = shift; 39 seek($self,0,0); 40 local $/ = undef; 41 scalar(<$self>); 42 } 43 44 sub response { 45 return Net::Cmd::CMD_OK; 46 } 47} 48 49sub check { 50 my $expect = pop; 51 my $cmd = Foo->new; 52 ok($cmd->datasend, 'datasend') unless @_; 53 foreach my $line (@_) { 54 ok($cmd->datasend($line), 'datasend'); 55 } 56 ok($cmd->dataend, 'dataend'); 57 is( 58 unpack("H*",$cmd->output), 59 unpack("H*",$expect) 60 ); 61} 62 63my $cmd; 64 65check( 66 # nothing 67 68 ".\015\012" 69); 70 71check( 72 "a", 73 74 "a\015\012.\015\012", 75); 76 77check( 78 "a\r", 79 80 "a\015\015\012.\015\012", 81); 82 83check( 84 "a\rb", 85 86 "a\015b\015\012.\015\012", 87); 88 89check( 90 "a\rb\n", 91 92 "a\015b\015\012.\015\012", 93); 94 95check( 96 "a\rb\n\n", 97 98 "a\015b\015\012\015\012.\015\012", 99); 100 101check( 102 "a\r", 103 "\nb", 104 105 "a\015\012b\015\012.\015\012", 106); 107 108check( 109 "a\r", 110 "\nb\n", 111 112 "a\015\012b\015\012.\015\012", 113); 114 115check( 116 "a\r", 117 "\nb\r\n", 118 119 "a\015\012b\015\012.\015\012", 120); 121 122check( 123 "a\r", 124 "\nb\r\n\n", 125 126 "a\015\012b\015\012\015\012.\015\012", 127); 128 129check( 130 "a\n.b\n", 131 132 "a\015\012..b\015\012.\015\012", 133); 134 135check( 136 ".a\n.b\n", 137 138 "..a\015\012..b\015\012.\015\012", 139); 140 141check( 142 ".a\n", 143 ".b\n", 144 145 "..a\015\012..b\015\012.\015\012", 146); 147 148check( 149 ".a", 150 ".b\n", 151 152 "..a.b\015\012.\015\012", 153); 154 155check( 156 "a\n.", 157 158 "a\015\012..\015\012.\015\012", 159); 160 161# Test that datasend() plays nicely with bytes in an upgraded string, 162# even though the input should really be encode()d already. 163check( 164 substr("\x{100}", 0, 0) . "\x{e9}", 165 166 "\x{e9}\015\012.\015\012" 167); 168