#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2019 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 settings."""


import unittest
import unittest.mock as mock

from cros_utils import logger
import download_images
from field import IntegerField
from field import ListField
import settings
import settings_factory


class TestSettings(unittest.TestCase):
    """setting test class."""

    def setUp(self):
        self.settings = settings.Settings("global_name", "global")

    def test_init(self):
        self.assertEqual(self.settings.name, "global_name")
        self.assertEqual(self.settings.settings_type, "global")
        self.assertIsNone(self.settings.parent)

    def test_set_parent_settings(self):
        self.assertIsNone(self.settings.parent)
        settings_parent = {"fake_parent_entry": 0}
        self.settings.SetParentSettings(settings_parent)
        self.assertIsNotNone(self.settings.parent)
        self.assertTrue(isinstance(self.settings.parent, dict))
        self.assertEqual(self.settings.parent, settings_parent)

    def test_add_field(self):
        self.assertEqual(self.settings.fields, {})
        self.settings.AddField(
            IntegerField(
                "iterations",
                default=1,
                required=False,
                description="Number of iterations to " "run the test.",
            )
        )
        self.assertEqual(len(self.settings.fields), 1)
        # Adding the same field twice raises an exception.
        self.assertRaises(
            Exception,
            self.settings.AddField,
            (
                IntegerField(
                    "iterations",
                    default=1,
                    required=False,
                    description="Number of iterations to run " "the test.",
                )
            ),
        )
        res = self.settings.fields["iterations"]
        self.assertIsInstance(res, IntegerField)
        self.assertEqual(res.Get(), 1)

    def test_set_field(self):
        self.assertEqual(self.settings.fields, {})
        self.settings.AddField(
            IntegerField(
                "iterations",
                default=1,
                required=False,
                description="Number of iterations to run the " "test.",
            )
        )
        res = self.settings.fields["iterations"]
        self.assertEqual(res.Get(), 1)

        self.settings.SetField("iterations", 10)
        res = self.settings.fields["iterations"]
        self.assertEqual(res.Get(), 10)

        # Setting a field that's not there raises an exception.
        self.assertRaises(
            Exception, self.settings.SetField, "remote", "lumpy1.cros"
        )

        self.settings.AddField(
            ListField(
                "remote",
                default=[],
                description="A comma-separated list of ip's of "
                "chromeos devices to run "
                "experiments on.",
            )
        )
        self.assertTrue(isinstance(self.settings.fields, dict))
        self.assertEqual(len(self.settings.fields), 2)
        res = self.settings.fields["remote"]
        self.assertEqual(res.Get(), [])
        self.settings.SetField("remote", "lumpy1.cros", append=True)
        self.settings.SetField("remote", "lumpy2.cros", append=True)
        res = self.settings.fields["remote"]
        self.assertEqual(res.Get(), ["lumpy1.cros", "lumpy2.cros"])

    def test_get_field(self):
        # Getting a field that's not there raises an exception.
        self.assertRaises(Exception, self.settings.GetField, "iterations")

        # Getting a required field that hasn't been assigned raises an exception.
        self.settings.AddField(
            IntegerField(
                "iterations",
                required=True,
                description="Number of iterations to " "run the test.",
            )
        )
        self.assertIsNotNone(self.settings.fields["iterations"])
        self.assertRaises(Exception, self.settings.GetField, "iterations")

        # Set the value, then get it.
        self.settings.SetField("iterations", 5)
        res = self.settings.GetField("iterations")
        self.assertEqual(res, 5)

    def test_inherit(self):
        parent_settings = settings_factory.SettingsFactory().GetSettings(
            "global", "global"
        )
        label_settings = settings_factory.SettingsFactory().GetSettings(
            "label", "label"
        )
        self.assertEqual(parent_settings.GetField("chromeos_root"), "")
        self.assertEqual(label_settings.GetField("chromeos_root"), "")
        self.assertIsNone(label_settings.parent)

        parent_settings.SetField("chromeos_root", "/tmp/chromeos")
        label_settings.SetParentSettings(parent_settings)
        self.assertEqual(
            parent_settings.GetField("chromeos_root"), "/tmp/chromeos"
        )
        self.assertEqual(label_settings.GetField("chromeos_root"), "")
        label_settings.Inherit()
        self.assertEqual(
            label_settings.GetField("chromeos_root"), "/tmp/chromeos"
        )

    def test_override(self):
        self.settings.AddField(
            ListField(
                "email",
                default=[],
                description="Space-seperated"
                "list of email addresses to send "
                "email to.",
            )
        )

        global_settings = settings_factory.SettingsFactory().GetSettings(
            "global", "global"
        )

        global_settings.SetField("email", "john.doe@google.com", append=True)
        global_settings.SetField("email", "jane.smith@google.com", append=True)

        res = self.settings.GetField("email")
        self.assertEqual(res, [])

        self.settings.Override(global_settings)
        res = self.settings.GetField("email")
        self.assertEqual(res, ["john.doe@google.com", "jane.smith@google.com"])

    def test_validate(self):

        self.settings.AddField(
            IntegerField(
                "iterations",
                required=True,
                description="Number of iterations " "to run the test.",
            )
        )
        self.settings.AddField(
            ListField(
                "remote",
                default=[],
                required=True,
                description="A comma-separated list "
                "of ip's of chromeos "
                "devices to run experiments on.",
            )
        )
        self.settings.AddField(
            ListField(
                "email",
                default=[],
                description="Space-seperated"
                "list of email addresses to "
                "send email to.",
            )
        )

        # 'required' fields have not been assigned; should raise an exception.
        self.assertRaises(Exception, self.settings.Validate)
        self.settings.SetField("iterations", 2)
        self.settings.SetField("remote", "x86-alex.cros", append=True)
        # Should run without exception now.
        self.settings.Validate()

    @mock.patch.object(logger, "GetLogger")
    @mock.patch.object(download_images.ImageDownloader, "Run")
    @mock.patch.object(download_images, "ImageDownloader")
    def test_get_xbuddy_path(self, mock_downloader, mock_run, mock_logger):

        mock_run.return_value = "fake_xbuddy_translation"
        mock_downloader.Run = mock_run
        board = "lumpy"
        chromeos_root = "/tmp/chromeos"
        log_level = "average"

        trybot_str = "trybot-lumpy-paladin/R34-5417.0.0-b1506"
        official_str = "lumpy-release/R34-5417.0.0"
        xbuddy_str = "latest-dev"
        autotest_path = ""
        debug_path = ""
        download_debug = False

        self.settings.GetXbuddyPath(
            trybot_str,
            autotest_path,
            debug_path,
            board,
            chromeos_root,
            log_level,
            download_debug,
        )
        self.assertEqual(mock_run.call_count, 1)
        self.assertEqual(
            mock_run.call_args_list[0][0],
            (
                "/tmp/chromeos",
                "remote/trybot-lumpy-paladin/R34-5417.0.0-b1506",
                "",
                "",
                False,
            ),
        )

        mock_run.reset_mock()
        self.settings.GetXbuddyPath(
            official_str,
            autotest_path,
            debug_path,
            board,
            chromeos_root,
            log_level,
            download_debug,
        )
        self.assertEqual(mock_run.call_count, 1)
        self.assertEqual(
            mock_run.call_args_list[0][0],
            (
                "/tmp/chromeos",
                "remote/lumpy-release/R34-5417.0.0",
                "",
                "",
                False,
            ),
        )

        mock_run.reset_mock()
        self.settings.GetXbuddyPath(
            xbuddy_str,
            autotest_path,
            debug_path,
            board,
            chromeos_root,
            log_level,
            download_debug,
        )
        self.assertEqual(mock_run.call_count, 1)
        self.assertEqual(
            mock_run.call_args_list[0][0],
            ("/tmp/chromeos", "remote/lumpy/latest-dev", "", "", False),
        )

        if mock_logger:
            return


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