blob: b551741eef69ee8998cf592943abec005ca9ab52 [file] [log] [blame]
### make sure we can find our conf.pl file
BEGIN {
use FindBin;
require "$FindBin::Bin/inc/conf.pl";
}
### dummy class for testing dist api ###
BEGIN {
package CPANPLUS::Dist::_Test;
use strict;
use vars qw[$Available $Create $Install $Init $Prepare @ISA];
@ISA = qw[CPANPLUS::Dist];
$Available = 1;
$Create = 1;
$Install = 1;
$Init = 1;
$Prepare = 1;
require CPANPLUS::Dist;
CPANPLUS::Dist->_add_dist_types( __PACKAGE__ );
sub init { $_[0]->status->mk_accessors(
qw[prepared created installed
_prepare_args _install_args _create_args]);
return $Init };
sub format_available { return $Available }
sub prepare { return shift->status->prepared( $Prepare ) }
sub create { return shift->status->created( $Create ) }
sub install { return shift->status->installed( $Install ) }
}
use strict;
use CPANPLUS::Configure;
use CPANPLUS::Backend;
use CPANPLUS::Internals::Constants;
use Test::More 'no_plan';
use Cwd;
use Data::Dumper;
use File::Basename ();
use File::Spec ();
use Module::Load::Conditional qw[check_install];
my $conf = gimme_conf();
my $cb = CPANPLUS::Backend->new( $conf );
### obsolete
#my $Format = '_test';
my $Module = 'CPANPLUS::Dist::_Test';
my $ModName = TEST_CONF_MODULE;
my $ModPrereq = TEST_CONF_INST_MODULE;
### XXX this version doesn't exist, but we don't check for it either ###
my $Prereq = { $ModPrereq => '1000' };
### since it's in this file, not in its own module file,
### make M::L::C think it already was loaded
$Module::Load::Conditional::CACHE->{$Module}->{usable} = 1;
use_ok('CPANPLUS::Dist');
### start with fresh sources ###
ok( $cb->reload_indices( update_source => 0 ),
"Rebuilding trees" );
my $Mod = $cb->module_tree( $ModName );
ok( $Mod, "Got module object" );
### straight forward dist build - prepare, create, install
{ my $dist = $Module->new( module => $Mod );
ok( $dist, "New dist object created" );
isa_ok( $dist, 'CPANPLUS::Dist' );
isa_ok( $dist, $Module );
my $status = $dist->status;
ok( $status, "Status object found" );
isa_ok( $status, "Object::Accessor" );
ok( $dist->prepare, "Prepare call" );
ok( $dist->status->prepared," Status registered OK" );
ok( $dist->create, "Create call" );
ok( $dist->status->created, " Status registered OK" );
ok( $dist->install, "Install call" );
ok( $dist->status->installed,
" Status registered OK" );
}
### check 'sanity check' option ###
{ local $CPANPLUS::Dist::_Test::Available = 0;
ok( !$Module->format_available,
"Format availability turned off" );
{ $conf->_set_build('sanity_check' => 0);
my $dist = $Module->new( module => $Mod );
ok( $dist, "Dist created with sanity check off" );
isa_ok( $dist, $Module );
}
{ $conf->_set_build('sanity_check' => 1);
my $dist = $Module->new( module => $Mod );
ok( !$dist, "Dist not created with sanity check on" );
like( CPANPLUS::Error->stack_as_string,
qr/Format '$Module' is not available/,
" Error recorded as expected" );
}
}
### undef the status hash, make sure it complains ###
{ local $CPANPLUS::Dist::_Test::Init = 0;
my $dist = $Module->new( module => $Mod );
ok( !$dist, "No dist created by failed init" );
like( CPANPLUS::Error->stack_as_string,
qr/Dist initialization of '$Module' failed for/s,
" Error recorded as expected" );
}
### configure_requires tests
{ my $meta = META->( $Mod );
ok( $meta, "Reading 'configure_requires' from '$meta'" );
my $clone = $Mod->clone;
ok( $clone, " Package cloned" );
### set the new location to fetch from
$clone->package( $meta );
my $file = $clone->fetch;
ok( $file, " Meta file fetched" );
ok( -e $file, " File '$file' exits" );
my $dist = $Module->new( module => $Mod );
ok( $dist, " Dist object created" );
my $meth = 'find_configure_requires';
can_ok( $dist, $meth );
my $href = $dist->$meth( file => $file );
ok( $href, " '$meth' returned hashref" );
ok( scalar(keys(%$href)), " Contains entries" );
ok( $href->{ +TEST_CONF_PREREQ },
" Contains the right prereq" );
}
### test _resolve prereqs, in a somewhat simulated set of circumstances
{ my $old_prereq = $conf->get_conf('prereqs');
my $map = {
0 => {
'Previous install failed' => [
sub { $cb->module_tree($ModPrereq)->status->installed(0);
'install' },
sub { like( CPANPLUS::Error->stack_as_string,
qr/failed to install before in this session/s,
" Previous install failed recorded ok" ) },
],
"Set $Module->prepare to false" => [
sub { $CPANPLUS::Dist::_Test::Prepare = 0; 'install' },
sub { like( CPANPLUS::Error->stack_as_string,
qr/Unable to create a new distribution object/s,
" Dist creation failed recorded ok" ) },
sub { like( CPANPLUS::Error->stack_as_string,
qr/Failed to install '$ModPrereq' as prerequisite/s,
" Dist creation failed recorded ok" ) },
],
"Set $Module->create to false" => [
sub { $CPANPLUS::Dist::_Test::Create = 0; 'install' },
sub { like( CPANPLUS::Error->stack_as_string,
qr/Unable to create a new distribution object/s,
" Dist creation failed recorded ok" ) },
sub { like( CPANPLUS::Error->stack_as_string,
qr/Failed to install '$ModPrereq' as prerequisite/s,
" Dist creation failed recorded ok" ) },
],
"Set $Module->install to false" => [
sub { $CPANPLUS::Dist::_Test::Install = 0; 'install' },
sub { like( CPANPLUS::Error->stack_as_string,
qr/Failed to install '$ModPrereq' as/s,
" Dist installation failed recorded ok" ) },
],
'Simple ignore' => [
sub { 'ignore' },
sub { ok( !$_[0]->status->prepared,
" Module status says not prepared" ) },
sub { ok( !$_[0]->status->created,
" Module status says not created" ) },
sub { ok( !$_[0]->status->installed,
" Module status says not installed" ) },
],
'Ignore from conf' => [
sub { $conf->set_conf(prereqs => PREREQ_IGNORE); '' },
sub { ok( !$_[0]->status->prepared,
" Module status says not prepared" ) },
sub { ok( !$_[0]->status->created,
" Module status says not created" ) },
sub { ok( !$_[0]->status->installed,
" Module status says not installed" ) },
### set the conf back ###
sub { $conf->set_conf(prereqs => PREREQ_INSTALL); },
],
'Perl binary version too low' => [
sub { $cb->module_tree( $ModName )
->status->prereqs({ PERL_CORE, 10000000000 }); '' },
sub { like( CPANPLUS::Error->stack_as_string,
qr/needs perl version/,
" Perl version not high enough" ) },
],
},
1 => {
'Simple create' => [
sub { 'create' },
sub { ok( $_[0]->status->prepared,
" Module status says prepared" ) },
sub { ok( $_[0]->status->created,
" Module status says created" ) },
sub { ok( !$_[0]->status->installed,
" Module status says not installed" ) },
],
'Simple install' => [
sub { 'install' },
sub { ok( $_[0]->status->prepared,
" Module status says prepared" ) },
sub { ok( $_[0]->status->created,
" Module status says created" ) },
sub { ok( $_[0]->status->installed,
" Module status says installed" ) },
],
"Set dependency to be perl-core" => [
sub { $cb->module_tree( $ModPrereq )->package(
'perl-5.8.1.tar.gz' ); 'install' },
sub { like( CPANPLUS::Error->stack_as_string,
qr/Prerequisite '$ModPrereq' is perl-core/s,
" Dist installation failed recorded ok" ) },
],
'Install from conf' => [
sub { $conf->set_conf(prereqs => PREREQ_INSTALL); '' },
sub { ok( $_[0]->status->prepared,
" Module status says prepared" ) },
sub { ok( $_[0]->status->created,
" Module status says created" ) },
sub { ok( $_[0]->status->installed,
" Module status says installed" ) },
],
'Create from conf' => [
sub { $conf->set_conf(prereqs => PREREQ_BUILD); '' },
sub { ok( $_[0]->status->prepared,
" Module status says prepared" ) },
sub { ok( $_[0]->status->created,
" Module status says created" ) },
sub { ok( !$_[0]->status->installed,
" Module status says not installed" ) },
### set the conf back ###
sub { $conf->set_conf(prereqs => PREREQ_INSTALL); },
],
'Ask from conf' => [
sub { $cb->_register_callback(
name => 'install_prerequisite',
code => sub {1} );
$conf->set_conf(prereqs => PREREQ_ASK); '' },
sub { ok( $_[0]->status->prepared,
" Module status says prepared" ) },
sub { ok( $_[0]->status->created,
" Module status says created" ) },
sub { ok( $_[0]->status->installed,
" Module status says installed" ) },
### set the conf back ###
sub { $conf->set_conf(prereqs => PREREQ_INSTALL); },
],
'Ask from conf, but decline' => [
sub { $cb->_register_callback(
name => 'install_prerequisite',
code => sub {0} );
$conf->set_conf( prereqs => PREREQ_ASK); '' },
sub { ok( !$_[0]->status->installed,
" Module status says not installed" ) },
sub { like( CPANPLUS::Error->stack_as_string,
qr/Will not install prerequisite '$ModPrereq' -- Note/,
" Install skipped, recorded ok" ) },
### set the conf back ###
sub { $conf->set_conf(prereqs => PREREQ_INSTALL); },
],
"Set recursive dependency" => [
sub { $cb->_status->pending_prereqs({ $ModPrereq => 1 });
'install' },
sub { like( CPANPLUS::Error->stack_as_string,
qr/Recursive dependency detected/,
" Recursive dependency recorded ok" ) },
],
'Perl binary version sufficient' => [
sub { $cb->module_tree( $ModName )
->status->prereqs({ PERL_CORE, 1 }); '' },
sub { unlike( CPANPLUS::Error->stack_as_string,
qr/needs perl version/,
" Perl version sufficient" ) },
],
},
};
for my $bool ( sort keys %$map ) {
diag("Running ". ($bool?'success':'fail') . " tests") if @ARGV;
my $href = $map->{$bool};
while ( my($txt,$aref) = each %$href ) {
### reset everything ###
ok( $cb->reload_indices( update_source => 0 ),
"Rebuilding trees" );
$CPANPLUS::Dist::_Test::Available = 1;
$CPANPLUS::Dist::_Test::Prepare = 1;
$CPANPLUS::Dist::_Test::Create = 1;
$CPANPLUS::Dist::_Test::Install = 1;
CPANPLUS::Error->flush;
$cb->_status->mk_flush;
### get a new dist from Text::Bastardize ###
my $mod = $cb->module_tree( $ModName );
my $dist = $Module->new( module => $mod );
### first sub returns target ###
my $sub = shift @$aref;
my $target = $sub->();
my $flag = $dist->_resolve_prereqs(
format => $Module,
force => 1,
target => $target,
prereqs => ($mod->status->prereqs || $Prereq) );
is( !!$flag, !!$bool, $txt );
### any extra tests ###
$_->($cb->module_tree($ModPrereq)) for @$aref;
}
}
}
### prereq satisfied tests
{ my $map = {
# version regex
0 => undef,
1 => undef,
2 => qr/have to resolve/,
};
my $mod = CPANPLUS::Module::Fake->new(
module => $$,
package => $$,
path => $$,
version => 1 );
ok( $mod, "Fake module created" );
is( $mod->version, 1, " Version set correctly" );
my $dist = $Module->new( module => $Mod );
ok( $dist, "Dist object created" );
isa_ok( $dist, $Module );
### scope it for the locals
{ local $^W; # quell sub redefined warnings;
### is_uptodate will need to return false for this test
local *CPANPLUS::Module::Fake::is_uptodate = sub { return };
local *CPANPLUS::Module::Fake::is_uptodate = sub { return };
CPANPLUS::Error->flush;
### it's satisfied
while( my($ver, $re) = each %$map ) {
my $rv = $dist->prereq_satisfied(
version => $ver,
modobj => $mod );
ok( 1, "Testing ver: $ver" );
is( $rv, undef, " Return value as expected" );
if( $re ) {
like( CPANPLUS::Error->stack_as_string, $re,
" Error as expected" );
}
CPANPLUS::Error->flush;
}
}
}
### dist_types tests
{ can_ok( 'CPANPLUS::Dist', 'dist_types' );
SKIP: {
skip "You do not have Module::Pluggable installed", 2
unless check_install( module => 'Module::Pluggable' );
my @types = CPANPLUS::Dist->dist_types;
ok( scalar(@types), " Dist types found" );
ok( grep( /_Test/, @types), " Found our _Test dist type" );
}
}
1;
# Local variables:
# c-indentation-style: bsd
# c-basic-offset: 4
# indent-tabs-mode: nil
# End:
# vim: expandtab shiftwidth=4: