# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package Apache::TestReport;
use strict;
use warnings FATAL => 'all';
use Apache::Test ();
use Apache::TestConfig ();
use File::Spec::Functions qw(catfile);
use File::Find;
sub new {
my $class = shift;
bless { @_ }, $class;
}
# generate t/REPORT script (or a different filename) which will drive
# Apache::TestReport
sub generate_script {
my ($class, $file) = @_;
$file ||= catfile 't', 'REPORT';
my $content = join "\n",
"BEGIN { eval { require blib && blib->import; } }",
Apache::TestConfig->perlscript_header,
"use $class;",
"$class->new(\@ARGV)->run;";
Apache::Test::basic_config()->write_perlscript($file, $content);
}
sub replace {
my($self, $template) = @_;
$template =~ s{\@(\w+)\@} {
my $method = lc $1;
eval { $self->$method() } || $self->{$1} || '';
}eg;
$template;
}
sub run {
my $self = shift;
print $self->replace($self->template);
}
sub config { Apache::TestConfig::as_string() }
sub report_to { '[email protected]' }
sub postit_note {
my $self = shift;
my($to, $where) = split '@', $self->report_to;
return <<EOF;
Note: Complete the rest of the details and post this bug report to
$to <at> $where. To subscribe to the list send an empty
email to $to-subscribe\@$where.
EOF
}
sub executable { $0 }
my $core_dump;
sub core_dump {
my $self = shift;
$core_dump = "";
if (eval { require Devel::GDB }) {
find(\&dump_core_file, 't')
}
$core_dump || ' [CORE TRACE COMES HERE]';
}
sub dump_core_file {
return unless /^core(\.\d+)?$/;
my $core = $_;
my $gdb = new Devel::GDB ();
my $test_config = Apache::TestConfig->new({thaw=>1});
my $httpd = $test_config->{vars}->{httpd};
return unless defined $httpd;
$core_dump .= join '',
$gdb->get("file $httpd"),
$gdb->get('sharedlibrary'),
$gdb->get("core $core"),
$gdb->get('info threads'),
$gdb->get('thread apply all bt');
}
sub date { scalar gmtime() . " GMT" }
sub template {
<<'EOI'
-------------8<---------- Start Bug Report ------------8<----------
1. Problem Description:
[DESCRIBE THE PROBLEM HERE]
2. Used Components and their Configuration:
@CONFIG@
3. This is the core dump trace: (if you get a core dump):
@CORE_DUMP@
This report was generated by @EXECUTABLE@ on @DATE@.
-------------8<---------- End Bug Report --------------8<----------
@POSTIT_NOTE@
EOI
}
1;
__END__
=head1 NAME
Apache::TestReport - A parent class for generating bug/success reports
=head1 Synopsis
use Apache::TestReport;
Apache::TestReport->new(@ARGV)->run;
=head1 Description
This class is used to generate a bug or a success report, providing
information about the system the code was running on.
=head1 Overridable Methods
=head2 config
return the information about user's system
=head2 report_to
return a string containing the email address the report should be sent
to
=head2 postit_note
return a string to close the report with, e.g.:
my($to, $where) = split '@', $self->report_to;
return <<EOF;
Note: Complete the rest of the details and post this bug report to
$to <at> $where. To subscribe to the list send an empty
email to $to-subscribe\@$where.
=cut