#!/usr/bin/python2
# Copyright 2017 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 unittest
import mock

import common

from autotest_lib.server import utils
from autotest_lib.server.hosts import cros_label
from autotest_lib.server.hosts.cros_label import BrandCodeLabel
from autotest_lib.server.hosts.cros_label import Cr50Label
from autotest_lib.server.hosts.cros_label import Cr50ROKeyidLabel
from autotest_lib.server.hosts.cros_label import Cr50RWKeyidLabel
from autotest_lib.server.hosts.cros_label import DeviceSkuLabel
from autotest_lib.server.hosts.cros_label import AudioLoopbackDongleLabel
from autotest_lib.server.hosts.cros_label import ChameleonConnectionLabel
from autotest_lib.server.hosts.cros_label import ChameleonLabel
from autotest_lib.server.hosts.cros_label import ChameleonPeripheralsLabel
from autotest_lib.server.hosts.cros_label import ServoTypeLabel
from autotest_lib.server.hosts.cros_label import DutStorageLabel
from autotest_lib.server.hosts import host_info

# pylint: disable=missing-docstring

NON_UNI_LSB_RELEASE_OUTPUT = """
CHROMEOS_RELEASE_APPID={63A9F698-C1CA-4A75-95E7-6B90181B3718}
CHROMEOS_BOARD_APPID={63A9F698-C1CA-4A75-95E7-6B90181B3718}
CHROMEOS_CANARY_APPID={90F229CE-83E2-4FAF-8479-E368A34938B1}
DEVICETYPE=CHROMEBOOK
CHROMEOS_ARC_VERSION=4234098
CHROMEOS_ARC_ANDROID_SDK_VERSION=25
GOOGLE_RELEASE=9798.0.2017_08_02_1022
CHROMEOS_DEVSERVER=http://shapiroc3.bld.corp.google.com:8080
CHROMEOS_RELEASE_BOARD=pyro
CHROMEOS_RELEASE_BUILD_NUMBER=9798
CHROMEOS_RELEASE_BRANCH_NUMBER=0
CHROMEOS_RELEASE_CHROME_MILESTONE=62
CHROMEOS_RELEASE_PATCH_NUMBER=2017_08_02_1022
CHROMEOS_RELEASE_TRACK=testimage-channel
CHROMEOS_RELEASE_DESCRIPTION=9798.0.2017_08_02_1022 (Test Build)
CHROMEOS_RELEASE_BUILD_TYPE=Test Build
CHROMEOS_RELEASE_NAME=Chromium OS
CHROMEOS_RELEASE_VERSION=9798.0.2017_08_02_1022
CHROMEOS_AUSERVER=http://someserver.bld.corp.google.com:8080/update
"""

UNI_LSB_RELEASE_OUTPUT = """
CHROMEOS_RELEASE_APPID={5A3AB642-2A67-470A-8F37-37E737A53CFC}
CHROMEOS_BOARD_APPID={5A3AB642-2A67-470A-8F37-37E737A53CFC}
CHROMEOS_CANARY_APPID={90F229CE-83E2-4FAF-8479-E368A34938B1}
DEVICETYPE=CHROMEBOOK
CHROMEOS_ARC_VERSION=4340813
CHROMEOS_ARC_ANDROID_SDK_VERSION=25
GOOGLE_RELEASE=9953.0.2017_09_18_1334
CHROMEOS_DEVSERVER=http://server.bld.corp.google.com:8080
CHROMEOS_RELEASE_BOARD=coral
CHROMEOS_RELEASE_BUILD_NUMBER=9953
CHROMEOS_RELEASE_BRANCH_NUMBER=0
CHROMEOS_RELEASE_CHROME_MILESTONE=63
CHROMEOS_RELEASE_PATCH_NUMBER=2017_09_18_1334
CHROMEOS_RELEASE_TRACK=testimage-channel
CHROMEOS_RELEASE_DESCRIPTION=9953.0.2017_09_18_1334 (Test Build)
CHROMEOS_RELEASE_BUILD_TYPE=Test Build
CHROMEOS_RELEASE_NAME=Chromium OS
CHROMEOS_RELEASE_UNIBUILD=1
CHROMEOS_RELEASE_VERSION=9953.0.2017_09_18_1334
CHROMEOS_AUSERVER=http://server.bld.corp.google.com:8080/update
CHROMEOS_RELEASE_MODELS=coral astronaut blue bruce lava nasher
"""

