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