Commit c8885e99 authored by Russ Allbery's avatar Russ Allbery

Add test_tmpdir function to Test::RRA::Automake

This parallels the C TAP library function: create a temporary
directory and return the path, and remove the directory if possible
on program exit.
parent c659fd61
......@@ -82,7 +82,7 @@ our (@EXPORT_OK, @ISA, $VERSION);
# consistency is good).
@ISA = qw(Exporter);
@EXPORT_OK = qw(automake_setup perl_dirs test_file_path);
@EXPORT_OK = qw(automake_setup perl_dirs test_file_path test_tmpdir);
# This version should match the corresponding rra-c-util release, but with
# two digits for the minor version, including a leading zero if necessary,
......@@ -95,6 +95,11 @@ BEGIN {
# distribution and has its own standalone test suite.
my @GLOBAL_SKIP = qw(.git perl);
# The temporary directory created by test_tmpdir, if any. If this is set,
# attempt to remove the directory stored here on program exit (but ignore
# failure to do so).
# Perform initial test setup for running a Perl test in an Automake package.
# This verifies that BUILD and SOURCE are set and then changes directory to
# the SOURCE directory by default. Sets LD_LIBRARY_PATH if the $LIBRARY_PATH
......@@ -238,12 +243,53 @@ sub test_file_path {
# Create a temporary directory for tests to use for transient files and return
# the path to that directory. The directory is automatically removed on
# program exit. The directory permissions use the current umask. Calls
# BAIL_OUT if the directory could not be created.
# Returns: Path to a writable temporary directory
sub test_tmpdir {
my $path;
# If we already figured out what directory to use, reuse the same path.
# Otherwise, create a directory relative to BUILD if set.
if (defined($TMPDIR)) {
$path = $TMPDIR;
} else {
my $base = defined($ENV{BUILD}) ? $ENV{BUILD} : File::Spec->curdir;
$path = File::Spec->catdir($base, 'tmp');
# Create the directory if it doesn't exist.
if (!-d $path) {
if (!mkdir($path, 0777)) {
BAIL_OUT("cannot create directory $path: $!");
# Store the directory name for cleanup and return it.
$TMPDIR = $path;
return $path;
# On program exit, remove $TMPDIR if set and if possible. Report errors with
# diag but otherwise ignore them.
if (defined($TMPDIR) && -d $TMPDIR) {
local $! = undef;
if (!rmdir($TMPDIR)) {
diag("cannot remove temporary directory $TMPDIR: $!");
=for stopwords
Allbery Automake Automake-aware Automake-based rra-c-util ARGS
subdirectories sublicense MERCHANTABILITY NONINFRINGEMENT umask
=head1 NAME
......@@ -320,6 +366,19 @@ checked for relative to the environment variable BUILD first, and then
relative to SOURCE. test_file_path() returns the full path to FILE or
calls BAIL_OUT if FILE could not be found.
=item test_tmpdir()
Create a temporary directory for tests to use for transient files and
return the path to that directory. The directory is created relative to
the BUILD environment variable, which must be set. Permissions on the
directory are set using the current umask. test_tmpdir() returns the full
path to the temporary directory or calls BAIL_OUT if it could not be
The directory is automatically removed if possible on program exit.
Failure to remove the directory on exit is reported with diag() and
otherwise ignored.
=head1 AUTHOR
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment