# Copyright (c) 2009-2012 Zmanda, Inc.  All Rights Reserved.
# Copyright (c) 2013-2016 Carbonite, Inc.  All Rights Reserved.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
#
# Contact information: Carbonite Inc., 756 N Pastoria Ave
# Sunnyvale, CA 94086, USA, or: http://www.zmanda.com

use Test::More tests => 192;

use strict;
use warnings;
use Errno;
use Cwd qw(abs_path);
use lib '@amperldir@';

use Installcheck;
use Installcheck::Run qw( run run_get run_out run_err );
use Installcheck::Catalogs;
use Amanda::Paths;
use Amanda::Constants;
use Amanda::Util qw( slurp burp );
use Amanda::Debug;
use Amanda::Config qw ( :init :getconf config_dir_relative );

# easy knob to twiddle to check amreport_new instead
my $amreport = "amreport";

Amanda::Debug::dbopen("installcheck");
Installcheck::log_test_output();

# we use Text::Diff for diagnostics if it's installed
my $have_text_diff;
BEGIN {
    eval "use Text::Diff;";
    if ($@) {
	$have_text_diff = 0;
    } else {
	$have_text_diff = 1;
    }
}

# set up a fake "printer" for postscript output
my $printer_output = "$Installcheck::TMP/postscript-output";
$ENV{'INSTALLCHECK_MOCK_LPR_OUTPUT'} = $printer_output;
$ENV{'INSTALLCHECK_MOCK_LPR'} = abs_path("mock") . "/lpr";

# and a fake template
my $ps_template = "$Installcheck::TMP/postscript-template";
burp($ps_template, "--PS-TEMPLATE--\n");

# and a fake "mail" for email output
my $mail_output = "$Installcheck::TMP/mail-output";
$ENV{'INSTALLCHECK_MOCK_MAIL_OUTPUT'} = $mail_output;
my $mail_mock = abs_path("mock") . "/mail";

my $cat;
my $alternate_log_filename="$Installcheck::TMP/installcheck-log";
my $current_log_filename="$Installcheck::CONFIG_DIR/TESTCONF/log/log";
my $out_filename="$Installcheck::TMP/installcheck-amreport-output";

sub setup_config {
    my %params = @_;
    my $testconf = Installcheck::Run::setup();

    cleanup();

    my $mailer =
        $params{want_mailer}  ? "\"$mail_mock\""
      : $params{bogus_mailer} ? "\"$mail_mock.bogus\""
      :                         '""';                    #default

    if ($params{bogus_mailer}) {
	unlink "$mail_mock.bogus";
	if ($params{bogus_mailer} == 2) {
	    open "MAIL", ">$mail_mock.bogus";
	    close MAIL;
	}
	if ($params{bogus_mailer} == 3) {
	    # write garbage
	    open "MAIL", ">$mail_mock.bogus";
	    print MAIL "sdfsdn398gl32";
	    close MAIL;
	    chmod 0755, "$mail_mock.bogus";
	}
    }
    $testconf->add_param('mailer', $mailer);
    $testconf->add_param('mailto',
        $params{want_mailto} ? '"nobody\@localhost"' : '""');

    $testconf->add_tapetype('TEST-TAPE-TEMPLATE', [
	'length' => '30 mbytes',
	'filemark' => '4 kbytes',
	$params{'want_template'}? ('lbl_templ' => "\"$ps_template\""):(),
    ]);
    $testconf->add_param('tapetype', "\"TEST-TAPE-TEMPLATE\"");

    $testconf->remove_param('send_amreport_on');
    $testconf->add_param('send_amreport_on',
        exists $params{send_amreport} ? uc($params{send_amreport}) : "ALL"
    );

    if (defined $params{'runtapes'}) {
	$testconf->remove_param('runtapes');
	$testconf->add_param('runtapes', $params{'runtapes'});
    }
    if (defined $params{'tapecycle'}) {
	$testconf->remove_param('tapecycle');
	$testconf->add_param('tapecycle', $params{'tapecycle'});
    }

    if ($params{vault1}) {
	$testconf->add_storage("vtapes");
	$testconf->add_storage("vault");
	$testconf->add_param('storage', "\"vtapes\"");
	$testconf->add_param('vault-storage', "\"vault\"");
    }

    $testconf->write();

    undef $cat;
    if ($params{'catalog'}) {
	$cat = Installcheck::Catalogs::load($params{'catalog'});
	$cat->install();
    }
}

sub cleanup {
    unlink $out_filename;
    unlink $mail_output;
    unlink $printer_output;
    unlink $alternate_log_filename;
    unlink "$mail_mock.bogus";
}

# compare two multiline strings, giving a diff if they do not match
sub results_match
{
    my ( $a_filename, $b, $msg ) = @_;

    if ($a_filename eq 'stdout') {
	$a = $Installcheck::Run::stdout;
	if (!$a) {
	    diag("stdout is empty");
	    fail($msg);
	    return;
	}
    } else {
	if (!-f $a_filename) {
	    diag("'$a_filename' does not exist");
	    fail($msg);
	    return;
	}
	$a = slurp($a_filename);
    }

    my $is_ps = ($b =~ m/^--PS-TEMPLATE--/);

    my $cleanup = sub {
        my $str = shift;
        chomp $str;

        # strip out special characters
        $str =~ tr{\f}{};

	if ($is_ps) {
	    # old amreport underquotes the postscript strings
	    $str =~ s{\\\(}{(}mgx;
	    $str =~ s{\\\)}{)}mgx;
	} else {
	    # make human report insensitive to whitespace differences
	    $str =~ s{[\t ]+}{ }mgx;
	    $str =~ s{\s*\n[\n ]*\s*}{\n}mgx;
	}

        # chomp the version lines
        $str =~ s{\n\(brought to you by Amanda version .*$}{\n<versioninfo>}g;
	$str =~ s{\(Amanda Version .*\) DrawVers}{(Amanda Version x.y.z) DrawVers}g;

        return $str;
    };

    $a = $cleanup->($a);
    $b = $cleanup->($b);

    if ( $a eq $b ) {
        pass($msg);
    } else {
        my $diff;
        if ($have_text_diff) {
            $diff = diff( \$a, \$b, { 'STYLE' => "Unified" } );
        } else {
            $diff = "---- GOT: ----\n$a\n---- EXPECTED: ----\n$b\n---- ----";
        }
        fail($msg);
        diag($diff);
    }
}

# convert a regular report into what we expect to see in a mail
sub make_mail {
    my ($report, $config, $error, $date, $addr) = @_;
    my $error_msg ="";
    $error_msg = " FAIL:" if $error;
    return <<EOF . $report;
\$ARGS = ['-s','$config${error_msg} AMANDA MAIL REPORT FOR $date','$addr'];
EOF
}

## try a few various options with a pretty normal logfile.  Note that
## these tests all use amreport's script mode

setup_config(catalog => 'normal',
    want_mailer => 1, want_mailto => 1, want_template => 1);

like(run_err($amreport, 'TESTCONF-NOSUCH'),
    qr/could not open conf/,
    "amreport with bogus config exits with error status and error message");

ok(!run($amreport, 'TESTCONF-NOSUCH', '--help'),
    "amreport --help exits with status 1");
like($Installcheck::Run::stdout,
    qr/Usage: amreport \[--version\]/,
    "..and prints usage message");

like(run_get($amreport, 'TESTCONF-NOSUCH', '--version'),
    qr/^amreport-.*/,
    "amreport --version gives version");

ok(run($amreport, 'TESTCONF', '--from-amdump'),
    "amreport, as run from amdump, with mailer, mailto, and a template")
    or diag($Installcheck::Run::stderr);

is($Installcheck::Run::stdout, "", "..produces no output");
results_match($mail_output,
    make_mail($cat->get_text('rpt1'), "DailySet1", 0, "February 25, 2009", "nobody\@localhost"),
    "..mail matches");

results_match($printer_output,
    $cat->get_text('postscript'),
    "..printer output matches A");

ok(run($amreport, 'TESTCONF', '--from-amdump', '/garbage/directory/'),
    "amreport, as run from amdump, with mailer, mailto, and a template, and  bogus option")
    or diag($Installcheck::Run::stderr);
is($Installcheck::Run::stdout, "", "..produces no output");
results_match($mail_output,
    make_mail($cat->get_text('rpt1'), "DailySet1", 0, "February 25, 2009", "nobody\@localhost"),
    "..mail matches");
results_match($printer_output,
    $cat->get_text('postscript'),
    "..printer output matches B");

cleanup();

ok(run($amreport, 'TESTCONF', '-M', 'somebody@localhost'),
    "amreport -M, with mailer, mailto, and a template")
    or diag($Installcheck::Run::stderr);
is($Installcheck::Run::stdout, "", "..produces no output");
results_match($mail_output,
    make_mail($cat->get_text('rpt1'), "DailySet1", 0, "February 25, 2009", "somebody\@localhost"),
    "..mail matches");
results_match($printer_output,
    $cat->get_text('postscript'),
    "..printer output matches C");

cleanup();

ok(run($amreport, 'TESTCONF', '-i'),
    "amreport -i, with mailer, mailto, and a template => no error");
ok(! -f $mail_output,
    "..doesn't mail");
ok(! -f $printer_output,
    "..doesn't print");

cleanup();

ok(run($amreport, 'TESTCONF', '-p', $out_filename),
    "amreport -p, with mailer, mailto, and a template")
    or diag($Installcheck::Run::stderr);
is($Installcheck::Run::stdout, "", "..produces no output");
results_match($mail_output,
    make_mail($cat->get_text('rpt1'), "DailySet1", 0, "February 25, 2009", "nobody\@localhost"),
    "..mail matches");
ok(! -f $printer_output,
    "..doesn't print");
results_match($out_filename, $cat->get_text('postscript'), "..postscript file matches");

# test a bare 'amreport', which should now output to stdout
cleanup();

ok(run($amreport, 'TESTCONF'),
    "amreport with no other options outputs to stdout for user convenience")
  or diag($Installcheck::Run::stderr);
results_match('stdout', $cat->get_text('rpt1'),
    "..output matches");
ok(!-f $printer_output, "..no printer output")
  or diag("error: printer output!:\n" . burp($printer_output));
ok(!-f $mail_output, "..no mail output")
  or diag("error: mail output!:\n" . burp($printer_output));

# test long-form file option
cleanup();

ok(run($amreport, 'TESTCONF', "--text=$out_filename"),
    "amreport --text=foo, no other options")
  or diag($Installcheck::Run::stderr);
results_match($out_filename, $cat->get_text('rpt1'),
    "..output matches");
ok(!-f $printer_output, "..no printer output")
  or diag("error: printer output!:\n" . burp($printer_output));
ok(!-f $mail_output, "..no mail output")
  or diag("error: mail output!:\n" . burp($printer_output));

# test long form postscript option
cleanup();

ok(
    run($amreport, 'TESTCONF', '--ps', $out_filename),
    "amreport --ps foo, no other options"
);
results_match($out_filename, $cat->get_text('postscript'), '..results match');
ok(!-f $printer_output, "..no printer output");
ok(!-f $mail_output, "..no mail output");

cleanup();

# test new mail option, using config mailto
setup_config(catalog => 'normal',
	     want_mailer => 1, want_mailto => 1, want_template => 1);

ok(run($amreport, 'TESTCONF', '--mail-text'),
    "amreport --mail-text, no other options, built-in mailto");
results_match(
    $mail_output,
    make_mail(
        $cat->get_text('rpt1'), "DailySet1", 0,
        "February 25, 2009",   "nobody\@localhost"
    ),
    "..mail matches"
);
ok(!-f $printer_output, "..no printer output");
ok(!-f $out_filename,   "..no file output");

cleanup();

# test new mail option, using passed mailto
ok(run($amreport, 'TESTCONF', '--mail-text=somebody@localhost',),
    'amreport --mail-text=somebody\@localhost, no other options');
results_match(
    $mail_output,
    make_mail(
        $cat->get_text('rpt1'), "DailySet1", 0,
        "February 25, 2009",   "somebody\@localhost"
    ),
    "..mail matches"
);
ok(!-f $printer_output, "..no printer output");
ok(!-f $out_filename, "..no file output");

cleanup();

# test long-form log option
burp($alternate_log_filename, $cat->get_file('log/log'));
ok(
    run($amreport, 'TESTCONF', '--log', $alternate_log_filename),
    "amreport --log with old log, no other config options"
);
results_match('stdout', $cat->get_text('rpt1'),
    '..stdout output matches');
ok(!-f $mail_output, "..no mail output");
ok(!-f $out_filename, "..no file output");
ok(!-f $printer_output, "..no printer output");

cleanup();

# test long-form print option, without specified printer
setup_config(catalog => 'normal', want_template => 1);
ok(run($amreport, 'TESTCONF', '--print'),
    'amreport --print, no other options');
results_match(
    $printer_output,
    $cat->get_text('postscript'),
    "..printer output matches"
);
ok(!-f $mail_output,  "..no mail output");
ok(!-f $out_filename, "..no file output");

cleanup();

setup_config(catalog => 'normal',
    want_mailer => 1, want_mailto => 1, want_template => 1);
ok(run($amreport, 'TESTCONF', '-i', '-p', $out_filename),
    "amreport -i -p, with mailer, mailto, and a template")
    or diag($Installcheck::Run::stderr);
is($Installcheck::Run::stdout, "", "..produces no output");
ok(! -f $mail_output,
    "..produces no mail");
ok(! -f $printer_output,
    "..doesn't print");
results_match($out_filename,
    $cat->get_text('postscript'),
    "..postscript output in -p file matches");

cleanup();

ok(run($amreport, 'TESTCONF', '-i', '-f', $out_filename),
    "amreport -i -f, with mailer, mailto, and a template")
    or diag($Installcheck::Run::stderr);
is($Installcheck::Run::stdout, "", "..produces no output");
ok(! -f $mail_output,
    "..produces no mail");
results_match($printer_output,
    $cat->get_text('postscript'),
    "..printer output matches");
results_match($out_filename,
    $cat->get_text('rpt1'),
    "..report output in -f file matches");

cleanup();

burp($alternate_log_filename, $cat->get_file('log/log'));
ok(run($amreport, 'TESTCONF', '-l', $alternate_log_filename),
    "amreport -l, with mailer, mailto, and a template")
    or diag($Installcheck::Run::stderr);
is($Installcheck::Run::stdout, "", "..produces no output");
results_match($mail_output,
    make_mail($cat->get_text('rpt1'), "DailySet1", 0, "February 25, 2009", "nobody\@localhost"),
    "..mail matches");
results_match($printer_output,
    $cat->get_text('postscript'),
    "..printer output matches");

setup_config(catalog => 'normal',
    want_mailer => 1);

ok(run($amreport, 'TESTCONF', '--from-amdump'),
    "amreport --from-amdump, with mailer but no mailto and no template => exit==0");
ok(! -f $mail_output, "..doesn't mail");
ok(! -f $printer_output, "..doesn't print");

cleanup();

ok(run($amreport, 'TESTCONF', '--from-amdump', '-o', 'mailto=hello'),
    "amreport -o to set mailto, with mailer but no mailto and no template")
    or diag($Installcheck::Run::stderr);
is($Installcheck::Run::stdout, "", "..produces no output");
results_match($mail_output,
    make_mail($cat->get_text('rpt1'), "DailySet1", 0, "February 25, 2009", "hello"),
    "..mail matches");
ok(! -f $printer_output,
    "..doesn't print");

cleanup();

like(run_out($amreport, 'TESTCONF', '--from-amdump', '-o', 'mailto=ill\egal'),
    qr/mail addresses have invalid characters/,
    "amreport with illegal email in -o, with mailer but no mailto and no template, errors out");

like(run_err($amreport, 'TESTCONF', '--mail-text=ill\egal'),
    qr/mail addresses have invalid characters/,
    "amreport with illegal email in -o, with mailer but no mailto and no template, errors out");

setup_config(catalog => 'normal',
    want_mailer => 1, want_template => 1);

ok(run($amreport, 'TESTCONF', '--from-amdump'),
    "no-args amreport with mailer, no mailto, and a template does nothing even though it could "
	. "print a label"); # arguably a bug, but we'll keep it for now
ok(! -f $mail_output, "..doesn't mail");
ok(! -f $printer_output, "..doesn't print");

cleanup();

ok(run($amreport, 'TESTCONF', '--from-amdump', '-o', 'mailto=dustin'),
    "amreport with mailer, no mailto, and a template, but mailto in config override works")
    or diag($Installcheck::Run::stderr);
is($Installcheck::Run::stdout, "", "..produces no output");
results_match($mail_output,
    make_mail($cat->get_text('rpt1'), "DailySet1", 0, "February 25, 2009", "dustin"),
    "..mail matches");
results_match($printer_output,
    $cat->get_text('postscript'),
    "..printer output matches");

ok(run($amreport, 'TESTCONF', '-M', 'pcmantz'),
    "amreport with mailer, no mailto, and a template, but mailto in -M works")
    or diag($Installcheck::Run::stderr);
is($Installcheck::Run::stdout, "", "..produces no output");
results_match($mail_output,
    make_mail($cat->get_text('rpt1'), "DailySet1", 0, "February 25, 2009", "pcmantz"),
    "..mail matches");
results_match($printer_output,
    $cat->get_text('postscript'),
    "..printer output matches");

setup_config(catalog => 'normal', want_template => 1);

like(run_get($amreport, 'TESTCONF', '-M', 'martineau'),
    qr/Warning: a mailer is not defined/,
    "amreport with no mailer, no mailto, and a template, but mailto in -M fails with "
	. "warning, but exit==0");
ok(! -f $mail_output, "..doesn't mail");
ok(! -f $printer_output, "..doesn't print");

setup_config(catalog => 'normal',
	want_mailer => 1, want_mailto => 1);

ok(run($amreport, 'TESTCONF', '-p', $out_filename), # XXX another probable bug
    "amreport with mailer, mailto, but no template, ignores -p option ")
    or diag($Installcheck::Run::stderr);
is($Installcheck::Run::stdout, "", "..produces no output");
results_match($mail_output,
    make_mail($cat->get_text('rpt1'), "DailySet1", 0, "February 25, 2009", "nobody\@localhost"),
    "..mail matches");
ok(! -f $printer_output,
    "..doesn't print");

cleanup();

ok(run($amreport, 'TESTCONF', '-o', "tapetype:TEST-TAPE-TEMPLATE:lbl_templ=$ps_template",
					    '-p', $out_filename),
    "amreport with mailer, mailto, but no template, minds -p option if template given via -o")
    or diag($Installcheck::Run::stderr);
is($Installcheck::Run::stdout, "", "..produces no output");
results_match($mail_output,
    make_mail($cat->get_text('rpt1'), "DailySet1", 0, "February 25, 2009", "nobody\@localhost"),
    "..mail matches");
results_match($out_filename,
    $cat->get_text('postscript'),
    "..printer output matches");

setup_config(catalog => 'normal',
	bogus_mailer => 1, want_mailto => 1, want_template => 1);

ok(run($amreport, 'TESTCONF', '--from-amdump'),
    "amreport with bogus mailer (1); doesn't mail, still prints")
  or diag($Installcheck::Run::stderr);
ok(!-f $mail_output, "..produces no mail output");
is($Installcheck::Run::stdout, "", "..produces no stdout output");
$! = &Errno::ENOENT;
my $enoent = $!;
like($Installcheck::Run::stderr,
     qr/^error: the mailer '.*': $enoent$/,
     "..produces correct stderr output");

setup_config(catalog => 'normal',
	bogus_mailer => 2, want_mailto => 1, want_template => 1);

ok(run($amreport, 'TESTCONF', '--from-amdump'),
    "amreport with bogus mailer (2); doesn't mail, still prints")
  or diag($Installcheck::Run::stderr);
ok(!-f $mail_output, "..produces no mail output");
is($Installcheck::Run::stdout, "", "..produces no stdout output");
$! = &Errno::ENOENT;
#my $enoent = $!;
like($Installcheck::Run::stderr,
     qr/^error: the mailer '.*' is not an executable program/,
     "..produces correct stderr output");


setup_config(catalog => 'normal',
	bogus_mailer => 3, want_mailto => 1, want_template => 1);

ok(run($amreport, 'TESTCONF', '--from-amdump'),
    "amreport with bogus mailer (3); doesn't mail, still prints")
  or diag($Installcheck::Run::stderr);
ok(!-f $mail_output, "..produces no mail output");
is($Installcheck::Run::stderr, "", "..produces no stderr output");
$! = &Errno::ENOENT;
#my $enoent = $!;
like($Installcheck::Run::stdout,
     qr/^.*: sdfsdn398gl32: (command |)not found/,
     "..produces correct stderr output");
results_match(
    $printer_output,
    $cat->get_text('postscript'),
    "..printer output matches"
);

setup_config(
    catalog => 'normal',
    want_mailer   => 1,
    want_mailto   => 1,
    want_template => 1,
    send_amreport => 'error'
);

ok(
    run($amreport, 'TESTCONF', '--from-amdump'),
"amreport with CNF_SEND_AMREPORT_ON set to errors only, no mail, still prints"
) or diag($Installcheck::Run::stderr);
ok(!-f $mail_output, "..produces no mail output") or diag(slurp $mail_output);
is($Installcheck::Run::stdout, "", "..produces no stdout output")
  or diag($Installcheck::Run::stdout);
results_match(
    $printer_output,
    $cat->get_text('postscript'),
    "..printer output matches"
);

## test columnspec adjustments, etc.

setup_config(catalog => 'normal');

ok(run($amreport, 'TESTCONF', '-f', $out_filename, '-o', 'columnspec=OrigKB=::2'),
    "amreport with OrigKB=::2");
results_match($out_filename, $cat->get_text('rpt2'),
    "..result matches 1");

ok(run($amreport, 'TESTCONF', '-f', $out_filename, '-o', 'columnspec=OrigKB=:5'),
    "amreport with OrigKB=:5");
results_match($out_filename, $cat->get_text('rpt3'),
    "..result matches 2");

ok(run($amreport, 'TESTCONF', '-f', $out_filename, '-o', 'columnspec=OrigKB=:5:6'),
    "amreport with OrigKB=:5:6");
results_match($out_filename, $cat->get_text('rpt4'),
    "..result matches 3");

ok(run($amreport, 'TESTCONF', '-f', $out_filename, '-o', 'displayunit=m'),
    "amreport with displayunit=m");
results_match($out_filename, $cat->get_text('rpt5'),
    "..result matches 4");

setup_config(catalog => 'doublefailure',
    want_mailer => 1, want_template => 1);

ok(!run($amreport, 'TESTCONF', '-M', 'dustin'),
    "amreport with log in error")
    or diag($Installcheck::Run::stderr);
is($Installcheck::Run::stdout, "", "..produces no output");
results_match($mail_output,
    make_mail($cat->get_text('report'), "DailySet1", 1, "March 26, 2009", "dustin"),
    "..mail matches");

## some (anonymized) real logfiles, for regression testing

setup_config(catalog => 'strontium', want_template => 1);

ok(run($amreport, 'TESTCONF', '-f', $out_filename),
    "amreport with strontium logfile (simple example with multiple levels)");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 5");
results_match($printer_output,
    $cat->get_text('postscript'),
    "..printer output matches");

setup_config(catalog => 'amflush', want_template => 1);

ok(run($amreport, 'TESTCONF', '-f', $out_filename),
    "amreport with amflush logfile (regression check for flush-related DUMP STATUS)");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 6");
results_match($printer_output,
    $cat->get_text('postscript'),
    "..printer output matches");

setup_config(catalog => 'resultsmissing', want_template => 1);

run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 12,
    "amreport with resultsmissing logfile ('RESULTS MISSING') exit==12");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 7");
