line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Test::CPANpm; |
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
865
|
use 5.006; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
35
|
|
4
|
1
|
|
|
1
|
|
4
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
31
|
|
5
|
1
|
|
|
1
|
|
14
|
use warnings; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
28
|
|
6
|
1
|
|
|
1
|
|
474
|
use Test::CPANpm::Fake; |
|
1
|
|
|
|
|
5
|
|
|
1
|
|
|
|
|
178
|
|
7
|
1
|
|
|
1
|
|
9
|
use Test::More; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
26
|
|
8
|
1
|
|
|
1
|
|
1638
|
use Exporter; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
40
|
|
9
|
1
|
|
|
1
|
|
6
|
use base q(Exporter); |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
97
|
|
10
|
1
|
|
|
1
|
|
6
|
use Cwd qw(getcwd); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
589
|
|
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
our @EXPORT = qw(cpan_depends_ok cpan_depends_ok_force_missing); |
13
|
|
|
|
|
|
|
our $VERSION = '0.010'; |
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
return 1; |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
sub cpan_depends_ok { |
18
|
1
|
|
|
1
|
1
|
612
|
my($deps, $test_name) = @_; |
19
|
1
|
|
|
|
|
3
|
my @actual; |
20
|
1
|
|
|
|
|
31
|
my @deps = sort @$deps; |
21
|
|
|
|
|
|
|
|
22
|
1
|
|
|
|
|
5
|
my($out, $in) = change_std(); |
23
|
|
|
|
|
|
|
run_with_cpan_config { |
24
|
1
|
|
|
1
|
|
4
|
my $dist_dir = dist_dir('.'); |
25
|
1
|
|
|
|
|
32
|
@actual = get_prereqs($dist_dir); |
26
|
0
|
|
|
|
|
|
@actual = sort(@actual); |
27
|
1
|
|
|
|
|
10
|
}; |
28
|
0
|
|
|
|
|
|
restore_std($out, $in); |
29
|
|
|
|
|
|
|
|
30
|
0
|
|
|
|
|
|
my $test = Test::More->builder; |
31
|
0
|
0
|
|
|
|
|
if(eq_array(\@actual, \@deps)) { |
32
|
0
|
|
|
|
|
|
$test->ok(1, $test_name); |
33
|
|
|
|
|
|
|
} else { |
34
|
0
|
|
|
|
|
|
diag("Expected dependancies: @deps, Actual: @actual"); |
35
|
0
|
|
|
|
|
|
$test->ok(0, $test_name); |
36
|
|
|
|
|
|
|
} |
37
|
|
|
|
|
|
|
} |
38
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
sub cpan_depends_ok_force_missing { |
40
|
0
|
|
|
0
|
1
|
|
my($deps, $missing, $test_name) = @_; |
41
|
0
|
|
|
|
|
|
my @actual; |
42
|
0
|
|
|
|
|
|
my @deps = sort @$deps; |
43
|
|
|
|
|
|
|
|
44
|
0
|
|
|
|
|
|
my($out, $in) = change_std(); |
45
|
|
|
|
|
|
|
run_with_cpan_config { |
46
|
0
|
|
|
0
|
|
|
my $dist_dir = dist_dir('.'); |
47
|
0
|
|
|
|
|
|
my %missing = map { $_ => 0 } @$missing; |
|
0
|
|
|
|
|
|
|
48
|
0
|
|
|
|
|
|
@actual = run_with_fake_modules { get_prereqs($dist_dir); } %missing; |
|
0
|
|
|
|
|
|
|
49
|
0
|
|
|
|
|
|
@actual = sort(@actual); |
50
|
0
|
|
|
|
|
|
}; |
51
|
0
|
|
|
|
|
|
restore_std($out, $in); |
52
|
|
|
|
|
|
|
|
53
|
0
|
|
|
|
|
|
my $test = Test::More->builder; |
54
|
0
|
0
|
|
|
|
|
if(eq_array(\@actual, \@deps)) { |
55
|
0
|
|
|
|
|
|
$test->ok(1, $test_name); |
56
|
|
|
|
|
|
|
} else { |
57
|
0
|
|
|
|
|
|
diag("Expected dependancies: @deps, Actual: @actual"); |
58
|
0
|
|
|
|
|
|
$test->ok(0, $test_name); |
59
|
|
|
|
|
|
|
} |
60
|
|
|
|
|
|
|
} |
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
=pod |
63
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
=head1 NAME |
65
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
Test::CPANpm - Test a distribution's interaction with CPAN before uploading. |
67
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
=head1 SYNOPSIS |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
use Test::CPANpm; |
71
|
|
|
|
|
|
|
use Test::More qw(no_plan); |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
cpan_depends_ok( |
74
|
|
|
|
|
|
|
['CGI', 'Module::Build', 'Acme::Wabbit'], |
75
|
|
|
|
|
|
|
'got the right dependancies' |
76
|
|
|
|
|
|
|
); |
77
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
cpan_depends_ok_force_missing( |
79
|
|
|
|
|
|
|
['Some::Module::Build::Subclass', 'CGI', 'Module::Build', 'Acme::Wabbit'], |
80
|
|
|
|
|
|
|
['Some::Module::Build::Subclass'], |
81
|
|
|
|
|
|
|
'got dependancies even though our Module::Build subclass is missing' |
82
|
|
|
|
|
|
|
); |
83
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
=head1 DESCRIPTION |
85
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
Test::CPANpm fools CPAN.pm into thinking it has downloaded and unpacked your |
87
|
|
|
|
|
|
|
package, then has it attempt to generate a C or C script. |
88
|
|
|
|
|
|
|
After this process completes, it asks your CPAN module what dependancies |
89
|
|
|
|
|
|
|
it thinks exist. |
90
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
If you just want to make sure your distribution is packaged in a way that |
92
|
|
|
|
|
|
|
is good for CPAN, consider using L instead. The main |
93
|
|
|
|
|
|
|
time that C is useful is when you depend on modules inside your |
94
|
|
|
|
|
|
|
C or C script and you want to make sure that you |
95
|
|
|
|
|
|
|
degrade gracefully if those modules are not available. |
96
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
=head1 TESTS |
98
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
=over |
100
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
=item cpan_depends_ok([modules], $test_name) |
102
|
|
|
|
|
|
|
|
103
|
|
|
|
|
|
|
Generate a distribution directory and tell CPAN to process it. The test will |
104
|
|
|
|
|
|
|
pass if your distribution depends on the exact modules listed in [modules]. |
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
=item cpan_depends_ok_force_missing([modules], [force-missing], $test_name) |
107
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
Create a bunch of modules that will fail to load, named in the [force-missing] |
109
|
|
|
|
|
|
|
array. Preprend this to our C<@INC>, then do the C test |
110
|
|
|
|
|
|
|
above. This is useful if, say, you have a Module::Build subclass, and you want |
111
|
|
|
|
|
|
|
to verify that your C script whines about this subclass missing in |
112
|
|
|
|
|
|
|
a way that CPAN can understand. |
113
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
The reason the fake modules are generated, is to prevent the already-installed |
115
|
|
|
|
|
|
|
modules on your system from interfereing with this test. |
116
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
Example: Given a C that contains the following: |
118
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
my $build; |
120
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
our %opts = ( |
122
|
|
|
|
|
|
|
module_name => 'My::Module::Subclass', |
123
|
|
|
|
|
|
|
license => 'perl', |
124
|
|
|
|
|
|
|
requires => { |
125
|
|
|
|
|
|
|
'Test::CPANpm' => '0', |
126
|
|
|
|
|
|
|
# My::Module provides My::Module::Build |
127
|
|
|
|
|
|
|
'My::Module' => '0', |
128
|
|
|
|
|
|
|
}, |
129
|
|
|
|
|
|
|
create_makefile_pl => 'passthrough', |
130
|
|
|
|
|
|
|
); |
131
|
|
|
|
|
|
|
|
132
|
|
|
|
|
|
|
eval { require My::Module::Build; }; |
133
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
if($@) { |
135
|
|
|
|
|
|
|
warn "My::Module::Build is required to build this module!"; |
136
|
|
|
|
|
|
|
$opts{requires}{'My::Module::Build'} = 0; |
137
|
|
|
|
|
|
|
# setting installdirs to an empty hash makes "./Build install" fail, |
138
|
|
|
|
|
|
|
# but we'll still get a "Build" script/Makefile that CPAN can use to |
139
|
|
|
|
|
|
|
# find prereqs |
140
|
|
|
|
|
|
|
$build = Module::Build->new(%opts, installdirs => {}); |
141
|
|
|
|
|
|
|
} else { |
142
|
|
|
|
|
|
|
$build = My::Module::Build->new(%opts); |
143
|
|
|
|
|
|
|
} |
144
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
$build->create_build_script; |
146
|
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
The following tests would be expected to pass: |
148
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
cpan_depends_ok( |
150
|
|
|
|
|
|
|
['My::Module', 'Test::CPANpm'], |
151
|
|
|
|
|
|
|
'CPAN sees basic dependancies' |
152
|
|
|
|
|
|
|
); |
153
|
|
|
|
|
|
|
|
154
|
|
|
|
|
|
|
cpan_depends_ok_force_missing( |
155
|
|
|
|
|
|
|
[ |
156
|
|
|
|
|
|
|
'My::Module', 'Test::CPANpm', 'My::Module::Build' |
157
|
|
|
|
|
|
|
], |
158
|
|
|
|
|
|
|
[ |
159
|
|
|
|
|
|
|
'My::Module::Build' |
160
|
|
|
|
|
|
|
], |
161
|
|
|
|
|
|
|
'CPAN complains if My::Module::Build is missing' |
162
|
|
|
|
|
|
|
); |
163
|
|
|
|
|
|
|
|
164
|
|
|
|
|
|
|
=back |
165
|
|
|
|
|
|
|
|
166
|
|
|
|
|
|
|
=head1 CAVEAT |
167
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
You must have a C or C script in the current working directory |
169
|
|
|
|
|
|
|
for C to work. It will call the "distdir" command on that script |
170
|
|
|
|
|
|
|
in order to build it's test environment. (This also means that your MANIFEST |
171
|
|
|
|
|
|
|
needs to be up-to-date for the tests to usually pass... but of course your |
172
|
|
|
|
|
|
|
MANIFEST needs to be up-to-date before you can upload to CPAN anyway, right?) |
173
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
=head1 TODO |
175
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
I'm rushing this package out because I have another package whose testability |
177
|
|
|
|
|
|
|
depends on these functions, but there's more I'd like to see in here: |
178
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
=over |
180
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
=item Test that you depend on particular versions of modules |
182
|
|
|
|
|
|
|
|
183
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
=item Test that a "Makefile" is actually created |
185
|
|
|
|
|
|
|
|
186
|
|
|
|
|
|
|
This is tacitly, implicitly done already by cpan_depends_ok, since |
187
|
|
|
|
|
|
|
you won't get any dependancy information out of CPAN without a Makefile, |
188
|
|
|
|
|
|
|
but an explicit test would still be good. |
189
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
=item Only generate distdir once for multiple tests |
191
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
=item Check that the modules you depend on actually are on CPAN |
194
|
|
|
|
|
|
|
|
195
|
|
|
|
|
|
|
Right now we just test that you depend on certain modules, there is no |
196
|
|
|
|
|
|
|
check to see if they are actually available. |
197
|
|
|
|
|
|
|
|
198
|
|
|
|
|
|
|
=item Tests that use CPANPLUS |
199
|
|
|
|
|
|
|
|
200
|
|
|
|
|
|
|
CPANPLUS is supposed to behave more-or-less the same as CPAN given a |
201
|
|
|
|
|
|
|
distribution, but it'd be nice to C it. |
202
|
|
|
|
|
|
|
|
203
|
|
|
|
|
|
|
=back |
204
|
|
|
|
|
|
|
|
205
|
|
|
|
|
|
|
=head1 SEE ALSO |
206
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
L, L, L, L, |
208
|
|
|
|
|
|
|
L |
209
|
|
|
|
|
|
|
|
210
|
|
|
|
|
|
|
=head1 AUTHOR |
211
|
|
|
|
|
|
|
|
212
|
|
|
|
|
|
|
Tyler "Crackerjack" MacDonald |
213
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
=head1 LICENSE |
215
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
Copyright 2006 Tyler MacDonald. |
217
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
This is free software; you may redistribute it under the same terms as perl itself. |
219
|
|
|
|
|
|
|
|
220
|
|
|
|
|
|
|
=cut |