# Copyright (c) 2020 The Chromium OS 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 mock
import unittest
from autotest_lib.client.common_lib import error
from autotest_lib.server.cros.faft import firmware_test


class TestRunOnce(unittest.TestCase):
    """Tests that run_once works as expected."""
    class GoodFirmwareTest(firmware_test.FirmwareTest):
        """A FirmwareTest stub providing the parts that should be tested."""
        def __init__(self, *_args, **_dargs):
            # pylint: disable=super-init-not-called
            """Init logic in FirmwareTest is not relevant to this test."""
            self.test = mock.MagicMock()
            self.test_good = mock.MagicMock()
            self.test_good_better = mock.MagicMock()
            self.test_host_mock = mock.MagicMock()
            self.test_arg2_mock = mock.MagicMock()

        def test_host(self, host, **kwargs):
            """Get at the 'host' mock"""
            self.test_host_mock(host, **kwargs)

        def test_arg2(self, arg2):
            """Get at the 'arg2' mock"""
            self.test_arg2_mock(arg2)

    def test_keyword_test_name(self):
        """Test that keyworded test names work"""
        ft = self.GoodFirmwareTest()

        ft.run_once(test_name='GoodFirmwareTest.good')
        ft.test_good.assert_called_with()

        ft.run_once('arg1', test_name='GoodFirmwareTest.good', arg2='arg2')
        ft.test_good.assert_called_with('arg1', arg2='arg2')

    def test_positional_test_name(self):
        """Test that positional test names work"""
        ft = self.GoodFirmwareTest()

        ft.run_once('GoodFirmwareTest.good')
        ft.test_good.assert_called_with()

        ft.run_once('GoodFirmwareTest.good', 'arg1', arg2='arg2')
        ft.test_good.assert_called_with('arg1', arg2='arg2')

    def test_no_test_name(self):
        """Test that running a whole test class works"""
        ft = self.GoodFirmwareTest()

        ft.run_once('GoodFirmwareTest')
        ft.test.assert_called_with()

        ft.run_once('GoodFirmwareTest', 'arg1', arg2='arg2')
        ft.test.assert_called_with('arg1', arg2='arg2')

    def test_sub_test_name(self):
        """Test that sub tests can be executed"""
        ft = self.GoodFirmwareTest()

        ft.run_once('GoodFirmwareTest.good.better')
        ft.test_good_better.assert_called_with()

        ft.run_once('GoodFirmwareTest.good.better', 'arg1', arg2='arg2')
        ft.test_good_better.assert_called_with('arg1', arg2='arg2')

    def test_missing_test_name(self):
        """Test that a test name must be passed"""
        ft = self.GoodFirmwareTest()

        with self.assertRaises(error.TestError):
            ft.run_once()

    def test_bad_class_name(self):
        """Test that the class name must be valid"""
        ft = self.GoodFirmwareTest()

        with self.assertRaises(error.TestError):
            ft.run_once(test_name='BadFirmwareTest')

    def test_bad_method_name(self):
        """Test that the method must be valid"""
        ft = self.GoodFirmwareTest()

        with self.assertRaises(error.TestError):
            ft.run_once(test_name='GoodFirmwareTest.bad')

    def test_host_arg(self):
        """Test operation with host arg used"""
        ft = self.GoodFirmwareTest()

        ft.run_once('GoodFirmwareTest.host', host='host', arg2='arg2')
        ft.test_host_mock.assert_called_with('host', arg2='arg2')

    def test_arg2(self):
        """Test operation with arg2 used"""
        ft = self.GoodFirmwareTest()

        ft.run_once('GoodFirmwareTest.arg2', host='host', arg2='arg2')
        ft.test_arg2_mock.assert_called_with('arg2')