results_match($printer_output,
    $cat->get_text('postscript'),
    "..printer output matches");

setup_config(catalog => 'shortstrange', want_template => 1);

run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 2,
    "amreport with shortstrange logfile exit==2");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 8");
results_match($printer_output,
    $cat->get_text('postscript'),
    "..printer output matches");

setup_config(catalog => 'longstrange', want_template => 1);

run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 2,
    "amreport with longstrange logfile exit==2");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 9");

setup_config(catalog => 'doublefailure', want_template => 1);

run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 4,
    "amreport with doublefailure logfile exit==4");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 10");
results_match($printer_output,
    $cat->get_text('postscript'),
    "..printer output matches");

setup_config(catalog => 'bigestimate', want_template => 1);

run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 0,
    "amreport with bigestimate logfile exit==0");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 11");
results_match($printer_output,
    $cat->get_text('postscript'),
    "..printer output matches");

setup_config(catalog => 'retried', want_template => 1);

run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 0,
    "amreport with retried logfile exit==0");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 12");
results_match($printer_output,
    $cat->get_text('postscript'),
    "..printer output matches");

setup_config(catalog => 'retried-strange');

run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 2,
    "amreport with retried logfile, with strange exit==2");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 13");

setup_config(catalog => 'retried-nofinish', want_template => 1);

