#!/usr/local/bin/perl -w use strict; my $DOC = <<"EOF"; Usage: $0 Run first: - steps Args: -
- , contains packages processed by oracle_package - , , package/suite numbers such that packages/suites /.zip through /.zip will be processed by this script - , contains bin-ins/coverage.em Constants: - - Affects: -
/suites.txt_- Header: - SuiteNum, >= 1, corresponds to FaultNum - TstLen, max of steps.StepNum for SuiteNum - Events, TstLen * (max of steps.TstNum + 1) for SuiteNum - E2Cov, # event pairs covered - E3Cov, # event triples covered - ClassCov, % classes covered - MethodCov, % methods covered - BlockCov, % blocks covered - LineCov, % lines covered - Cov, max of steps.Cov for SuiteNum - Det, max of 0 and steps.Det for SuiteNum Lists information about each (SuiteNum=FaultNum). EOF ; if (@ARGV != 5) { print $DOC; exit 1; } my ($table_dir, $pkg_dir, $first, $last, $app_dir) = @ARGV; $table_dir =~ s|/$||; $pkg_dir =~ s|/$||; $app_dir =~ s|/$||; my $out_file = "$table_dir/suites.txt_$first-$last"; if (-e $out_file) { die "$out_file already exists\n"; } my $TMP = '/tmp/strecker'; my $EMMA_DIR = '/skollhomes/strecker'; my %suites; # key = SuiteNum my @curr_tst = (), my @curr_suite = (); my $prev_tst_num = 0, my $prev_suite_num = $first; $suites{$first}{'Cov'} = 0; $suites{$first}{'Det'} = 0; my $steps_file = "$table_dir/steps.txt"; open(STEPS, $steps_file) or die "Couldn't read $steps_file\n"; my $head = ; while () { # Assumes rows sorted by SuiteNum then TstNum then StepNum and >1 row per SuiteNum chomp; my ($suite_num, $tst_num, $step_num, $event_num, $cov, $det) = split; next if ($suite_num < $first); if (eof(STEPS)) { push @curr_tst, $event_num; if ($cov) { $suites{$suite_num}{'Cov'} = 1; } if ($det) { $suites{$suite_num}{'Det'} = 1; } } if ($prev_tst_num != $tst_num || eof(STEPS)) { my @curr_tst_copy = @curr_tst; push @curr_suite, \@curr_tst_copy; @curr_tst = (); $prev_tst_num = $tst_num; } if ($prev_suite_num != $suite_num || eof(STEPS)) { my $tst_len, my %e2cov, my %e3cov; foreach my $tst_ref (@curr_suite) { my @tst = @$tst_ref; if (defined $tst_len && $tst_len != scalar(@tst)) { die "Differing test-case lengths for SuiteNum=$suite_num\n"; } $tst_len = scalar(@tst); for (my $i = 0; $i <= $#tst - 1; $i++) { $e2cov{$tst[$i] . ',' . $tst[$i+1]} = 1; } for (my $i = 0; $i <= $#tst - 2; $i++) { $e3cov{$tst[$i] . ',' . $tst[$i+1] . ',' . $tst[$i+2]} = 1; } } $suites{$prev_suite_num}{'TstLen'} = $tst_len; $suites{$prev_suite_num}{'Events'} = $tst_len * scalar(@curr_suite); $suites{$prev_suite_num}{'E2Cov'} = scalar(keys %e2cov); $suites{$prev_suite_num}{'E3Cov'} = scalar(keys %e3cov); last if ($suite_num > $last || eof(STEPS)); @curr_suite = (); $suites{$suite_num}{'Cov'} = 0; $suites{$suite_num}{'Det'} = 0; $prev_suite_num = $suite_num; } push @curr_tst, $event_num; if ($cov) { $suites{$suite_num}{'Cov'} = 1; } if ($det) { $suites{$suite_num}{'Det'} = 1; } } close(STEPS); for (my $pkg_num = $first; $pkg_num <= $last; $pkg_num++) { if (-e "$TMP/$pkg_num") { `chmod -R u+w $TMP/$pkg_num`; `rm -r $TMP/$pkg_num`; if ($?) { die "Couldn't do rm -r $TMP/$pkg_num\n"; } } `unzip -q -d $TMP $pkg_dir/$pkg_num.zip "$pkg_num/cov-cln/*.ec"`; my $cov_cln_dir = "$TMP/$pkg_num/cov-cln"; my $report_file = "$TMP/report.xml"; if (-e $report_file) { `chmod -R u+w $report_file`; `rm -r $report_file`; if ($?) { die "Couldn't do rm -r $report_file\n"; } } my $suite_num = $pkg_num; my $ec_file_args = ''; foreach my $ec_file (<$cov_cln_dir/*>) { $ec_file_args .= "-in $ec_file "; } `java -cp $EMMA_DIR/emma.jar emma report $ec_file_args -in $app_dir/bin-ins/coverage.em -r xml -Dreport.xml.out.file=$report_file -Dreport.depth=all`; open(REPORT, $report_file) or die "Couldn't read $report_file\n"; while () { chomp; if (m| $b} keys %suites; for (my $i = 0; $i <= $#sorted_keys; $i++) { my $suite_num = $sorted_keys[$i]; push @lines, "$suite_num $suites{$suite_num}{'TstLen'} $suites{$suite_num}{'Events'} $suites{$suite_num}{'E2Cov'} $suites{$suite_num}{'E3Cov'} $suites{$suite_num}{'ClassCov'} $suites{$suite_num}{'MethodCov'} $suites{$suite_num}{'BlockCov'} $suites{$suite_num}{'LineCov'} $suites{$suite_num}{'Cov'} $suites{$suite_num}{'Det'}\n"; } open(OUT, ">$out_file") or die "Couldn't write to $out_file\n"; print OUT @lines; close(OUT);