#! /usr/bin/env perl
# Copyright 2018 The OpenSSL Project Authors. All Rights Reserved.
#
-# Licensed under the OpenSSL license (the "License"). You may not use
+# Licensed under the Apache License 2.0 (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy
# in the file LICENSE in the source distribution or at
# https://www.openssl.org/source/license.html
setup("test_out_option");
-plan skip_all => "'-out' option tests are not available on Windows"
- if $^O eq 'MSWin32';
+plan tests => 4;
-plan tests => 11;
+# Test 1
+SKIP: {
+ # Paths that should generate failure when trying to write to them.
+ # Directories are a safe bet for failure on most platforms.
+ # Notably, this isn't true on OpenVMS, as a default file name is
+ # appended under the hood when trying to "write" to a directory spec.
+ # From observation, that file is '.' (i.e. a file with no file name
+ # and no extension), so '[]' gets translated to '[].'
+ skip 'Directories become writable files on OpenVMS', 1 if $^O eq 'VMS';
-# The following patterns should be tested:
-#
-# path dirname
-# /usr/ /
-# / /
-# . .
-# .. .
-
-test_illegal_path('/usr/');
-test_illegal_path('/');
-test_illegal_path('./');
-test_illegal_path('../');
-
-# Test for trying to create a file in a non-exist directory
-my @chars = ("A".."Z", "a".."z", "0".."9");
-my $rand_path = $chars[rand @chars] for 1..32;
-$rand_path .= "/test.pem";
-
-test_illegal_path($rand_path);
-test_legal_path('test.pem');
-unlink 'test.pem';
-
-sub test_illegal_path {
- my $path = File::Spec->canonpath($_[0]);
-
- my $start = time();
- ok(!run(app([ 'openssl', 'genrsa', '-out', $path, '16384'])), "invalid output path: $path");
- my $end = time();
- # The above process should exit in 2 seconds if the path is not valid
- ok($end - $start < 2, "check time consumed");
+ # Note that directories must end with a slash here, because of how
+ # File::Spec massages them into directory specs on some platforms.
+ my $path = File::Spec->canonpath('./');
+ ok(!run(app([ 'openssl', 'rand', '-out', $path, '1'])),
+ "invalid output path: $path");
+}
+
+# Test 2
+{
+ my $path = File::Spec->canonpath('randomname.bin');
+ ok(run(app([ 'openssl', 'rand', '-out', $path, '1'])),
+ "valid output path: $path");
+}
+
+# Test 3
+{
+ # Test for trying to create a file in a non-exist directory
+ my $rand_path = "";
+ do {
+ my @chars = ("A".."Z", "a".."z", "0".."9");
+ $rand_path .= $chars[rand @chars] for 1..32;
+ } while (-d File::Spec->catdir('.', $rand_path));
+ $rand_path .= "/randomname.bin";
+
+ my $path = File::Spec->canonpath($rand_path);
+ ok(!run(app([ 'openssl', 'rand', '-out', $path, '1'])),
+ "invalid output path: $path");
}
-sub test_legal_path {
- my $path = File::Spec->canonpath($_[0]);
+# Test 4
+SKIP: {
+ skip "It's not safe to use perl's idea of the NULL device in an explicitly cross compiled build", 1
+ unless (config('CROSS_COMPILE') // '') eq '';
+
+ my $path = File::Spec->canonpath(File::Spec->devnull());
+ ok(run(app([ 'openssl', 'rand', '-out', $path, '1'])),
+ "valid output path: $path");
+}
- ok(run(app([ 'openssl', 'genrsa', '-out', $path, '2048'])), "valid output path: $path");
+# Cleanup
+END {
+ unlink 'randomname.bin' if -f 'randomname.bin';
}