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