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