add Module::Build 0.27_08
[p5sagit/p5-mst-13.2.git] / lib / Module / Build / t / runthrough.t
1 #!/usr/bin/perl -w
2
3 use strict;
4 use lib $ENV{PERL_CORE} ? '../lib/Module/Build/t/lib' : 't/lib';
5 use MBTest tests => 28;
6 use Module::Build;
7 use Module::Build::ConfigData;
8
9 my $have_yaml = Module::Build::ConfigData->feature('YAML_support');
10
11 #########################
12
13 use Cwd ();
14 my $cwd = Cwd::cwd;
15 my $tmp = File::Spec->catdir( $cwd, 't', '_tmp' );
16
17 use DistGen;
18 my $dist = DistGen->new( dir => $tmp );
19 $dist->remove_file( 't/basic.t' );
20 $dist->change_file( 'Build.PL', <<'---' );
21 use Module::Build;
22
23 my $build = new Module::Build(
24   module_name => 'Simple',
25   scripts     => [ 'script' ],
26   license     => 'perl',
27   requires    => { 'File::Spec' => 0 },
28 );
29 $build->create_build_script;
30 ---
31 $dist->add_file( 'script', <<'---' );
32 #!perl -w
33 print "Hello, World!\n";
34 ---
35 $dist->add_file( 'test.pl', <<'---' );
36 #!/usr/bin/perl
37
38 use Test;
39 plan tests => 2;
40
41 ok 1;
42
43 require Module::Build;
44 skip $ENV{PERL_CORE} && "no blib in core",
45   $INC{'Module/Build.pm'}, qr/blib/, 'Module::Build should be loaded from blib';
46
47 print "# Cwd: ", Module::Build->cwd, "\n";
48 print "# \@INC: (@INC)\n";
49 print "Done.\n";  # t/compat.t looks for this
50 ---
51 $dist->add_file( 'lib/Simple/Script.PL', <<'---' );
52 #!perl -w
53
54 my $filename = shift;
55 open FH, "> $filename" or die "Can't create $filename: $!";
56 print FH "Contents: $filename\n";
57 close FH;
58 ---
59 $dist->regen;
60
61 chdir( $dist->dirname ) or die "Can't chdir to '@{[$dist->dirname]}': $!";
62
63 #########################
64
65 use Module::Build;
66 ok(1);
67
68 SKIP: {
69   skip "no blib in core", 1 if $ENV{PERL_CORE};
70   like $INC{'Module/Build.pm'}, qr/\bblib\b/, "Make sure version from blib/ is loaded";
71 }
72
73 #########################
74
75 my $mb = Module::Build->new_from_context;
76 ok $mb;
77 is $mb->license, 'perl';
78
79 # Make sure cleanup files added before create_build_script() get respected
80 $mb->add_to_cleanup('before_script');
81
82 eval {$mb->create_build_script};
83 is $@, '';
84 ok -e $mb->build_script;
85
86 is $mb->dist_dir, 'Simple-0.01';
87
88 # The 'cleanup' file doesn't exist yet
89 ok grep {$_ eq 'before_script'} $mb->cleanup;
90
91 $mb->add_to_cleanup('save_out');
92
93 # The 'cleanup' file now exists
94 ok grep {$_ eq 'before_script'} $mb->cleanup;
95 ok grep {$_ eq 'save_out'     } $mb->cleanup;
96
97 {
98   # Make sure verbose=>1 works
99   my $all_ok = 1;
100   my $output = eval {
101     stdout_of( sub { $mb->dispatch('test', verbose => 1) } )
102   };
103   $all_ok &&= is($@, '');
104   $all_ok &&= like($output, qr/all tests successful/i);
105   
106   # This is the output of lib/Simple/Script.PL
107   $all_ok &&= ok(-e $mb->localize_file_path('lib/Simple/Script'));
108
109   unless ($all_ok) {
110     # We use diag() so Test::Harness doesn't get confused.
111     diag("vvvvvvvvvvvvvvvvvvvvv Simple/test.pl output vvvvvvvvvvvvvvvvvvvvv");
112     diag($output);
113     diag("^^^^^^^^^^^^^^^^^^^^^ Simple/test.pl output ^^^^^^^^^^^^^^^^^^^^^");
114   }
115 }
116
117 SKIP: {
118   skip( 'YAML_support feature is not enabled', 7 ) unless $have_yaml;
119
120   my $output = eval {
121     stdout_of( sub { $mb->dispatch('disttest') } )
122   };
123   is $@, '';
124   
125   # After a test, the distdir should contain a blib/ directory
126   ok -e File::Spec->catdir('Simple-0.01', 'blib');
127   
128   eval {$mb->dispatch('distdir')};
129   is $@, '';
130   
131   # The 'distdir' should contain a lib/ directory
132   ok -e File::Spec->catdir('Simple-0.01', 'lib');
133   
134   # The freshly run 'distdir' should never contain a blib/ directory, or
135   # else it could get into the tarball
136   ok ! -e File::Spec->catdir('Simple-0.01', 'blib');
137
138   # Make sure all of the above was done by the new version of Module::Build
139   my $fh = IO::File->new(File::Spec->catfile($dist->dirname, 'META.yml'));
140   my $contents = do {local $/; <$fh>};
141   $contents =~ /Module::Build version ([0-9_.]+)/m;
142   cmp_ok $1, '==', $mb->VERSION, "Check version used to create META.yml: $1 == " . $mb->VERSION;
143
144   SKIP: {
145     skip( "not sure if we can create a tarball on this platform", 1 )
146       unless $mb->check_installed_status('Archive::Tar', 0) ||
147              $mb->isa('Module::Build::Platform::Unix');
148
149     $mb->add_to_cleanup($mb->dist_dir . ".tar.gz");
150     eval {$mb->dispatch('dist')};
151     is $@, '';
152   }
153
154 }
155
156 {
157   # Make sure the 'script' file was recognized as a script.
158   my $scripts = $mb->script_files;
159   ok $scripts->{script};
160   
161   # Check that a shebang line is rewritten
162   my $blib_script = File::Spec->catdir( qw( blib script script ) );
163   ok -e $blib_script;
164   
165   my $fh = IO::File->new($blib_script);
166   my $first_line = <$fh>;
167   isnt $first_line, "#!perl -w\n", "should rewrite the shebang line";
168 }
169
170 {
171   # Check PPD
172   $mb->dispatch('ppd', args => {codebase => '/path/to/codebase'});
173
174   my $ppd = slurp('Simple.ppd');
175
176   # This test is quite a hack since with XML you don't really want to
177   # do a strict string comparison, but absent an XML parser it's the
178   # best we can do.
179   is $ppd, <<'EOF';
180 <SOFTPKG NAME="Simple" VERSION="0,01,0,0">
181     <TITLE>Simple</TITLE>
182     <ABSTRACT>Perl extension for blah blah blah</ABSTRACT>
183     <AUTHOR>A. U. Thor, a.u.thor@a.galaxy.far.far.away</AUTHOR>
184     <IMPLEMENTATION>
185         <DEPENDENCY NAME="File-Spec" VERSION="0,0,0,0" />
186         <CODEBASE HREF="/path/to/codebase" />
187     </IMPLEMENTATION>
188 </SOFTPKG>
189 EOF
190 }
191
192
193 eval {$mb->dispatch('realclean')};
194 is $@, '';
195
196 ok ! -e $mb->build_script;
197 ok ! -e $mb->config_dir;
198 ok ! -e $mb->dist_dir;
199
200
201 # cleanup
202 chdir( $cwd ) or die "Can''t chdir to '$cwd': $!";
203 $dist->remove;
204
205 use File::Path;
206 rmtree( $tmp );