#!/usr/bin/python2
# pylint: disable-msg=C0111
#
# Copyright 2008 Google Inc. All Rights Reserved.

"""Tests for label."""

import unittest

import common
from autotest_lib.cli import cli_mock


class label_list_unittest(cli_mock.cli_unittest):
    values = [{u'id': 180,          # Valid label
               u'platform': False,
               u'name': u'label0',
               u'invalid': False,
               u'kernel_config': u'',
               u'only_if_needed': False},
              {u'id': 338,          # Valid label
               u'platform': False,
               u'name': u'label1',
               u'invalid': False,
               u'kernel_config': u'',
               u'only_if_needed': False},
              {u'id': 340,          # Invalid label
               u'platform': False,
               u'name': u'label2',
               u'invalid': True,
               u'kernel_config': u'',
               u'only_if_needed': False},
              {u'id': 350,          # Valid platform
               u'platform': True,
               u'name': u'plat0',
               u'invalid': False,
               u'kernel_config': u'',
               u'only_if_needed': False},
              {u'id': 420,          # Invalid platform
               u'platform': True,
               u'name': u'plat1',
               u'invalid': True,
               u'kernel_config': u'',
               u'only_if_needed': False}]


    def test_label_list_labels_only(self):
        self.run_cmd(argv=['atest', 'label', 'list'],
                     rpcs=[('get_labels', {}, True, self.values)],
                     out_words_ok=['label0', 'label1', 'label2'],
                     out_words_no=['plat0', 'plat1'])


    def test_label_list_labels_only_valid(self):
        self.run_cmd(argv=['atest', 'label', 'list', '-d'],
                     rpcs=[('get_labels', {}, True, self.values)],
                     out_words_ok=['label0', 'label1'],
                     out_words_no=['label2', 'plat0', 'plat1'])


    def test_label_list_labels_and_platforms(self):
        self.run_cmd(argv=['atest', 'label', 'list', '--all'],
                     rpcs=[('get_labels', {}, True, self.values)],
                     out_words_ok=['label0', 'label1', 'label2',
                                   'plat0', 'plat1'])


    def test_label_list_platforms_only(self):
        self.run_cmd(argv=['atest', 'label', 'list', '-t'],
                     rpcs=[('get_labels', {}, True, self.values)],
                     out_words_ok=['plat0', 'plat1'],
                     out_words_no=['label0', 'label1', 'label2'])


    def test_label_list_platforms_only_valid(self):
        self.run_cmd(argv=['atest', 'label', 'list',
                           '-t', '--valid-only'],
                     rpcs=[('get_labels', {}, True, self.values)],
                     out_words_ok=['plat0'],
                     out_words_no=['label0', 'label1', 'label2',
                                   'plat1'])


class label_create_unittest(cli_mock.cli_unittest):
    def test_execute_create_two_labels(self):
        self.run_cmd(argv=['atest', 'label', 'create', 'label0', 'label1'],
                     rpcs=[('add_label',
                            {'name': 'label0', 'platform': False,
                             'only_if_needed': False},
                            True, 42),
                           ('add_label',
                            {'name': 'label1', 'platform': False,
                             'only_if_needed': False},
                            True, 43)],
                     out_words_ok=['Created', 'label0', 'label1'])


    def test_execute_create_two_labels_bad(self):
        self.run_cmd(argv=['atest', 'label', 'create', 'label0', 'label1'],
                     rpcs=[('add_label',
                            {'name': 'label0', 'platform': False,
                             'only_if_needed': False},
                            True, 3),
                           ('add_label',
                            {'name': 'label1', 'platform': False,
                             'only_if_needed': False},
                            False,
                            '''ValidationError: {'name':
                            'This value must be unique (label0)'}''')],
                     out_words_ok=['Created', 'label0'],
                     out_words_no=['label1'],
                     err_words_ok=['label1', 'ValidationError'])



class label_delete_unittest(cli_mock.cli_unittest):
    def test_execute_delete_labels(self):
        self.run_cmd(argv=['atest', 'label', 'delete', 'label0', 'label1', '--no-confirmation'],
                     rpcs=[('delete_label', {'id': 'label0'}, True, None),
                           ('delete_label', {'id': 'label1'}, True, None)],
                     out_words_ok=['Deleted', 'label0', 'label1'])


class label_add_unittest(cli_mock.cli_unittest):
    def test_execute_add_labels_to_hosts(self):
        self.run_cmd(argv=['atest', 'label', 'add', 'label0',
                           '--machine', 'host0,host1'],
                     rpcs=[('label_add_hosts', {'id': 'label0',
                                                'hosts': ['host1', 'host0']},
                            True, None)],
                     out_words_ok=['Added', 'label0', 'host0', 'host1'])


class label_remove_unittest(cli_mock.cli_unittest):
    def test_execute_remove_labels_from_hosts(self):
        self.run_cmd(argv=['atest', 'label', 'remove', 'label0',
                           '--machine', 'host0,host1'],
                     rpcs=[('label_remove_hosts', {'id': 'label0',
                                               'hosts': ['host1', 'host0']},
                            True, None)],
                     out_words_ok=['Removed', 'label0', 'host0', 'host1'])


if __name__ == '__main__':
    unittest.main()
