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

"""Tests for test."""

import unittest, sys, os

import common
from autotest_lib.cli import cli_mock, topic_common, test
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'synch_type': u'Asynchronous',
               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'synch_type': u'Asynchronous',
               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'synch_type': u'Asynchronous',
               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'synch_type': u'Asynchronous',
               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'synch_type': u'Asynchronous',
               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'synch_type': u'Asynchronous',
                              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()
