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