GSCTOOL_OUTPUT_PVT = """
start
target running protocol version 6
keyids: RO 0xaa66150f, RW 0xde88588d
offsets: backup RO at 0x40000, backup RW at 0x44000
Current versions:
RO 0.0.10
RW 0.3.14
"""

GSCTOOL_OUTPUT_PREPVT = """
start
target running protocol version 6
keyids: RO 0xaa66150f, RW 0xde88588d
offsets: backup RO at 0x40000, backup RW at 0x44000
Current versions:
RO 0.0.10
RW 0.4.15
"""

GSCTOOL_OUTPUT_DEV_RO = """
start
target running protocol version 6
keyids: RO 0x3716ee6b, RW 0xde88588d
offsets: backup RO at 0x40000, backup RW at 0x44000
Current versions:
RO 0.0.10
RW 0.4.15
"""

GSCTOOL_OUTPUT_DEV_RW = """
start
target running protocol version 6
keyids: RO 0xaa66150f, RW 0xb93d6539
offsets: backup RO at 0x40000, backup RW at 0x44000
Current versions:
RO 0.0.10
RW 0.4.15
"""


class MockCmd(object):
    """Simple mock command with base command and results"""

    def __init__(self, cmd, exit_status, stdout):
        self.cmd = cmd
        self.stdout = stdout
        self.exit_status = exit_status


class MockAFEHost(utils.EmptyAFEHost):

    def __init__(self, labels=[], attributes={}):
        self.labels = labels
        self.attributes = attributes


class MockHost(object):
    """Simple host for running mock'd host commands"""

    def __init__(self, labels, *args):
        self._afe_host = MockAFEHost(labels)
        self.mock_cmds = {c.cmd: c for c in args}
        info = host_info.HostInfo(labels=labels)
        self.host_info_store = host_info.InMemoryHostInfoStore(info)

    def run(self, command, **kwargs):
        """Finds the matching result by command value"""
        return self.mock_cmds[command]

    def is_up(self, **args):
        return True


class MockHostWithoutAFE(MockHost):

    def __init__(self, labels, *args):
        super(MockHostWithoutAFE, self).__init__(labels, *args)
        self._afe_host = utils.EmptyAFEHost()


class DeviceSkuLabelTests(unittest.TestCase):
    """Unit tests for DeviceSkuLabel"""

    def test_new_label(self):
        mosys_cmd = 'mosys platform sku'
        host = MockHost([], MockCmd(mosys_cmd, 0, '27\n'))
        self.assertEqual(DeviceSkuLabel().generate_labels(host), ['27'])

    def test_new_label_mosys_fails(self):
        mosys_cmd = 'mosys platform sku'
        host = MockHost([], MockCmd(mosys_cmd, 1, '27\n'))
        self.assertEqual(DeviceSkuLabel().generate_labels(host), [])

    def test_existing_label(self):
        host = MockHost(['device-sku:48'])
        self.assertEqual(DeviceSkuLabel().generate_labels(host), ['48'])

    def test_update_for_task(self):
        self.assertTrue(DeviceSkuLabel().update_for_task(''))
        self.assertTrue(DeviceSkuLabel().update_for_task('repair'))
        self.assertTrue(DeviceSkuLabel().update_for_task('deploy'))


class BrandCodeLabelTests(unittest.TestCase):
    """Unit tests for DeviceSkuLabel"""

    def test_new_label(self):
        cros_config_cmd = 'cros_config / brand-code'
        host = MockHost([], MockCmd(cros_config_cmd, 0, 'XXYZ\n'))
        self.assertEqual(BrandCodeLabel().generate_labels(host), ['XXYZ'])

    def test_new_label_cros_config_fails(self):
        cros_config_cmd = 'cros_config / brand-code'
        host = MockHost([], MockCmd(cros_config_cmd, 1, 'XXYZ\n'))
        self.assertEqual(BrandCodeLabel().generate_labels(host), [])

    def test_existing_label(self):
        host = MockHost(['brand-code:ABCD'])
        self.assertEqual(BrandCodeLabel().generate_labels(host), ['ABCD'])


