xref: /freebsd/contrib/pam-krb5/tests/valgrind/logs-t (revision bf6873c5786e333d679a7838d28812febf479a8a)
1#!/usr/bin/perl
2#
3# Check for errors in valgrind logs.
4#
5# The canonical version of this file is maintained in the rra-c-util package,
6# which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
7#
8# Copyright 2018-2019, 2021 Russ Allbery <eagle@eyrie.org>
9#
10# Permission is hereby granted, free of charge, to any person obtaining a
11# copy of this software and associated documentation files (the "Software"),
12# to deal in the Software without restriction, including without limitation
13# the rights to use, copy, modify, merge, publish, distribute, sublicense,
14# and/or sell copies of the Software, and to permit persons to whom the
15# Software is furnished to do so, subject to the following conditions:
16#
17# The above copyright notice and this permission notice shall be included in
18# all copies or substantial portions of the Software.
19#
20# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
23# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26# DEALINGS IN THE SOFTWARE.
27#
28# SPDX-License-Identifier: MIT
29
30use 5.010;
31use strict;
32use warnings;
33
34use lib "$ENV{C_TAP_SOURCE}/tap/perl";
35
36use Test::RRA;
37use Test::RRA::Automake qw(automake_setup);
38
39use File::Spec;
40use Test::More;
41
42# Skip this test if C_TAP_VALGRIND was not set.
43if (!exists $ENV{C_TAP_VALGRIND}) {
44    plan skip_all => 'Not testing under valgrind';
45}
46
47# Set up Automake testing.
48automake_setup({ chdir_build => 1 });
49
50# Gather the list of valgrind logs (and skip this test if there are none).
51opendir(my $logdir, File::Spec->catfile('tests', 'tmp', 'valgrind'))
52  or plan skip_all => 'No valgrind logs in tests/tmp/valgrind';
53my @logs = grep { m{ \A log [.] }xms } readdir $logdir;
54closedir($logdir) or BAIL_OUT("cannot close directory: $!");
55
56# Check each log file.
57plan tests => scalar(@logs);
58for my $file (@logs) {
59    my $path = File::Spec->catfile('tests', 'tmp', 'valgrind', $file);
60    open(my $log, '<', $path) or BAIL_OUT("cannot open $path: $!");
61    my $okay = 1;
62    my @log;
63    while (defined(my $line = <$log>)) {
64        push(@log, $line);
65        if ($line =~ m{ ERROR [ ] SUMMARY: [ ] (\d+) [ ] errors }xms) {
66            $okay = ($1 == 0);
67        }
68    }
69    close($log) or BAIL_OUT("cannot close $path: $!");
70    if ($okay) {
71        unlink($path);
72    } else {
73        for my $line (@log) {
74            print '# ', $line
75              or BAIL_OUT("cannot print to standard output: $!");
76        }
77    }
78    ok($okay, $path);
79}
80
81# Remove tests/tmp/valgrind if it's now empty.
82rmdir(File::Spec->catfile('tests', 'tmp', 'valgrind'));
83rmdir(File::Spec->catfile('tests', 'tmp'));
84