openafs/tests/tests-lib/perl5/afstest.pm
Andrew Deason 4db3775c0f tests: Redirect diag() to stdout by default
Currently our perl tests use Test::More, which sends diag() messages
to stderr, including when reporting why a test failed.

Our 'runtests' harness from c-tap-harness discards stderr from test
programs, unless we run in single-test mode (-o). As a result, when we
run tests with 'runtests -v' and a test fails, we can't see any
diagnostic information if the test was using perl's Test::More,
including why a test failed. If the test is written in C using
c-tap-harness bindings, diag() goes to stdout, and this problem
doesn't happen.

To make sure we can see diag() messages from perl tests, change the
default behavior for Test::More to print diag() messages to stdout,
where they will be read by 'runtests' and shown by 'runtests -v'.  The
diag messages are still discarded when running in non-v (and non-o)
mode.

Change-Id: I971a61cb9c83e85949ba6adf9af0ee54b0b23680
Reviewed-on: https://gerrit.openafs.org/15734
Tested-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
2024-06-24 17:54:59 -04:00

73 lines
2.5 KiB
Perl

# Copyright (c) 2020 Sine Nomine Associates. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package afstest;
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(src_path obj_path);
use Test::More;
# Make Test::More print diag() messages to stdout, instead of stderr.
# Historically, diag() from Test::More prints to stderr, but diag() from
# c-tap-harness prints to stdout as part of the TAP stream. Running
# 'runtests -v' ignores stderr, so by default any perl diag()s are lost. Change
# the default behavior to diag() to stdout, so we can see diagnostics in
# 'runtests -v' when tests fail.
my $tb = Test::More->builder;
$tb->failure_output($tb->output);
sub
x_path($;$)
{
my ($env_var, $path) = @_;
my $tdir = $ENV{$env_var};
if (!defined($tdir)) {
# If C_TAP_SOURCE/C_TAP_BUILD isn't set, we assume we're running from
# the same cwd as one of the test programs (e.g. 'tests/foo/'). So to
# get to 'tests/', just go up one level.
$tdir = "..";
}
# $tdir now represents the 'tests/' dir. Go one level up to get to the
# top-level dir.
if (defined($path)) {
return "$tdir/../$path";
} else {
return "$tdir/..";
}
}
sub
src_path(;$)
{
my $path = $_[0];
return x_path("C_TAP_SOURCE", $path);
}
sub
obj_path(;$)
{
my $path = $_[0];
return x_path("C_TAP_BUILD", $path);
}