Silence the warning "Can't locate auto/POSIX/autosplit.ix in @INC"
[p5sagit/p5-mst-13.2.git] / lib / CPANPLUS / t / 08_CPANPLUS-Backend.t
CommitLineData
6aaee015 1### make sure we can find our conf.pl file
2BEGIN {
3 use FindBin;
4 require "$FindBin::Bin/inc/conf.pl";
5}
6
7use strict;
8use Test::More 'no_plan';
9use File::Basename 'dirname';
10
11use Data::Dumper;
12use CPANPLUS::Error;
13use CPANPLUS::Internals::Constants;
14
15my $conf = gimme_conf();
16
17### purposely avert messages and errors to a file? ###
18my $Trap_Output = @ARGV ? 0 : 1;
19
20my $Class = 'CPANPLUS::Backend';
21### D::C has troubles with the 'use_ok' -- it finds the wrong paths.
22### for now, do a 'use' instead
23#use_ok( $Class ) or diag "$Class not found";
24use CPANPLUS::Backend;
25
26my $cb = $Class->new( $conf );
27isa_ok( $cb, $Class );
28
29my $mt = $cb->module_tree;
30my $at = $cb->author_tree;
31ok( scalar keys %$mt, "Module tree has entries" );
32ok( scalar keys %$at, "Author tree has entries" );
33
34### module_tree tests ###
35my $Name = TEST_CONF_MODULE;
36my $mod = $cb->module_tree($Name);
37
38### XXX SOURCEFILES FIX
39{ my @mods = $cb->module_tree($Name,$Name);
40 my $none = $cb->module_tree( TEST_CONF_INVALID_MODULE );
41
42 ok( IS_MODOBJ->(mod => $mod), "Module object found" );
43 is( scalar(@mods), 2, " Module list found" );
44 ok( IS_MODOBJ->(mod => $mods[0]), " ISA module object" );
45 ok( !IS_MODOBJ->(mod => $none), " Bogus module detected");
46}
47
48### author_tree tests ###
49{ my @auths = $cb->author_tree( $mod->author->cpanid,
50 $mod->author->cpanid );
51 my $none = $cb->author_tree( 'fnurk' );
52
53 ok( IS_AUTHOBJ->(auth => $mod->author), "Author object found" );
54 is( scalar(@auths), 2, " Author list found" );
55 ok( IS_AUTHOBJ->( author => $auths[0] )," ISA author object" );
56 is( $mod->author, $auths[0], " Objects are identical" );
57 ok( !IS_AUTHOBJ->( author => $none ), " Bogus author detected" );
58}
59
60my $conf_obj = $cb->configure_object;
61ok( IS_CONFOBJ->(conf => $conf_obj), "Configure object found" );
62
63
64### parse_module tests ###
65{ my @map = ( # author package version
66 $Name => [ $mod->author->cpanid, $mod->package_name, $mod->version ],
67 $mod => [ $mod->author->cpanid, $mod->package_name, $mod->version ],
68 'Foo-Bar-EU-NOXS'
69 => [ $mod->author->cpanid, $mod->package_name, $mod->version ],
70 'Foo-Bar-EU-NOXS-0.01'
71 => [ $mod->author->cpanid, $mod->package_name, '0.01' ],
72 'EUNOXS/Foo-Bar-EU-NOXS'
73 => [ 'EUNOXS', $mod->package_name, $mod->version ],
74 'EUNOXS/Foo-Bar-EU-NOXS-0.01'
75 => [ 'EUNOXS', $mod->package_name, '0.01' ],
76 'Foo-Bar-EU-NOXS-0.09'
77 => [ $mod->author->cpanid, $mod->package_name, '0.09' ],
78 'MBXS/Foo-Bar-EU-NOXS-0.01'
79 => [ 'MBXS', $mod->package_name, '0.01' ],
80 'EUNOXS/Foo-Bar-EU-NOXS-0.09'
81 => [ 'EUNOXS', $mod->package_name, '0.09' ],
82 'EUNOXS/Foo-Bar-EU-NOXS-0.09.zip'
83 => [ 'EUNOXS', $mod->package_name, '0.09' ],
84 'FROO/Flub-Flob-1.1.zip'
85 => [ 'FROO', 'Flub-Flob', '1.1' ],
86 'G/GO/GOYALI/SMS_API_3_01.tar.gz'
87 => [ 'GOYALI', 'SMS_API', '3_01' ],
88 'E/EY/EYCK/Net/Lite/Net-Lite-FTP-0.091'
89 => [ 'EYCK', 'Net-Lite-FTP', '0.091' ],
90 'EYCK/Net/Lite/Net-Lite-FTP-0.091'
91 => [ 'EYCK', 'Net-Lite-FTP', '0.091' ],
92 'M/MA/MAXDB/DBD-MaxDB-7.5.00.24a'
93 => [ 'MAXDB', 'DBD-MaxDB', '7.5.00.24a' ],
94 'EUNOXS/perl5.005_03.tar.gz'
95 => [ 'EUNOXS', 'perl', '5.005_03' ],
96 'FROO/Flub-Flob-v1.1.0.tbz'
97 => [ 'FROO', 'Flub-Flob', 'v1.1.0' ],
98 'FROO/Flub-Flob-1.1_2.tbz'
99 => [ 'FROO', 'Flub-Flob', '1.1_2' ],
100 'LDS/CGI.pm-3.27.tar.gz'
101 => [ 'LDS', 'CGI', '3.27' ],
102 'FROO/Text-Tabs+Wrap-2006.1117.tar.gz'
103 => [ 'FROO', 'Text-Tabs+Wrap', '2006.1117' ],
104 'JETTERO/Crypt-PBC-0.7.20.0-0.4.9',
105 => [ 'JETTERO', 'Crypt-PBC', '0.7.20.0-0.4.9' ],
106
107 );
108
109 while ( my($guess, $attr) = splice @map, 0, 2 ) {
110 my( $author, $pkg, $version ) = @$attr;
111
112 ok( $guess, "Attempting to parse $guess" );
113
114 my $obj = $cb->parse_module( module => $guess );
115
116 ok( $obj, " Result returned" );
117 ok( IS_MODOBJ->( mod => $obj ),
118 " parse_module success by '$guess'" );
119
120 is( $obj->version, $version,
121 " Proper version found: $version" );
122 is( $obj->package_version, $version,
123 " Found in package_version as well" );
124 is( $obj->package_name, $pkg,
125 " Proper package found: $pkg" );
126 unlike( $obj->package_name, qr/\d/,
127 " No digits in package name" );
128 like( $obj->author->cpanid, "/$author/i",
129 " Proper author found: $author");
130 like( $obj->path, "/$author/i",
131 " Proper path found: " . $obj->path );
132 }
133
134
135 ### test for things that look like real modules, but aren't ###
136 { local $CPANPLUS::Error::MSG_FH = output_handle() if $Trap_Output;
137 local $CPANPLUS::Error::ERROR_FH = output_handle() if $Trap_Output;
138
139 my @map = (
140 [ $Name . $$ => [
141 [qr/does not contain an author/,"Missing author part detected"],
142 [qr/Cannot find .+? in the module tree/,"Unable to find module"]
143 ] ],
144 [ {}, => [
145 [ qr/module string from reference/,"Unable to parse ref"]
146 ] ],
147 );
148
149 for my $entry ( @map ) {
150 my($mod,$aref) = @$entry;
151
152 my $none = $cb->parse_module( module => $mod );
153 ok( !IS_MODOBJ->(mod => $none),
154 "Non-existant module detected" );
155 ok( !IS_FAKE_MODOBJ->(mod => $none),
156 "Non-existant fake module detected" );
157
158 my $str = CPANPLUS::Error->stack_as_string;
159 for my $pair (@$aref) {
160 my($re,$diag) = @$pair;
161 like( $str, $re," $diag" );
162 }
163 }
164 }
165
166 ### test parsing of arbitrary URI
167 for my $guess ( qw[ http://foo/bar.gz
168 http://a/b/c/d/e/f/g/h/i/j
169 flub://floo ]
170 ) {
171 my $obj = $cb->parse_module( module => $guess );
172 ok( IS_FAKE_MODOBJ->(mod => $obj), "parse_module success by '$guess'" );
173 is( $obj->status->_fetch_from, $guess,
174 " Fetch from set ok" );
175 }
176}
177
178### RV tests ###
179{ my $method = 'readme';
180 my %args = ( modules => [$Name] );
181
182 my $rv = $cb->$method( %args );
183 ok( IS_RVOBJ->( $rv ), "Got an RV object" );
184 ok( $rv->ok, " Overall OK" );
185 cmp_ok( $rv, '==', 1, " Overload OK" );
186 is( $rv->function, $method, " Function stored OK" );
187 is_deeply( $rv->args, \%args, " Arguments stored OK" );
188 is( $rv->rv->{$Name}, $mod->readme, " RV as expected" );
189}
190
191### reload_indices tests ###
192{
193 my $file = File::Spec->catfile( $conf->get_conf('base'),
194 $conf->_get_source('mod'),
195 );
196
197 ok( $cb->reload_indices( update_source => 0 ), "Rebuilding trees" );
198 my $age = -M $file;
199
200 ### make sure we are 'newer' on faster machines with a sleep..
201 ### apparently Win32's FAT isn't granual enough on intervals
202 ### < 2 seconds, so it may give the same answer before and after
203 ### the sleep, causing the test to fail. so sleep atleast 2 seconds.
204 sleep 2;
205 ok( $cb->reload_indices( update_source => 1 ),
206 "Rebuilding and refetching trees" );
207 cmp_ok( $age, '>', -M $file, " Source file '$file' updated" );
208}
209
210### flush tests ###
211{
212 for my $cache( qw[methods hosts modules lib all] ) {
213 ok( $cb->flush($cache), "Cache $cache flushed ok" );
214 }
215}
216
217### installed tests ###
218{
219 ok( scalar $cb->installed, "Found list of installed modules" );
220}
221
222### autobudle tests ###
223{
224 my $where = $cb->autobundle;
225 ok( $where, "Autobundle written" );
226 ok( -s $where, " File has size" );
227}
228
229### local_mirror tests ###
230{ ### turn off md5 checks for the 'fake' packages we have
231 my $old_md5 = $conf->get_conf('md5');
232 $conf->set_conf( md5 => 0 );
233
234 ### otherwise 'status->fetch' might be undef! ###
235 my $rv = $cb->local_mirror( path => 'dummy-localmirror' );
236 ok( $rv, "Local mirror created" );
237
238 for my $mod ( values %{ $cb->module_tree } ) {
239 my $name = $mod->module;
240
241 my $cksum = File::Spec->catfile(
242 dirname($mod->status->fetch),
243 CHECKSUMS );
244 ok( -e $mod->status->fetch, " Module '$name' fetched" );
245 ok( -s _, " Module '$name' has size" );
246 ok( -e $cksum, " Checksum fetched for '$name'" );
247 ok( -s _, " Checksum for '$name' has size" );
248 }
249
250 $conf->set_conf( md5 => $old_md5 );
251}
252
253### check ENV variable
254{ ### process id
255 { my $name = 'PERL5_CPANPLUS_IS_RUNNING';
256 ok( $ENV{$name}, "Env var '$name' set" );
257 is( $ENV{$name}, $$, " Set to current process id" );
258 }
259
260 ### Version
261 { my $name = 'PERL5_CPANPLUS_IS_VERSION';
262 ok( $ENV{$name}, "Env var '$name' set" );
263
264 ### version.pm formats ->VERSION output... *sigh*
265 is( $ENV{$name}, $Class->VERSION,
266 " Set to current process version" );
267 }
268
269}
270
271__END__
272
273# Local variables:
274# c-indentation-style: bsd
275# c-basic-offset: 4
276# indent-tabs-mode: nil
277# End:
278# vim: expandtab shiftwidth=4:
279