1#!./perl 2 3BEGIN { 4 if ($ENV{PERL_CORE}) { 5 chdir 't' if -d 't'; 6 @INC = '../lib'; 7 } 8 if (!eval "require Socket") { 9 print "1..0 # no Socket\n"; exit 0; 10 } 11 if (ord('A') == 193 && !eval "require Convert::EBCDIC") { 12 print "1..0 # EBCDIC but no Convert::EBCDIC\n"; exit 0; 13 } 14} 15 16use strict; 17 18use Cwd; 19print "1..20\n"; 20 21# for testing _readrc 22$ENV{HOME} = Cwd::cwd(); 23 24# avoid "used only once" warning 25local (*CORE::GLOBAL::getpwuid, *CORE::GLOBAL::stat); 26 27*CORE::GLOBAL::getpwuid = sub ($) { 28 ((undef) x 7, Cwd::cwd()); 29}; 30 31# for testing _readrc 32my @stat; 33*CORE::GLOBAL::stat = sub (*) { 34 return @stat; 35}; 36 37# for testing _readrc 38$INC{'FileHandle.pm'} = 1; 39 40(my $libnet_t = __FILE__) =~ s/\w+.t$/libnet_t.pl/; 41require $libnet_t; 42 43# now that the tricks are out of the way... 44eval { require Net::Netrc; }; 45ok( !$@, 'should be able to require() Net::Netrc safely' ); 46ok( exists $INC{'Net/Netrc.pm'}, 'should be able to use Net::Netrc' ); 47$Net::Netrc::TESTING=$Net::Netrc::TESTING=1; 48 49SKIP: { 50 skip('incompatible stat() handling for OS', 4), next SKIP 51 if ($^O =~ /os2|win32|macos|cygwin/i or $] < 5.005); 52 53 my $warn; 54 local $SIG{__WARN__} = sub { 55 $warn = shift; 56 }; 57 58 # add write access for group/other 59 $stat[2] = 077; 60 ok( !defined(Net::Netrc::_readrc()), 61 '_readrc() should not read world-writable file' ); 62 ok( scalar($warn =~ /^Bad permissions:/), 63 '... and should warn about it' ); 64 65 # the owner field should still not match 66 $stat[2] = 0; 67 68 if ($<) { 69 ok( !defined(Net::Netrc::_readrc()), 70 '_readrc() should not read file owned by someone else' ); 71 ok( scalar($warn =~ /^Not owner:/), 72 '... and should warn about it' ); 73 } else { 74 skip("testing as root",2); 75 } 76} 77 78# this field must now match, to avoid the last-tested warning 79$stat[4] = $<; 80 81# this curious mix of spaces and quotes tests a regex at line 79 (version 2.11) 82FileHandle::set_lines(split(/\n/, <<LINES)); 83macdef bar 84login baz 85 machine "foo" 86login nigol "password" drowssap 87machine foo "login" l2 88 password p2 89account tnuocca 90default login "baz" password p2 91default "login" baz password p3 92macdef 93LINES 94 95# having set several lines and the uid, this should succeed 96is( Net::Netrc::_readrc(), 1, '_readrc() should succeed now' ); 97 98# on 'foo', the login is 'nigol' 99is( Net::Netrc->lookup('foo')->{login}, 'nigol', 100 'lookup() should find value by host name' ); 101 102# on 'foo' with login 'l2', the password is 'p2' 103is( Net::Netrc->lookup('foo', 'l2')->{password}, 'p2', 104 'lookup() should find value by hostname and login name' ); 105 106# the default password is 'p3', as later declarations have priority 107is( Net::Netrc->lookup()->{password}, 'p3', 108 'lookup() should find default value' ); 109 110# lookup() ignores the login parameter when using default data 111is( Net::Netrc->lookup('default', 'baz')->{password}, 'p3', 112 'lookup() should ignore passed login when searching default' ); 113 114# lookup() goes to default data if hostname cannot be found in config data 115is( Net::Netrc->lookup('abadname')->{login}, 'baz', 116 'lookup() should use default for unknown machine name' ); 117 118# now test these accessors 119my $instance = bless({}, 'Net::Netrc'); 120for my $accessor (qw( login account password )) { 121 is( $instance->$accessor(), undef, 122 "$accessor() should return undef if $accessor is not set" ); 123 $instance->{$accessor} = $accessor; 124 is( $instance->$accessor(), $accessor, 125 "$accessor() should return value when $accessor is set" ); 126} 127 128# and the three-for-one accessor 129is( scalar( () = $instance->lpa()), 3, 130 'lpa() should return login, password, account'); 131is( join(' ', $instance->lpa), 'login password account', 132 'lpa() should return appropriate values for l, p, and a' ); 133 134package FileHandle; 135 136sub new { 137 tie *FH, 'FileHandle', @_; 138 bless \*FH, $_[0]; 139} 140 141sub TIEHANDLE { 142 my ($class, $file, $mode) = @_[0,2,3]; 143 bless({ file => $file, mode => $mode }, $class); 144} 145 146my @lines; 147sub set_lines { 148 @lines = @_; 149} 150 151sub READLINE { 152 shift @lines; 153} 154 155sub close { 1 } 156 157