#!/usr/bin/python
#
# Copyright 2008 Google Inc. All Rights Reserved.

"""Tests for test."""

import unittest

import common
from autotest_lib.cli import cli_mock
from autotest_lib.client.common_lib import control_data

CLIENT = control_data.CONTROL_TYPE_NAMES.CLIENT
SERVER = control_data.CONTROL_TYPE_NAMES.SERVER

class test_list_unittest(cli_mock.cli_unittest):
    values = [{u'description': u'unknown',
               u'test_type': CLIENT,
               u'test_class': u'Canned Test Sets',
               u'path': u'client/tests/test0/control',
               u'id': 138,
               u'name': u'test0',
               u'experimental': False},
              {u'description': u'unknown',
               u'test_type': SERVER,
               u'test_class': u'Kernel',
               u'path': u'server/tests/test1/control',
               u'id': 139,
               u'name': u'test1',
               u'experimental': False},
              {u'description': u'unknown',
               u'test_type': CLIENT,
               u'test_class': u'Canned Test Sets',
               u'path': u'client/tests/test2/control.readprofile',
               u'id': 140,
               u'name': u'test2',
               u'experimental': False},
              {u'description': u'unknown',
               u'test_type': SERVER,
               u'test_class': u'Canned Test Sets',
               u'path': u'server/tests/test3/control',
               u'id': 142,
               u'name': u'test3',
               u'experimental': False},
              {u'description': u'Random stuff to check that things are ok',
               u'test_type': CLIENT,
               u'test_class': u'Hardware',
               u'path': u'client/tests/test4/control.export',
               u'id': 143,
               u'name': u'test4',
               u'experimental': True}]


    def test_test_list_tests_default(self):
        self.run_cmd(argv=['atest', 'test', 'list'],
                     rpcs=[('get_tests', {'experimental': False},
                            True, self.values)],
                     out_words_ok=['test0', 'test1', 'test2',
                                   'test3', 'test4'],
                     out_words_no=['Random', 'control.export'])


    def test_test_list_tests_all(self):
        self.run_cmd(argv=['atest', 'test', 'list', '--all'],
                     rpcs=[('get_tests', {},
                            True, self.values)],
                     out_words_ok=['test0', 'test1', 'test2',
                                   'test3', 'test4'],
                     out_words_no=['Random', 'control.export'])


    def test_test_list_tests_exp(self):
        self.run_cmd(argv=['atest', 'test', 'list', '--experimental'],
                     rpcs=[('get_tests', {'experimental': True},
                            True,
                            [{u'description': u'Random stuff',
                              u'test_type': CLIENT,
                              u'test_class': u'Hardware',
                              u'path': u'client/tests/test4/control.export',
                              u'id': 143,
                              u'name': u'test4',
                              u'experimental': True}])],
                     out_words_ok=['test4'],
                     out_words_no=['Random', 'control.export'])


    def test_test_list_tests_select_one(self):
        filtered = [val for val in self.values if val['name'] in ['test3']]
        self.run_cmd(argv=['atest', 'test', 'list', 'test3'],
                     rpcs=[('get_tests', {'name__in': ['test3'],
                                          'experimental': False},
                            True, filtered)],
                     out_words_ok=['test3'],
                     out_words_no=['test0', 'test1', 'test2', 'test4',
                                   'unknown'])


    def test_test_list_tests_select_two(self):
        filtered = [val for val in self.values
                    if val['name'] in ['test3', 'test1']]
        self.run_cmd(argv=['atest', 'test', 'list', 'test3,test1'],
                     rpcs=[('get_tests', {'name__in': ['test1', 'test3'],
                                          'experimental': False},
                            True, filtered)],
                     out_words_ok=['test3', 'test1', SERVER],
                     out_words_no=['test0', 'test2', 'test4',
                                   'unknown', CLIENT])


    def test_test_list_tests_select_two_space(self):
        filtered = [val for val in self.values
                    if val['name'] in ['test3', 'test1']]
        self.run_cmd(argv=['atest', 'test', 'list', 'test3', 'test1'],
                     rpcs=[('get_tests', {'name__in': ['test1', 'test3'],
                                          'experimental': False},
                            True, filtered)],
                     out_words_ok=['test3', 'test1', SERVER],
                     out_words_no=['test0', 'test2', 'test4',
                                   'unknown', CLIENT])


    def test_test_list_tests_all_verbose(self):
        self.run_cmd(argv=['atest', 'test', 'list', '-v'],
                     rpcs=[('get_tests', {'experimental': False},
                            True, self.values)],
                     out_words_ok=['test0', 'test1', 'test2',
                                   'test3', 'test4', 'client/tests',
                                   'server/tests'],
                     out_words_no=['Random'])


    def test_test_list_tests_all_desc(self):
        self.run_cmd(argv=['atest', 'test', 'list', '-d'],
                     rpcs=[('get_tests', {'experimental': False},
                            True, self.values)],
                     out_words_ok=['test0', 'test1', 'test2',
                                   'test3', 'test4', 'unknown', 'Random'],
                     out_words_no=['client/tests', 'server/tests'])


    def test_test_list_tests_all_desc_verbose(self):
        self.run_cmd(argv=['atest', 'test', 'list', '-d', '-v'],
                     rpcs=[('get_tests', {'experimental': False},
                            True, self.values)],
                     out_words_ok=['test0', 'test1', 'test2',
                                   'test3', 'test4', 'client/tests',
                                   'server/tests', 'unknown', 'Random' ])


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