#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Copyright 2017 The ChromiumOS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unittest for crosperf."""

from __future__ import print_function

import unittest

import settings_factory


class BenchmarkSettingsTest(unittest.TestCase):
  """Class to test benchmark settings."""

  def test_init(self):
    res = settings_factory.BenchmarkSettings('b_settings')
    self.assertIsNotNone(res)
    self.assertEqual(len(res.fields), 7)
    self.assertEqual(res.GetField('test_name'), '')
    self.assertEqual(res.GetField('test_args'), '')
    self.assertEqual(res.GetField('iterations'), 0)
    self.assertEqual(res.GetField('suite'), 'test_that')


class LabelSettingsTest(unittest.TestCase):
  """Class to test label settings."""

  def test_init(self):
    res = settings_factory.LabelSettings('l_settings')
    self.assertIsNotNone(res)
    self.assertEqual(len(res.fields), 10)
    self.assertEqual(res.GetField('chromeos_image'), '')
    self.assertEqual(res.GetField('autotest_path'), '')
    self.assertEqual(res.GetField('chromeos_root'), '')
    self.assertEqual(res.GetField('remote'), None)
    self.assertEqual(res.GetField('image_args'), '')
    self.assertEqual(res.GetField('cache_dir'), '')
    self.assertEqual(res.GetField('chrome_src'), '')
    self.assertEqual(res.GetField('build'), '')


class GlobalSettingsTest(unittest.TestCase):
  """Class to test global settings."""

  def test_init(self):
    res = settings_factory.GlobalSettings('g_settings')
    self.assertIsNotNone(res)
    self.assertEqual(len(res.fields), 40)
    self.assertEqual(res.GetField('name'), '')
    self.assertEqual(res.GetField('board'), '')
    self.assertEqual(res.GetField('crosfleet'), False)
    self.assertEqual(res.GetField('remote'), None)
    self.assertEqual(res.GetField('rerun_if_failed'), False)
    self.assertEqual(res.GetField('rm_chroot_tmp'), False)
    self.assertEqual(res.GetField('email'), None)
    self.assertEqual(res.GetField('rerun'), False)
    self.assertEqual(res.GetField('same_specs'), True)
    self.assertEqual(res.GetField('same_machine'), False)
    self.assertEqual(res.GetField('iterations'), 0)
    self.assertEqual(res.GetField('chromeos_root'), '')
    self.assertEqual(res.GetField('logging_level'), 'average')
    self.assertEqual(res.GetField('acquire_timeout'), 0)
    self.assertEqual(res.GetField('perf_args'), '')
    self.assertEqual(res.GetField('download_debug'), True)
    self.assertEqual(res.GetField('cache_dir'), '')
    self.assertEqual(res.GetField('cache_only'), False)
    self.assertEqual(res.GetField('no_email'), False)
    self.assertEqual(res.GetField('show_all_results'), False)
    self.assertEqual(res.GetField('share_cache'), '')
    self.assertEqual(res.GetField('results_dir'), '')
    self.assertEqual(res.GetField('compress_results'), True)
    self.assertEqual(res.GetField('chrome_src'), '')
    self.assertEqual(res.GetField('cwp_dso'), '')
    self.assertEqual(res.GetField('enable_aslr'), False)
    self.assertEqual(res.GetField('ignore_min_max'), False)
    self.assertEqual(res.GetField('intel_pstate'), 'no_hwp')
    self.assertEqual(res.GetField('turbostat'), True)
    self.assertEqual(res.GetField('top_interval'), 1)
    self.assertEqual(res.GetField('cooldown_time'), 10)
    self.assertEqual(res.GetField('cooldown_temp'), 40)
    self.assertEqual(res.GetField('governor'), 'performance')
    self.assertEqual(res.GetField('cpu_usage'), 'all')
    self.assertEqual(res.GetField('cpu_freq_pct'), 95)


class SettingsFactoryTest(unittest.TestCase):
  """Class to test SettingsFactory."""

  def test_get_settings(self):
    self.assertRaises(Exception, settings_factory.SettingsFactory.GetSettings,
                      'global', 'bad_type')

    l_settings = settings_factory.SettingsFactory().GetSettings(
        'label', 'label')
    self.assertIsInstance(l_settings, settings_factory.LabelSettings)
    self.assertEqual(len(l_settings.fields), 10)

    b_settings = settings_factory.SettingsFactory().GetSettings(
        'benchmark', 'benchmark')
    self.assertIsInstance(b_settings, settings_factory.BenchmarkSettings)
    self.assertEqual(len(b_settings.fields), 7)

    g_settings = settings_factory.SettingsFactory().GetSettings(
        'global', 'global')
    self.assertIsInstance(g_settings, settings_factory.GlobalSettings)
    self.assertEqual(len(g_settings.fields), 40)


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