Blame t/netrc.t

Packit bd23c0
#!perl
Packit bd23c0
Packit bd23c0
use 5.008001;
Packit bd23c0
Packit bd23c0
use strict;
Packit bd23c0
use warnings;
Packit bd23c0
Packit bd23c0
BEGIN {
Packit bd23c0
    if (!eval { require Socket }) {
Packit bd23c0
        print "1..0 # no Socket\n"; exit 0;
Packit bd23c0
    }
Packit bd23c0
    if (ord('A') == 193 && !eval { require Convert::EBCDIC }) {
Packit bd23c0
        print "1..0 # EBCDIC but no Convert::EBCDIC\n"; exit 0;
Packit bd23c0
    }
Packit bd23c0
}
Packit bd23c0
Packit bd23c0
use Cwd;
Packit bd23c0
print "1..20\n";
Packit bd23c0
Packit bd23c0
# for testing _readrc
Packit bd23c0
$ENV{HOME} = Cwd::cwd();
Packit bd23c0
Packit bd23c0
# avoid "used only once" warning
Packit bd23c0
local (*CORE::GLOBAL::getpwuid, *CORE::GLOBAL::stat);
Packit bd23c0
Packit bd23c0
*CORE::GLOBAL::getpwuid = sub ($) {
Packit bd23c0
        ((undef) x 7, Cwd::cwd());
Packit bd23c0
};
Packit bd23c0
Packit bd23c0
# for testing _readrc
Packit bd23c0
my @stat;
Packit bd23c0
*CORE::GLOBAL::stat = sub (*) {
Packit bd23c0
        return @stat;
Packit bd23c0
};
Packit bd23c0
Packit bd23c0
# for testing _readrc
Packit bd23c0
$INC{'FileHandle.pm'} = 1;
Packit bd23c0
Packit bd23c0
(my $libnet_t = __FILE__) =~ s/\w+.t$/libnet_t.pl/;
Packit bd23c0
require $libnet_t;
Packit bd23c0
Packit bd23c0
# now that the tricks are out of the way...
Packit bd23c0
eval { require Net::Netrc; };
Packit bd23c0
ok( !$@, 'should be able to require() Net::Netrc safely' );
Packit bd23c0
ok( exists $INC{'Net/Netrc.pm'}, 'should be able to use Net::Netrc' );
Packit bd23c0
$Net::Netrc::TESTING=$Net::Netrc::TESTING=1;
Packit bd23c0
Packit bd23c0
SKIP: {
Packit bd23c0
        skip('incompatible stat() handling for OS', 4), next SKIP 
Packit bd23c0
                if $^O =~ /os2|win32|macos|cygwin/i;
Packit bd23c0
Packit bd23c0
        my $warn;
Packit bd23c0
        local $SIG{__WARN__} = sub {
Packit bd23c0
                $warn = shift;
Packit bd23c0
        };
Packit bd23c0
Packit bd23c0
        # add write access for group/other
Packit bd23c0
        $stat[2] = 077; ## no critic (ValuesAndExpressions::ProhibitLeadingZeros)
Packit bd23c0
        ok( !defined(Net::Netrc->_readrc()),
Packit bd23c0
                '_readrc() should not read world-writable file' );
Packit bd23c0
        ok( scalar($warn =~ /^Bad permissions:/),
Packit bd23c0
                '... and should warn about it' );
Packit bd23c0
Packit bd23c0
        # the owner field should still not match
Packit bd23c0
        $stat[2] = 0;
Packit bd23c0
Packit bd23c0
        if ($<) { 
Packit bd23c0
          ok( !defined(Net::Netrc->_readrc()),
Packit bd23c0
              '_readrc() should not read file owned by someone else' ); 
Packit bd23c0
          ok( scalar($warn =~ /^Not owner:/),
Packit bd23c0
                '... and should warn about it' ); 
Packit bd23c0
        } else { 
Packit bd23c0
          skip("testing as root",2);
Packit bd23c0
        } 
Packit bd23c0
}
Packit bd23c0
Packit bd23c0
# this field must now match, to avoid the last-tested warning
Packit bd23c0
$stat[4] = $<;
Packit bd23c0
Packit bd23c0
# this curious mix of spaces and quotes tests a regex at line 79 (version 2.11)
Packit bd23c0
FileHandle::set_lines(split(/\n/, <
Packit bd23c0
macdef   bar
Packit bd23c0
login    baz
Packit bd23c0
machine  "foo"
Packit bd23c0
login    nigol "password" drowssap
Packit bd23c0
machine  foo "login" l2
Packit bd23c0
password p2
Packit bd23c0
account  tnuocca
Packit bd23c0
default  login "baz" password p2
Packit bd23c0
default  "login" baz password p3
Packit bd23c0
macdef
Packit bd23c0
LINES
Packit bd23c0
Packit bd23c0
# having set several lines and the uid, this should succeed
Packit bd23c0
is( Net::Netrc->_readrc(), 1, '_readrc() should succeed now' );
Packit bd23c0
Packit bd23c0
# on 'foo', the login is 'nigol'
Packit bd23c0
is( Net::Netrc->lookup('foo')->{login}, 'nigol', 
Packit bd23c0
        'lookup() should find value by host name' );
Packit bd23c0
Packit bd23c0
# on 'foo' with login 'l2', the password is 'p2'
Packit bd23c0
is( Net::Netrc->lookup('foo', 'l2')->{password}, 'p2',
Packit bd23c0
        'lookup() should find value by hostname and login name' );
Packit bd23c0
Packit bd23c0
# the default password is 'p3', as later declarations have priority
Packit bd23c0
is( Net::Netrc->lookup()->{password}, 'p3', 
Packit bd23c0
        'lookup() should find default value' );
Packit bd23c0
Packit bd23c0
# lookup() ignores the login parameter when using default data
Packit bd23c0
is( Net::Netrc->lookup('default', 'baz')->{password}, 'p3',
Packit bd23c0
        'lookup() should ignore passed login when searching default' );
Packit bd23c0
Packit bd23c0
# lookup() goes to default data if hostname cannot be found in config data 
Packit bd23c0
is( Net::Netrc->lookup('abadname')->{login}, 'baz',
Packit bd23c0
        'lookup() should use default for unknown machine name' );
Packit bd23c0
Packit bd23c0
# now test these accessors
Packit bd23c0
my $instance = bless({}, 'Net::Netrc');
Packit bd23c0
for my $accessor (qw( login account password )) {
Packit bd23c0
        is( $instance->$accessor(), undef, 
Packit bd23c0
                "$accessor() should return undef if $accessor is not set" );
Packit bd23c0
        $instance->{$accessor} = $accessor;
Packit bd23c0
        is( $instance->$accessor(), $accessor,
Packit bd23c0
                "$accessor() should return value when $accessor is set" );
Packit bd23c0
}
Packit bd23c0
Packit bd23c0
# and the three-for-one accessor
Packit bd23c0
is( scalar( () = $instance->lpa()), 3, 
Packit bd23c0
        'lpa() should return login, password, account');
Packit bd23c0
is( join(' ', $instance->lpa), 'login password account', 
Packit bd23c0
        'lpa() should return appropriate values for l, p, and a' );
Packit bd23c0
Packit bd23c0
package FileHandle;
Packit bd23c0
Packit bd23c0
sub new {
Packit bd23c0
        tie *FH, 'FileHandle', @_;
Packit bd23c0
        bless \*FH, $_[0];
Packit bd23c0
}
Packit bd23c0
Packit bd23c0
sub TIEHANDLE {
Packit bd23c0
        my ($class, $file, $mode) = @_[0,2,3];
Packit bd23c0
        bless({ file => $file, mode => $mode }, $class);
Packit bd23c0
}
Packit bd23c0
Packit bd23c0
my @lines;
Packit bd23c0
sub set_lines {
Packit bd23c0
        @lines = @_;
Packit bd23c0
}
Packit bd23c0
Packit bd23c0
sub READLINE {
Packit bd23c0
        shift @lines;
Packit bd23c0
}
Packit bd23c0
Packit bd23c0
sub close { 1 }
Packit bd23c0