Doit
view release on metacpan or search on metacpan
t/ssh-local.t view on Meta::CPAN
my $doit = Doit->init;
my @common_ssh_opts = ((defined $ENV{USER} ? $ENV{USER}.'@' : '') . 'localhost', master_opts => [qw(-oPasswordAuthentication=no -oBatchMode=yes -oConnectTimeout=3)]);
for my $test_type ('args', 'net-openssh-object') {
SKIP: {
my $ssh;
if ($test_type eq 'args') {
$ssh = eval { $doit->do_ssh_connect(@common_ssh_opts, debug => 0) };
} elsif ($test_type eq 'net-openssh-object') {
$ssh = eval {
require Net::OpenSSH;
my $net_openssh = Net::OpenSSH->new(@common_ssh_opts);
$net_openssh->error and die $net_openssh->error;
$ssh = $doit->do_ssh_connect($net_openssh, debug => 0);
};
} else {
die "Unhandled test_type";
}
skip "Cannot do ssh localhost using test type '$test_type': $@", 1
if !$ssh;
isa_ok $ssh, 'Doit::SSH';
my $ret = $ssh->info_qx('perl', '-e', 'print "yes\n"');
is $ret, "yes\n", 'run command via local ssh connection';
my $env = $ssh->call_with_runner('environment');
is $env->{cwd}, $ENV{HOME}, 'expected cwd is current home directory';
## XXX Actually it's unclear what $FindBin::RealBin should return here
#is($env->{original_realbin}, '???');
#is($env->{refreshed_realbin}, '???');
is $env->{DOIT_IN_REMOTE}, 1, 'DOIT_IN_REMOTE env set';
# XXX currently the output is not visible ---
# to work around this problem $|=1 has to be set in the function
# This should be done automatically.
# Another possibility: call $ssh->exit. But this would mean that
# the output only appears at the exit() call, not before.
# Also, this should be a proper test, e.g. using Capture::Tiny
$ssh->call_with_runner('stdout_test');
is $ssh->exit, 'bye-bye', 'exit called'; # XXX hmmm, should this really return "bye-bye"?
eval { $ssh->system($^X, '-e', 'exit 0') };
isnt $@, '', 'calling on ssh after exit';
SKIP: {
skip "Symlinks on Windows?", 1 if $^O eq 'MSWin32';
# Do a symlink test
my $dir = tempdir("doit_XXXXXXXX", TMPDIR => 1, CLEANUP => 1);
$doit->write_binary({quiet=>1}, "$dir/test-doit.pl", <<'EOF');
use Doit;
return 1 if caller;
my $doit = Doit->init;
my $ssh = $doit->do_ssh_connect((defined $ENV{USER} ? $ENV{USER}.'@' : '') . 'localhost', debug => 0, master_opts => [qw(-oPasswordAuthentication=no -oBatchMode=yes -oConnectTimeout=3)]);
my $ret = $ssh->info_qx('perl', '-e', 'print "yes\n"');
print $ret;
EOF
$doit->chmod(0755, "$dir/test-doit.pl");
$doit->symlink("$dir/test-doit.pl", "$dir/test-symlink.pl");
my $ret = $doit->info_qx($^X, "$dir/test-symlink.pl");
is $ret, "yes\n";
}
}
}
{
my $dir = tempdir("doit_XXXXXXXX", TMPDIR => 1, CLEANUP => 1);
$doit->write_binary({quiet=>1}, "$dir/test-doit.pl", <<'EOF');
use Doit;
sub fail_on_remote {
Doit::Log::error("fail on remote");
}
return 1 if caller;
my $doit = Doit->init;
my $ssh = $doit->do_ssh_connect((defined $ENV{USER} ? $ENV{USER}.'@' : '') . 'localhost', debug => 0, master_opts => [qw(-oPasswordAuthentication=no -oBatchMode=yes -oConnectTimeout=3)]);
$ssh->call_with_runner("fail_on_remote");
Doit::Log::warning("This should never be reached!");
EOF
$doit->chmod(0755, "$dir/test-doit.pl");
my $ret = eval { $doit->system($^X, "$dir/test-doit.pl"); 1 };
ok !$ret, 'system command failed';
like $@, qr{^Command exited with exit code (\d+) at}, 'expected error message';
isnt $1, 0, 'exit code is not zero';
}
__END__
( run in 0.732 second using v1.01-cache-2.11-cpan-39bf76dae61 )