run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 0,
    "amreport with retried logfile where driver did not finish exit==0");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 14");

setup_config(catalog => 'taperr', want_template => 1);

run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 16,
    "amreport with taperr logfile exit==16");
results_match($out_filename, $cat->get_text('report-holding'),
    "..result matches 15");
ok((-f $printer_output and -z $printer_output),
    "..printer output exists but is empty");

burp($alternate_log_filename, $cat->get_file('log/log'));

# use an explicit -l here so amreport doesn't try to look at the holding disk
run($amreport, 'TESTCONF', '-f', $out_filename, '-l', $alternate_log_filename);
is($Installcheck::Run::exit_code, 16,
    "amreport with taperr logfile specified explicitly exit==16");
results_match($out_filename, $cat->get_text('report-noholding'),
    "..result matches 16");

setup_config(catalog => 'tapers', want_template => 1);
burp($alternate_log_filename, $cat->get_file('log/log'));
run($amreport, 'TESTCONF', '-f', $out_filename, '-l', $alternate_log_filename, '-odisplayunit=g');
is($Installcheck::Run::exit_code, 16,
    "amreport with tapers logfile exit==16");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 16s");

setup_config(catalog => 'tapers1', want_template => 1);
burp($alternate_log_filename, $cat->get_file('log/log'));
run($amreport, 'TESTCONF', '-f', $out_filename, '-l', $alternate_log_filename);
is($Installcheck::Run::exit_code, 16,
    "amreport with taperss logfile exit==16");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 16s1");

setup_config(catalog => 'spanned', want_template => 1);

run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 0,
    "amreport with spanned logfile");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 17");
results_match($printer_output,
    $cat->get_text('postscript'),
    "..printer output matches");

setup_config(catalog => 'fatal', want_template => 1);

run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 5,
    "amreport with fatal logfile");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 18");
ok(-f $printer_output && -z $printer_output,
    "..printer output is empty (no dumps, no tapes)");

setup_config(catalog => 'flush-origsize', want_template => 1);

run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 0,
    "amreport with flush-origsize");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 19");

setup_config(catalog => 'flush-noorigsize', want_template => 1);

run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 0,
    "amreport with flush-noorigsize");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 20");

setup_config(catalog => 'plannerfail', want_template => 1);

run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 4,
    "amreport with a planner failure (failed)");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 21");

setup_config(catalog => 'skipped', want_template => 1);

run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 0,
    "amreport with a planner skipped dump (success)");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 22");

setup_config(catalog => 'filesystemstaped', want_template => 1, runtapes => 3, tapecycle => 5);

run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 0,
    "amreport correctly report filesystem taped (success)");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 23");

setup_config(catalog => 'multi-taper', want_template => 0);

config_init($CONFIG_INIT_EXPLICIT_NAME, "TESTCONF");
my $logdir = config_dir_relative(getconf($CNF_LOGDIR));
my $logfile = $logdir . "/log.20100908110856.0";
run($amreport, 'TESTCONF', '-l', $logfile, '-f', $out_filename, '-o', 'TAPETYPE:TEST-TAPE-TEMPLATE:length=41m');
is($Installcheck::Run::exit_code, 0,
    "amreport correctly report multi-taper (success)");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 24");

