gecko/testing/tinderbox-standalone-tests/Tests/BloatTest2.pm

136 lines
5.2 KiB
Perl

sub BloatTest2 {
my ($binary, $build_dir, $timeout_secs) = @_;
my $binary_basename = File::Basename::basename($binary);
my $binary_dir = File::Basename::dirname($binary);
my $PERL = $^X;
if ($Settings::OS =~ /^WIN/ && $build_dir !~ m/^.:\//) {
chomp($build_dir = `cygpath -w $build_dir`);
$build_dir =~ s/\\/\//g;
$PERL = "perl";
}
my $binary_log = "$build_dir/bloattest2.log";
my $malloc_log = "$build_dir/malloc.log";
my $sdleak_log = "$build_dir/sdleak.log";
my $old_sdleak_log = "$build_dir/sdleak.log.old";
my $leakstats_log = "$build_dir/leakstats.log";
my $old_leakstats_log = "$build_dir/leakstats.log.old";
my $sdleak_diff_log = "$build_dir/sdleak.diff.log";
local $_;
unless (-e "$binary_dir/bloaturls.txt") {
Util::print_log("Error: bloaturls.txt does not exist.\n");
return 'testfailed';
}
my $platform = $Settings::OS =~ /^WIN/ ? 'windows' : 'unix';
# If on Windows, make sure the urls file has dos lineendings, or
# mozilla won't parse the file correctly
if ($platform eq 'windows') {
my $bu = "$binary_dir/bloaturls.txt";
open(IN,"$bu") || die ("$bu: $!\n");
open(OUT,">$bu.new") || die ("$bu.new: $!\n");
while (<IN>) {
if (! m/\r\n$/) {
s/\n$/\r\n/;
}
print OUT "$_";
}
close(IN);
close(OUT);
File::Copy::move("$bu.new", "$bu") or die("move: $!\n");
}
rename($sdleak_log, $old_sdleak_log);
my @args;
if($Settings::BinaryName eq "TestGtkEmbed" ||
$Settings::BinaryName =~ /^firefox/) {
@args = ($binary_basename, "-P", $Settings::MozProfileName,
"resource:///res/bloatcycle.html",
"--trace-malloc", $malloc_log);
} else {
@args = ($binary_basename, "-P", $Settings::MozProfileName,
"-f", "bloaturls.txt",
"--trace-malloc", $malloc_log);
}
# win32 builds crash on multiple runs when --shutdown-leaks is used
@args = (@args, "--shutdown-leaks", $sdleak_log) unless $Settings::OS =~ /^WIN/;
my $result = Util::run_cmd($build_dir, $binary_dir, \@args, $timeout_secs);
Util::print_logfile($binary_log, "trace-malloc bloat test");
if ($result->{timed_out}) {
Util::print_log("Error: bloat test timed out after"
." $timeout_secs seconds.\n");
return 'testfailed';
} elsif ($result->{exit_value}) {
Util::print_test_errors($result, $binary_basename);
Util::print_log("Error: bloat test failed.\n");
return 'testfailed';
}
rename($leakstats_log, $old_leakstats_log);
if ($Settings::OS =~ /^WIN/) {
@args = ("leakstats", $malloc_log);
} else {
@args = ("run-mozilla.sh", "./leakstats", $malloc_log);
}
$result = Util::run_cmd($build_dir, $binary_dir, \@args, $timeout_secs);
Util::print_logfile($leakstats_log, "trace-malloc bloat test: leakstats");
my $newstats = ReadLeakstatsLog($leakstats_log);
my $oldstats;
if (-e $old_leakstats_log) {
$oldstats = ReadLeakstatsLog($old_leakstats_log);
} else {
$oldstats = $newstats;
}
my $leakchange = PercentChange($oldstats->{'leaks'}, $newstats->{'leaks'});
my $mhschange = PercentChange($oldstats->{'mhs'}, $newstats->{'mhs'});
my $leaks_testname_label = "Leaks: total bytes 'malloc'ed and not 'free'd";
my $maxheap_testname_label = "Maximum Heap: max (bytes 'malloc'ed - bytes 'free'd) over run";
my $allocs_testname_label = "Allocations: number of calls to 'malloc' and friends";
my $embed_prefix = "";
if($Settings::BinaryName eq "TestGtkEmbed") {
$embed_prefix = "m";
}
my $leaks_testname = "trace_malloc_leaks";
Util::print_log_test_result_bytes($leaks_testname, $leaks_testname_label,
$newstats->{'leaks'},
$embed_prefix . 'Lk', 3);
my $maxheap_testname = "trace_malloc_maxheap";
Util::print_log_test_result_bytes($maxheap_testname,
$maxheap_testname_label,
$newstats->{'mhs'},
$embed_prefix . 'MH', 3);
my $allocs_testname = "trace_malloc_allocs";
Util::print_log_test_result_count($allocs_testname, $allocs_testname_label,
$newstats->{'allocs'},
$embed_prefix . 'A', 3);
if ($Settings::TestsPhoneHome) {
# Send results to server.
Util::send_results_to_server($newstats->{'leaks'}, "--", $leaks_testname);
Util::send_results_to_server($newstats->{'mhs'}, "--", $maxheap_testname);
Util::send_results_to_server($newstats->{'allocs'}, "--", $allocs_testname);
}
if (-e $old_sdleak_log && -e $sdleak_log) {
Util::print_logfile($old_leakstats_log, "previous run of trace-malloc bloat test leakstats");
@args = ($PERL, "$build_dir/mozilla/tools/trace-malloc/diffbloatdump.pl", "--depth=15", $old_sdleak_log, $sdleak_log);
$result = Util::run_cmd($build_dir, $binary_dir, \@args, $timeout_secs);
Util::print_logfile($sdleak_diff_log, "trace-malloc leak stats differences");
}
return 'success';
}
1;