1 ### make sure we can find our conf.pl file
4 require "$FindBin::Bin/inc/conf.pl";
7 ### dummy class for testing dist api ###
10 package CPANPLUS::Dist::_Test;
12 use vars qw[$Available $Create $Install $Init $Prepare @ISA];
14 @ISA = qw[CPANPLUS::Dist];
21 require CPANPLUS::Dist;
22 CPANPLUS::Dist->_add_dist_types( __PACKAGE__ );
24 sub init { $_[0]->status->mk_accessors(
25 qw[prepared created installed
26 _prepare_args _install_args _create_args]);
28 sub format_available { return $Available }
29 sub prepare { return shift->status->prepared( $Prepare ) }
30 sub create { return shift->status->created( $Create ) }
31 sub install { return shift->status->installed( $Install ) }
36 use CPANPLUS::Configure;
37 use CPANPLUS::Backend;
38 use CPANPLUS::Internals::Constants;
40 use Test::More 'no_plan';
43 use File::Basename ();
45 use Module::Load::Conditional qw[check_install];
47 my $conf = gimme_conf();
48 my $cb = CPANPLUS::Backend->new( $conf );
51 #my $Format = '_test';
52 my $Module = 'CPANPLUS::Dist::_Test';
53 my $ModName = TEST_CONF_MODULE;
54 my $ModPrereq = TEST_CONF_INST_MODULE;
55 ### XXX this version doesn't exist, but we don't check for it either ###
56 my $Prereq = { $ModPrereq => '1000' };
58 ### since it's in this file, not in its own module file,
59 ### make M::L::C think it already was loaded
60 $Module::Load::Conditional::CACHE->{$Module}->{usable} = 1;
63 use_ok('CPANPLUS::Dist');
65 ### start with fresh sources ###
66 ok( $cb->reload_indices( update_source => 0 ),
69 my $Mod = $cb->module_tree( $ModName );
70 ok( $Mod, "Got module object" );
73 ### straight forward dist build - prepare, create, install
74 { my $dist = $Module->new( module => $Mod );
76 ok( $dist, "New dist object created" );
77 isa_ok( $dist, 'CPANPLUS::Dist' );
78 isa_ok( $dist, $Module );
80 my $status = $dist->status;
81 ok( $status, "Status object found" );
82 isa_ok( $status, "Object::Accessor" );
84 ok( $dist->prepare, "Prepare call" );
85 ok( $dist->status->prepared," Status registered OK" );
87 ok( $dist->create, "Create call" );
88 ok( $dist->status->created, " Status registered OK" );
90 ok( $dist->install, "Install call" );
91 ok( $dist->status->installed,
92 " Status registered OK" );
95 ### check 'sanity check' option ###
96 { local $CPANPLUS::Dist::_Test::Available = 0;
98 ok( !$Module->format_available,
99 "Format availability turned off" );
101 { $conf->_set_build('sanity_check' => 0);
103 my $dist = $Module->new( module => $Mod );
105 ok( $dist, "Dist created with sanity check off" );
106 isa_ok( $dist, $Module );
110 { $conf->_set_build('sanity_check' => 1);
112 my $dist = $Module->new( module => $Mod );
114 ok( !$dist, "Dist not created with sanity check on" );
115 like( CPANPLUS::Error->stack_as_string,
116 qr/Format '$Module' is not available/,
117 " Error recorded as expected" );
121 ### undef the status hash, make sure it complains ###
122 { local $CPANPLUS::Dist::_Test::Init = 0;
124 my $dist = $Module->new( module => $Mod );
126 ok( !$dist, "No dist created by failed init" );
127 like( CPANPLUS::Error->stack_as_string,
128 qr/Dist initialization of '$Module' failed for/s,
129 " Error recorded as expected" );
132 ### configure_requires tests
133 { my $meta = META->( $Mod );
134 ok( $meta, "Reading 'configure_requires' from '$meta'" );
136 my $clone = $Mod->clone;
137 ok( $clone, " Package cloned" );
139 ### set the new location to fetch from
140 $clone->package( $meta );
142 my $file = $clone->fetch;
143 ok( $file, " Meta file fetched" );
144 ok( -e $file, " File '$file' exits" );
146 my $dist = $Module->new( module => $Mod );
148 ok( $dist, " Dist object created" );
150 my $meth = 'find_configure_requires';
151 can_ok( $dist, $meth );
153 my $href = $dist->$meth( file => $file );
154 ok( $href, " '$meth' returned hashref" );
156 ok( scalar(keys(%$href)), " Contains entries" );
157 ok( $href->{ +TEST_CONF_PREREQ },
158 " Contains the right prereq" );
162 ### test _resolve prereqs, in a somewhat simulated set of circumstances
163 { my $old_prereq = $conf->get_conf('prereqs');
167 'Previous install failed' => [
168 sub { $cb->module_tree($ModPrereq)->status->installed(0);
170 sub { like( CPANPLUS::Error->stack_as_string,
171 qr/failed to install before in this session/s,
172 " Previous install failed recorded ok" ) },
175 "Set $Module->prepare to false" => [
176 sub { $CPANPLUS::Dist::_Test::Prepare = 0; 'install' },
177 sub { like( CPANPLUS::Error->stack_as_string,
178 qr/Unable to create a new distribution object/s,
179 " Dist creation failed recorded ok" ) },
180 sub { like( CPANPLUS::Error->stack_as_string,
181 qr/Failed to install '$ModPrereq' as prerequisite/s,
182 " Dist creation failed recorded ok" ) },
185 "Set $Module->create to false" => [
186 sub { $CPANPLUS::Dist::_Test::Create = 0; 'install' },
187 sub { like( CPANPLUS::Error->stack_as_string,
188 qr/Unable to create a new distribution object/s,
189 " Dist creation failed recorded ok" ) },
190 sub { like( CPANPLUS::Error->stack_as_string,
191 qr/Failed to install '$ModPrereq' as prerequisite/s,
192 " Dist creation failed recorded ok" ) },
195 "Set $Module->install to false" => [
196 sub { $CPANPLUS::Dist::_Test::Install = 0; 'install' },
197 sub { like( CPANPLUS::Error->stack_as_string,
198 qr/Failed to install '$ModPrereq' as/s,
199 " Dist installation failed recorded ok" ) },
204 sub { ok( !$_[0]->status->prepared,
205 " Module status says not prepared" ) },
206 sub { ok( !$_[0]->status->created,
207 " Module status says not created" ) },
208 sub { ok( !$_[0]->status->installed,
209 " Module status says not installed" ) },
211 'Ignore from conf' => [
212 sub { $conf->set_conf(prereqs => PREREQ_IGNORE); '' },
213 sub { ok( !$_[0]->status->prepared,
214 " Module status says not prepared" ) },
215 sub { ok( !$_[0]->status->created,
216 " Module status says not created" ) },
217 sub { ok( !$_[0]->status->installed,
218 " Module status says not installed" ) },
219 ### set the conf back ###
220 sub { $conf->set_conf(prereqs => PREREQ_INSTALL); },
222 'Perl binary version too low' => [
223 sub { $cb->module_tree( $ModName )
224 ->status->prereqs({ PERL_CORE, 10000000000 }); '' },
225 sub { like( CPANPLUS::Error->stack_as_string,
226 qr/needs perl version/,
227 " Perl version not high enough" ) },
233 sub { ok( $_[0]->status->prepared,
234 " Module status says prepared" ) },
235 sub { ok( $_[0]->status->created,
236 " Module status says created" ) },
237 sub { ok( !$_[0]->status->installed,
238 " Module status says not installed" ) },
240 'Simple install' => [
242 sub { ok( $_[0]->status->prepared,
243 " Module status says prepared" ) },
244 sub { ok( $_[0]->status->created,
245 " Module status says created" ) },
246 sub { ok( $_[0]->status->installed,
247 " Module status says installed" ) },
250 "Set dependency to be perl-core" => [
251 sub { $cb->module_tree( $ModPrereq )->package(
252 'perl-5.8.1.tar.gz' ); 'install' },
253 sub { like( CPANPLUS::Error->stack_as_string,
254 qr/Prerequisite '$ModPrereq' is perl-core/s,
255 " Dist installation failed recorded ok" ) },
258 'Install from conf' => [
259 sub { $conf->set_conf(prereqs => PREREQ_INSTALL); '' },
260 sub { ok( $_[0]->status->prepared,
261 " Module status says prepared" ) },
262 sub { ok( $_[0]->status->created,
263 " Module status says created" ) },
264 sub { ok( $_[0]->status->installed,
265 " Module status says installed" ) },
267 'Create from conf' => [
268 sub { $conf->set_conf(prereqs => PREREQ_BUILD); '' },
269 sub { ok( $_[0]->status->prepared,
270 " Module status says prepared" ) },
271 sub { ok( $_[0]->status->created,
272 " Module status says created" ) },
273 sub { ok( !$_[0]->status->installed,
274 " Module status says not installed" ) },
275 ### set the conf back ###
276 sub { $conf->set_conf(prereqs => PREREQ_INSTALL); },
280 sub { $cb->_register_callback(
281 name => 'install_prerequisite',
283 $conf->set_conf(prereqs => PREREQ_ASK); '' },
284 sub { ok( $_[0]->status->prepared,
285 " Module status says prepared" ) },
286 sub { ok( $_[0]->status->created,
287 " Module status says created" ) },
288 sub { ok( $_[0]->status->installed,
289 " Module status says installed" ) },
290 ### set the conf back ###
291 sub { $conf->set_conf(prereqs => PREREQ_INSTALL); },
295 'Ask from conf, but decline' => [
296 sub { $cb->_register_callback(
297 name => 'install_prerequisite',
299 $conf->set_conf( prereqs => PREREQ_ASK); '' },
300 sub { ok( !$_[0]->status->installed,
301 " Module status says not installed" ) },
302 sub { like( CPANPLUS::Error->stack_as_string,
303 qr/Will not install prerequisite '$ModPrereq' -- Note/,
304 " Install skipped, recorded ok" ) },
305 ### set the conf back ###
306 sub { $conf->set_conf(prereqs => PREREQ_INSTALL); },
309 "Set recursive dependency" => [
310 sub { $cb->_status->pending_prereqs({ $ModPrereq => 1 });
312 sub { like( CPANPLUS::Error->stack_as_string,
313 qr/Recursive dependency detected/,
314 " Recursive dependency recorded ok" ) },
316 'Perl binary version sufficient' => [
317 sub { $cb->module_tree( $ModName )
318 ->status->prereqs({ PERL_CORE, 1 }); '' },
319 sub { unlike( CPANPLUS::Error->stack_as_string,
320 qr/needs perl version/,
321 " Perl version sufficient" ) },
326 for my $bool ( sort keys %$map ) {
328 diag("Running ". ($bool?'success':'fail') . " tests") if @ARGV;
330 my $href = $map->{$bool};
331 while ( my($txt,$aref) = each %$href ) {
333 ### reset everything ###
334 ok( $cb->reload_indices( update_source => 0 ),
335 "Rebuilding trees" );
337 $CPANPLUS::Dist::_Test::Available = 1;
338 $CPANPLUS::Dist::_Test::Prepare = 1;
339 $CPANPLUS::Dist::_Test::Create = 1;
340 $CPANPLUS::Dist::_Test::Install = 1;
342 CPANPLUS::Error->flush;
343 $cb->_status->mk_flush;
345 ### get a new dist from Text::Bastardize ###
346 my $mod = $cb->module_tree( $ModName );
347 my $dist = $Module->new( module => $mod );
349 ### first sub returns target ###
350 my $sub = shift @$aref;
351 my $target = $sub->();
353 my $flag = $dist->_resolve_prereqs(
357 prereqs => ($mod->status->prereqs || $Prereq) );
359 is( !!$flag, !!$bool, $txt );
361 ### any extra tests ###
362 $_->($cb->module_tree($ModPrereq)) for @$aref;
369 ### prereq satisfied tests
374 2 => qr/have to resolve/,
377 my $mod = CPANPLUS::Module::Fake->new(
383 ok( $mod, "Fake module created" );
384 is( $mod->version, 1, " Version set correctly" );
386 my $dist = $Module->new( module => $Mod );
388 ok( $dist, "Dist object created" );
389 isa_ok( $dist, $Module );
392 ### scope it for the locals
393 { local $^W; # quell sub redefined warnings;
395 ### is_uptodate will need to return false for this test
396 local *CPANPLUS::Module::Fake::is_uptodate = sub { return };
397 local *CPANPLUS::Module::Fake::is_uptodate = sub { return };
398 CPANPLUS::Error->flush;
402 while( my($ver, $re) = each %$map ) {
404 my $rv = $dist->prereq_satisfied(
408 ok( 1, "Testing ver: $ver" );
409 is( $rv, undef, " Return value as expected" );
412 like( CPANPLUS::Error->stack_as_string, $re,
413 " Error as expected" );
416 CPANPLUS::Error->flush;
423 { can_ok( 'CPANPLUS::Dist', 'dist_types' );
426 skip "You do not have Module::Pluggable installed", 2
427 unless check_install( module => 'Module::Pluggable' );
429 my @types = CPANPLUS::Dist->dist_types;
430 ok( scalar(@types), " Dist types found" );
431 ok( grep( /_Test/, @types), " Found our _Test dist type" );
437 # c-indentation-style: bsd
439 # indent-tabs-mode: nil
441 # vim: expandtab shiftwidth=4: