#!/usr/bin/env python
# Copyright 2016 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.


import json
import os
import unittest

import generate_legacy_perf_dashboard_json

class LegacyResultsProcessorUnittest(unittest.TestCase):
  def setUp(self):
    """Set up for all test method of each test method below."""
    super(LegacyResultsProcessorUnittest, self).setUp()
    self.data_directory = os.path.join(os.path.dirname(
      os.path.abspath(__file__)), 'testdata')

  def _ConstructDefaultProcessor(self):
    """Creates a LegacyResultsProcessor instance.

    Returns:
      An instance of LegacyResultsProcessor class
    """
    return generate_legacy_perf_dashboard_json.LegacyResultsProcessor()

  def _ProcessLog(self, log_processor, logfile):  # pylint: disable=R0201
    """Reads in a input log file and processes it.

    This changes the state of the log processor object; the output is stored
    in the object and can be gotten using the PerformanceLogs() method.

    Args:
      log_processor: An PerformanceLogProcessor instance.
      logfile: File name of an input performance results log file.
    """
    for line in open(os.path.join(self.data_directory, logfile)):
      log_processor.ProcessLine(line)

  def _CheckFileExistsWithData(self, logs, graph):
    """Asserts that |graph| exists in the |logs| dict and is non-empty."""
    self.assertTrue(graph in logs, 'File %s was not output.' % graph)
    self.assertTrue(logs[graph], 'File %s did not contain data.' % graph)

  def _ConstructParseAndCheckLogfiles(self, inputfiles, graphs):
    """Uses a log processor to process the given input files.

    Args:
      inputfiles: A list of input performance results log file names.
      logfiles: List of expected output ".dat" file names.

    Returns:
      A dictionary mapping output file name to output file lines.
    """
    parser = self._ConstructDefaultProcessor()
    for inputfile in inputfiles:
      self._ProcessLog(parser, inputfile)

    logs = json.loads(parser.GenerateGraphJson())
    for graph in graphs:
      self._CheckFileExistsWithData(logs, graph)

    return logs

  def _ConstructParseAndCheckJSON(
      self, inputfiles, logfiles, graphs):
    """Processes input with a log processor and checks against expectations.

    Args:
      inputfiles: A list of input performance result log file names.
      logfiles: A list of expected output ".dat" file names.
      subdir: Subdirectory containing expected output files.
      log_processor_class: A log processor class.
    """
    logs = self._ConstructParseAndCheckLogfiles(inputfiles, graphs)
    index = 0
    for filename in logfiles:
      graph_name = graphs[index]
      actual = logs[graph_name]
      path = os.path.join(self.data_directory, filename)
      expected = json.load(open(path))
      self.assertEqual(expected, actual, 'JSON data in %s did not match '
          'expectations.' % filename)

      index += 1


  def testSummary(self):
    graphs = ['commit_charge',
        'ws_final_total', 'vm_final_browser', 'vm_final_total',
        'ws_final_browser', 'processes', 'artificial_graph']
    # Tests the output of "summary" files, which contain per-graph data.
    input_files = ['graphing_processor.log']
    output_files = ['%s-summary.dat' % graph for graph in graphs]

    self._ConstructParseAndCheckJSON(input_files, output_files, graphs)


if __name__ == '__main__':
  unittest.main()