class TestCheckPowerState(unittest.TestCase):
    """Test that power_state matching is precise"""
    # Mock out EC behavior to return definable power states
    class MockedECFirmwareTest(firmware_test.FirmwareTest):
        """A stubbed out FirmwareTest to check the precision behavior"""

        def __init__(self, *_args, **_dargs):
            # pylint: disable=super-init-not-called
            pass

    # power_state is supposed to be a string, but lists seem somewhat common,
    # so guard against them.
    def test_fails_on_list(self):
        ft = self.MockedECFirmwareTest()

        with self.assertRaises(error.TestError):
            ft._check_power_state([], 'S0')

    def test_s0ix_isnt_s0(self):
        ft = self.MockedECFirmwareTest()

        self.assertEqual(False, ft._check_power_state("S0", "S0ix"))

    def test_s0_is_found(self):
        ft = self.MockedECFirmwareTest()

        self.assertEqual(True, ft._check_power_state("S0", "S0"))

    def test_s0_is_found_unicode(self):
        ft = self.MockedECFirmwareTest()

        self.assertEqual(True, ft._check_power_state(u"S0", "S0"))
        self.assertEqual(True, ft._check_power_state("S0", u"S0"))
        self.assertEqual(True, ft._check_power_state(u"S0", u"S0"))

    def test_s0_or_s3_is_found(self):
        ft = self.MockedECFirmwareTest()

        self.assertEqual(True, ft._check_power_state("(S0|S3)", "S0"))
        self.assertEqual(True, ft._check_power_state("(S0|S3)", "S3"))
        self.assertEqual(False, ft._check_power_state("(S0|S3)", "G3"))


class Test_stage_build_to_usbkey(unittest.TestCase):
    """stage_build_to_usbkey test"""

    class MockFirmwareTest(firmware_test.FirmwareTest):
        """Mock of FirmwareTest"""

        def __init__(self):
            self._client = mock.MagicMock()
            self.faft_client = mock.MagicMock()

    def setUp(self):
        self.test = self.MockFirmwareTest()

    def test_stage_build_to_usbkey(self):
        self.test._client.host_info_store.get.return_value.build = "placeholder_build"
        self.test._client._servo_host.validate_image_usbkey.return_value = (
            "another_build")
        self.assertTrue(self.test.stage_build_to_usbkey())
        self.test._client.stage_build_to_usb.assert_called_with(
                "placeholder_build")

    def test_stage_build_to_usbkey_same_build(self):
        self.test._client.host_info_store.get.return_value.build = "placeholder_build"
        self.test._client._servo_host.validate_image_usbkey.return_value = (
                "placeholder_build")
        self.assertTrue(self.test.stage_build_to_usbkey())
        self.test._client.stage_build_to_usb.assert_not_called()

    def test_stage_build_to_usbkey_no_build(self):
        self.test._client.host_info_store.get.return_value.build = None
        self.assertFalse(self.test.stage_build_to_usbkey())
        self.test._client.stage_build_to_usb.assert_not_called()

    def test_stage_build_to_usbkey_download_error(self):
        self.test._client.host_info_store.get.return_value.build = "placeholder_build"
        self.test._client._servo_host.validate_image_usbkey.return_value = (
            "another_build")
        self.test._client.stage_build_to_usb = (
            mock.MagicMock(side_effect=error.AutotestError("download")))
        self.assertFalse(self.test.stage_build_to_usbkey())
        self.test._client.stage_build_to_usb.assert_called_with(
                "placeholder_build")

    def test_setup_usbkey(self):
        self.test._client.host_info_store.get.return_value.build = "placeholder_build"
        self.test._client._servo_host.validate_image_usbkey.return_value = (
            "another_build")
        self.test.assert_test_image_in_usb_disk = mock.MagicMock()
        self.test.set_servo_v4_role_to_snk = mock.MagicMock()
        with mock.patch('time.sleep'):
            self.test.setup_usbkey(usbkey=True)
        self.test._client.stage_build_to_usb.assert_called_with(
                "placeholder_build")
        self.test.assert_test_image_in_usb_disk.assert_called()
        self.test.set_servo_v4_role_to_snk.assert_called()

    def test_setup_usbkey_no_stage(self):
        self.test._client.host_info_store.get.return_value.build = "placeholder_build"
        self.test._client._servo_host.validate_image_usbkey.return_value = (
            "another_build")
        self.test.assert_test_image_in_usb_disk = mock.MagicMock()
        self.test.set_servo_v4_role_to_snk = mock.MagicMock()
        self.test.servo = mock.MagicMock()
        self.test.setup_usbkey(usbkey=False)
        self.test._client.stage_build_to_usb.assert_not_called()
        self.test.assert_test_image_in_usb_disk.assert_not_called()
        self.test.servo.switch_usbkey.assert_called_with('host')
        self.test.set_servo_v4_role_to_snk.assert_not_called()


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