xref: /aosp_15_r20/external/autotest/utils/labellib_unittest.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li#!/usr/bin/python3
2*9c5db199SXin Li#
3*9c5db199SXin Li# Copyright 2017 The Chromium OS Authors. All rights reserved.
4*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
5*9c5db199SXin Li# found in the LICENSE file.
6*9c5db199SXin Li
7*9c5db199SXin Liimport copy
8*9c5db199SXin Liimport unittest
9*9c5db199SXin Li
10*9c5db199SXin Liimport common
11*9c5db199SXin Lifrom autotest_lib.utils import labellib
12*9c5db199SXin Li
13*9c5db199SXin Li
14*9c5db199SXin Liclass KeyvalLabelTestCase(unittest.TestCase):
15*9c5db199SXin Li    """Tests for basic KeyvalLabel functions."""
16*9c5db199SXin Li
17*9c5db199SXin Li    def test_parse_keyval_label(self):
18*9c5db199SXin Li        got = labellib.parse_keyval_label('pool:suites')
19*9c5db199SXin Li        self.assertEqual(got, labellib.KeyvalLabel('pool', 'suites'))
20*9c5db199SXin Li
21*9c5db199SXin Li    def test_parse_keyval_label_with_multiple_colons(self):
22*9c5db199SXin Li        got = labellib.parse_keyval_label('pool:suites:penthouse')
23*9c5db199SXin Li        self.assertEqual(got, labellib.KeyvalLabel('pool', 'suites:penthouse'))
24*9c5db199SXin Li
25*9c5db199SXin Li    def test_parse_keyval_label_raises(self):
26*9c5db199SXin Li        with self.assertRaises(ValueError):
27*9c5db199SXin Li            labellib.parse_keyval_label('webcam')
28*9c5db199SXin Li
29*9c5db199SXin Li    def test_format_keyval_label(self):
30*9c5db199SXin Li        got = labellib.format_keyval_label(
31*9c5db199SXin Li                labellib.KeyvalLabel('pool', 'suites'))
32*9c5db199SXin Li        self.assertEqual(got, 'pool:suites')
33*9c5db199SXin Li
34*9c5db199SXin Li    def test_format_keyval_label_with_colon_in_value(self):
35*9c5db199SXin Li        got = labellib.format_keyval_label(
36*9c5db199SXin Li                labellib.KeyvalLabel('pool', 'suites:penthouse'))
37*9c5db199SXin Li        self.assertEqual(got, 'pool:suites:penthouse')
38*9c5db199SXin Li
39*9c5db199SXin Li
40*9c5db199SXin Liclass LabelsMappingTestCase(unittest.TestCase):
41*9c5db199SXin Li    """Tests for LabelsMapping class."""
42*9c5db199SXin Li
43*9c5db199SXin Li    def test_getlabels(self):
44*9c5db199SXin Li        labels = ['webcam', 'pool:suites']
45*9c5db199SXin Li        mapping = labellib.LabelsMapping(labels)
46*9c5db199SXin Li        self.assertEqual(mapping.getlabels(), labels)
47*9c5db199SXin Li
48*9c5db199SXin Li    def test_init_and_getlabels_should_remove_duplicates(self):
49*9c5db199SXin Li        labels = ['webcam', 'pool:suites', 'pool:party']
50*9c5db199SXin Li        mapping = labellib.LabelsMapping(labels)
51*9c5db199SXin Li        self.assertEqual(mapping.getlabels(), ['webcam', 'pool:suites'])
52*9c5db199SXin Li
53*9c5db199SXin Li    def test_init_and_getlabels_should_move_plain_labels_first(self):
54*9c5db199SXin Li        labels = ['ohse:tsubame', 'webcam']
55*9c5db199SXin Li        mapping = labellib.LabelsMapping(labels)
56*9c5db199SXin Li        self.assertEqual(mapping.getlabels(), ['webcam', 'ohse:tsubame'])
57*9c5db199SXin Li
58*9c5db199SXin Li    def test_init_and_getlabels_should_preserve_plain_label_order(self):
59*9c5db199SXin Li        labels = ['webcam', 'exec', 'method']
60*9c5db199SXin Li        mapping = labellib.LabelsMapping(labels)
61*9c5db199SXin Li        self.assertEqual(mapping.getlabels(), ['webcam', 'exec', 'method'])
62*9c5db199SXin Li
63*9c5db199SXin Li    def test_init_and_getlabels_should_preserve_keyval_label_order(self):
64*9c5db199SXin Li        labels = ['class:protecta', 'method:metafalica', 'exec:chronicle_key']
65*9c5db199SXin Li        mapping = labellib.LabelsMapping(labels)
66*9c5db199SXin Li        self.assertEqual(mapping.getlabels(), labels)
67*9c5db199SXin Li
68*9c5db199SXin Li    def test_init_should_not_mutate_labels(self):
69*9c5db199SXin Li        labels = ['class:protecta', 'exec:chronicle_key', 'method:metafalica']
70*9c5db199SXin Li        input_labels = copy.deepcopy(labels)
71*9c5db199SXin Li        mapping = labellib.LabelsMapping(input_labels)
72*9c5db199SXin Li        mapping['class'] = 'distllista'
73*9c5db199SXin Li        self.assertEqual(input_labels, labels)
74*9c5db199SXin Li
75*9c5db199SXin Li    def test_init_mutated_arg_should_not_affect_mapping(self):
76*9c5db199SXin Li        labels = ['class:protecta', 'exec:chronicle_key', 'method:metafalica']
77*9c5db199SXin Li        mapping = labellib.LabelsMapping(labels)
78*9c5db199SXin Li        original_mapping = copy.deepcopy(mapping)
79*9c5db199SXin Li        labels.pop()
80*9c5db199SXin Li        self.assertEqual(mapping, original_mapping)
81*9c5db199SXin Li
82*9c5db199SXin Li    def test_duplicate_keys_should_take_first(self):
83*9c5db199SXin Li        labels = ['webcam', 'pool:party', 'pool:suites']
84*9c5db199SXin Li        mapping = labellib.LabelsMapping(labels)
85*9c5db199SXin Li        self.assertEqual(mapping['pool'], 'party')
86*9c5db199SXin Li
87*9c5db199SXin Li    def test_getitem(self):
88*9c5db199SXin Li        labels = ['webcam', 'pool:suites']
89*9c5db199SXin Li        mapping = labellib.LabelsMapping(labels)
90*9c5db199SXin Li        self.assertEqual(mapping['pool'], 'suites')
91*9c5db199SXin Li
92*9c5db199SXin Li    def test_in(self):
93*9c5db199SXin Li        labels = ['webcam', 'pool:suites']
94*9c5db199SXin Li        mapping = labellib.LabelsMapping(labels)
95*9c5db199SXin Li        self.assertIn('pool', mapping)
96*9c5db199SXin Li
97*9c5db199SXin Li    def test_setitem(self):
98*9c5db199SXin Li        labels = ['webcam']
99*9c5db199SXin Li        mapping = labellib.LabelsMapping(labels)
100*9c5db199SXin Li        mapping['pool'] = 'suites'
101*9c5db199SXin Li        self.assertEqual(mapping['pool'], 'suites')
102*9c5db199SXin Li
103*9c5db199SXin Li    def test_setitem_to_none_should_delete(self):
104*9c5db199SXin Li        labels = ['webcam', 'pool:suites']
105*9c5db199SXin Li        mapping = labellib.LabelsMapping(labels)
106*9c5db199SXin Li        mapping['pool'] = None
107*9c5db199SXin Li        self.assertNotIn('pool', mapping)
108*9c5db199SXin Li
109*9c5db199SXin Li    def test_setitem_to_none_with_missing_key_should_noop(self):
110*9c5db199SXin Li        labels = ['webcam', 'pool:suites']
111*9c5db199SXin Li        mapping = labellib.LabelsMapping(labels)
112*9c5db199SXin Li        mapping['foo'] = None
113*9c5db199SXin Li        self.assertNotIn('foo', mapping)
114*9c5db199SXin Li
115*9c5db199SXin Li    def test_delitem(self):
116*9c5db199SXin Li        labels = ['webcam', 'pool:suites']
117*9c5db199SXin Li        mapping = labellib.LabelsMapping(labels)
118*9c5db199SXin Li        del mapping['pool']
119*9c5db199SXin Li        self.assertNotIn('pool', mapping)
120*9c5db199SXin Li
121*9c5db199SXin Li    def test_iter(self):
122*9c5db199SXin Li        labels = ['webcam', 'pool:suites']
123*9c5db199SXin Li        mapping = labellib.LabelsMapping(labels)
124*9c5db199SXin Li        self.assertEqual(list(iter(mapping)), ['pool'])
125*9c5db199SXin Li
126*9c5db199SXin Li    def test_len(self):
127*9c5db199SXin Li        labels = ['webcam', 'pool:suites']
128*9c5db199SXin Li        mapping = labellib.LabelsMapping(labels)
129*9c5db199SXin Li        self.assertEqual(len(mapping), 1)
130*9c5db199SXin Li
131*9c5db199SXin Li
132*9c5db199SXin Liclass CrosVersionTestCase(unittest.TestCase):
133*9c5db199SXin Li    """Tests for CrosVersion functions."""
134*9c5db199SXin Li
135*9c5db199SXin Li    def test_parse_cros_version_without_rc(self):
136*9c5db199SXin Li        got = labellib.parse_cros_version('lumpy-release/R27-3773.0.0')
137*9c5db199SXin Li        self.assertEqual(got, labellib.CrosVersion('lumpy-release', 'lumpy',
138*9c5db199SXin Li                                                   'R27', '3773.0.0', None))
139*9c5db199SXin Li
140*9c5db199SXin Li    def test_parse_cros_version_with_rc(self):
141*9c5db199SXin Li        got = labellib.parse_cros_version('lumpy-release/R27-3773.0.0-rc1')
142*9c5db199SXin Li        self.assertEqual(got, labellib.CrosVersion('lumpy-release', 'lumpy',
143*9c5db199SXin Li                                                   'R27', '3773.0.0', 'rc1'))
144*9c5db199SXin Li
145*9c5db199SXin Li    def test_parse_cros_version_raises(self):
146*9c5db199SXin Li        with self.assertRaises(ValueError):
147*9c5db199SXin Li            labellib.parse_cros_version('foo')
148*9c5db199SXin Li
149*9c5db199SXin Li    def test_format_cros_version_without_rc(self):
150*9c5db199SXin Li        got = labellib.format_cros_version(
151*9c5db199SXin Li                labellib.CrosVersion('lumpy-release', 'lumpy', 'R27',
152*9c5db199SXin Li                                     '3773.0.0', None))
153*9c5db199SXin Li        self.assertEqual(got, 'lumpy-release/R27-3773.0.0')
154*9c5db199SXin Li
155*9c5db199SXin Li    def test_format_cros_version_with_rc(self):
156*9c5db199SXin Li        got = labellib.format_cros_version(
157*9c5db199SXin Li                labellib.CrosVersion('lumpy-release', 'lumpy',  'R27',
158*9c5db199SXin Li                                     '3773.0.0', 'rc1'))
159*9c5db199SXin Li        self.assertEqual(got, 'lumpy-release/R27-3773.0.0-rc1')
160*9c5db199SXin Li
161*9c5db199SXin Li    def test_parse_cros_version_for_board(self):
162*9c5db199SXin Li        test_builds = ['lumpy-release/R27-3773.0.0-rc1',
163*9c5db199SXin Li                       'trybot-lumpy-paladin/R27-3773.0.0',
164*9c5db199SXin Li                       'lumpy-pre-cq/R27-3773.0.0-rc1',
165*9c5db199SXin Li                       'lumpy-test-ap/R27-3773.0.0-rc1',
166*9c5db199SXin Li                       'lumpy-toolchain/R27-3773.0.0-rc1',
167*9c5db199SXin Li                       ]
168*9c5db199SXin Li        for build in test_builds:
169*9c5db199SXin Li            cros_version = labellib.parse_cros_version(build)
170*9c5db199SXin Li            self.assertEqual(cros_version.board, 'lumpy')
171*9c5db199SXin Li            self.assertEqual(cros_version.milestone, 'R27')
172*9c5db199SXin Li
173*9c5db199SXin Li        build = 'trybot-lumpy-a-pre-cq/R27-3773.0.0-rc1'
174*9c5db199SXin Li        cros_version = labellib.parse_cros_version(build)
175*9c5db199SXin Li        self.assertEqual(cros_version.board, 'lumpy-a')
176*9c5db199SXin Li        self.assertEqual(cros_version.milestone, 'R27')
177*9c5db199SXin Li
178*9c5db199SXin Li        build = 'trybot-lumpy_a-pre-cq/R27-3773.0.0-rc1'
179*9c5db199SXin Li        cros_version = labellib.parse_cros_version(build)
180*9c5db199SXin Li        self.assertEqual(cros_version.board, 'lumpy_a')
181*9c5db199SXin Li        self.assertEqual(cros_version.milestone, 'R27')
182*9c5db199SXin Li
183*9c5db199SXin Li
184*9c5db199SXin Liif __name__ == '__main__':
185*9c5db199SXin Li    unittest.main()
186