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

"""Routines for reading performance results from a directory.

The directory should match the format created by the 'bootperf'
script; see comments in that script for a summary of the layout.

"""

import fnmatch
import os
import re

import resultset


_PERF_KEYVAL_PATTERN = re.compile("(.*){perf}=(.*)\n")


def _ReadKeyvalFile(results, file_):
  """Read an autotest keyval file, and process the results.

  The `file_` parameter is a file object with contents in autotest
  perf keyval format:
      <keyname>{perf}=<value>

  Each iteration of the test is terminated with a single blank line,
  including the last iteration.  Each iteration's results are added
  to the `results` parameter, which should be an instance of
  TestResultSet.

  @param results A TestResultSet where the result data will be
                 collected.
  @param file_ File object for the results file to be read.

  """
  kvd = {}
  for line in iter(file_):
    if line == "\n":
      results.AddIterationResults(kvd)
      kvd = {}
      continue
    m = _PERF_KEYVAL_PATTERN.match(line)
    if m is None:
      continue
    kvd[m.group(1)] = m.group(2)


_RESULTS_PATH = "summary/platform_BootPerfServer/results/keyval"


def ReadResultsDirectory(dir_):
  """Process results from a 'bootperf' output directory.

  The accumulated results are returned in a newly created
  TestResultSet object.

  @param dir_ The directory containing the test results keyval file.

  """
  res_set = resultset.TestResultSet(dir_)
  dirlist = fnmatch.filter(os.listdir(dir_), "run.???")
  dirlist.sort()
  for rundir in dirlist:
    keyval_path = os.path.join(dir_, rundir, _RESULTS_PATH)
    try:
      kvf = open(keyval_path)
    except IOError:
      continue
    _ReadKeyvalFile(res_set, kvf)
  res_set.FinalizeResults()
  return res_set
