xref: /openbsd-src/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/Installed.t (revision eac174f2741a08d8deb8aae59a7f778ef9b5d770)
1b8851fccSafresh1#!/usr/bin/perl -w
2*eac174f2Safresh1use strict;
3*eac174f2Safresh1
4*eac174f2Safresh1# Test ExtUtils::Installed
5b8851fccSafresh1
6b8851fccSafresh1BEGIN {
7*eac174f2Safresh1    # For backwards compatibility, use bundled version of Test::More
8b8851fccSafresh1    unshift @INC, 't/lib/';
9b8851fccSafresh1}
10b8851fccSafresh1
11b8851fccSafresh1my $Is_VMS = $^O eq 'VMS';
12b8851fccSafresh1
13b8851fccSafresh1
14b8851fccSafresh1use Config;
15b8851fccSafresh1use Cwd;
16b8851fccSafresh1use File::Path;
17b8851fccSafresh1use File::Basename;
18b8851fccSafresh1use File::Spec;
19*eac174f2Safresh1use File::Temp qw[tempdir];
20b8851fccSafresh1
21*eac174f2Safresh1use Test::More tests => 76;
22b8851fccSafresh1
23b8851fccSafresh1BEGIN { use_ok( 'ExtUtils::Installed' ) }
24b8851fccSafresh1
25b8851fccSafresh1my $mandirs =  !!$Config{man1direxp} + !!$Config{man3direxp};
26b8851fccSafresh1
27b8851fccSafresh1# saves having to qualify package name for class methods
28b8851fccSafresh1my $ei = bless( {}, 'ExtUtils::Installed' );
29b8851fccSafresh1
30b8851fccSafresh1# Make sure meta info is available
31b8851fccSafresh1$ei->{':private:'}{Config} = \%Config;
32b8851fccSafresh1$ei->{':private:'}{INC} = \@INC;
33b8851fccSafresh1
34b8851fccSafresh1# _is_prefix
35b8851fccSafresh1ok( $ei->_is_prefix('foo/bar', 'foo'),
36b8851fccSafresh1        '_is_prefix() should match valid path prefix' );
37b8851fccSafresh1ok( !$ei->_is_prefix('\foo\bar', '\bar'),
38b8851fccSafresh1        '... should not match wrong prefix' );
39*eac174f2Safresh1ok( ! defined $ei->_is_prefix( undef, 'foo' ),
40*eac174f2Safresh1    '_is_prefix() needs two defined arguments' );
41*eac174f2Safresh1ok( ! defined $ei->_is_prefix( 'foo/bar', undef ),
42*eac174f2Safresh1    '_is_prefix() needs two defined arguments' );
43b8851fccSafresh1
44b8851fccSafresh1# _is_type
45b8851fccSafresh1ok( $ei->_is_type(0, 'all'), '_is_type() should be true for type of "all"' );
46b8851fccSafresh1
47b8851fccSafresh1foreach my $path (qw( man1dir man3dir )) {
48b8851fccSafresh1    SKIP: {
49b8851fccSafresh1        my $dir = File::Spec->canonpath($Config{$path.'exp'});
50b8851fccSafresh1        skip("no man directory $path on this system", 2 ) unless $dir;
51b8851fccSafresh1
52b8851fccSafresh1        my $file = $dir . '/foo';
53b8851fccSafresh1        ok( $ei->_is_type($file, 'doc'),   "... should find doc file in $path" );
54b8851fccSafresh1        ok( !$ei->_is_type($file, 'prog'), "... but not prog file in $path" );
55b8851fccSafresh1    }
56b8851fccSafresh1}
57b8851fccSafresh1
58b8851fccSafresh1# VMS 5.6.1 doesn't seem to have $Config{prefixexp}
59b8851fccSafresh1my $prefix = $Config{prefix} || $Config{prefixexp};
60b8851fccSafresh1
61b8851fccSafresh1# You can concatenate /foo but not foo:, which defaults in the current
62b8851fccSafresh1# directory
63b8851fccSafresh1$prefix = VMS::Filespec::unixify($prefix) if $Is_VMS;
64b8851fccSafresh1
65b8851fccSafresh1# ActivePerl 5.6.1/631 has $Config{prefixexp} as 'p:' for some reason
66b8851fccSafresh1$prefix = $Config{prefix} if $prefix eq 'p:' && $^O eq 'MSWin32';
67b8851fccSafresh1
68b8851fccSafresh1ok( $ei->_is_type( File::Spec->catfile($prefix, 'bar'), 'prog'),
69b8851fccSafresh1        "... should find prog file under $prefix" );
70b8851fccSafresh1
71b8851fccSafresh1SKIP: {
72b8851fccSafresh1    skip('no man directories on this system', 1) unless $mandirs;
73b8851fccSafresh1    is( $ei->_is_type('bar', 'doc'), 0,
74b8851fccSafresh1        '... should not find doc file outside path' );
75b8851fccSafresh1}
76b8851fccSafresh1
77b8851fccSafresh1ok( !$ei->_is_type('bar', 'prog'),
78b8851fccSafresh1        '... nor prog file outside path' );
79b8851fccSafresh1ok( !$ei->_is_type('whocares', 'someother'), '... nor other type anywhere' );
80b8851fccSafresh1
81b8851fccSafresh1# _is_under
82b8851fccSafresh1ok( $ei->_is_under('foo'), '_is_under() should return true with no dirs' );
83b8851fccSafresh1
84b8851fccSafresh1my @under = qw( boo bar baz );
85b8851fccSafresh1ok( !$ei->_is_under('foo', @under), '... should find no file not under dirs');
86b8851fccSafresh1ok( $ei->_is_under('baz', @under),  '... should find file under dir' );
87b8851fccSafresh1
88*eac174f2Safresh1my $startdir = cwd();
89*eac174f2Safresh1END { ok(chdir $startdir, "Return to where we started"); }
90b8851fccSafresh1
91*eac174f2Safresh1{
92*eac174f2Safresh1    my $tmpdir = tempdir( CLEANUP => 1 );
93*eac174f2Safresh1    chdir $tmpdir;
94b8851fccSafresh1
95*eac174f2Safresh1    my $fakedir = 'FakeMod';
96*eac174f2Safresh1    my $fakepath = File::Spec->catdir('auto', $fakedir);
97*eac174f2Safresh1    ok( mkpath($fakepath), "Able to create directory $fakepath for testing" );
98*eac174f2Safresh1
99*eac174f2Safresh1    ok(open(PACKLIST, '>', File::Spec->catfile($fakepath, '.packlist')),
100*eac174f2Safresh1        "Able to open .packlist for writing");
101b8851fccSafresh1    print PACKLIST 'list';
102b8851fccSafresh1    close PACKLIST;
103b8851fccSafresh1
104*eac174f2Safresh1    ok(open(FAKEMOD, '>', File::Spec->catfile($fakepath, 'FakeMod.pm')),
105*eac174f2Safresh1        "Able to open FakeMod.pm for writing");
106b8851fccSafresh1
107b8851fccSafresh1    print FAKEMOD <<'FAKE';
108b8851fccSafresh1package FakeMod;
109*eac174f2Safresh1our $VERSION = '1.1.1';
110b8851fccSafresh11;
111b8851fccSafresh1FAKE
112b8851fccSafresh1
113b8851fccSafresh1    close FAKEMOD;
114b8851fccSafresh1
115*eac174f2Safresh1    my $fake_mod_dir = File::Spec->catdir(cwd(), $fakepath);
116b8851fccSafresh1    {
117b8851fccSafresh1        # avoid warning and death by localizing glob
118b8851fccSafresh1        local *ExtUtils::Installed::Config;
119b8851fccSafresh1        %ExtUtils::Installed::Config = (
120b8851fccSafresh1            %Config,
121b8851fccSafresh1            archlibexp         => cwd(),
122b8851fccSafresh1            sitearchexp        => $fake_mod_dir,
123b8851fccSafresh1        );
124b8851fccSafresh1
125b8851fccSafresh1        # should find $fake_mod_dir via '.' in @INC
126b8851fccSafresh1
1275759b3d2Safresh1        local @INC = @INC;
1285759b3d2Safresh1        push @INC, '.' if not $INC[-1] eq '.';
1295759b3d2Safresh1
130b8851fccSafresh1        my $realei = ExtUtils::Installed->new();
131b8851fccSafresh1        isa_ok( $realei, 'ExtUtils::Installed' );
132b8851fccSafresh1        isa_ok( $realei->{Perl}{packlist}, 'ExtUtils::Packlist' );
133b8851fccSafresh1        is( $realei->{Perl}{version}, $Config{version},
134b8851fccSafresh1            'new() should set Perl version from %Config' );
135b8851fccSafresh1
136b8851fccSafresh1        ok( exists $realei->{FakeMod}, 'new() should find modules with .packlists');
137b8851fccSafresh1        isa_ok( $realei->{FakeMod}{packlist}, 'ExtUtils::Packlist' );
138b8851fccSafresh1        is( $realei->{FakeMod}{version}, '1.1.1',
139b8851fccSafresh1            '... should find version in modules' );
140b8851fccSafresh1    }
141b8851fccSafresh1
142b8851fccSafresh1    {
143b8851fccSafresh1        # avoid warning and death by localizing glob
144b8851fccSafresh1        local *ExtUtils::Installed::Config;
145b8851fccSafresh1        %ExtUtils::Installed::Config = (
146b8851fccSafresh1            %Config,
147b8851fccSafresh1            archlibexp         => cwd(),
148b8851fccSafresh1            sitearchexp        => $fake_mod_dir,
149b8851fccSafresh1        );
150b8851fccSafresh1
151b8851fccSafresh1        # disable '.' search
152b8851fccSafresh1
153b8851fccSafresh1        my $realei = ExtUtils::Installed->new( skip_cwd => 1 );
154b8851fccSafresh1        isa_ok( $realei, 'ExtUtils::Installed' );
155b8851fccSafresh1        isa_ok( $realei->{Perl}{packlist}, 'ExtUtils::Packlist' );
156b8851fccSafresh1        is( $realei->{Perl}{version}, $Config{version},
157b8851fccSafresh1            'new() should set Perl version from %Config' );
158b8851fccSafresh1
159b8851fccSafresh1        ok( ! exists $realei->{FakeMod}, 'new( skip_cwd => 1 ) should fail to find modules with .packlists');
160b8851fccSafresh1    }
161b8851fccSafresh1
162b8851fccSafresh1    {
163b8851fccSafresh1        # avoid warning and death by localizing glob
164b8851fccSafresh1        local *ExtUtils::Installed::Config;
165b8851fccSafresh1        %ExtUtils::Installed::Config = (
166b8851fccSafresh1            %Config,
167b8851fccSafresh1            archlibexp         => cwd(),
168b8851fccSafresh1            sitearchexp        => $fake_mod_dir,
169b8851fccSafresh1        );
170b8851fccSafresh1
171b8851fccSafresh1        # necessary to fool new() since we'll disable searching '.'
172b8851fccSafresh1        push @INC, $fake_mod_dir;
173b8851fccSafresh1
174b8851fccSafresh1        my $realei = ExtUtils::Installed->new( skip_cwd => 1 );
175b8851fccSafresh1        isa_ok( $realei, 'ExtUtils::Installed' );
176b8851fccSafresh1        isa_ok( $realei->{Perl}{packlist}, 'ExtUtils::Packlist' );
177b8851fccSafresh1        is( $realei->{Perl}{version}, $Config{version},
178b8851fccSafresh1            'new() should set Perl version from %Config' );
179b8851fccSafresh1
180b8851fccSafresh1        ok( exists $realei->{FakeMod}, 'new() should find modules with .packlists');
181b8851fccSafresh1        isa_ok( $realei->{FakeMod}{packlist}, 'ExtUtils::Packlist' );
182b8851fccSafresh1        is( $realei->{FakeMod}{version}, '1.1.1',
183b8851fccSafresh1            '... should find version in modules' );
184b8851fccSafresh1    }
185b8851fccSafresh1
186b8851fccSafresh1    # Now try this using PERL5LIB
187b8851fccSafresh1    {
188b8851fccSafresh1        local $ENV{PERL5LIB} = join $Config{path_sep}, $fake_mod_dir;
189b8851fccSafresh1        local *ExtUtils::Installed::Config;
190b8851fccSafresh1        %ExtUtils::Installed::Config = (
191b8851fccSafresh1            %Config,
192b8851fccSafresh1            archlibexp         => cwd(),
193b8851fccSafresh1            sitearchexp        => cwd(),
194b8851fccSafresh1        );
195b8851fccSafresh1
196b8851fccSafresh1        my $realei = ExtUtils::Installed->new();
197b8851fccSafresh1        isa_ok( $realei, 'ExtUtils::Installed' );
198b8851fccSafresh1        isa_ok( $realei->{Perl}{packlist}, 'ExtUtils::Packlist' );
199b8851fccSafresh1        is( $realei->{Perl}{version}, $Config{version},
200b8851fccSafresh1            'new() should set Perl version from %Config' );
201b8851fccSafresh1
202b8851fccSafresh1        ok( exists $realei->{FakeMod},
203b8851fccSafresh1            'new() should find modules with .packlists using PERL5LIB'
204b8851fccSafresh1        );
205b8851fccSafresh1        isa_ok( $realei->{FakeMod}{packlist}, 'ExtUtils::Packlist' );
206b8851fccSafresh1        is( $realei->{FakeMod}{version}, '1.1.1',
207b8851fccSafresh1            '... should find version in modules' );
208b8851fccSafresh1    }
209b8851fccSafresh1
210b8851fccSafresh1    # Do the same thing as the last block, but with overrides for
211b8851fccSafresh1    # %Config and @INC.
212b8851fccSafresh1    {
213b8851fccSafresh1        my $config_override = { %Config::Config };
214b8851fccSafresh1        $config_override->{archlibexp} = cwd();
215b8851fccSafresh1        $config_override->{sitearchexp} = $fake_mod_dir;
216b8851fccSafresh1        $config_override->{version} = 'fake_test_version';
217b8851fccSafresh1
218b8851fccSafresh1        my @inc_override = (@INC, $fake_mod_dir);
219b8851fccSafresh1
220b8851fccSafresh1        my $realei = ExtUtils::Installed->new(
221b8851fccSafresh1            'config_override' => $config_override,
222b8851fccSafresh1            'inc_override' => \@inc_override,
223b8851fccSafresh1        );
224b8851fccSafresh1        isa_ok( $realei, 'ExtUtils::Installed' );
225b8851fccSafresh1        isa_ok( $realei->{Perl}{packlist}, 'ExtUtils::Packlist' );
226b8851fccSafresh1        is( $realei->{Perl}{version}, 'fake_test_version',
227b8851fccSafresh1            'new(config_override => HASH) overrides %Config' );
228b8851fccSafresh1
229b8851fccSafresh1        ok( exists $realei->{FakeMod}, 'new() with overrides should find modules with .packlists');
230b8851fccSafresh1        isa_ok( $realei->{FakeMod}{packlist}, 'ExtUtils::Packlist' );
231b8851fccSafresh1        is( $realei->{FakeMod}{version}, '1.1.1',
232b8851fccSafresh1            '... should find version in modules' );
233b8851fccSafresh1    }
234b8851fccSafresh1
235b8851fccSafresh1    # Check if extra_libs works.
236b8851fccSafresh1    {
237b8851fccSafresh1        my $realei = ExtUtils::Installed->new(
238b8851fccSafresh1            'extra_libs' => [ cwd() ],
239b8851fccSafresh1        );
240b8851fccSafresh1        isa_ok( $realei, 'ExtUtils::Installed' );
241b8851fccSafresh1        isa_ok( $realei->{Perl}{packlist}, 'ExtUtils::Packlist' );
242b8851fccSafresh1        ok( exists $realei->{FakeMod},
243b8851fccSafresh1            'new() with extra_libs should find modules with .packlists');
244b8851fccSafresh1
245b8851fccSafresh1        #{ use Data::Dumper; local $realei->{':private:'}{Config};
246b8851fccSafresh1        #  warn Dumper($realei); }
247b8851fccSafresh1
248b8851fccSafresh1        isa_ok( $realei->{FakeMod}{packlist}, 'ExtUtils::Packlist' );
249b8851fccSafresh1        is( $realei->{FakeMod}{version}, '1.1.1',
250b8851fccSafresh1            '... should find version in modules' );
251b8851fccSafresh1    }
252b8851fccSafresh1
253b8851fccSafresh1    # modules
254b8851fccSafresh1    $ei->{$_} = 1 for qw( abc def ghi );
255b8851fccSafresh1    is( join(' ', $ei->modules()), 'abc def ghi',
256b8851fccSafresh1        'modules() should return sorted keys' );
257b8851fccSafresh1
258b8851fccSafresh1    # This didn't work for a long time due to a sort in scalar context oddity.
259b8851fccSafresh1    is( $ei->modules, 3,    'modules() in scalar context' );
260b8851fccSafresh1
261b8851fccSafresh1    # files
262b8851fccSafresh1    $ei->{goodmod} = {
263b8851fccSafresh1            packlist => {
264b8851fccSafresh1                    ($Config{man1direxp} ?
265b8851fccSafresh1                        (File::Spec->catdir($Config{man1direxp}, 'foo') => 1) :
266b8851fccSafresh1                            ()),
267b8851fccSafresh1                    ($Config{man3direxp} ?
268b8851fccSafresh1                        (File::Spec->catdir($Config{man3direxp}, 'bar') => 1) :
269b8851fccSafresh1                            ()),
270b8851fccSafresh1                    File::Spec->catdir($prefix, 'foobar') => 1,
271b8851fccSafresh1                    foobaz  => 1,
272b8851fccSafresh1            },
273b8851fccSafresh1    };
274b8851fccSafresh1
275b8851fccSafresh1    eval { $ei->files('badmod') };
276b8851fccSafresh1    like( $@, qr/badmod is not installed/,'files() should croak given bad modname');
277b8851fccSafresh1    eval { $ei->files('goodmod', 'badtype' ) };
278b8851fccSafresh1    like( $@, qr/type must be/,'files() should croak given bad type' );
279b8851fccSafresh1
280b8851fccSafresh1    my @files;
281b8851fccSafresh1    SKIP: {
282b8851fccSafresh1        skip('no man directory man1dir on this system', 2)
283b8851fccSafresh1          unless $Config{man1direxp};
284b8851fccSafresh1        @files = $ei->files('goodmod', 'doc', $Config{man1direxp});
285b8851fccSafresh1        is( scalar @files, 1, '... should find doc file under given dir' );
286b8851fccSafresh1        is( (grep { /foo$/ } @files), 1, '... checking file name' );
287b8851fccSafresh1    }
288b8851fccSafresh1    SKIP: {
289b8851fccSafresh1        skip('no man directories on this system', 1) unless $mandirs;
290b8851fccSafresh1        @files = $ei->files('goodmod', 'doc');
291b8851fccSafresh1        is( scalar @files, $mandirs, '... should find all doc files with no dir' );
292b8851fccSafresh1    }
293b8851fccSafresh1
294b8851fccSafresh1    @files = $ei->files('goodmod', 'prog', 'fake', 'fake2');
295b8851fccSafresh1    is( scalar @files, 0, '... should find no doc files given wrong dirs' );
296b8851fccSafresh1    @files = $ei->files('goodmod', 'prog');
297b8851fccSafresh1    is( scalar @files, 1, '... should find doc file in correct dir' );
298b8851fccSafresh1    like( $files[0], qr/foobar[>\]]?$/, '... checking file name' );
299b8851fccSafresh1    @files = $ei->files('goodmod');
300b8851fccSafresh1    is( scalar @files, 2 + $mandirs, '... should find all files with no type specified' );
301b8851fccSafresh1    my %dirnames = map { lc($_) => dirname($_) } @files;
302b8851fccSafresh1
303b8851fccSafresh1    # directories
304b8851fccSafresh1    my @dirs = $ei->directories('goodmod', 'prog', 'fake');
305b8851fccSafresh1    is( scalar @dirs, 0, 'directories() should return no dirs if no files found' );
306b8851fccSafresh1
307b8851fccSafresh1    SKIP: {
308b8851fccSafresh1        skip('no man directories on this system', 1) unless $mandirs;
309b8851fccSafresh1        @dirs = $ei->directories('goodmod', 'doc');
310b8851fccSafresh1        is( scalar @dirs, $mandirs, '... should find all files files() would' );
311b8851fccSafresh1    }
312b8851fccSafresh1    @dirs = $ei->directories('goodmod');
313b8851fccSafresh1    is( scalar @dirs, 2 + $mandirs, '... should find all files files() would, again' );
314b8851fccSafresh1    @files = sort map { exists $dirnames{lc($_)} ? $dirnames{lc($_)} : '' } @files;
315b8851fccSafresh1    is( join(' ', @files), join(' ', @dirs), '... should sort output' );
316b8851fccSafresh1
317b8851fccSafresh1    # directory_tree
318b8851fccSafresh1    my $expectdirs =
319b8851fccSafresh1           ($mandirs == 2) &&
320b8851fccSafresh1           (dirname($Config{man1direxp}) eq dirname($Config{man3direxp}))
321b8851fccSafresh1           ? 3 : 2;
322b8851fccSafresh1
323b8851fccSafresh1    SKIP: {
324b8851fccSafresh1        skip('no man directories on this system', 1) unless $mandirs;
325b8851fccSafresh1        @dirs = $ei->directory_tree('goodmod', 'doc', $Config{man1direxp} ?
326b8851fccSafresh1           dirname($Config{man1direxp}) : dirname($Config{man3direxp}));
327b8851fccSafresh1        is( scalar @dirs, $expectdirs,
328b8851fccSafresh1            'directory_tree() should report intermediate dirs to those requested' );
329b8851fccSafresh1    }
330b8851fccSafresh1
331b8851fccSafresh1    my $fakepak = Fakepak->new(102);
332b8851fccSafresh1
333b8851fccSafresh1    $ei->{yesmod} = {
334b8851fccSafresh1            version         => 101,
335b8851fccSafresh1            packlist        => $fakepak,
336b8851fccSafresh1    };
337b8851fccSafresh1
338b8851fccSafresh1    # these should all croak
339b8851fccSafresh1    foreach my $sub (qw( validate packlist version )) {
340b8851fccSafresh1        eval { $ei->$sub('nomod') };
341b8851fccSafresh1        like( $@, qr/nomod is not installed/,
342b8851fccSafresh1            "$sub() should croak when asked about uninstalled module" );
343b8851fccSafresh1    }
344b8851fccSafresh1
345b8851fccSafresh1    # validate
346b8851fccSafresh1    is( $ei->validate('yesmod'), 'validated',
347b8851fccSafresh1            'validate() should return results of packlist validate() call' );
348b8851fccSafresh1
349b8851fccSafresh1    # packlist
350b8851fccSafresh1    is( ${ $ei->packlist('yesmod') }, 102,
351b8851fccSafresh1            'packlist() should report installed mod packlist' );
352b8851fccSafresh1
353b8851fccSafresh1    # version
354b8851fccSafresh1    is( $ei->version('yesmod'), 101,
355b8851fccSafresh1            'version() should report installed mod version' );
356b8851fccSafresh1
357*eac174f2Safresh1} # End of block enclosing tempdir
358b8851fccSafresh1
359b8851fccSafresh1package Fakepak;
360b8851fccSafresh1
361b8851fccSafresh1sub new {
362b8851fccSafresh1    my $class = shift;
363b8851fccSafresh1    bless(\(my $scalar = shift), $class);
364b8851fccSafresh1}
365b8851fccSafresh1
366b8851fccSafresh1sub validate {
367b8851fccSafresh1    return 'validated'
368b8851fccSafresh1}
369