You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
328 lines
12 KiB
328 lines
12 KiB
#!/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 ServoTypeLabel
|
|
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 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()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|