#!/bin/sh
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Scape errors from the valgrind bots, reproduce them locally,
# save logs as regrind-TESTNAME.log, and display any errors found.
# Also save files regrind-failed.txt listing failed tests,
# and regrind-failed-map.txt showing which bot URLs have which failed tests
# (handy when filing bugs).
#
# Only scrapes linux layout bot at the moment.
# TODO: handle layout tests that don't have obvious path to test file
# TODO: extend script to handle more kinds of errors and more tests

# where the valgrind layout bot results live
LAYOUT_URL="http://build.chromium.org/p/chromium.memory.full/builders/Webkit%20Linux%20(valgrind%20layout)"
# how many builds back to check
LAYOUT_COUNT=250

# regexp to match valgrind errors
PATTERN="are definitely|uninitialised|Unhandled exception|\
Invalid read|Invalid write|Invalid free|Source and desti|Mismatched free|\
unaddressable byte|vex x86|the 'impossible' happened|\
valgrind:.*: Assertion.*failed|VALGRIND INTERNAL ERROR"

usage() {
  echo "Usage: regrind.sh [--noscrape][--norepro][--keep]"
  echo "--noscrape: don't scrape bots, just use old regrind-failed.txt"
  echo "--norepro: don't reproduce locally"
  echo "--keep: keep temp files"
  exit 1
}

# Given a log on stdin, list all the tests that failed in that log.
layout_list_failed_tests() {
  grep "Command:.*LayoutTests" |
    sed 's/<.*>//' |
    sed 's/.*LayoutTests/LayoutTests/' |
    sort -u |
    tr -d '\015'
}

# Generate a list of failed tests in regrind-failed.txt by scraping bot.
# Scrape most recent first, so if user interrupts, he is left with fresh-ish data.
scrape_layout() {
  rm -f regrind-*.tmp* regrind-failed.txt regrind-failed-map.txt
  touch regrind-failed.txt

  # First, grab the number of the latest complete build.
  wget -q -O regrind-builds.html "$LAYOUT_URL"
  latest=`grep "<li><font .*" < regrind-builds.html | head -1 | sed 's/.*#//;s/<.*//'`

  echo "Fetching $LAYOUT_COUNT logs from bot"
  # Scrape the desired number of runs (150 is about one cycle)
  first=`expr $latest - $LAYOUT_COUNT`
  i=$latest
  while test $i -ge $first
  do
    url="$LAYOUT_URL/builds/$i/steps/valgrind%20test:%20layout/logs/stdio"
    wget -q -O regrind-$i.tmp "$url"
    # Did any tests fail in this file?
    layout_list_failed_tests < regrind-$i.tmp > regrind-$i.tmp.failed
    if test -s regrind-$i.tmp.failed
    then
      # Yes.  Log them to stdout,
      echo "$url"
      cat regrind-$i.tmp.failed
      # to the table regrind-failed-map.txt,
      cat regrind-$i.tmp.failed | sed "s,^,$url ,"   >> regrind-failed-map.txt
      # and, if not already there, to regrind-failed.txt.
      for test in `cat regrind-$i.tmp.failed`
      do
        fgrep "$test" regrind-failed.txt > /dev/null 2>&1 || echo "$test" >> regrind-failed.txt
      done
    else
      rm regrind-$i.tmp.failed
    fi
    # Sleep 1/3 sec per fetch
    case $i in
    *[036]) sleep 1;;
    esac
    i=`expr $i - 1`
  done

  # Finally, munge the logs to identify tests that probably failed.
  sh c.sh -l regrind-*.tmp > regrind-errfiles.txt
  cat `cat regrind-errfiles.txt` | layout_list_failed_tests > regrind-failed.txt
}

# Run the tests identified in regrind-failed.txt locally under valgrind.
# Save logs in regrind-$TESTNAME.log.
repro_layout() {
  echo Running `wc -l < regrind-failed.txt` layout tests.
  for test in `cat regrind-failed.txt`
  do
    logname="`echo $test | tr / _`"
    echo "sh tools/valgrind/valgrind_webkit_tests.sh $test"
    sh tools/valgrind/valgrind_webkit_tests.sh "$test" > regrind-"$logname".log 2>&1
    egrep "$PATTERN" < regrind-"$logname".log | sed 's/==.*==//'
  done
}

do_repro=1
do_scrape=1
do_cleanup=1
while test ! -z "$1"
do
  case "$1" in
  --noscrape) do_scrape=0;;
  --norepro) do_repro=0;;
  --keep) do_cleanup=0;;
  *) usage;;
  esac
  shift
done

echo "WARNING: This script is not supported and may be out of date"

if test $do_scrape = 0 && test $do_repro = 0
then
  usage
fi

if test $do_scrape = 1
then
  scrape_layout
fi

if test $do_repro = 1
then
  repro_layout
fi

if test $do_cleanup = 1
then
  rm -f regrind-errfiles.txt regrind-*.tmp*
fi
