#!/usr/bin/python3
#
# 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()
