Commit | Line | Data |
3b7ffd31 |
1 | use strict; |
2 | use warnings; |
3 | use Test::More; |
4 | use File::Spec; |
57987bd1 |
5 | use File::Basename qw(dirname); |
3b7ffd31 |
6 | use File::Temp (); |
7 | use Config; |
8 | use local::lib (); |
9 | |
10 | my @paths = File::Spec->path; |
11 | my @ext = $^O eq 'MSWin32' ? (split /\Q$Config{path_sep}/, $ENV{PATHEXT}) : (''); |
12 | sub which { |
13 | my $shell = shift; |
14 | for my $dir (@paths) { |
15 | my $file = File::Spec->catfile($dir||'.', $shell); |
16 | for my $ext (@ext) { |
17 | my $full = $file . $ext; |
18 | return $full |
19 | if -x $full; |
20 | } |
21 | } |
22 | return; |
23 | } |
24 | |
57987bd1 |
25 | my $extra_lib = '-I"' . dirname(dirname($INC{'local/lib.pm'})) . '"'; |
3b7ffd31 |
26 | |
27 | my @shells; |
28 | for my $shell ( |
29 | { |
30 | name => 'sh', |
31 | }, |
32 | { |
33 | name => 'csh', |
19e23dc8 |
34 | opt => '-f', |
3b7ffd31 |
35 | }, |
36 | { |
37 | name => 'cmd', |
e46466ba |
38 | opt => '/D /C', |
3b7ffd31 |
39 | ext => 'bat', |
40 | perl => qq{@"$^X"}, |
41 | }, |
42 | { |
43 | name => 'powershell', |
e46466ba |
44 | opt => '-NoProfile -ExecutionPolicy Unrestricted', |
3b7ffd31 |
45 | ext => 'ps1', |
46 | perl => qq{& '$^X'}, |
47 | }, |
48 | ) { |
49 | my $name = $shell->{name}; |
50 | next |
51 | if @ARGV && !grep {$_ eq $name} @ARGV; |
52 | $shell->{shell} = which($name) || next; |
53 | $shell->{ext} ||= $name; |
54 | $shell->{perl} ||= qq{"$^X"}; |
55 | push @shells, $shell; |
56 | } |
57 | |
58 | if (!@shells) { |
59 | plan skip_all => 'no supported shells found'; |
60 | } |
57987bd1 |
61 | plan tests => 6*@shells; |
3b7ffd31 |
62 | |
63 | my $sep = $Config{path_sep}; |
64 | |
65 | my $root = File::Spec->rootdir; |
66 | for my $shell (@shells) { |
67 | my $ll = File::Temp->newdir(); |
68 | my $ll_dir = local::lib->normalize_path("$ll"); |
69 | local $ENV{PERL_LOCAL_LIB_ROOT}; |
3b7ffd31 |
70 | delete $ENV{PERL_LOCAL_LIB_ROOT}; |
57987bd1 |
71 | local $ENV{PATH} = $root; |
72 | local $ENV{PERL5LIB}; |
73 | delete $ENV{PERL5LIB}; |
3b7ffd31 |
74 | my $env = call_ll($shell, "$ll"); |
57987bd1 |
75 | is $env->{PERL_LOCAL_LIB_ROOT}, $ll_dir, |
76 | "$shell->{name}: activate root"; |
77 | is $env->{PATH}, local::lib->install_base_bin_path($ll_dir)."$sep$root", |
78 | "$shell->{name}: activate PATH"; |
79 | is $env->{PERL5LIB}, local::lib->install_base_perl_path($ll_dir), |
80 | "$shell->{name}: activate PERL5LIB"; |
3b7ffd31 |
81 | |
82 | $ENV{$_} = $env->{$_} for qw(PATH PERL5LIB PERL_LOCAL_LIB_ROOT); |
83 | $env = call_ll($shell, '--deactivate', "$ll"); |
84 | |
57987bd1 |
85 | is $env->{PERL_LOCAL_LIB_ROOT}, undef, |
86 | "$shell->{name}: deactivate root"; |
87 | is $env->{PATH}, $root, |
88 | "$shell->{name}: deactivate PATH"; |
89 | is $env->{PERL5LIB}, undef, |
90 | "$shell->{name}: deactivate PERL5LIB"; |
3b7ffd31 |
91 | } |
92 | |
93 | sub call_ll { |
94 | my ($info, @options) = @_; |
95 | my $option = @options ? '='.join(',', @options) : ''; |
96 | |
97 | local $ENV{SHELL} = $info->{shell}; |
98 | |
19e23dc8 |
99 | my $file = File::Temp->new( |
100 | TEMPLATE => 'll-test-script-XXXXX', |
101 | TMPDIR => 1, |
102 | SUFFIX => '.'.$info->{ext}, |
3b7ffd31 |
103 | ); |
104 | |
105 | $file->print(scalar `"$^X" $extra_lib -Mlocal::lib$option` . "\n"); |
106 | $file->print(qq{$info->{perl} -Mt::lib::ENVDumper -e1\n}); |
107 | $file->close; |
108 | |
109 | my $opt = $info->{opt} ? "$info->{opt} " : ''; |
110 | my $out = `"$info->{shell}" $opt"$file"`; |
111 | if ($?) { |
112 | die "failed with code: $?"; |
113 | } |
114 | my $VAR1; |
115 | eval $out or die "bad output: $@"; |
116 | $VAR1; |
117 | } |