1 ### make sure we can find our conf.pl file
4 require "$FindBin::Bin/inc/conf.pl";
8 use Test::More 'no_plan';
13 use CPANPLUS::Backend;
15 use CPANPLUS::Internals::Constants;
17 my $Conf = gimme_conf();
18 my $CB = CPANPLUS::Backend->new( $Conf );
19 my $Inst = INSTALLER_BUILD;
21 ### set the config so that we will ignore the build installer,
22 ### but prefer it anyway
23 { Module::Loaded::mark_as_loaded( $Inst );
24 CPANPLUS::Dist->_ignore_dist_types( $Inst );
25 $Conf->set_conf( prefer_makefile => 0 );
28 my $Mod = $CB->module_tree( 'Foo::Bar::MB::NOXS' );
30 ok( $Mod, "Module object retrieved" );
31 ok( not grep { $_ eq $Inst } CPANPLUS::Dist->dist_types,
32 " $Inst installer not returned" );
34 ### fetch the file first
35 { my $where = $Mod->fetch;
36 ok( -e $where, " Tarball '$where' exists" );
39 ### extract it, silence warnings/messages
40 { my $where = $Mod->extract;
41 ok( -e $where, " Tarball extracted to '$where'" );
44 ### check the installer type
45 { is( $Mod->status->installer_type, $Inst,
46 "Proper installer type found: $Inst" );
48 my $href = $Mod->status->configure_requires;
49 ok( scalar(keys(%$href)), " Dependencies recorded" );
51 ok( defined $href->{$Inst}, " Dependency on $Inst" );
53 my $err = CPANPLUS::Error->stack_as_string;
54 like( $err, qr/$Inst/, " Message mentions $Inst" );
55 like( $err, qr/prerequisites list/,
56 " Message mentions adding prerequisites" );
59 ### now run the test, it should trigger the installation of the installer
61 { no warnings 'redefine';
63 ### bootstrapping creates a call to $cb->module_tree('c::d::build')->install
64 ### we need to intercept that call
65 my $org_mt = CPANPLUS::Backend->can('module_tree');
66 local *CPANPLUS::Backend::module_tree = sub {
70 ### return a dummy object if this is the bootstrap call
71 return CPANPLUS::Test::Module->new if $mod eq $Inst;
73 ### otherwise do a regular call
74 return $org_mt->( $self, $mod, @_ );
77 ### bootstrap install call will abort the ->create() call, so catch
79 eval { $Mod->create( skiptest => 1) };
81 ok( $@, "Create call aborted at bootstrap phase" );
82 like( $@, qr/$Inst/, " Diagnostics confirmed" );
84 my $diag = CPANPLUS::Error->stack_as_string;
85 like( $diag, qr/This module requires.*$Inst/,
86 " Dependency on $Inst recorded" );
87 like( $diag, qr/Bootstrapping installer.*$Inst/,
88 " Bootstrap notice recorded" );
89 like( $diag, qr/Installer '$Inst' succesfully bootstrapped/,
90 " Successful bootstrap recorded" );
93 END { 1 while unlink output_file() }
95 ### place holder package to serve as a module object for C::D::Build
96 { package CPANPLUS::Test::Module;
97 sub new { return bless {} }
99 ### at load time we ignored C::D::Build. Reset the ignore here
100 ### so a 'rescan' after the 'install' picks up C::D::Build
101 CPANPLUS::Dist->_reset_dist_ignore;
106 ### test package for cpanplus::dist::build
107 { package CPANPLUS::Dist::Build;
108 use base 'CPANPLUS::Dist::Base';
110 ### shortcut out of the installation procedure
111 sub new { die __PACKAGE__ };
112 sub format_available { 1 }