### make sure we can find our conf.pl file BEGIN { use FindBin; require "$FindBin::Bin/inc/conf.pl"; } use strict; use CPANPLUS::Configure; use CPANPLUS::Backend; use CPANPLUS::Module::Fake; use CPANPLUS::Module::Author::Fake; use CPANPLUS::Internals::Constants; use Test::More 'no_plan'; use Data::Dumper; use File::Spec; use File::Path (); my $Conf = gimme_conf(); my $CB = CPANPLUS::Backend->new( $Conf ); ### start with fresh sources ### ok( $CB->reload_indices( update_source => 0 ), "Rebuilding trees" ); my $AuthName = TEST_CONF_AUTHOR; my $Auth = $CB->author_tree( $AuthName ); my $ModName = TEST_CONF_MODULE; my $Mod = $CB->module_tree( $ModName ); my $CoreName = TEST_CONF_PREREQ; my $CoreMod = $CB->module_tree( $CoreName ); isa_ok( $Auth, 'CPANPLUS::Module::Author' ); isa_ok( $Mod, 'CPANPLUS::Module' ); isa_ok( $CoreMod, 'CPANPLUS::Module' ); ### author accessors ### is( $Auth->author, 'ExtUtils::MakeMaker No XS Code', "Author name: " . $Auth->author ); is( $Auth->cpanid, $AuthName, "Author CPANID: " . $Auth->cpanid ); is( $Auth->email, DEFAULT_EMAIL,"Author email: " . $Auth->email ); isa_ok( $Auth->parent, 'CPANPLUS::Backend' ); ### module accessors ### { my %map = ( ### method ### result module => $ModName, name => $ModName, comment => undef, package => 'Foo-Bar-0.01.tar.gz', path => 'authors/id/EUNOXS', version => '0.01', dslip => 'cdpO ', description => 'CPANPLUS Test Package', mtime => '', author => $Auth, ); my @acc = $Mod->accessors; ok( scalar(@acc), "Retrieved module accessors" ); ### remove private accessors is_deeply( [ sort keys %map ], [ sort grep { $_ !~ /^_/ } @acc ], " About to test all accessors" ); ### check all the accessors while( my($meth,$res) = each %map ) { is( $Mod->$meth, $res, " Mod->$meth: " . ($res || '') ); } ### check accessor objects ### isa_ok( $Mod->parent, 'CPANPLUS::Backend' ); isa_ok( $Mod->author, 'CPANPLUS::Module::Author' ); is( $Mod->author->author, $Auth->author, "Module eq Author" ); } ### convenience methods ### { ok( 1, "Convenience functions" ); is( $Mod->package_name, 'Foo-Bar', " Package name"); is( $Mod->package_version, '0.01', " Package version"); is( $Mod->package_extension, 'tar.gz', " Package extension"); ok( !$Mod->package_is_perl_core, " Package not core"); ok( !$Mod->module_is_supplied_with_perl_core, " Module not core" ); ok( !$Mod->is_bundle, " Package not bundle"); } ### clone & status tests { my $clone = $Mod->clone; ok( $clone, "Module cloned" ); isa_ok( $clone, 'CPANPLUS::Module' ); for my $acc ( $Mod->accessors ) { is( $clone->$acc, $Mod->$acc, " Clone->$acc matches Mod->$acc " ); } ### XXX whitebox test ok( !$clone->_status, "Status object empty on start" ); my $status = $clone->status; ok( $status, " Status object defined after query" ); is( $status, $clone->_status, " Object stored as expected" ); isa_ok( $status, 'Object::Accessor' ); } { ### extract + error test ### ok( !$Mod->extract(), "Cannot extract unfetched file" ); like( CPANPLUS::Error->stack_as_string, qr/You have not fetched/, " Error properly logged" ); } { ### fetch tests ### ### enable signature checks for checksums ### my $old = $Conf->get_conf('signature'); $Conf->set_conf(signature => 1); my $where = $Mod->fetch( force => 1 ); ok( $where, "Module fetched" ); ok( -f $where, " Module is a file" ); ok( -s $where, " Module has size" ); $Conf->set_conf( signature => $old ); } { ### extract tests ### my $dir = $Mod->extract( force => 1 ); ok( $dir, "Module extracted" ); ok( -d $dir, " Dir exsits" ); } { ### readme tests ### my $readme = $Mod->readme; ok( length $readme, "Readme found" ); is( $readme, $Mod->status->readme, " Readme stored in module object" ); } { ### checksums tests ### SKIP: { skip(q[You chose not to enable checksum verification], 5) unless $Conf->get_conf('md5'); my $cksum_file = $Mod->checksums; ok( $cksum_file, "Checksum file found" ); is( $cksum_file, $Mod->status->checksums, " File stored in module object" ); ok( -e $cksum_file, " File exists" ); ok( -s $cksum_file, " File has size" ); ### XXX test checksum_value if there's digest::md5 + config wants it ok( $Mod->status->checksum_ok, " Checksum is ok" ); ### check ttl code for checksums; fetching it now means the cache ### should kick in { CPANPLUS::Error->flush; ok( $Mod->checksums, " Checksums re-fetched" ); like( CPANPLUS::Error->stack_as_string, qr/Using cached file/, " Cached file used" ); } } } { ### installer type tests ### my $installer = $Mod->get_installer_type; ok( $installer, "Installer found" ); is( $installer, INSTALLER_MM, " Proper installer found" ); } { ### check signature tests ### SKIP: { skip(q[You chose not to enable signature checks], 1) unless $Conf->get_conf('signature'); ok( $Mod->check_signature, "Signature check OK" ); } } ### dslip & related { my $dslip = $Mod->dslip; ok( $dslip, "Got dslip information from $ModName ($dslip)" ); ### now find it for a submodule { my $submod = $CB->module_tree( TEST_CONF_MODULE_SUB ); ok( $submod, " Found submodule " . $submod->name ); ok( $submod->dslip, " Got dslip info (".$submod->dslip.")" ); is( $submod->dslip, $dslip, " It's identical to $ModName" ); } } { ### details() test ### my $href = { 'Support Level' => 'Developer', 'Package' => $Mod->package, 'Description' => $Mod->description, 'Development Stage' => 'under construction but pre-alpha (not yet released)', 'Author' => sprintf("%s (%s)", $Auth->author, $Auth->email), 'Version on CPAN' => $Mod->version, 'Language Used' => 'Perl-only, no compiler needed, should be platform independent', 'Interface Style' => 'Object oriented using blessed references and/or inheritance', 'Public License' => 'Unknown', ### XXX we can't really know what you have installed ### #'Version Installed' => '0.06', }; my $res = $Mod->details; ### delete they key of which we don't know the value ### delete $res->{'Version Installed'}; is_deeply( $res, $href, "Details OK" ); } { ### contians() test ### ### XXX ->contains works based on package name. in our sourcefiles ### we use 4x the same package name for different modules. So use ### the only unique package name here, which is the one for the core mod my @list = $CoreMod->contains; ok( scalar(@list), "Found modules contained in this one" ); is_deeply( \@list, [$CoreMod], " Found all modules expected" ); } { ### testing distributions() ### my @mdists = $Mod->distributions; is( scalar @mdists, 1, "Distributions found via module" ); my @adists = $Auth->distributions; is( scalar @adists, 3, "Distributions found via author" ); } { ### test status->flush ### ok( $Mod->status->mk_flush, "Status flushed" ); ok(!$Mod->status->fetch," Fetch status empty" ); ok(!$Mod->status->extract, " Extract status empty" ); ok(!$Mod->status->checksums, " Checksums status empty" ); ok(!$Mod->status->readme, " Readme status empty" ); } { ### testing bundles ### my $bundle = $CB->module_tree('Bundle::Foo::Bar'); isa_ok( $bundle, 'CPANPLUS::Module' ); ok( $bundle->is_bundle, " It's a Bundle:: module" ); ok( $bundle->fetch, " Fetched the bundle" ); ok( $bundle->extract, " Extracted the bundle" ); my @objs = $bundle->bundle_modules; is( scalar(@objs), 5, " Found all prerequisites" ); for( @objs ) { isa_ok( $_, 'CPANPLUS::Module', " Prereq " . $_->module ); ok( defined $bundle->status->prereqs->{$_->module}, " Prereq was registered" ); } } { ### testing autobundles my $file = File::Spec->catfile( dummy_cpan_dir(), $Conf->_get_build('autobundle'), 'Snapshot.pm' ); my $uri = $CB->_host_to_uri( scheme => 'file', path => $file ); my $bundle = $CB->parse_module( module => $uri ); ok( -e $file, "Creating bundle from '$file'" ); ok( $bundle, " Object created" ); isa_ok( $bundle, 'CPANPLUS::Module', " Object" ); ok( $bundle->is_bundle, " Recognized as bundle" ); ok( $bundle->is_autobundle, " Recognized as autobundle" ); my $type = $bundle->get_installer_type; ok( $type, " Found installer type" ); is( $type, INSTALLER_AUTOBUNDLE, " Installer type is $type" ); my $where = $bundle->fetch; ok( $where, " Autobundle fetched" ); ok( -e $where, " File exists" ); my @list = $bundle->bundle_modules; ok( scalar(@list), " Prereqs found" ); is( scalar(@list), 1, " Right number of prereqs" ); isa_ok( $list[0], 'CPANPLUS::Module', " Object" ); ### skiptests to make sure we don't get any test header mismatches my $rv = $bundle->create( prereq_target => 'create', skiptest => 1 ); ok( $rv, " Tested prereqs" ); } ### test module from perl core ### { isa_ok( $CoreMod, 'CPANPLUS::Module', "Core module " . $CoreName ); ok( $CoreMod->package_is_perl_core, " Package found in perl core" ); ### check if it's core with 5.6.1 { local $] = '5.006001'; ok( $CoreMod->module_is_supplied_with_perl_core, " Module also found in perl core"); } ok( !$CoreMod->install, " Package not installed" ); like( CPANPLUS::Error->stack_as_string, qr/core Perl/, " Error properly logged" ); } ### test third-party modules SKIP: { skip "Module::ThirdParty not installed", 10 unless eval { require Module::ThirdParty; 1 }; ok( !$Mod->is_third_party, "Not a 3rd party module: ". $Mod->name ); my $fake = $CB->parse_module( module => 'LOCAL/SVN-Core-1.0' ); ok( $fake, "Created module object for ". $fake->name ); ok( $fake->is_third_party, " It is a 3rd party module" ); my $info = $fake->third_party_information; ok( $info, "Got 3rd party package information" ); isa_ok( $info, 'HASH' ); for my $item ( qw[name url author author_url] ) { ok( length($info->{$item}), " $item field is filled" ); } } ### testing EU::Installed methods in Dist::MM tests ### # Local variables: # c-indentation-style: bsd # c-basic-offset: 4 # indent-tabs-mode: nil # End: # vim: expandtab shiftwidth=4: