This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
The DynaLoader test isn't happy with OpenBSD's libc.so.39.3.
[perl5.git] / ext / DynaLoader / t / DynaLoader.t
index 841fa22..b97fc60 100644 (file)
@@ -9,7 +9,6 @@ BEGIN {
 
 use strict;
 use Config;
-use Errno qw(ENOENT);
 use Test::More;
 my %modules;
 
@@ -22,7 +21,7 @@ my %modules;
     'Time::HiRes'=> q| ::is( ref Time::HiRes->can('usleep'),'CODE' ) |,  # 5.7.3
 );
 
-plan tests => 28 + keys(%modules) * 2;
+plan tests => 27 + keys(%modules) * 2;
 
 
 # Try to load the module
@@ -37,7 +36,10 @@ can_ok( 'DynaLoader' => 'dl_install_xsub'         ); # defined in XS section
 can_ok( 'DynaLoader' => 'dl_load_file'            ); # defined in XS section
 can_ok( 'DynaLoader' => 'dl_load_flags'           ); # defined in Perl section
 can_ok( 'DynaLoader' => 'dl_undef_symbols'        ); # defined in XS section
-can_ok( 'DynaLoader' => 'dl_unload_file'          ); # defined in XS section
+SKIP: {
+    skip "unloading unsupported on $^O", 1 if ($^O eq 'VMS' || $^O eq 'darwin');
+    can_ok( 'DynaLoader' => 'dl_unload_file'          ); # defined in XS section
+}
 
 TODO: {
 local $TODO = "Test::More::can_ok() seems to have trouble dealing with AutoLoaded functions";
@@ -65,17 +67,35 @@ like( $@, q{/^Usage: DynaLoader::dl_load_file\(filename, flags=0\)/},
 eval { no warnings 'uninitialized'; DynaLoader::dl_load_file(undef) };
 is( $@, '', "calling DynaLoader::dl_load_file() with undefined argument" );     # is this expected ?
 
-eval { DynaLoader::dl_load_file("egg_bacon_sausage_and_spam") };
-is( $@, '', "calling DynaLoader::dl_load_file() with a package without binary object" );
-is( 0+$!, ENOENT, "checking errno value" );
-like( DynaLoader::dl_error(), "/$!/", "checking error message returned by dl_error()" );
+my ($dlhandle, $dlerr);
+eval { $dlhandle = DynaLoader::dl_load_file("egg_bacon_sausage_and_spam") };
+$dlerr = DynaLoader::dl_error();
+SKIP: {
+    skip "dl_load_file() does not attempt to load file on VMS (and thus does not fail) when \@dl_require_symbols is empty", 1 if $^O eq 'VMS';
+    ok( !$dlhandle, "calling DynaLoader::dl_load_file() without an existing library should fail" );
+}
+ok( defined $dlerr, "dl_error() returning an error message: '$dlerr'" );
 
-# ... dl_findfile()
-my @files = ();
-eval { @files = DynaLoader::dl_findfile("c") };
-is( $@, '', "calling dl_findfile()" );
-cmp_ok( scalar @files, '>=', 1, " - array should contain one result result or more: libc => (@files)" );
+# Checking for any particular error messages or numeric codes
+# is very unportable, please do not try to do that.  A failing
+# dl_load_file() is not even guaranteed to set the $! or the $^E.
 
+# ... dl_findfile()
+SKIP: {
+    my @files = ();
+    eval { @files = DynaLoader::dl_findfile("c") };
+    is( $@, '', "calling dl_findfile()" );
+    # Some platforms are known to not have a "libc"
+    # (not at least by that name) that the dl_findfile()
+    # could find.
+    skip "dl_findfile test not appropriate on $^O", 1
+       if $^O =~ /(win32|vms|openbsd)/i;
+    # Play safe and only try this test if this system
+    # looks pretty much Unix-like.
+    skip "dl_findfile test not appropriate on $^O", 1
+       unless -d '/usr' && -f '/bin/ls';
+    cmp_ok( scalar @files, '>=', 1, "array should contain one result result or more: libc => (@files)" );
+}
 
 # Now try to load well known XS modules
 my $extensions = $Config{'extensions'};
@@ -83,7 +103,7 @@ $extensions =~ s|/|::|g;
 
 for my $module (sort keys %modules) {
     SKIP: {
-        skip "$module not available", 2 if $extensions !~ /\b$module\b/;
+        skip "$module not available", 1 if $extensions !~ /\b$module\b/;
         eval "use $module";
         is( $@, '', "loading $module" );
     }
@@ -95,9 +115,12 @@ is( scalar @DynaLoader::dl_modules, scalar keys %modules, "checking number of it
 
 my @loaded_modules = @DynaLoader::dl_modules;
 for my $libref (reverse @DynaLoader::dl_librefs) {
+  SKIP: {
+    skip "unloading unsupported on $^O", 2 if ($^O eq 'VMS' || $^O eq 'darwin');
     my $module = pop @loaded_modules;
     my $r = eval { DynaLoader::dl_unload_file($libref) };
     is( $@, '', "calling dl_unload_file() for $module" );
     is( $r,  1, " - unload was successful" );
+  }
 }