#!/usr/bin/python2.7 # # Copyright 2017 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import copy import unittest import common from autotest_lib.utils import labellib class KeyvalLabelTestCase(unittest.TestCase): """Tests for basic KeyvalLabel functions.""" def test_parse_keyval_label(self): got = labellib.parse_keyval_label('pool:suites') self.assertEqual(got, labellib.KeyvalLabel('pool', 'suites')) def test_parse_keyval_label_with_multiple_colons(self): got = labellib.parse_keyval_label('pool:suites:penthouse') self.assertEqual(got, labellib.KeyvalLabel('pool', 'suites:penthouse')) def test_parse_keyval_label_raises(self): with self.assertRaises(ValueError): labellib.parse_keyval_label('webcam') def test_format_keyval_label(self): got = labellib.format_keyval_label( labellib.KeyvalLabel('pool', 'suites')) self.assertEqual(got, 'pool:suites') def test_format_keyval_label_with_colon_in_value(self): got = labellib.format_keyval_label( labellib.KeyvalLabel('pool', 'suites:penthouse')) self.assertEqual(got, 'pool:suites:penthouse') class LabelsMappingTestCase(unittest.TestCase): """Tests for LabelsMapping class.""" def test_getlabels(self): labels = ['webcam', 'pool:suites'] mapping = labellib.LabelsMapping(labels) self.assertEqual(mapping.getlabels(), labels) def test_init_and_getlabels_should_remove_duplicates(self): labels = ['webcam', 'pool:suites', 'pool:party'] mapping = labellib.LabelsMapping(labels) self.assertEqual(mapping.getlabels(), ['webcam', 'pool:suites']) def test_init_and_getlabels_should_move_plain_labels_first(self): labels = ['ohse:tsubame', 'webcam'] mapping = labellib.LabelsMapping(labels) self.assertEqual(mapping.getlabels(), ['webcam', 'ohse:tsubame']) def test_init_and_getlabels_should_preserve_plain_label_order(self): labels = ['webcam', 'exec', 'method'] mapping = labellib.LabelsMapping(labels) self.assertEqual(mapping.getlabels(), ['webcam', 'exec', 'method']) def test_init_and_getlabels_should_preserve_keyval_label_order(self): labels = ['class:protecta', 'method:metafalica', 'exec:chronicle_key'] mapping = labellib.LabelsMapping(labels) self.assertEqual(mapping.getlabels(), labels) def test_init_should_not_mutate_labels(self): labels = ['class:protecta', 'exec:chronicle_key', 'method:metafalica'] input_labels = copy.deepcopy(labels) mapping = labellib.LabelsMapping(input_labels) mapping['class'] = 'distllista' self.assertEqual(input_labels, labels) def test_init_mutated_arg_should_not_affect_mapping(self): labels = ['class:protecta', 'exec:chronicle_key', 'method:metafalica'] mapping = labellib.LabelsMapping(labels) original_mapping = copy.deepcopy(mapping) labels.pop() self.assertEqual(mapping, original_mapping) def test_duplicate_keys_should_take_first(self): labels = ['webcam', 'pool:party', 'pool:suites'] mapping = labellib.LabelsMapping(labels) self.assertEqual(mapping['pool'], 'party') def test_getitem(self): labels = ['webcam', 'pool:suites'] mapping = labellib.LabelsMapping(labels) self.assertEqual(mapping['pool'], 'suites') def test_in(self): labels = ['webcam', 'pool:suites'] mapping = labellib.LabelsMapping(labels) self.assertIn('pool', mapping) def test_setitem(self): labels = ['webcam'] mapping = labellib.LabelsMapping(labels) mapping['pool'] = 'suites' self.assertEqual(mapping['pool'], 'suites') def test_setitem_to_none_should_delete(self): labels = ['webcam', 'pool:suites'] mapping = labellib.LabelsMapping(labels) mapping['pool'] = None self.assertNotIn('pool', mapping) def test_setitem_to_none_with_missing_key_should_noop(self): labels = ['webcam', 'pool:suites'] mapping = labellib.LabelsMapping(labels) mapping['foo'] = None self.assertNotIn('foo', mapping) def test_delitem(self): labels = ['webcam', 'pool:suites'] mapping = labellib.LabelsMapping(labels) del mapping['pool'] self.assertNotIn('pool', mapping) def test_iter(self): labels = ['webcam', 'pool:suites'] mapping = labellib.LabelsMapping(labels) self.assertEqual(list(iter(mapping)), ['pool']) def test_len(self): labels = ['webcam', 'pool:suites'] mapping = labellib.LabelsMapping(labels) self.assertEqual(len(mapping), 1) class CrosVersionTestCase(unittest.TestCase): """Tests for CrosVersion functions.""" def test_parse_cros_version_without_rc(self): got = labellib.parse_cros_version('lumpy-release/R27-3773.0.0') self.assertEqual(got, labellib.CrosVersion('lumpy-release', 'lumpy', 'R27', '3773.0.0', None)) def test_parse_cros_version_with_rc(self): got = labellib.parse_cros_version('lumpy-release/R27-3773.0.0-rc1') self.assertEqual(got, labellib.CrosVersion('lumpy-release', 'lumpy', 'R27', '3773.0.0', 'rc1')) def test_parse_cros_version_raises(self): with self.assertRaises(ValueError): labellib.parse_cros_version('foo') def test_format_cros_version_without_rc(self): got = labellib.format_cros_version( labellib.CrosVersion('lumpy-release', 'lumpy', 'R27', '3773.0.0', None)) self.assertEqual(got, 'lumpy-release/R27-3773.0.0') def test_format_cros_version_with_rc(self): got = labellib.format_cros_version( labellib.CrosVersion('lumpy-release', 'lumpy', 'R27', '3773.0.0', 'rc1')) self.assertEqual(got, 'lumpy-release/R27-3773.0.0-rc1') def test_parse_cros_version_for_board(self): test_builds = ['lumpy-release/R27-3773.0.0-rc1', 'trybot-lumpy-paladin/R27-3773.0.0', 'lumpy-pre-cq/R27-3773.0.0-rc1', 'lumpy-test-ap/R27-3773.0.0-rc1', 'lumpy-toolchain/R27-3773.0.0-rc1', ] for build in test_builds: cros_version = labellib.parse_cros_version(build) self.assertEqual(cros_version.board, 'lumpy') self.assertEqual(cros_version.milestone, 'R27') build = 'trybot-lumpy-a-pre-cq/R27-3773.0.0-rc1' cros_version = labellib.parse_cros_version(build) self.assertEqual(cros_version.board, 'lumpy-a') self.assertEqual(cros_version.milestone, 'R27') build = 'trybot-lumpy_a-pre-cq/R27-3773.0.0-rc1' cros_version = labellib.parse_cros_version(build) self.assertEqual(cros_version.board, 'lumpy_a') self.assertEqual(cros_version.milestone, 'R27') if __name__ == '__main__': unittest.main()