class Cr50Tests(unittest.TestCase):
    """Unit tests for Cr50Label"""

    def test_cr50_pvt(self):
        host = MockHost([], MockCmd('gsctool -a -f', 0, GSCTOOL_OUTPUT_PVT))
        self.assertEqual(Cr50Label().get(host), ['cr50:pvt'])

    def test_cr50_prepvt(self):
        host = MockHost([], MockCmd('gsctool -a -f', 0, GSCTOOL_OUTPUT_PREPVT))
        self.assertEqual(Cr50Label().get(host), ['cr50:prepvt'])

    def test_gsctool_fails(self):
        host = MockHost([], MockCmd('gsctool -a -f', 1, ''))
        self.assertEqual(Cr50Label().get(host), [])


class Cr50RWKeyidTests(unittest.TestCase):
    """Unit tests for Cr50RWKeyidLabel"""

    def test_cr50_prod_rw(self):
        host = MockHost([], MockCmd('gsctool -a -f', 0, GSCTOOL_OUTPUT_PVT))
        self.assertEqual(Cr50RWKeyidLabel().get(host),
                         ['cr50-rw-keyid:0xde88588d', 'cr50-rw-keyid:prod'])

    def test_cr50_dev_rw(self):
        host = MockHost([], MockCmd('gsctool -a -f', 0, GSCTOOL_OUTPUT_DEV_RW))
        self.assertEqual(Cr50RWKeyidLabel().get(host),
                         ['cr50-rw-keyid:0xb93d6539', 'cr50-rw-keyid:dev'])

    def test_gsctool_fails(self):
        host = MockHost([], MockCmd('gsctool -a -f', 1, ''))
        self.assertEqual(Cr50RWKeyidLabel().get(host), [])


class Cr50ROKeyidTests(unittest.TestCase):
    """Unit tests for Cr50ROKeyidLabel"""

    def test_cr50_prod_ro(self):
        host = MockHost([], MockCmd('gsctool -a -f', 0, GSCTOOL_OUTPUT_PREPVT))
        self.assertEqual(Cr50ROKeyidLabel().get(host),
                         ['cr50-ro-keyid:0xaa66150f', 'cr50-ro-keyid:prod'])

    def test_cr50_dev_ro(self):
        host = MockHost([], MockCmd('gsctool -a -f', 0, GSCTOOL_OUTPUT_DEV_RO))
        self.assertEqual(Cr50ROKeyidLabel().get(host),
                         ['cr50-ro-keyid:0x3716ee6b', 'cr50-ro-keyid:dev'])

    def test_gsctool_fails(self):
        host = MockHost([], MockCmd('gsctool -a -f', 1, ''))
        self.assertEqual(Cr50ROKeyidLabel().get(host), [])


class HWIDLabelTests(unittest.TestCase):
    def test_merge_hwid_label_lists_empty(self):
        self.assertEqual(cros_label.HWIDLabel._merge_hwid_label_lists([], []), [])

    def test_merge_hwid_label_lists_singleton(self):
        self.assertEqual(cros_label.HWIDLabel._merge_hwid_label_lists([], ["4"]),
                         ["4"])
        self.assertEqual(cros_label.HWIDLabel._merge_hwid_label_lists(["7"], []),
                         ["7"])

    def test_merge_hwid_label_lists_override(self):
        self.assertEqual(
            cros_label.HWIDLabel._merge_hwid_label_lists(old=["7:a"], new=["7:b"]),
            ["7:b"])

    def test_merge_hwid_label_lists_no_override(self):
        self.assertEqual(
            cros_label.HWIDLabel._merge_hwid_label_lists(old=["7a"], new=["7b"]),
            ["7a", "7b"])

    def test_hwid_label_names(self):
        class HWIDLabelTester(cros_label.HWIDLabel):
            def get_all_labels(self):
                return [], []

        item = HWIDLabelTester()
        self.assertEqual(item._hwid_label_names(), cros_label.HWID_LABELS_FALLBACK)


