load-module.t revision 1.1.1.1
1#!perl -w
2use strict;
3
4# Test the load_module() core API function.
5#
6# Note that this function can be passed arbitrary and illegal module
7# names which would already have been caught if a require statement had
8# been compiled. So check that load_module() can catch such bad things.
9
10use Test::More;
11use XS::APItest;
12
13# This isn't complete yet. In particular, we don't test import lists, or
14# the other flags. But it's better than nothing.
15
16is($INC{'less.pm'}, undef, "less isn't loaded");
17load_module(PERL_LOADMOD_NOIMPORT, 'less');
18like($INC{'less.pm'}, qr!(?:\A|/)lib/less\.pm\z!, "less is now loaded");
19
20delete $INC{'less.pm'};
21delete $::{'less::'};
22
23is(eval { load_module(PERL_LOADMOD_NOIMPORT, 'less', 1); 1}, undef,
24   "expect load_module() to fail");
25like($@, qr/less version 1 required--this is only version 0\./,
26     'with the correct error message');
27
28is(eval { load_module(PERL_LOADMOD_NOIMPORT, 'less', 0.03); 1}, 1,
29   "expect load_module() not to fail");
30
31#
32# Check for illegal module names
33
34for (["", qr!\ABareword in require maps to empty filename!],
35    ["::", qr!\ABareword in require must not start with a double-colon: "::"!],
36    ["::::", qr!\ABareword in require must not start with a double-colon: "::::"!],
37    ["::/", qr!\ABareword in require must not start with a double-colon: "::/!],
38    ["/", qr!\ABareword in require maps to disallowed filename "/\.pm"!],
39    ["::/WOOSH", qr!\ABareword in require must not start with a double-colon: "::/WOOSH!],
40    [".WOOSH", qr!\ABareword in require maps to disallowed filename "\.WOOSH\.pm"!],
41    ["::.WOOSH", qr!\ABareword in require must not start with a double-colon: "::.WOOSH!],
42    ["WOOSH::.sock", qr!\ABareword in require contains "/\."!],
43    ["WOOSH::.sock", qr!\ABareword in require contains "/\."!],
44    ["WOOSH/.sock", qr!\ABareword in require contains "/\."!],
45    ["WOOSH/..sock", qr!\ABareword in require contains "/\."!],
46    ["WOOSH/../sock", qr!\ABareword in require contains "/\."!],
47    ["WOOSH::..::sock", qr!\ABareword in require contains "/\."!],
48    ["WOOSH::.::sock", qr!\ABareword in require contains "/\."!],
49    ["WOOSH::./sock", qr!\ABareword in require contains "/\."!],
50    ["WOOSH/./sock", qr!\ABareword in require contains "/\."!],
51    ["WOOSH/.::sock", qr!\ABareword in require contains "/\."!],
52    ["WOOSH/..::sock", qr!\ABareword in require contains "/\."!],
53    ["WOOSH::../sock", qr!\ABareword in require contains "/\."!],
54    ["WOOSH::../..::sock", qr!\ABareword in require contains "/\."!],
55    ["WOOSH\0sock", qr!\ACan't locate WOOSH\\0sock.pm:!],
56    )
57{
58    my ($module, $error) = @$_;
59    my $module2 = $module; # load_module mangles its first argument
60    no warnings 'syscalls';
61    is(eval { load_module(PERL_LOADMOD_NOIMPORT, $module); 1}, undef,
62       "expect load_module() for '$module2' to fail");
63    like($@, $error, "check expected error for $module2");
64}
65
66done_testing();
67