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

"""Unittest for crosperf."""


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()
