xref: /aosp_15_r20/external/autotest/server/hosts/base_label_unittest.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li#!/usr/bin/python3
2*9c5db199SXin Li# Copyright 2016 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 Li
8*9c5db199SXin Liimport common
9*9c5db199SXin Li
10*9c5db199SXin Lifrom autotest_lib.server import utils
11*9c5db199SXin Lifrom autotest_lib.server.hosts import host_info
12*9c5db199SXin Lifrom autotest_lib.server.hosts import base_label
13*9c5db199SXin Li
14*9c5db199SXin Li # pylint: disable=missing-docstring
15*9c5db199SXin Li
16*9c5db199SXin Li
17*9c5db199SXin Liclass TestBaseLabel(base_label.BaseLabel):
18*9c5db199SXin Li    """TestBaseLabel is used for testing/validating BaseLabel methods."""
19*9c5db199SXin Li
20*9c5db199SXin Li    _NAME = 'base_label'
21*9c5db199SXin Li
22*9c5db199SXin Li    def exists(self, host):
23*9c5db199SXin Li        return host.exists
24*9c5db199SXin Li
25*9c5db199SXin Li
26*9c5db199SXin Liclass TestBaseLabels(base_label.BaseLabel):
27*9c5db199SXin Li    """
28*9c5db199SXin Li    TestBaseLabels is used for testing/validating BaseLabel methods.
29*9c5db199SXin Li
30*9c5db199SXin Li    This is a variation of BaseLabel with multiple labels for _NAME
31*9c5db199SXin Li    to ensure we handle a label that contains a list of labels for
32*9c5db199SXin Li    its _NAME attribute.
33*9c5db199SXin Li    """
34*9c5db199SXin Li
35*9c5db199SXin Li    _NAME = ['base_label_1' , 'base_label_2']
36*9c5db199SXin Li
37*9c5db199SXin Li
38*9c5db199SXin Liclass TestStringPrefixLabel(base_label.StringPrefixLabel):
39*9c5db199SXin Li    """
40*9c5db199SXin Li    TestBaseLabels is used for testing/validating StringPrefixLabel methods.
41*9c5db199SXin Li
42*9c5db199SXin Li    This test class is to check that we properly construct the prefix labels
43*9c5db199SXin Li    with the label passed in during construction.
44*9c5db199SXin Li    """
45*9c5db199SXin Li
46*9c5db199SXin Li    _NAME = 'prefix'
47*9c5db199SXin Li
48*9c5db199SXin Li    def __init__(self, label='postfix'):
49*9c5db199SXin Li        self.label_to_return = label
50*9c5db199SXin Li
51*9c5db199SXin Li
52*9c5db199SXin Li    def generate_labels(self, _):
53*9c5db199SXin Li        return [self.label_to_return]
54*9c5db199SXin Li
55*9c5db199SXin Li
56*9c5db199SXin Liclass MockAFEHost(utils.EmptyAFEHost):
57*9c5db199SXin Li
58*9c5db199SXin Li    def __init__(self, labels=None, attributes=None):
59*9c5db199SXin Li        self.labels = labels or []
60*9c5db199SXin Li        self.attributes = attributes or {}
61*9c5db199SXin Li
62*9c5db199SXin Li
63*9c5db199SXin Liclass MockHost(object):
64*9c5db199SXin Li
65*9c5db199SXin Li    def __init__(self, exists=True, store=None):
66*9c5db199SXin Li        self.hostname = 'hostname'
67*9c5db199SXin Li        self.exists = exists
68*9c5db199SXin Li        self.host_info_store = store
69*9c5db199SXin Li
70*9c5db199SXin Li
71*9c5db199SXin Liclass BaseLabelUnittests(unittest.TestCase):
72*9c5db199SXin Li    """Unittest for testing base_label.BaseLabel."""
73*9c5db199SXin Li
74*9c5db199SXin Li    def setUp(self):
75*9c5db199SXin Li        self.test_base_label = TestBaseLabel()
76*9c5db199SXin Li        self.test_base_labels = TestBaseLabels()
77*9c5db199SXin Li
78*9c5db199SXin Li
79*9c5db199SXin Li    def test_generate_labels(self):
80*9c5db199SXin Li        """Let's make sure generate_labels() returns the labels expected."""
81*9c5db199SXin Li        self.assertEqual(self.test_base_label.generate_labels(None),
82*9c5db199SXin Li                         [self.test_base_label._NAME])
83*9c5db199SXin Li
84*9c5db199SXin Li
85*9c5db199SXin Li    def test_get(self):
86*9c5db199SXin Li        """Let's make sure the logic in get() works as expected."""
87*9c5db199SXin Li        # We should get labels here.
88*9c5db199SXin Li        self.assertEqual(self.test_base_label.get(MockHost(exists=True)),
89*9c5db199SXin Li                         [self.test_base_label._NAME])
90*9c5db199SXin Li        # We should get nothing here.
91*9c5db199SXin Li        self.assertEqual(self.test_base_label.get(MockHost(exists=False)),
92*9c5db199SXin Li                         [])
93*9c5db199SXin Li
94*9c5db199SXin Li
95*9c5db199SXin Li    def test_get_all_labels(self):
96*9c5db199SXin Li        """Check that we get the expected labels for get_all_labels()."""
97*9c5db199SXin Li        prefix_tbl, full_tbl = self.test_base_label.get_all_labels()
98*9c5db199SXin Li        prefix_tbls, full_tbls = self.test_base_labels.get_all_labels()
99*9c5db199SXin Li
100*9c5db199SXin Li        # We want to check that we always get a list of labels regardless if
101*9c5db199SXin Li        # the label class attribute _NAME is a list or a string.
102*9c5db199SXin Li        self.assertEqual(full_tbl, set([self.test_base_label._NAME]))
103*9c5db199SXin Li        self.assertEqual(full_tbls, set(self.test_base_labels._NAME))
104*9c5db199SXin Li
105*9c5db199SXin Li        # We want to make sure we get nothing on the prefix_* side of things
106*9c5db199SXin Li        # since BaseLabel shouldn't be a prefix for any label.
107*9c5db199SXin Li        self.assertEqual(prefix_tbl, set())
108*9c5db199SXin Li        self.assertEqual(prefix_tbls, set())
109*9c5db199SXin Li
110*9c5db199SXin Li    def test_update_for_task(self):
111*9c5db199SXin Li        self.assertTrue(self.test_base_label.update_for_task(''))
112*9c5db199SXin Li
113*9c5db199SXin Li
114*9c5db199SXin Liclass StringPrefixLabelUnittests(unittest.TestCase):
115*9c5db199SXin Li    """Unittest for testing base_label.StringPrefixLabel."""
116*9c5db199SXin Li
117*9c5db199SXin Li    def setUp(self):
118*9c5db199SXin Li        self.postfix_label = 'postfix_label'
119*9c5db199SXin Li        self.test_label = TestStringPrefixLabel(label=self.postfix_label)
120*9c5db199SXin Li
121*9c5db199SXin Li
122*9c5db199SXin Li    def test_get(self):
123*9c5db199SXin Li        """Let's make sure that the labels we get are prefixed."""
124*9c5db199SXin Li        self.assertEqual(self.test_label.get(None),
125*9c5db199SXin Li                         ['%s:%s' % (self.test_label._NAME,
126*9c5db199SXin Li                                     self.postfix_label)])
127*9c5db199SXin Li
128*9c5db199SXin Li
129*9c5db199SXin Li    def test_get_all_labels(self):
130*9c5db199SXin Li        """Check that we only get prefix labels and no full labels."""
131*9c5db199SXin Li        prefix_labels, postfix_labels = self.test_label.get_all_labels()
132*9c5db199SXin Li        self.assertEqual(prefix_labels, set(['%s:' % self.test_label._NAME]))
133*9c5db199SXin Li        self.assertEqual(postfix_labels, set())
134*9c5db199SXin Li
135*9c5db199SXin Li
136*9c5db199SXin Liclass LabelRetrieverUnittests(unittest.TestCase):
137*9c5db199SXin Li    """Unittest for testing base_label.LabelRetriever."""
138*9c5db199SXin Li
139*9c5db199SXin Li    def setUp(self):
140*9c5db199SXin Li        label_list = [TestStringPrefixLabel(), TestBaseLabel()]
141*9c5db199SXin Li        self.retriever = base_label.LabelRetriever(label_list)
142*9c5db199SXin Li        self.retriever._populate_known_labels(label_list, '')
143*9c5db199SXin Li
144*9c5db199SXin Li
145*9c5db199SXin Li    def test_populate_known_labels(self):
146*9c5db199SXin Li        """Check that _populate_known_labels() works as expected."""
147*9c5db199SXin Li        full_names = set([TestBaseLabel._NAME])
148*9c5db199SXin Li        prefix_names = set(['%s:' % TestStringPrefixLabel._NAME])
149*9c5db199SXin Li        # Check on a normal retriever.
150*9c5db199SXin Li        self.assertEqual(self.retriever.label_full_names, full_names)
151*9c5db199SXin Li        self.assertEqual(self.retriever.label_prefix_names, prefix_names)
152*9c5db199SXin Li
153*9c5db199SXin Li
154*9c5db199SXin Li    def test_is_known_label(self):
155*9c5db199SXin Li        """Check _is_known_label() detects/skips the right labels."""
156*9c5db199SXin Li        # This will be a list of tuples of label and expected return bool.
157*9c5db199SXin Li        # Make sure Full matches match correctly
158*9c5db199SXin Li        labels_to_check = [(TestBaseLabel._NAME, True),
159*9c5db199SXin Li                           ('%s:' % TestStringPrefixLabel._NAME, True),
160*9c5db199SXin Li                           # Make sure partial matches fail.
161*9c5db199SXin Li                           (TestBaseLabel._NAME[:2], False),
162*9c5db199SXin Li                           ('%s:' % TestStringPrefixLabel._NAME[:2], False),
163*9c5db199SXin Li                           ('no_label_match', False)]
164*9c5db199SXin Li
165*9c5db199SXin Li        for label, expected_known in labels_to_check:
166*9c5db199SXin Li            self.assertEqual(self.retriever._is_known_label(label),
167*9c5db199SXin Li                             expected_known)
168*9c5db199SXin Li
169*9c5db199SXin Li
170*9c5db199SXin Li    def test_update_labels(self):
171*9c5db199SXin Li        """Check that we add/remove the expected labels in update_labels()."""
172*9c5db199SXin Li        label_to_add = 'label_to_add'
173*9c5db199SXin Li        label_to_remove = 'prefix:label_to_remove'
174*9c5db199SXin Li        store = host_info.InMemoryHostInfoStore(
175*9c5db199SXin Li                info=host_info.HostInfo(
176*9c5db199SXin Li                        labels=[label_to_remove, TestBaseLabel._NAME],
177*9c5db199SXin Li                ),
178*9c5db199SXin Li        )
179*9c5db199SXin Li        mockhost = MockHost(store=store)
180*9c5db199SXin Li
181*9c5db199SXin Li        retriever = base_label.LabelRetriever(
182*9c5db199SXin Li                [TestStringPrefixLabel(label=label_to_add),
183*9c5db199SXin Li                 TestBaseLabel()])
184*9c5db199SXin Li        retriever.update_labels(mockhost)
185*9c5db199SXin Li        self.assertEqual(
186*9c5db199SXin Li                set(store.get().labels),
187*9c5db199SXin Li                {'%s:%s' % (TestStringPrefixLabel._NAME, label_to_add),
188*9c5db199SXin Li                 TestBaseLabel._NAME},
189*9c5db199SXin Li        )
190*9c5db199SXin Li
191*9c5db199SXin Li
192*9c5db199SXin Liif __name__ == '__main__':
193*9c5db199SXin Li    unittest.main()
194*9c5db199SXin Li
195