Avoid test_errstr in a cross compiled configuration
[openssl.git] / test / recipes / 02-test_errstr.t
1 #! /usr/bin/env perl
2 # Copyright 2018 The OpenSSL Project Authors. All Rights Reserved.
3 #
4 # Licensed under the OpenSSL license (the "License").  You may not use
5 # this file except in compliance with the License.  You can obtain a copy
6 # in the file LICENSE in the source distribution or at
7 # https://www.openssl.org/source/license.html
8
9 use strict;
10 no strict 'refs';               # To be able to use strings as function refs
11 use OpenSSL::Test;
12 use OpenSSL::Test::Utils;
13 use Errno qw(:POSIX);
14 use POSIX qw(strerror);
15
16 # We actually have space for up to 4095 error messages,
17 # numerically speaking...  but we're currently only using
18 # numbers 1 through 127.
19 # This constant should correspond to the same constant
20 # defined in crypto/err/err.c, or at least must not be
21 # assigned a greater number.
22 use constant NUM_SYS_STR_REASONS => 127;
23
24 setup('test_errstr');
25
26 # In a cross compiled situation, there are chances that our
27 # application is linked against different C libraries than
28 # perl, and may thereby get different error messages for the
29 # same error.
30 # The safest is not to test under such circumstances.
31 plan skip_all => 'This is unsupported for cross compiled configurations'
32     if config('CROSS_COMPILE');
33
34 # These are POSIX error names, which Errno implements as functions
35 # (this is documented)
36 my @posix_errors = @{$Errno::EXPORT_TAGS{POSIX}};
37
38 plan tests => scalar @posix_errors
39     +1                          # Checking that error 128 gives 'reason(128)'
40     +1                          # Checking that error 0 gives the library name
41     ;
42
43 foreach my $errname (@posix_errors) {
44     my $errnum = "Errno::$errname"->();
45
46  SKIP: {
47         skip "Error $errname ($errnum) isn't within our range", 1
48             if $errnum > NUM_SYS_STR_REASONS;
49
50         my $perr = eval {
51             # Set $! to the error number...
52             local $! = $errnum;
53             # ... and $! will give you the error string back
54             $!
55         };
56
57         # We know that the system reasons are in OpenSSL error library 2
58         my @oerr = run(app([ qw(openssl errstr), sprintf("2%06x", $errnum) ]),
59                        capture => 1);
60         $oerr[0] =~ s|\R$||;
61         $oerr[0] =~ s|.*system library:||g; # The actual message is last
62
63         ok($oerr[0] eq $perr, "($errnum) '$oerr[0]' == '$perr'");
64     }
65 }
66
67 my @after = run(app([ qw(openssl errstr 2000080) ]), capture => 1);
68 $after[0] =~ s|\R$||;
69 $after[0] =~ s|.*system library:||g;
70 ok($after[0] eq "reason(128)", "(128) '$after[0]' == 'reason(128)'");
71
72 my @zero = run(app([ qw(openssl errstr 2000000) ]), capture => 1);
73 $zero[0] =~ s|\R$||;
74 $zero[0] =~ s|.*system library:||g;
75 ok($zero[0] eq "system library", "(0) '$zero[0]' == 'system library'");