xref: /aosp_15_r20/external/autotest/server/hosts/cros_label_unittest.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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