# pylint: disable-msg=C0111
#!/usr/bin/python
#
# 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', '--ignore_site_file'],
                     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',
                           '--ignore_site_file'],
                     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',
                           '--ignore_site_file'],
                     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',
                           '--ignore_site_file'],
                     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', '--ignore_site_file'],
                     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',
                           '--ignore_site_file'],
                     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',
                           '--ignore_site_file'],
                     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',
                           '--ignore_site_file', '--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', '--ignore_site_file'],
                     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', '--ignore_site_file'],
                     rpcs=[('label_remove_hosts', {'id': 'label0',
                                               'hosts': ['host1', 'host0']},
                            True, None)],
                     out_words_ok=['Removed', 'label0', 'host0', 'host1'])


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