1 ### make sure we can find our conf.pl file
4 require "$FindBin::Bin/inc/conf.pl";
8 use Test::More 'no_plan';
9 use File::Basename 'dirname';
13 use CPANPLUS::Internals::Constants;
15 my $conf = gimme_conf();
17 my $Class = 'CPANPLUS::Backend';
18 ### D::C has troubles with the 'use_ok' -- it finds the wrong paths.
19 ### for now, do a 'use' instead
20 #use_ok( $Class ) or diag "$Class not found";
21 use CPANPLUS::Backend;
23 my $cb = $Class->new( $conf );
24 isa_ok( $cb, $Class );
26 my $mt = $cb->module_tree;
27 my $at = $cb->author_tree;
28 ok( scalar keys %$mt, "Module tree has entries" );
29 ok( scalar keys %$at, "Author tree has entries" );
31 ### module_tree tests ###
32 my $Name = TEST_CONF_MODULE;
33 my $mod = $cb->module_tree($Name);
35 ### XXX SOURCEFILES FIX
36 { my @mods = $cb->module_tree($Name,$Name);
37 my $none = $cb->module_tree( TEST_CONF_INVALID_MODULE );
39 ok( IS_MODOBJ->(mod => $mod), "Module object found" );
40 is( scalar(@mods), 2, " Module list found" );
41 ok( IS_MODOBJ->(mod => $mods[0]), " ISA module object" );
42 ok( !IS_MODOBJ->(mod => $none), " Bogus module detected");
45 ### author_tree tests ###
46 { my @auths = $cb->author_tree( $mod->author->cpanid,
47 $mod->author->cpanid );
48 my $none = $cb->author_tree( 'fnurk' );
50 ok( IS_AUTHOBJ->(auth => $mod->author), "Author object found" );
51 is( scalar(@auths), 2, " Author list found" );
52 ok( IS_AUTHOBJ->( author => $auths[0] )," ISA author object" );
53 is( $mod->author, $auths[0], " Objects are identical" );
54 ok( !IS_AUTHOBJ->( author => $none ), " Bogus author detected" );
57 my $conf_obj = $cb->configure_object;
58 ok( IS_CONFOBJ->(conf => $conf_obj), "Configure object found" );
61 ### parse_module tests ###
64 $mod->author->cpanid, # author
65 $mod->package_name, # package name
66 $mod->version, # version
73 'Foo-Bar-EU-NOXS' => [
78 'Foo-Bar-EU-NOXS-0.01' => [
83 'EUNOXS/Foo-Bar-EU-NOXS' => [
88 'EUNOXS/Foo-Bar-EU-NOXS-0.01' => [
93 ### existing module, no extension given
94 ### this used to create a modobj with no package extension
95 'EUNOXS/Foo-Bar-0.02' => [
100 'Foo-Bar-EU-NOXS-0.09' => [
101 $mod->author->cpanid,
105 'MBXS/Foo-Bar-EU-NOXS-0.01' => [
110 'EUNOXS/Foo-Bar-EU-NOXS-0.09' => [
115 'EUNOXS/Foo-Bar-EU-NOXS-0.09.zip' => [
120 'FROO/Flub-Flob-1.1.zip' => [
125 'G/GO/GOYALI/SMS_API_3_01.tar.gz' => [
130 'E/EY/EYCK/Net/Lite/Net-Lite-FTP-0.091' => [
135 'EYCK/Net/Lite/Net-Lite-FTP-0.091' => [
140 'M/MA/MAXDB/DBD-MaxDB-7.5.0.24a' => [
145 'EUNOXS/perl5.005_03.tar.gz' => [
150 'FROO/Flub-Flub-v1.1.0.tbz' => [
155 'FROO/Flub-Flub-1.1_2.tbz' => [
160 'LDS/CGI.pm-3.27.tar.gz' => [
165 'FROO/Text-Tabs+Wrap-2006.1117.tar.gz' => [
170 'JETTERO/Crypt-PBC-0.7.20.0-0.4.9' => [
175 'GRICHTER/HTML-Embperl-1.2.1.tar.gz' => [
180 'KANE/File-Fetch-0.15_03' => [
185 'AUSCHUTZ/IO-Stty-.02.tar.gz' => [
192 while ( my($guess, $attr) = splice @map, 0, 2 ) {
193 my( $author, $pkg_name, $version ) = @$attr;
195 ok( $guess, "Attempting to parse $guess" );
197 my $obj = $cb->parse_module( module => $guess );
199 ok( $obj, " Result returned" );
200 ok( IS_MODOBJ->( mod => $obj ),
201 " parse_module success by '$guess'" );
203 is( $obj->version, $version,
204 " Proper version found: $version" );
205 is( $obj->package_version, $version,
206 " Found in package_version as well" );
207 is( $obj->package_name, $pkg_name,
208 " Proper package_name found: $pkg_name" );
209 unlike( $obj->package_name, qr/\d/,
210 " No digits in package name" );
211 { my $ext = $obj->package_extension;
212 ok( $ext, " Has extension as well: $ext" );
215 like( $obj->author->cpanid, "/$author/i",
216 " Proper author found: $author");
217 like( $obj->path, "/$author/i",
218 " Proper path found: " . $obj->path );
222 ### test for things that look like real modules, but aren't ###
225 [qr/does not contain an author/,"Missing author part detected"],
226 [qr/Cannot find .+? in the module tree/,"Unable to find module"]
229 [ qr/module string from reference/,"Unable to parse ref"]
233 for my $entry ( @map ) {
234 my($mod,$aref) = @$entry;
236 my $none = $cb->parse_module( module => $mod );
237 ok( !IS_MODOBJ->(mod => $none),
238 "Non-existant module detected" );
239 ok( !IS_FAKE_MODOBJ->(mod => $none),
240 "Non-existant fake module detected" );
242 my $str = CPANPLUS::Error->stack_as_string;
243 for my $pair (@$aref) {
244 my($re,$diag) = @$pair;
245 like( $str, $re," $diag" );
250 ### test parsing of arbitrary URI
251 for my $guess ( qw[ http://foo/bar.gz
252 http://a/b/c/d/e/f/g/h/i/j
255 my $obj = $cb->parse_module( module => $guess );
256 ok( IS_FAKE_MODOBJ->(mod => $obj),
257 "parse_module success by '$guess'" );
258 is( $obj->status->_fetch_from, $guess,
259 " Fetch from set ok" );
264 { my $method = 'readme';
265 my %args = ( modules => [$Name] );
267 my $rv = $cb->$method( %args );
268 ok( IS_RVOBJ->( $rv ), "Got an RV object" );
269 ok( $rv->ok, " Overall OK" );
270 cmp_ok( $rv, '==', 1, " Overload OK" );
271 is( $rv->function, $method, " Function stored OK" );
272 is_deeply( $rv->args, \%args, " Arguments stored OK" );
273 is( $rv->rv->{$Name}, $mod->readme, " RV as expected" );
276 ### reload_indices tests ###
278 my $file = File::Spec->catfile( $conf->get_conf('base'),
279 $conf->_get_source('mod'),
282 ok( $cb->reload_indices( update_source => 0 ), "Rebuilding trees" );
285 ### make sure we are 'newer' on faster machines with a sleep..
286 ### apparently Win32's FAT isn't granual enough on intervals
287 ### < 2 seconds, so it may give the same answer before and after
288 ### the sleep, causing the test to fail. so sleep atleast 2 seconds.
290 ok( $cb->reload_indices( update_source => 1 ),
291 "Rebuilding and refetching trees" );
292 cmp_ok( $age, '>', -M $file, " Source file '$file' updated" );
297 for my $cache( qw[methods hosts modules lib all] ) {
298 ok( $cb->flush($cache), "Cache $cache flushed ok" );
302 ### installed tests ###
303 { ok( scalar($cb->installed), "Found list of installed modules" );
306 ### autobudle tests ###
308 my $where = $cb->autobundle;
309 ok( $where, "Autobundle written" );
310 ok( -s $where, " File has size" );
313 ### local_mirror tests ###
314 { ### turn off md5 checks for the 'fake' packages we have
315 my $old_md5 = $conf->get_conf('md5');
316 $conf->set_conf( md5 => 0 );
318 ### otherwise 'status->fetch' might be undef! ###
319 my $rv = $cb->local_mirror( path => 'dummy-localmirror' );
320 ok( $rv, "Local mirror created" );
322 for my $mod ( values %{ $cb->module_tree } ) {
323 my $name = $mod->module;
325 my $cksum = File::Spec->catfile(
326 dirname($mod->status->fetch),
328 ok( -e $mod->status->fetch, " Module '$name' fetched" );
329 ok( -s _, " Module '$name' has size" );
330 ok( -e $cksum, " Checksum fetched for '$name'" );
331 ok( -s _, " Checksum for '$name' has size" );
334 $conf->set_conf( md5 => $old_md5 );
337 ### check ENV variable
339 { my $name = 'PERL5_CPANPLUS_IS_RUNNING';
340 ok( $ENV{$name}, "Env var '$name' set" );
341 is( $ENV{$name}, $$, " Set to current process id" );
345 { my $name = 'PERL5_CPANPLUS_IS_VERSION';
346 ok( $ENV{$name}, "Env var '$name' set" );
348 ### version.pm formats ->VERSION output... *sigh*
349 is( $ENV{$name}, $Class->VERSION,
350 " Set to current process version" );
358 # c-indentation-style: bsd
360 # indent-tabs-mode: nil
362 # vim: expandtab shiftwidth=4: