#!/usr/bin/python
#
# Copyright 2010 Google Inc. All Rights Reserved.

"""Script to summarize the results of various log files."""

__author__ = "raymes@google.com (Raymes Khoury)"

from utils import command_executer
import os
import sys
import re

RESULTS_DIR = "results"
RESULTS_FILE = RESULTS_DIR + "/results.csv"

class DejaGNUSummarizer:
  def Matches(self, log_file):
    for log_line in log_file:
      if log_line.find("""tests ===""") > -1:
        return True
    return False

  def Summarize(self, log_file, filename):
    result = ""
    pass_statuses = ["PASS", "XPASS"]
    fail_statuses = ["FAIL", "XFAIL", "UNSUPPORTED"]
    name_count = {}
    for line in log_file:
      line = line.strip().split(":")
      if len(line) > 1 and (line[0] in pass_statuses or
                            line[0] in fail_statuses):
        test_name = (":".join(line[1:])).replace("\t", " ").strip()
        count = name_count.get(test_name, 0) + 1
        name_count[test_name] = count
        test_name = "%s (%s)" % (test_name, str(count))
        if line[0] in pass_statuses:
          test_result = "pass"
        else:
          test_result = "fail"
        result += "%s\t%s\t%s\n" % (test_name, test_result, filename)
    return result


class PerflabSummarizer:
  def Matches(self, log_file):
    p = re.compile("METRIC isolated \w+")
    for log_line in log_file:
      if p.search(log_line):
        return True
    return False

  def Summarize(self, log_file, filename):
    result = ""
    p = re.compile("METRIC isolated (\w+) .*\['(.*?)'\]")
    log_file_lines = "\n".join(log_file)
    matches = p.findall(log_file_lines)
    for match in matches:
      if len(match) != 2:
        continue
      result += "%s\t%s\n" % (match[0], match[1])
    return result


class AutoTestSummarizer:
  def Matches(self, log_file):
    for log_line in log_file:
      if log_line.find("""Installing autotest on""") > -1:
        return True
    return False

  def Summarize(self, log_file, filename):
    result = ""
    pass_statuses = ["PASS"]
    fail_statuses = ["FAIL"]
    for line in log_file:
      line = line.strip().split(" ")
      if len(line) > 1 and (line[-1].strip() in pass_statuses or
                            line[-1].strip() in fail_statuses):
        test_name = (line[0].strip())
        if line[-1].strip() in pass_statuses:
          test_result = "pass"
        else:
          test_result = "fail"
        result += "%s\t%s\t%s\n" % (test_name, test_result, filename)
    return result

def Usage():
  print "Usage: %s log_file" % sys.argv[0]
  sys.exit(1)


def SummarizeFile(filename):
  summarizers = [DejaGNUSummarizer(), AutoTestSummarizer(), PerflabSummarizer()]
  input = open(filename, 'rb')
  executer = command_executer.GetCommandExecuter()
  for summarizer in summarizers:
    input.seek(0)
    if summarizer.Matches(input):
      executer.CopyFiles(filename, RESULTS_DIR, recursive=False)
      input.seek(0)
      result = summarizer.Summarize(input, os.path.basename(filename))
      input.close()
      return result
  input.close()
  return None


def Main(argv):
  if len(argv) != 2:
    Usage()
  filename = argv[1]

  executer = command_executer.GetCommandExecuter()
  executer.RunCommand("mkdir -p %s" % RESULTS_DIR)
  summary = SummarizeFile(filename)
  if summary is not None:
    output = open(RESULTS_FILE, "a")
    output.write(summary.strip() + "\n")
    output.close()
  return 0

if __name__ == "__main__":
  retval = Main(sys.argv)
  sys.exit(retval)