class AudioLoopbackDongleLabelTests(unittest.TestCase):
    def test_update_for_task(self):
        self.assertTrue(AudioLoopbackDongleLabel().update_for_task(''))
        self.assertTrue(AudioLoopbackDongleLabel().update_for_task('repair'))
        self.assertFalse(AudioLoopbackDongleLabel().update_for_task('deploy'))


class ChameleonConnectionLabelTests(unittest.TestCase):
    def test_update_for_task(self):
        self.assertTrue(ChameleonConnectionLabel().update_for_task(''))
        self.assertFalse(ChameleonConnectionLabel().update_for_task('repair'))
        self.assertTrue(ChameleonConnectionLabel().update_for_task('deploy'))


class ChameleonLabelTests(unittest.TestCase):
    def test_update_for_task(self):
        self.assertTrue(ChameleonLabel().update_for_task(''))
        self.assertTrue(ChameleonLabel().update_for_task('repair'))
        self.assertFalse(ChameleonLabel().update_for_task('deploy'))


class ChameleonPeripheralsLabelTests(unittest.TestCase):
    def test_update_for_task(self):
        self.assertTrue(ChameleonPeripheralsLabel().update_for_task(''))
        self.assertFalse(ChameleonPeripheralsLabel().update_for_task('repair'))
        self.assertTrue(ChameleonPeripheralsLabel().update_for_task('deploy'))


class ServoTypeLabelTests(unittest.TestCase):
    """Unit tests for ServoTypeLabel"""
    def test_update_for_task(self):
        self.assertTrue(ServoTypeLabel().update_for_task(''))
        self.assertFalse(ServoTypeLabel().update_for_task('repair'))
        self.assertTrue(ServoTypeLabel().update_for_task('deploy'))

    def test_generate_labels_return_value_from_labels(self):
        host = MockHost(['servo_type:Some_interesting'])
        servo = ServoTypeLabel()
        self.assertEqual(servo.get(host), ['servo_type:Some_interesting'])
        self.assertEqual(servo.generate_labels(host), ['Some_interesting'])

    def test_generate_labels_from_cache_when_servo_is_none(self):
        host = MockHost(['servo_state:Some_interesting'])
        host.servo = None
        servo = ServoTypeLabel()
        self.assertEqual(servo.get(host), [])
        self.assertEqual(servo.generate_labels(host), [])

    def test_generate_labels_not_from_cache_when_servo_exist(self):
        host = MockHost(['servo_type'])
        host.servo = mock.Mock()
        host.servo.get_servo_version.return_value = 'servo_v3'
        servo = ServoTypeLabel()
        self.assertEqual(servo.get(host), ['servo_type:servo_v3'])
        self.assertEqual(servo.generate_labels(host), ['servo_v3'])
        host.servo.get_servo_version.assert_called()


class DutStorageLabelTests(unittest.TestCase):
    """Unit tests for DutStorageLabel"""
    def test_update_for_task(self):
        self.assertFalse(DutStorageLabel().update_for_task(''))
        self.assertFalse(DutStorageLabel().update_for_task('repair'))
        self.assertTrue(DutStorageLabel().update_for_task('deploy'))

    @mock.patch('autotest_lib.server.cros.storage.'
                'storage_validate.StorageStateValidator')
    def test_return_state_labels_when_has_servo(self, validator):
        storage_validator = mock.Mock()
        storage_validator.get_type.return_value = 'some_servo'
        storage_validator.get_state.return_value = 'warming'
        validator.return_value = storage_validator
        host = MockHost([])
        host.servo = mock.Mock()
        label = DutStorageLabel()
        self.assertEqual(label.get(host), ['storage_state:ACCEPTABLE'])

    def test_no_labels_when_no_servo(self):
        host = MockHost([])
        host.servo = None
        label = DutStorageLabel()
        self.assertEqual(label.get(host), [])


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