xref: /openbsd-src/gnu/usr.bin/perl/t/op/require_errors.t (revision e5157e49389faebcb42b7237d55fbf096d9c2523)
1#!perl
2use strict;
3use warnings;
4
5BEGIN {
6    chdir 't';
7    require './test.pl';
8}
9
10plan(tests => 17);
11
12my $nonfile = tempfile();
13
14@INC = qw(Perl Rules);
15
16# The tests for ' ' and '.h' never did fail, but previously the error reporting
17# code would read memory before the start of the SV's buffer
18
19for my $file ($nonfile, ' ') {
20    eval {
21	require $file;
22    };
23
24    like $@, qr/^Can't locate $file in \@INC \(\@INC contains: @INC\) at/,
25	"correct error message for require '$file'";
26}
27
28eval "require $nonfile";
29
30like $@, qr/^Can't locate $nonfile\.pm in \@INC \(you may need to install the $nonfile module\) \(\@INC contains: @INC\) at/,
31    "correct error message for require $nonfile";
32
33eval {
34    require "$nonfile.ph";
35};
36
37like $@, qr/^Can't locate $nonfile\.ph in \@INC \(did you run h2ph\?\) \(\@INC contains: @INC\) at/;
38
39for my $file ("$nonfile.h", ".h") {
40    eval {
41	require $file
42    };
43
44    like $@, qr/^Can't locate \Q$file\E in \@INC \(change \.h to \.ph maybe\?\) \(did you run h2ph\?\) \(\@INC contains: @INC\) at/,
45	"correct error message for require '$file'";
46}
47
48for my $file ("$nonfile.ph", ".ph") {
49    eval {
50	require $file
51    };
52
53    like $@, qr/^Can't locate \Q$file\E in \@INC \(did you run h2ph\?\) \(\@INC contains: @INC\) at/,
54	"correct error message for require '$file'";
55}
56
57eval 'require <foom>';
58like $@, qr/^<> should be quotes at /, 'require <> error';
59
60my $module   = tempfile();
61my $mod_file = "$module.pm";
62
63open my $module_fh, ">", $mod_file or die $!;
64print { $module_fh } "print 1; 1;\n";
65close $module_fh;
66
67chmod 0333, $mod_file;
68
69SKIP: {
70    skip_if_miniperl("these modules may not be available to miniperl", 2);
71
72    push @INC, '../lib';
73    require Cwd;
74    require File::Spec::Functions;
75    if ($^O eq 'cygwin') {
76        require Win32;
77    }
78
79    # Going to try to switch away from root.  Might not work.
80    # (stolen from t/op/stat.t)
81    my $olduid = $>;
82    eval { $> = 1; };
83    skip "Can't test permissions meaningfully if you're superuser", 2
84        if ($^O eq 'cygwin' ? Win32::IsAdminUser() : $> == 0);
85
86    local @INC = ".";
87    eval "use $module";
88    like $@,
89        qr<^\QCan't locate $mod_file:>,
90        "special error message if the file exists but can't be opened";
91
92    SKIP: {
93        skip "Can't make the path absolute", 1
94            if !defined(Cwd::getcwd());
95
96        my $file = File::Spec::Functions::catfile(Cwd::getcwd(), $mod_file);
97        eval {
98            require($file);
99        };
100        like $@,
101            qr<^\QCan't locate $file:>,
102            "...even if we use a full path";
103    }
104
105    # switch uid back (may not be implemented)
106    eval { $> = $olduid; };
107}
108
1091 while unlink $mod_file;
110
111# I can't see how to test the EMFILE case
112# I can't see how to test the case of not displaying @INC in the message.
113# (and does that only happen on VMS?)
114
115# fail and print the full filename
116eval { no warnings 'syscalls'; require "strict.pm\0invalid"; };
117like $@, qr/^Can't locate strict\.pm\\0invalid: /, 'require nul check [perl #117265]';
118eval { no warnings 'syscalls'; do "strict.pm\0invalid"; };
119like $@, qr/^Can't locate strict\.pm\\0invalid: /, 'do nul check';
120{
121  my $WARN;
122  local $SIG{__WARN__} = sub { $WARN = shift };
123  eval { require "strict.pm\0invalid"; };
124  like $WARN, qr{^Invalid \\0 character in pathname for require: strict\.pm\\0invalid at }, 'nul warning';
125  like $@, qr{^Can't locate strict\.pm\\0invalid: }, 'nul error';
126
127  $WARN = '';
128  local @INC = @INC;
129  unshift @INC, "lib\0invalid";
130  eval { require "unknown.pm" };
131  like $WARN, qr{^Invalid \\0 character in \@INC entry for require: lib\\0invalid at }, 'nul warning';
132}
133eval "require strict\0::invalid;";
134like $@, qr/^syntax error at \(eval \d+\) line 1/, 'parse error with \0 in barewords module names';
135
136