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