setup_config(catalog => 'dumper-tryagain', want_template => 0);

config_init($CONFIG_INIT_EXPLICIT_NAME, "TESTCONF");
run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 4,
    "amreport correctly report try-again (error)");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 25");

setup_config(catalog => 'dumper-chunker-taper-success', want_template => 0);

config_init($CONFIG_INIT_EXPLICIT_NAME, "TESTCONF");
run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 0,
    "amreport correctly report dumper-chunker-taper-success");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 26");

setup_config(catalog => 'dumper-taper-success', want_template => 0);

config_init($CONFIG_INIT_EXPLICIT_NAME, "TESTCONF");
run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 0,
    "amreport correctly report dumper-taper-success");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 27");

setup_config(catalog => 'vault1', want_template => 0, vault1 => 1);

config_init($CONFIG_INIT_EXPLICIT_NAME, "TESTCONF");
run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 4,
    "amreport correctly report vault1");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 28");

setup_config(catalog => 'vault2', want_template => 0, vault1 => 1);

config_init($CONFIG_INIT_EXPLICIT_NAME, "TESTCONF");
run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 0,
    "amreport correctly report vault2");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 29");

setup_config(catalog => 'vault3', want_template => 0, vault1 => 1);

config_init($CONFIG_INIT_EXPLICIT_NAME, "TESTCONF");
run($amreport, 'TESTCONF', '-f', $out_filename);
is($Installcheck::Run::exit_code, 0,
    "amreport correctly report vault3");
results_match($out_filename, $cat->get_text('report'),
    "..result matches 30");
exit;

cleanup();
