1*9c5db199SXin Li#!/usr/bin/python3 2*9c5db199SXin Li# Copyright 2017 The Chromium OS Authors. All rights reserved. 3*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 4*9c5db199SXin Li# found in the LICENSE file. 5*9c5db199SXin Li 6*9c5db199SXin Liimport unittest 7*9c5db199SXin Lifrom unittest import mock 8*9c5db199SXin Li 9*9c5db199SXin Liimport common 10*9c5db199SXin Li 11*9c5db199SXin Lifrom autotest_lib.server import utils 12*9c5db199SXin Lifrom autotest_lib.server.hosts.cros_label import BrandCodeLabel 13*9c5db199SXin Lifrom autotest_lib.server.hosts.cros_label import Cr50Label 14*9c5db199SXin Lifrom autotest_lib.server.hosts.cros_label import Cr50ROKeyidLabel 15*9c5db199SXin Lifrom autotest_lib.server.hosts.cros_label import Cr50RWKeyidLabel 16*9c5db199SXin Lifrom autotest_lib.server.hosts.cros_label import DeviceSkuLabel 17*9c5db199SXin Lifrom autotest_lib.server.hosts.cros_label import AudioConfigLabel 18*9c5db199SXin Lifrom autotest_lib.server.hosts.cros_label import AudioLoopbackDongleLabel 19*9c5db199SXin Lifrom autotest_lib.server.hosts.cros_label import ChameleonConnectionLabel 20*9c5db199SXin Lifrom autotest_lib.server.hosts.cros_label import ChameleonLabel 21*9c5db199SXin Lifrom autotest_lib.server.hosts.cros_label import ServoTypeLabel 22*9c5db199SXin Lifrom autotest_lib.server.hosts import host_info 23*9c5db199SXin Li 24*9c5db199SXin Li# pylint: disable=missing-docstring 25*9c5db199SXin Li 26*9c5db199SXin LiNON_UNI_LSB_RELEASE_OUTPUT = """ 27*9c5db199SXin LiCHROMEOS_RELEASE_APPID={63A9F698-C1CA-4A75-95E7-6B90181B3718} 28*9c5db199SXin LiCHROMEOS_BOARD_APPID={63A9F698-C1CA-4A75-95E7-6B90181B3718} 29*9c5db199SXin LiCHROMEOS_CANARY_APPID={90F229CE-83E2-4FAF-8479-E368A34938B1} 30*9c5db199SXin LiDEVICETYPE=CHROMEBOOK 31*9c5db199SXin LiCHROMEOS_ARC_VERSION=4234098 32*9c5db199SXin LiCHROMEOS_ARC_ANDROID_SDK_VERSION=25 33*9c5db199SXin LiGOOGLE_RELEASE=9798.0.2017_08_02_1022 34*9c5db199SXin LiCHROMEOS_DEVSERVER=http://shapiroc3.bld.corp.google.com:8080 35*9c5db199SXin LiCHROMEOS_RELEASE_BOARD=pyro 36*9c5db199SXin LiCHROMEOS_RELEASE_BUILD_NUMBER=9798 37*9c5db199SXin LiCHROMEOS_RELEASE_BRANCH_NUMBER=0 38*9c5db199SXin LiCHROMEOS_RELEASE_CHROME_MILESTONE=62 39*9c5db199SXin LiCHROMEOS_RELEASE_PATCH_NUMBER=2017_08_02_1022 40*9c5db199SXin LiCHROMEOS_RELEASE_TRACK=testimage-channel 41*9c5db199SXin LiCHROMEOS_RELEASE_DESCRIPTION=9798.0.2017_08_02_1022 (Test Build) 42*9c5db199SXin LiCHROMEOS_RELEASE_BUILD_TYPE=Test Build 43*9c5db199SXin LiCHROMEOS_RELEASE_NAME=Chromium OS 44*9c5db199SXin LiCHROMEOS_RELEASE_VERSION=9798.0.2017_08_02_1022 45*9c5db199SXin LiCHROMEOS_AUSERVER=http://someserver.bld.corp.google.com:8080/update 46*9c5db199SXin Li""" 47*9c5db199SXin Li 48*9c5db199SXin LiUNI_LSB_RELEASE_OUTPUT = """ 49*9c5db199SXin LiCHROMEOS_RELEASE_APPID={5A3AB642-2A67-470A-8F37-37E737A53CFC} 50*9c5db199SXin LiCHROMEOS_BOARD_APPID={5A3AB642-2A67-470A-8F37-37E737A53CFC} 51*9c5db199SXin LiCHROMEOS_CANARY_APPID={90F229CE-83E2-4FAF-8479-E368A34938B1} 52*9c5db199SXin LiDEVICETYPE=CHROMEBOOK 53*9c5db199SXin LiCHROMEOS_ARC_VERSION=4340813 54*9c5db199SXin LiCHROMEOS_ARC_ANDROID_SDK_VERSION=25 55*9c5db199SXin LiGOOGLE_RELEASE=9953.0.2017_09_18_1334 56*9c5db199SXin LiCHROMEOS_DEVSERVER=http://server.bld.corp.google.com:8080 57*9c5db199SXin LiCHROMEOS_RELEASE_BOARD=coral 58*9c5db199SXin LiCHROMEOS_RELEASE_BUILD_NUMBER=9953 59*9c5db199SXin LiCHROMEOS_RELEASE_BRANCH_NUMBER=0 60*9c5db199SXin LiCHROMEOS_RELEASE_CHROME_MILESTONE=63 61*9c5db199SXin LiCHROMEOS_RELEASE_PATCH_NUMBER=2017_09_18_1334 62*9c5db199SXin LiCHROMEOS_RELEASE_TRACK=testimage-channel 63*9c5db199SXin LiCHROMEOS_RELEASE_DESCRIPTION=9953.0.2017_09_18_1334 (Test Build) 64*9c5db199SXin LiCHROMEOS_RELEASE_BUILD_TYPE=Test Build 65*9c5db199SXin LiCHROMEOS_RELEASE_NAME=Chromium OS 66*9c5db199SXin LiCHROMEOS_RELEASE_UNIBUILD=1 67*9c5db199SXin LiCHROMEOS_RELEASE_VERSION=9953.0.2017_09_18_1334 68*9c5db199SXin LiCHROMEOS_AUSERVER=http://server.bld.corp.google.com:8080/update 69*9c5db199SXin LiCHROMEOS_RELEASE_MODELS=coral astronaut blue bruce lava nasher 70*9c5db199SXin Li""" 71*9c5db199SXin Li 72*9c5db199SXin LiGSCTOOL_OUTPUT_PVT = """ 73*9c5db199SXin Listart 74*9c5db199SXin Litarget running protocol version 6 75*9c5db199SXin Likeyids: RO 0xaa66150f, RW 0xde88588d 76*9c5db199SXin Lioffsets: backup RO at 0x40000, backup RW at 0x44000 77*9c5db199SXin LiCurrent versions: 78*9c5db199SXin LiRO 0.0.10 79*9c5db199SXin LiRW 0.3.14 80*9c5db199SXin Li""" 81*9c5db199SXin Li 82*9c5db199SXin LiGSCTOOL_OUTPUT_PREPVT = """ 83*9c5db199SXin Listart 84*9c5db199SXin Litarget running protocol version 6 85*9c5db199SXin Likeyids: RO 0xaa66150f, RW 0xde88588d 86*9c5db199SXin Lioffsets: backup RO at 0x40000, backup RW at 0x44000 87*9c5db199SXin LiCurrent versions: 88*9c5db199SXin LiRO 0.0.10 89*9c5db199SXin LiRW 0.4.15 90*9c5db199SXin Li""" 91*9c5db199SXin Li 92*9c5db199SXin LiGSCTOOL_OUTPUT_DEV_RO = """ 93*9c5db199SXin Listart 94*9c5db199SXin Litarget running protocol version 6 95*9c5db199SXin Likeyids: RO 0x3716ee6b, RW 0xde88588d 96*9c5db199SXin Lioffsets: backup RO at 0x40000, backup RW at 0x44000 97*9c5db199SXin LiCurrent versions: 98*9c5db199SXin LiRO 0.0.10 99*9c5db199SXin LiRW 0.4.15 100*9c5db199SXin Li""" 101*9c5db199SXin Li 102*9c5db199SXin LiGSCTOOL_OUTPUT_DEV_RW = """ 103*9c5db199SXin Listart 104*9c5db199SXin Litarget running protocol version 6 105*9c5db199SXin Likeyids: RO 0xaa66150f, RW 0xb93d6539 106*9c5db199SXin Lioffsets: backup RO at 0x40000, backup RW at 0x44000 107*9c5db199SXin LiCurrent versions: 108*9c5db199SXin LiRO 0.0.10 109*9c5db199SXin LiRW 0.4.15 110*9c5db199SXin Li""" 111*9c5db199SXin Li 112*9c5db199SXin Li 113*9c5db199SXin Liclass MockCmd(object): 114*9c5db199SXin Li """Simple mock command with base command and results""" 115*9c5db199SXin Li 116*9c5db199SXin Li def __init__(self, cmd, exit_status, stdout): 117*9c5db199SXin Li self.cmd = cmd 118*9c5db199SXin Li self.stdout = stdout 119*9c5db199SXin Li self.exit_status = exit_status 120*9c5db199SXin Li 121*9c5db199SXin Li 122*9c5db199SXin Liclass MockAFEHost(utils.EmptyAFEHost): 123*9c5db199SXin Li 124*9c5db199SXin Li def __init__(self, labels=[], attributes={}): 125*9c5db199SXin Li self.labels = labels 126*9c5db199SXin Li self.attributes = attributes 127*9c5db199SXin Li 128*9c5db199SXin Li 129*9c5db199SXin Liclass MockHost(object): 130*9c5db199SXin Li """Simple host for running mock'd host commands""" 131*9c5db199SXin Li 132*9c5db199SXin Li def __init__(self, labels, *args): 133*9c5db199SXin Li self._afe_host = MockAFEHost(labels) 134*9c5db199SXin Li self.mock_cmds = {c.cmd: c for c in args} 135*9c5db199SXin Li info = host_info.HostInfo(labels=labels) 136*9c5db199SXin Li self.host_info_store = host_info.InMemoryHostInfoStore(info) 137*9c5db199SXin Li 138*9c5db199SXin Li def run(self, command, **kwargs): 139*9c5db199SXin Li """Finds the matching result by command value""" 140*9c5db199SXin Li return self.mock_cmds[command] 141*9c5db199SXin Li 142*9c5db199SXin Li def is_up(self, **args): 143*9c5db199SXin Li return True 144*9c5db199SXin Li 145*9c5db199SXin Li 146*9c5db199SXin Liclass MockHostWithoutAFE(MockHost): 147*9c5db199SXin Li 148*9c5db199SXin Li def __init__(self, labels, *args): 149*9c5db199SXin Li super(MockHostWithoutAFE, self).__init__(labels, *args) 150*9c5db199SXin Li self._afe_host = utils.EmptyAFEHost() 151*9c5db199SXin Li 152*9c5db199SXin Li 153*9c5db199SXin Liclass DeviceSkuLabelTests(unittest.TestCase): 154*9c5db199SXin Li """Unit tests for DeviceSkuLabel""" 155*9c5db199SXin Li 156*9c5db199SXin Li def test_new_label(self): 157*9c5db199SXin Li mosys_cmd = 'mosys platform sku' 158*9c5db199SXin Li host = MockHost([], MockCmd(mosys_cmd, 0, '27\n')) 159*9c5db199SXin Li self.assertEqual(DeviceSkuLabel().generate_labels(host), ['27']) 160*9c5db199SXin Li 161*9c5db199SXin Li def test_new_label_mosys_fails(self): 162*9c5db199SXin Li mosys_cmd = 'mosys platform sku' 163*9c5db199SXin Li host = MockHost([], MockCmd(mosys_cmd, 1, '27\n')) 164*9c5db199SXin Li self.assertEqual(DeviceSkuLabel().generate_labels(host), []) 165*9c5db199SXin Li 166*9c5db199SXin Li def test_existing_label(self): 167*9c5db199SXin Li host = MockHost(['device-sku:48']) 168*9c5db199SXin Li self.assertEqual(DeviceSkuLabel().generate_labels(host), ['48']) 169*9c5db199SXin Li 170*9c5db199SXin Li def test_update_for_task(self): 171*9c5db199SXin Li self.assertTrue(DeviceSkuLabel().update_for_task('')) 172*9c5db199SXin Li self.assertTrue(DeviceSkuLabel().update_for_task('repair')) 173*9c5db199SXin Li self.assertTrue(DeviceSkuLabel().update_for_task('deploy')) 174*9c5db199SXin Li 175*9c5db199SXin Li 176*9c5db199SXin Liclass BrandCodeLabelTests(unittest.TestCase): 177*9c5db199SXin Li """Unit tests for DeviceSkuLabel""" 178*9c5db199SXin Li 179*9c5db199SXin Li def test_new_label(self): 180*9c5db199SXin Li cros_config_cmd = 'cros_config / brand-code' 181*9c5db199SXin Li host = MockHost([], MockCmd(cros_config_cmd, 0, 'XXYZ\n')) 182*9c5db199SXin Li self.assertEqual(BrandCodeLabel().generate_labels(host), ['XXYZ']) 183*9c5db199SXin Li 184*9c5db199SXin Li def test_new_label_cros_config_fails(self): 185*9c5db199SXin Li cros_config_cmd = 'cros_config / brand-code' 186*9c5db199SXin Li host = MockHost([], MockCmd(cros_config_cmd, 1, 'XXYZ\n')) 187*9c5db199SXin Li self.assertEqual(BrandCodeLabel().generate_labels(host), []) 188*9c5db199SXin Li 189*9c5db199SXin Li def test_existing_label(self): 190*9c5db199SXin Li host = MockHost(['brand-code:ABCD']) 191*9c5db199SXin Li self.assertEqual(BrandCodeLabel().generate_labels(host), ['ABCD']) 192*9c5db199SXin Li 193*9c5db199SXin Li 194*9c5db199SXin Liclass Cr50Tests(unittest.TestCase): 195*9c5db199SXin Li """Unit tests for Cr50Label""" 196*9c5db199SXin Li 197*9c5db199SXin Li def test_cr50_pvt(self): 198*9c5db199SXin Li host = MockHost([], MockCmd('gsctool -a -f', 0, GSCTOOL_OUTPUT_PVT)) 199*9c5db199SXin Li self.assertEqual(Cr50Label().get(host), ['cr50:pvt']) 200*9c5db199SXin Li 201*9c5db199SXin Li def test_cr50_prepvt(self): 202*9c5db199SXin Li host = MockHost([], MockCmd('gsctool -a -f', 0, GSCTOOL_OUTPUT_PREPVT)) 203*9c5db199SXin Li self.assertEqual(Cr50Label().get(host), ['cr50:prepvt']) 204*9c5db199SXin Li 205*9c5db199SXin Li def test_gsctool_fails(self): 206*9c5db199SXin Li host = MockHost([], MockCmd('gsctool -a -f', 1, '')) 207*9c5db199SXin Li self.assertEqual(Cr50Label().get(host), []) 208*9c5db199SXin Li 209*9c5db199SXin Li 210*9c5db199SXin Liclass Cr50RWKeyidTests(unittest.TestCase): 211*9c5db199SXin Li """Unit tests for Cr50RWKeyidLabel""" 212*9c5db199SXin Li 213*9c5db199SXin Li def test_cr50_prod_rw(self): 214*9c5db199SXin Li host = MockHost([], MockCmd('gsctool -a -f', 0, GSCTOOL_OUTPUT_PVT)) 215*9c5db199SXin Li self.assertEqual(Cr50RWKeyidLabel().get(host), 216*9c5db199SXin Li ['cr50-rw-keyid:0xde88588d', 'cr50-rw-keyid:prod']) 217*9c5db199SXin Li 218*9c5db199SXin Li def test_cr50_dev_rw(self): 219*9c5db199SXin Li host = MockHost([], MockCmd('gsctool -a -f', 0, GSCTOOL_OUTPUT_DEV_RW)) 220*9c5db199SXin Li self.assertEqual(Cr50RWKeyidLabel().get(host), 221*9c5db199SXin Li ['cr50-rw-keyid:0xb93d6539', 'cr50-rw-keyid:dev']) 222*9c5db199SXin Li 223*9c5db199SXin Li def test_gsctool_fails(self): 224*9c5db199SXin Li host = MockHost([], MockCmd('gsctool -a -f', 1, '')) 225*9c5db199SXin Li self.assertEqual(Cr50RWKeyidLabel().get(host), []) 226*9c5db199SXin Li 227*9c5db199SXin Li 228*9c5db199SXin Liclass Cr50ROKeyidTests(unittest.TestCase): 229*9c5db199SXin Li """Unit tests for Cr50ROKeyidLabel""" 230*9c5db199SXin Li 231*9c5db199SXin Li def test_cr50_prod_ro(self): 232*9c5db199SXin Li host = MockHost([], MockCmd('gsctool -a -f', 0, GSCTOOL_OUTPUT_PREPVT)) 233*9c5db199SXin Li self.assertEqual(Cr50ROKeyidLabel().get(host), 234*9c5db199SXin Li ['cr50-ro-keyid:0xaa66150f', 'cr50-ro-keyid:prod']) 235*9c5db199SXin Li 236*9c5db199SXin Li def test_cr50_dev_ro(self): 237*9c5db199SXin Li host = MockHost([], MockCmd('gsctool -a -f', 0, GSCTOOL_OUTPUT_DEV_RO)) 238*9c5db199SXin Li self.assertEqual(Cr50ROKeyidLabel().get(host), 239*9c5db199SXin Li ['cr50-ro-keyid:0x3716ee6b', 'cr50-ro-keyid:dev']) 240*9c5db199SXin Li 241*9c5db199SXin Li def test_gsctool_fails(self): 242*9c5db199SXin Li host = MockHost([], MockCmd('gsctool -a -f', 1, '')) 243*9c5db199SXin Li self.assertEqual(Cr50ROKeyidLabel().get(host), []) 244*9c5db199SXin Li 245*9c5db199SXin Li 246*9c5db199SXin Liclass AudioConfigLabelTests(unittest.TestCase): 247*9c5db199SXin Li """Unit tests for AudioConfigLabel""" 248*9c5db199SXin Li 249*9c5db199SXin Li HAS_NC_BOARD_INI_OUTPUT = """ 250*9c5db199SXin Li [hotword] 251*9c5db199SXin Li pause_at_suspend=1 252*9c5db199SXin Li [processing] 253*9c5db199SXin Li nc_supported=1 254*9c5db199SXin Li hw_echo_ref_disabled=1 255*9c5db199SXin Li """ 256*9c5db199SXin Li 257*9c5db199SXin Li NO_NC_BOARD_INI_OUTPUT = """ 258*9c5db199SXin Li [hotword] 259*9c5db199SXin Li pause_at_suspend=1 260*9c5db199SXin Li [processing] 261*9c5db199SXin Li hw_echo_ref_disabled=1 262*9c5db199SXin Li """ 263*9c5db199SXin Li 264*9c5db199SXin Li DISABLED_NC_BOARD_INI_OUTPUT = """ 265*9c5db199SXin Li [hotword] 266*9c5db199SXin Li pause_at_suspend=1 267*9c5db199SXin Li [processing] 268*9c5db199SXin Li hw_echo_ref_disabled=1 269*9c5db199SXin Li nc_supported=0 270*9c5db199SXin Li """ 271*9c5db199SXin Li 272*9c5db199SXin Li def test_has_noise_cancellation_label_enabled(self): 273*9c5db199SXin Li cros_config_cmd = 'cros_config / name' 274*9c5db199SXin Li cras_config_cmd = 'cat /etc/cras/HAS_NC/board.ini' 275*9c5db199SXin Li host = MockHost([], MockCmd(cros_config_cmd, 0, 'HAS_NC\n'), 276*9c5db199SXin Li MockCmd(cras_config_cmd, 0, 277*9c5db199SXin Li self.HAS_NC_BOARD_INI_OUTPUT)) 278*9c5db199SXin Li self.assertEqual(AudioConfigLabel().get(host), 279*9c5db199SXin Li ['audio:has_noise_cancellation']) 280*9c5db199SXin Li 281*9c5db199SXin Li def test_has_noise_cancellation_label_not_exists(self): 282*9c5db199SXin Li cros_config_cmd = 'cros_config / name' 283*9c5db199SXin Li cras_config_cmd = 'cat /etc/cras/NO_NC/board.ini' 284*9c5db199SXin Li host = MockHost([], MockCmd(cros_config_cmd, 0, 'NO_NC\n'), 285*9c5db199SXin Li MockCmd(cras_config_cmd, 0, 286*9c5db199SXin Li self.NO_NC_BOARD_INI_OUTPUT)) 287*9c5db199SXin Li self.assertEqual(AudioConfigLabel().get(host), []) 288*9c5db199SXin Li 289*9c5db199SXin Li def test_has_noise_cancellation_label_disabled(self): 290*9c5db199SXin Li cros_config_cmd = 'cros_config / name' 291*9c5db199SXin Li cras_config_cmd = 'cat /etc/cras/DISABLED_NC/board.ini' 292*9c5db199SXin Li host = MockHost([], MockCmd(cros_config_cmd, 0, 'DISABLED_NC\n'), 293*9c5db199SXin Li MockCmd(cras_config_cmd, 0, 294*9c5db199SXin Li self.DISABLED_NC_BOARD_INI_OUTPUT)) 295*9c5db199SXin Li self.assertEqual(AudioConfigLabel().get(host), []) 296*9c5db199SXin Li 297*9c5db199SXin Li def test_has_noise_cancellation_label_fails_cros_config(self): 298*9c5db199SXin Li cros_config_cmd = 'cros_config / name' 299*9c5db199SXin Li cras_config_cmd = 'cat /etc/cras/HAS_NC/board.ini' 300*9c5db199SXin Li host = MockHost([], MockCmd(cros_config_cmd, 1, 'HAS_NC\n'), 301*9c5db199SXin Li MockCmd(cras_config_cmd, 0, 302*9c5db199SXin Li self.HAS_NC_BOARD_INI_OUTPUT)) 303*9c5db199SXin Li self.assertEqual(AudioConfigLabel().get(host), []) 304*9c5db199SXin Li 305*9c5db199SXin Li def test_has_noise_cancellation_label_fails_cras_config(self): 306*9c5db199SXin Li cros_config_cmd = 'cros_config / name' 307*9c5db199SXin Li cras_config_cmd = 'cat /etc/cras/HAS_NC/board.ini' 308*9c5db199SXin Li host = MockHost([], MockCmd(cros_config_cmd, 0, 'HAS_NC\n'), 309*9c5db199SXin Li MockCmd(cras_config_cmd, 1, 310*9c5db199SXin Li self.HAS_NC_BOARD_INI_OUTPUT)) 311*9c5db199SXin Li self.assertEqual(AudioConfigLabel().get(host), []) 312*9c5db199SXin Li 313*9c5db199SXin Li 314*9c5db199SXin Liclass AudioLoopbackDongleLabelTests(unittest.TestCase): 315*9c5db199SXin Li def test_update_for_task(self): 316*9c5db199SXin Li self.assertTrue(AudioLoopbackDongleLabel().update_for_task('')) 317*9c5db199SXin Li self.assertTrue(AudioLoopbackDongleLabel().update_for_task('repair')) 318*9c5db199SXin Li self.assertFalse(AudioLoopbackDongleLabel().update_for_task('deploy')) 319*9c5db199SXin Li 320*9c5db199SXin Li 321*9c5db199SXin Liclass ChameleonConnectionLabelTests(unittest.TestCase): 322*9c5db199SXin Li def test_update_for_task(self): 323*9c5db199SXin Li self.assertTrue(ChameleonConnectionLabel().update_for_task('')) 324*9c5db199SXin Li self.assertFalse(ChameleonConnectionLabel().update_for_task('repair')) 325*9c5db199SXin Li self.assertTrue(ChameleonConnectionLabel().update_for_task('deploy')) 326*9c5db199SXin Li 327*9c5db199SXin Li 328*9c5db199SXin Liclass ChameleonLabelTests(unittest.TestCase): 329*9c5db199SXin Li def test_update_for_task(self): 330*9c5db199SXin Li self.assertTrue(ChameleonLabel().update_for_task('')) 331*9c5db199SXin Li self.assertTrue(ChameleonLabel().update_for_task('repair')) 332*9c5db199SXin Li self.assertFalse(ChameleonLabel().update_for_task('deploy')) 333*9c5db199SXin Li 334*9c5db199SXin Li 335*9c5db199SXin Liclass ServoTypeLabelTests(unittest.TestCase): 336*9c5db199SXin Li """Unit tests for ServoTypeLabel""" 337*9c5db199SXin Li def test_update_for_task(self): 338*9c5db199SXin Li self.assertTrue(ServoTypeLabel().update_for_task('')) 339*9c5db199SXin Li self.assertFalse(ServoTypeLabel().update_for_task('repair')) 340*9c5db199SXin Li self.assertTrue(ServoTypeLabel().update_for_task('deploy')) 341*9c5db199SXin Li 342*9c5db199SXin Li def test_generate_labels_return_value_from_labels(self): 343*9c5db199SXin Li host = MockHost(['servo_type:Some_interesting']) 344*9c5db199SXin Li servo = ServoTypeLabel() 345*9c5db199SXin Li self.assertEqual(servo.get(host), ['servo_type:Some_interesting']) 346*9c5db199SXin Li self.assertEqual(servo.generate_labels(host), ['Some_interesting']) 347*9c5db199SXin Li 348*9c5db199SXin Li def test_generate_labels_from_cache_when_servo_is_none(self): 349*9c5db199SXin Li host = MockHost(['servo_state:Some_interesting']) 350*9c5db199SXin Li host.servo = None 351*9c5db199SXin Li servo = ServoTypeLabel() 352*9c5db199SXin Li self.assertEqual(servo.get(host), []) 353*9c5db199SXin Li self.assertEqual(servo.generate_labels(host), []) 354*9c5db199SXin Li 355*9c5db199SXin Li def test_generate_labels_not_from_cache_when_servo_exist(self): 356*9c5db199SXin Li host = MockHost(['servo_type']) 357*9c5db199SXin Li host.servo = mock.Mock() 358*9c5db199SXin Li host.servo.get_servo_version.return_value = 'servo_v3' 359*9c5db199SXin Li servo = ServoTypeLabel() 360*9c5db199SXin Li self.assertEqual(servo.get(host), ['servo_type:servo_v3']) 361*9c5db199SXin Li self.assertEqual(servo.generate_labels(host), ['servo_v3']) 362*9c5db199SXin Li host.servo.get_servo_version.assert_called() 363*9c5db199SXin Li 364*9c5db199SXin Li 365*9c5db199SXin Liif __name__ == '__main__': 366*9c5db199SXin Li unittest.main() 367