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

"""Unittest for crosperf."""
import atexit
import os
import optparse
import StringIO


import mock
import unittest

import crosperf
import settings_factory
import experiment_file
import experiment_runner

from help import Help

from cros_utils import command_executer
from cros_utils import logger

EXPERIMENT_FILE_1 = """
  board: x86-alex
  remote: chromeos-alex3
  perf_args: record -a -e cycles
  benchmark: PageCycler {
    iterations: 3
  }

  image1 {
    chromeos_image: /usr/local/google/cros_image1.bin
  }

  image2 {
    remote: chromeos-lumpy1
    chromeos_image: /usr/local/google/cros_image2.bin
  }
  """

class CrosperfTest(unittest.TestCase):

  def setUp(self):
    input_file = StringIO.StringIO(EXPERIMENT_FILE_1)
    self.exp_file = experiment_file.ExperimentFile(input_file)

  def test_setup_parser_options(self):

    parser = optparse.OptionParser(usage=Help().GetUsage(),
                                   description=Help().GetHelp(),
                                   formatter=crosperf.MyIndentedHelpFormatter(),
                                   version="%prog 3.0")
    parser.add_option("-l", "--log_dir",
                      dest="log_dir",
                      default="",
                      help="The log_dir, default is under <crosperf_logs>/logs")
    options_before = parser._get_all_options()
    self.assertEqual(len(options_before), 3)
    crosperf.SetupParserOptions(parser)
    options_after = parser._get_all_options()
    self.assertEqual(len(options_after), 29)


  def test_convert_options_to_settings(self):
    parser = optparse.OptionParser(usage=Help().GetUsage(),
                                   description=Help().GetHelp(),
                                   formatter=crosperf.MyIndentedHelpFormatter(),
                                   version="%prog 3.0")
    parser.add_option("-l", "--log_dir",
                      dest="log_dir",
                      default="",
                      help="The log_dir, default is under <crosperf_logs>/logs")
    crosperf.SetupParserOptions(parser)
    argv = ['crosperf/crosperf.py', 'temp.exp', '--rerun=True']
    options, args = parser.parse_args(argv)
    settings = crosperf.ConvertOptionsToSettings(options)
    self.assertIsNotNone(settings)
    self.assertIsInstance(settings, settings_factory.GlobalSettings)
    self.assertEqual(len(settings.fields), 25)
    self.assertTrue(settings.GetField('rerun'))
    argv = ['crosperf/crosperf.py', 'temp.exp']
    options, args = parser.parse_args(argv)
    settings = crosperf.ConvertOptionsToSettings(options)
    self.assertFalse(settings.GetField('rerun'))


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