App-SSH-SwitchShell
view release on metacpan or search on metacpan
#!perl
use 5.006;
use strict;
use warnings;
use autodie;
use Capture::Tiny qw(capture);
use Cwd;
use English qw( -no_match_vars );
use File::Spec;
use Test::More;
use Test::MockModule;
use Test::TempDir::Tiny;
use lib qw(.);
main();
sub main {
# $x is used to suppress warning
# $x is used twice to shut up perlcritic
if ( !eval { my $x = getpwuid $EUID; $x = 1; 1 } ) {
plan skip_all => 'The getpwuid function is unimplemented';
}
require_ok('bin/sshss') or BAIL_OUT();
# If this exists (for whatever strange reason), remove it.
delete $ENV{SSH_ORIGINAL_COMMAND};
my $tmpdir = tempdir();
# create a dummy "shell"
my $shell = File::Spec->catfile( $tmpdir, 'shell.pl' );
open my $fh, '>', $shell;
close $fh;
chmod 0755, $shell;
# mock get_abs_script_basedir and _exec
my $script_basedir;
my @exec_args;
my $sshss = Test::MockModule->new( 'App::SSH::SwitchShell', no_auto => 1 );
$sshss->mock( get_abs_script_basedir => sub { return $script_basedir } );
$sshss->mock( _exec => sub (&@) { @exec_args = @_; return; } );
# Change to a different tempdir to see if the chdir functionality works
my $basedir = tempdir();
chdir $basedir;
note('login shell, script inside .ssh dir');
{
local $ENV{HOME} = '/home/dummy';
local $ENV{SHELL} = '/bin/dummy';
$script_basedir = File::Spec->catdir( $tmpdir, '.ssh' );
mkdir $script_basedir;
local @ARGV = ($shell);
my ( $stdout, $stderr, @result ) = capture { App::SSH::SwitchShell::main() };
is( $result[0], undef, 'main() returns undef (because we mocked _exec)' );
is( $stdout, q{}, '... prints nothing to STDOUT' );
is( $stderr, q{}, '... prints nothing to STDERR' );
is( $ENV{HOME}, $tmpdir, '... HOME environment variable is correctly set' );
is( $ENV{SHELL}, $shell, '... SHELL environment variable is correctly set' );
is( cwd(), $tmpdir, '... cwd is correctly changed' );
my $exec_file = ( shift @exec_args )->();
is( $exec_file, $shell, '... the correct shell was run' );
is_deeply( \@exec_args, [qw(-shell.pl)], '... with the correct arguments' );
chdir $basedir;
}
note(q{run 'perl -v', script inside .ssh dir});
{
local $ENV{HOME} = '/home/dummy';
local $ENV{SHELL} = '/bin/dummy';
local $ENV{SSH_ORIGINAL_COMMAND} = "$EXECUTABLE_NAME -v";
$script_basedir = File::Spec->catdir( $tmpdir, '.ssh' );
local @ARGV = ($shell);
( run in 0.590 second using v1.01-cache-2.11-cpan-39bf76dae61 )