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 it's 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 = CPANPLUS::Dist->new(
79 ok( $dist, "New dist object created" );
80 isa_ok( $dist, 'CPANPLUS::Dist' );
81 isa_ok( $dist, $Module );
83 my $status = $dist->status;
84 ok( $status, "Status object found" );
85 isa_ok( $status, "Object::Accessor" );
87 ok( $dist->prepare, "Prepare call" );
88 ok( $dist->status->prepared," Status registered OK" );
90 ok( $dist->create, "Create call" );
91 ok( $dist->status->created, " Status registered OK" );
93 ok( $dist->install, "Install call" );
94 ok( $dist->status->installed,
95 " Status registered OK" );
98 ### check 'sanity check' option ###
99 { local $CPANPLUS::Dist::_Test::Available = 0;
101 ok( !$Module->format_available,
102 "Format availabillity turned off" );
104 { $conf->_set_build('sanity_check' => 0);
106 my $dist = CPANPLUS::Dist->new(
111 ok( $dist, "Dist created with sanity check off" );
112 isa_ok( $dist, $Module );
116 { $conf->_set_build('sanity_check' => 1);
117 my $dist = CPANPLUS::Dist->new(
122 ok( !$dist, "Dist not created with sanity check on" );
123 like( CPANPLUS::Error->stack_as_string,
124 qr/Format '$Module' is not available/,
125 " Error recorded as expected" );
129 ### undef the status hash, make sure it complains ###
130 { local $CPANPLUS::Dist::_Test::Init = 0;
132 my $dist = CPANPLUS::Dist->new(
137 ok( !$dist, "No dist created by failed init" );
138 like( CPANPLUS::Error->stack_as_string,
139 qr/Dist initialization of '$Module' failed for/s,
140 " Error recorded as expected" );
143 ### test _resolve prereqs, in a somewhat simulated set of circumstances
144 { my $old_prereq = $conf->get_conf('prereqs');
148 'Previous install failed' => [
149 sub { $cb->module_tree($ModPrereq)->status->installed(0);
151 sub { like( CPANPLUS::Error->stack_as_string,
152 qr/failed to install before in this session/s,
153 " Previous install failed recorded ok" ) },
156 "Set $Module->prepare to false" => [
157 sub { $CPANPLUS::Dist::_Test::Prepare = 0; 'install' },
158 sub { like( CPANPLUS::Error->stack_as_string,
159 qr/Unable to create a new distribution object/s,
160 " Dist creation failed recorded ok" ) },
161 sub { like( CPANPLUS::Error->stack_as_string,
162 qr/Failed to install '$ModPrereq' as prerequisite/s,
163 " Dist creation failed recorded ok" ) },
166 "Set $Module->create to false" => [
167 sub { $CPANPLUS::Dist::_Test::Create = 0; 'install' },
168 sub { like( CPANPLUS::Error->stack_as_string,
169 qr/Unable to create a new distribution object/s,
170 " Dist creation failed recorded ok" ) },
171 sub { like( CPANPLUS::Error->stack_as_string,
172 qr/Failed to install '$ModPrereq' as prerequisite/s,
173 " Dist creation failed recorded ok" ) },
176 "Set $Module->install to false" => [
177 sub { $CPANPLUS::Dist::_Test::Install = 0; 'install' },
178 sub { like( CPANPLUS::Error->stack_as_string,
179 qr/Failed to install '$ModPrereq' as/s,
180 " Dist installation failed recorded ok" ) },
183 "Set dependency to be perl-core" => [
184 sub { $cb->module_tree( $ModPrereq )->package(
185 'perl-5.8.1.tar.gz' ); 'install' },
186 sub { like( CPANPLUS::Error->stack_as_string,
187 qr/Prerequisite '$ModPrereq' is perl-core/s,
188 " Dist installation failed recorded ok" ) },
192 sub { ok( !$_[0]->status->prepared,
193 " Module status says not prepared" ) },
194 sub { ok( !$_[0]->status->created,
195 " Module status says not created" ) },
196 sub { ok( !$_[0]->status->installed,
197 " Module status says not installed" ) },
199 'Ignore from conf' => [
200 sub { $conf->set_conf(prereqs => PREREQ_IGNORE); '' },
201 sub { ok( !$_[0]->status->prepared,
202 " Module status says not prepared" ) },
203 sub { ok( !$_[0]->status->created,
204 " Module status says not created" ) },
205 sub { ok( !$_[0]->status->installed,
206 " Module status says not installed" ) },
207 ### set the conf back ###
208 sub { $conf->set_conf(prereqs => PREREQ_INSTALL); },
214 sub { ok( $_[0]->status->prepared,
215 " Module status says prepared" ) },
216 sub { ok( $_[0]->status->created,
217 " Module status says created" ) },
218 sub { ok( !$_[0]->status->installed,
219 " Module status says not installed" ) },
221 'Simple install' => [
223 sub { ok( $_[0]->status->prepared,
224 " Module status says prepared" ) },
225 sub { ok( $_[0]->status->created,
226 " Module status says created" ) },
227 sub { ok( $_[0]->status->installed,
228 " Module status says installed" ) },
231 'Install from conf' => [
232 sub { $conf->set_conf(prereqs => PREREQ_INSTALL); '' },
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 installed" ) },
240 'Create from conf' => [
241 sub { $conf->set_conf(prereqs => PREREQ_BUILD); '' },
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 not installed" ) },
248 ### set the conf back ###
249 sub { $conf->set_conf(prereqs => PREREQ_INSTALL); },
253 sub { $cb->_register_callback(
254 name => 'install_prerequisite',
256 $conf->set_conf(prereqs => PREREQ_ASK); '' },
257 sub { ok( $_[0]->status->prepared,
258 " Module status says prepared" ) },
259 sub { ok( $_[0]->status->created,
260 " Module status says created" ) },
261 sub { ok( $_[0]->status->installed,
262 " Module status says installed" ) },
263 ### set the conf back ###
264 sub { $conf->set_conf(prereqs => PREREQ_INSTALL); },
268 'Ask from conf, but decline' => [
269 sub { $cb->_register_callback(
270 name => 'install_prerequisite',
272 $conf->set_conf( prereqs => PREREQ_ASK); '' },
273 sub { ok( !$_[0]->status->installed,
274 " Module status says not installed" ) },
275 sub { like( CPANPLUS::Error->stack_as_string,
276 qr/Will not install prerequisite '$ModPrereq' -- Note/,
277 " Install skipped, recorded ok" ) },
278 ### set the conf back ###
279 sub { $conf->set_conf(prereqs => PREREQ_INSTALL); },
282 "Set recursive dependency" => [
283 sub { $cb->_status->pending_prereqs({ $ModPrereq => 1 });
285 sub { like( CPANPLUS::Error->stack_as_string,
286 qr/Recursive dependency detected/,
287 " Recursive dependency recorded ok" ) },
293 for my $bool ( sort keys %$map ) {
295 diag("Running ". ($bool?'success':'fail') . " tests") if @ARGV;
297 my $href = $map->{$bool};
298 while ( my($txt,$aref) = each %$href ) {
300 ### reset everything ###
301 ok( $cb->reload_indices( update_source => 0 ),
302 "Rebuilding trees" );
304 $CPANPLUS::Dist::_Test::Available = 1;
305 $CPANPLUS::Dist::_Test::Prepare = 1;
306 $CPANPLUS::Dist::_Test::Create = 1;
307 $CPANPLUS::Dist::_Test::Install = 1;
309 CPANPLUS::Error->flush;
310 $cb->_status->mk_flush;
312 ### get a new dist from Text::Bastardize ###
313 my $dist = CPANPLUS::Dist->new(
315 module => $cb->module_tree( $ModName ),
318 ### first sub returns target ###
319 my $sub = shift @$aref;
320 my $target = $sub->();
322 my $flag = $dist->_resolve_prereqs(
326 prereqs => $Prereq );
328 is( !!$flag, !!$bool, $txt );
330 ### any extra tests ###
331 $_->($cb->module_tree($ModPrereq)) for @$aref;
338 ### prereq satisfied tests
343 2 => qr/have to resolve/,
346 my $mod = CPANPLUS::Module::Fake->new(
352 ok( $mod, "Fake module created" );
353 is( $mod->version, 1, " Version set correctly" );
355 my $dist = CPANPLUS::Dist->new(
360 ok( $dist, "Dist object created" );
361 isa_ok( $dist, $Module );
364 ### scope it for the locals
365 { local $^W; # quell sub redefined warnings;
367 ### is_uptodate will need to return false for this test
368 local *CPANPLUS::Module::Fake::is_uptodate = sub { return };
369 local *CPANPLUS::Module::Fake::is_uptodate = sub { return };
370 CPANPLUS::Error->flush;
374 while( my($ver, $re) = each %$map ) {
376 my $rv = $dist->prereq_satisfied(
380 ok( 1, "Testing ver: $ver" );
381 is( $rv, undef, " Return value as expected" );
384 like( CPANPLUS::Error->stack_as_string, $re,
385 " Error as expected" );
388 CPANPLUS::Error->flush;
395 { can_ok( 'CPANPLUS::Dist', 'dist_types' );
398 skip "You do not have Module::Pluggable installed", 2
399 unless check_install( module => 'Module::Pluggable' );
401 my @types = CPANPLUS::Dist->dist_types;
402 ok( scalar(@types), " Dist types found" );
403 ok( grep( /_Test/, @types), " Found our _Test dist type" );
409 # c-indentation-style: bsd
411 # indent-tabs-mode: nil
413 # vim: expandtab shiftwidth=4: