line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Module::Install::TestTarget; |
2
|
1
|
|
|
1
|
|
23496
|
use 5.006_002; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
29
|
|
3
|
1
|
|
|
1
|
|
5
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
67
|
|
4
|
|
|
|
|
|
|
#use warnings; # XXX: warnings.pm produces a lot of 'redefine' warnings! |
5
|
|
|
|
|
|
|
our $VERSION = '0.19'; |
6
|
|
|
|
|
|
|
|
7
|
1
|
|
|
1
|
|
5
|
use base qw(Module::Install::Base); |
|
1
|
|
|
|
|
7
|
|
|
1
|
|
|
|
|
796
|
|
8
|
1
|
|
|
1
|
|
695
|
use Config; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
32
|
|
9
|
1
|
|
|
1
|
|
4
|
use Carp qw(croak); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
348
|
|
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
our($ORIG_TEST_VIA_HARNESS); |
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
our $TEST_DYNAMIC = { |
14
|
|
|
|
|
|
|
env => '', |
15
|
|
|
|
|
|
|
includes => '', |
16
|
|
|
|
|
|
|
load_modules => '', |
17
|
|
|
|
|
|
|
insert_on_prepare => '', |
18
|
|
|
|
|
|
|
insert_on_finalize => '', |
19
|
|
|
|
|
|
|
run_on_prepare => '', |
20
|
|
|
|
|
|
|
run_on_finalize => '', |
21
|
|
|
|
|
|
|
}; |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
# override the default `make test` |
24
|
|
|
|
|
|
|
sub default_test_target { |
25
|
0
|
|
|
0
|
1
|
|
my ($self, %args) = @_; |
26
|
0
|
|
|
|
|
|
my %test = _build_command_parts(%args); |
27
|
0
|
|
|
|
|
|
$TEST_DYNAMIC = \%test; |
28
|
|
|
|
|
|
|
} |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
# create a new test target |
31
|
|
|
|
|
|
|
sub test_target { |
32
|
0
|
|
|
0
|
1
|
|
my ($self, $target, %args) = @_; |
33
|
0
|
0
|
|
|
|
|
croak 'target must be spesiced at test_target()' unless $target; |
34
|
0
|
|
|
|
|
|
my $alias = "\n"; |
35
|
|
|
|
|
|
|
|
36
|
0
|
0
|
|
|
|
|
if($args{alias}) { |
37
|
0
|
|
|
|
|
|
$alias .= qq{$args{alias} :: $target\n\n}; |
38
|
|
|
|
|
|
|
} |
39
|
0
|
0
|
0
|
|
|
|
if($Module::Install::AUTHOR && $args{alias_for_author}) { |
40
|
0
|
|
|
|
|
|
$alias .= qq{$args{alias_for_author} :: $target\n\n}; |
41
|
|
|
|
|
|
|
} |
42
|
|
|
|
|
|
|
|
43
|
0
|
|
|
|
|
|
my $test = _assemble(_build_command_parts(%args)); |
44
|
|
|
|
|
|
|
|
45
|
0
|
|
|
|
|
|
$self->postamble( |
46
|
|
|
|
|
|
|
$alias |
47
|
|
|
|
|
|
|
. qq{$target :: pure_all\n} |
48
|
|
|
|
|
|
|
. qq{\t} . $test |
49
|
|
|
|
|
|
|
); |
50
|
|
|
|
|
|
|
} |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
sub _build_command_parts { |
53
|
0
|
|
|
0
|
|
|
my %args = @_; |
54
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
#XXX: _build_command_parts() will be called first, so we put it here |
56
|
0
|
0
|
|
|
|
|
unless(defined $ORIG_TEST_VIA_HARNESS) { |
57
|
0
|
|
|
|
|
|
$ORIG_TEST_VIA_HARNESS = MY->can('test_via_harness'); |
58
|
1
|
|
|
1
|
|
4
|
no warnings 'redefine'; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
991
|
|
59
|
0
|
|
|
|
|
|
*MY::test_via_harness = \&_test_via_harness; |
60
|
|
|
|
|
|
|
} |
61
|
|
|
|
|
|
|
|
62
|
0
|
|
|
|
|
|
for my $key (qw/includes load_modules run_on_prepare run_on_finalize insert_on_prepare insert_on_finalize tests/) { |
63
|
0
|
|
0
|
|
|
|
$args{$key} ||= []; |
64
|
0
|
0
|
|
|
|
|
$args{$key} = [$args{$key}] unless ref $args{$key} eq 'ARRAY'; |
65
|
|
|
|
|
|
|
} |
66
|
0
|
|
0
|
|
|
|
$args{env} ||= {}; |
67
|
|
|
|
|
|
|
|
68
|
0
|
|
|
|
|
|
my %test; |
69
|
0
|
0
|
|
|
|
|
$test{includes} = @{$args{includes}} ? join '', map { qq|"-I$_" | } @{$args{includes}} : ''; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
70
|
0
|
0
|
|
|
|
|
$test{load_modules} = @{$args{load_modules}} ? join '', map { qq|"-M$_" | } @{$args{load_modules}} : ''; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
|
72
|
0
|
|
|
|
|
|
$test{tests} = @{$args{tests}} |
|
0
|
|
|
|
|
|
|
73
|
0
|
0
|
|
|
|
|
? join '', map { qq|"$_" | } @{$args{tests}} |
|
0
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
: '$(TEST_FILES)'; |
75
|
|
|
|
|
|
|
|
76
|
0
|
|
|
|
|
|
for my $key (qw/run_on_prepare run_on_finalize/) { |
77
|
0
|
0
|
|
|
|
|
$test{$key} = @{$args{$key}} ? join '', map { qq|do { local \$@; do '$_'; die \$@ if \$@ }; | } @{$args{$key}} : ''; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
78
|
0
|
|
|
|
|
|
$test{$key} = _quote($test{$key}); |
79
|
|
|
|
|
|
|
} |
80
|
0
|
|
|
|
|
|
for my $key (qw/insert_on_prepare insert_on_finalize/) { |
81
|
0
|
|
|
|
|
|
my $codes = join '', map { _build_funcall($_) } @{$args{$key}}; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
82
|
0
|
|
|
|
|
|
$test{$key} = _quote($codes); |
83
|
|
|
|
|
|
|
} |
84
|
0
|
|
|
|
|
|
$test{env} = %{$args{env}} ? _quote(join '', map { |
|
0
|
|
|
|
|
|
|
85
|
0
|
|
|
|
|
|
my $key = _env_quote($_); |
86
|
0
|
|
|
|
|
|
my $val = _env_quote($args{env}->{$_}); |
87
|
0
|
|
|
|
|
|
sprintf "\$ENV{q{%s}} = q{%s}; ", $key, $val |
88
|
0
|
0
|
|
|
|
|
} keys %{$args{env}}) : ''; |
89
|
|
|
|
|
|
|
|
90
|
0
|
|
|
|
|
|
return %test; |
91
|
|
|
|
|
|
|
} |
92
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
my $bd; |
94
|
|
|
|
|
|
|
sub _build_funcall { |
95
|
0
|
|
|
0
|
|
|
my($code) = @_; |
96
|
0
|
0
|
|
|
|
|
if(ref $code eq 'CODE') { |
97
|
0
|
|
0
|
|
|
|
$bd ||= do { require B::Deparse; B::Deparse->new() }; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
98
|
0
|
|
|
|
|
|
$code = $bd->coderef2text($code); |
99
|
|
|
|
|
|
|
} |
100
|
0
|
|
|
|
|
|
return qq|sub { $code }->(); |; |
101
|
|
|
|
|
|
|
} |
102
|
|
|
|
|
|
|
|
103
|
|
|
|
|
|
|
sub _quote { |
104
|
0
|
|
|
0
|
|
|
my $code = shift; |
105
|
0
|
|
|
|
|
|
$code =~ s/\$/\\\$\$/g; |
106
|
0
|
|
|
|
|
|
$code =~ s/"/\\"/g; |
107
|
0
|
|
|
|
|
|
$code =~ s/\n/ /g; |
108
|
0
|
0
|
|
|
|
|
if ($^O eq 'MSWin32') { |
109
|
0
|
|
|
|
|
|
$code =~ s/\\\$\$/\$\$/g; |
110
|
0
|
0
|
|
|
|
|
if ($Config{make} =~ /dmake/i) { |
111
|
0
|
|
|
|
|
|
$code =~ s/{/{{/g; |
112
|
0
|
|
|
|
|
|
$code =~ s/}/}}/g; |
113
|
|
|
|
|
|
|
} |
114
|
|
|
|
|
|
|
} |
115
|
0
|
|
|
|
|
|
return $code; |
116
|
|
|
|
|
|
|
} |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
sub _env_quote { |
119
|
0
|
|
|
0
|
|
|
my $val = shift; |
120
|
0
|
|
|
|
|
|
$val =~ s/}/\\}/g; |
121
|
0
|
|
|
|
|
|
return $val; |
122
|
|
|
|
|
|
|
} |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
sub _assemble { |
125
|
0
|
|
|
0
|
|
|
my %args = @_; |
126
|
0
|
|
0
|
|
|
|
my $command = MY->$ORIG_TEST_VIA_HARNESS($args{perl} || '$(FULLPERLRUN)', $args{tests}); |
127
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
# inject includes and modules before the first switch |
129
|
0
|
|
|
|
|
|
$command =~ s/("- \S+? ")/$args{includes}$args{load_modules}$1/xms; |
130
|
|
|
|
|
|
|
|
131
|
|
|
|
|
|
|
# inject snipetts in the one-liner |
132
|
0
|
|
|
|
|
|
$command =~ s{ |
133
|
|
|
|
|
|
|
( "-e" \s+ ") # start the one liner |
134
|
|
|
|
|
|
|
( (?: [^"] | \\ . )+ ) # body of the one liner |
135
|
|
|
|
|
|
|
( " ) # end the one liner |
136
|
|
|
|
|
|
|
}{ |
137
|
0
|
|
|
|
|
|
join '', $1, |
138
|
|
|
|
|
|
|
$args{env}, |
139
|
|
|
|
|
|
|
$args{run_on_prepare}, |
140
|
|
|
|
|
|
|
$args{insert_on_prepare}, |
141
|
|
|
|
|
|
|
"$2; ", |
142
|
|
|
|
|
|
|
$args{run_on_finalize}, |
143
|
|
|
|
|
|
|
$args{insert_on_finalize}, |
144
|
|
|
|
|
|
|
$3, |
145
|
|
|
|
|
|
|
}xmse; |
146
|
0
|
|
|
|
|
|
return $command; |
147
|
|
|
|
|
|
|
} |
148
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
sub _test_via_harness { |
150
|
0
|
|
|
0
|
|
|
my($self, $perl, $tests) = @_; |
151
|
|
|
|
|
|
|
|
152
|
0
|
|
|
|
|
|
$TEST_DYNAMIC->{perl} = $perl; |
153
|
0
|
|
0
|
|
|
|
$TEST_DYNAMIC->{tests} ||= $tests; |
154
|
0
|
|
|
|
|
|
return _assemble(%$TEST_DYNAMIC); |
155
|
|
|
|
|
|
|
} |
156
|
|
|
|
|
|
|
|
157
|
|
|
|
|
|
|
1; |
158
|
|
|
|
|
|
|
__END__ |