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

"""Test for atest."""

import unittest, os, sys, StringIO, urllib2

import common
from autotest_lib.cli import cli_mock, topic_common, rpc
from autotest_lib.frontend.afe.json_rpc import proxy


class topic_common_misc_tests(unittest.TestCase):
    def test_get_item_key(self):
        get_item_key = topic_common._get_item_key
        self.assertRaises(ValueError, get_item_key, {}, '')
        self.assertRaises(ValueError, get_item_key, {}, '.')
        self.assertRaises(KeyError, get_item_key, {}, 'a')
        self.assertRaises(KeyError, get_item_key, {}, 'a.')
        self.assertRaises(ValueError, get_item_key, {'a': {}}, 'a.')
        self.assertRaises(KeyError, get_item_key, {'a': {}}, 'a.b')
        self.assertEquals(2, get_item_key({'a.b': 2, 'a': {}}, 'a.b'))
        self.assertEquals(9, get_item_key({'a': {'b': 9}}, 'a.b'))
        self.assertEquals(3, get_item_key({'a': {'b': {'c': 3}}}, 'a.b.c'))
        self.assertEquals(5, get_item_key({'a': 5}, 'a'))
        self.assertEquals({'b': 9}, get_item_key({'a': {'b': 9}}, 'a'))


class item_parse_info_unittest(cli_mock.cli_unittest):
    def __test_parsing_flist_bad(self, options):
        parse_info = topic_common.item_parse_info
        test_parse_info = parse_info(attribute_name='testing',
                                     filename_option='flist')
        self.assertRaises(topic_common.CliError,
                          test_parse_info.get_values, options, [])


    def __test_parsing_flist_good(self, options, expected):
        parse_info = topic_common.item_parse_info
        test_parse_info = parse_info(attribute_name='testing',
                                     filename_option='flist')
        result, leftover = test_parse_info.get_values(options, [])

        self.assertEqualNoOrder(expected, result)
        os.unlink(options.flist)


    def __test_parsing_inline_good(self, options, expected):
        parse_info = topic_common.item_parse_info
        test_parse_info = parse_info(attribute_name='testing',
                                     inline_option='inline')
        result, leftover = test_parse_info.get_values(options, [])

        self.assertEqualNoOrder(expected, result)


    def __test_parsing_leftover_good(self, leftover, expected):
        class opt(object):
            pass
        parse_info = topic_common.item_parse_info
        test_parse_info = parse_info(attribute_name='testing',
                                     inline_option='inline',
                                     use_leftover=True)
        result, leftover = test_parse_info.get_values(opt(), leftover)

        self.assertEqualNoOrder(expected, result)


    def __test_parsing_all_good(self, options, leftover, expected):
        parse_info = topic_common.item_parse_info
        test_parse_info = parse_info(attribute_name='testing',
                                     inline_option='inline',
                                     filename_option='flist',
                                     use_leftover=True)
        result, leftover = test_parse_info.get_values(options, leftover)

        self.assertEqualNoOrder(expected, result)
        os.unlink(options.flist)


    def __test_parsing_all_bad(self, options, leftover):
        parse_info = topic_common.item_parse_info
        test_parse_info = parse_info(attribute_name='testing',
                                     inline_option='inline',
                                     filename_option='flist',
                                     use_leftover=True)
        self.assertRaises(topic_common.CliError,
                          test_parse_info.get_values, options, leftover)


    def test_file_list_wrong_file(self):
        class opt(object):
            flist = './does_not_exist'
        self.__test_parsing_flist_bad(opt())


    def test_file_list_empty_file(self):
        class opt(object):
            flist_obj = cli_mock.create_file('')
            flist = flist_obj.name
        self.__test_parsing_flist_bad(opt())


    def test_file_list_ok(self):
        class opt(object):
            flist_obj = cli_mock.create_file('a\nb\nc\n')
            flist = flist_obj.name
        self.__test_parsing_flist_good(opt(), ['a', 'b', 'c'])


    def test_file_list_one_line_space(self):
        class opt(object):
            flist_obj = cli_mock.create_file('a b c\nd e\nf\n')
            flist = flist_obj.name
        self.__test_parsing_flist_good(opt(), ['a', 'b', 'c', 'd', 'e', 'f'])


    def test_file_list_one_line_comma(self):
        class opt(object):
            flist_obj = cli_mock.create_file('a,b,c\nd,e\nf\n')
            flist = flist_obj.name
        self.__test_parsing_flist_good(opt(), ['a', 'b', 'c', 'd', 'e', 'f'])


    def test_file_list_one_line_mix(self):
        class opt(object):
            flist_obj = cli_mock.create_file('a,b c\nd,e\nf\ng h,i')
            flist = flist_obj.name
        self.__test_parsing_flist_good(opt(), ['a', 'b', 'c', 'd', 'e',
                                         'f', 'g', 'h', 'i'])


    def test_file_list_one_line_comma_space(self):
        class opt(object):
            flist_obj = cli_mock.create_file('a, b c\nd,e\nf\ng h,i')
            flist = flist_obj.name
        self.__test_parsing_flist_good(opt(), ['a', 'b', 'c', 'd', 'e',
                                         'f', 'g', 'h', 'i'])


    def test_file_list_line_end_comma_space(self):
        class opt(object):
            flist_obj = cli_mock.create_file('a, b c\nd,e, \nf,\ng h,i ,')
            flist = flist_obj.name
        self.__test_parsing_flist_good(opt(), ['a', 'b', 'c', 'd', 'e',
                                         'f', 'g', 'h', 'i'])


    def test_file_list_no_eof(self):
        class opt(object):
            flist_obj = cli_mock.create_file('a\nb\nc')
            flist = flist_obj.name
        self.__test_parsing_flist_good(opt(), ['a', 'b', 'c'])


    def test_file_list_blank_line(self):
        class opt(object):
            flist_obj = cli_mock.create_file('\na\nb\n\nc\n')
            flist = flist_obj.name
        self.__test_parsing_flist_good(opt(), ['a', 'b', 'c'])


    def test_file_list_escaped_commas(self):
        class opt(object):
            flist_obj = cli_mock.create_file('a\nb\\,c\\,d\nef\\,g')
            flist = flist_obj.name
        self.__test_parsing_flist_good(opt(), ['a', 'b,c,d', 'ef,g'])


    def test_file_list_escaped_commas_slashes(self):
        class opt(object):
            flist_obj = cli_mock.create_file('a\nb\\\\\\,c\\,d\nef\\\\,g')
            flist = flist_obj.name
        self.__test_parsing_flist_good(opt(), ['a', 'b\\,c,d', 'ef\\', 'g'])


    def test_file_list_opt_list_one(self):
        class opt(object):
            inline = 'a'
        self.__test_parsing_inline_good(opt(), ['a'])


    def test_file_list_opt_list_space(self):
        class opt(object):
            inline = 'a b c'
        self.__test_parsing_inline_good(opt(), ['a', 'b', 'c'])


    def test_file_list_opt_list_mix_space_comma(self):
        class opt(object):
            inline = 'a b,c,d e'
        self.__test_parsing_inline_good(opt(), ['a', 'b', 'c', 'd', 'e'])


    def test_file_list_opt_list_mix_comma_space(self):
        class opt(object):
            inline = 'a b,c, d e'
        self.__test_parsing_inline_good(opt(), ['a', 'b', 'c', 'd', 'e'])


    def test_file_list_opt_list_end_comma_space(self):
        class opt(object):
            inline = 'a b, ,c,, d e, '
        self.__test_parsing_inline_good(opt(), ['a', 'b', 'c', 'd', 'e'])


    def test_file_list_opt_list_escaped_commas(self):
        class opt(object):
            inline = 'a\\,b,c, d'
        self.__test_parsing_inline_good(opt(), ['a,b', 'c', 'd'])


    def test_file_list_opt_list_escaped_commas_slashes(self):
        class opt(object):
            inline = 'a\\,b\\\\\\,c,d,e'
        self.__test_parsing_inline_good(opt(), ['a,b\\,c', 'd', 'e'])


    def test_file_list_add_on_space(self):
        self.__test_parsing_leftover_good(['a','c','b'],
                                          ['a', 'b', 'c'])


    def test_file_list_add_on_mix_space_comma(self):
        self.__test_parsing_leftover_good(['a', 'c','b,d'],
                                          ['a', 'b', 'c', 'd'])


    def test_file_list_add_on_mix_comma_space(self):
        self.__test_parsing_leftover_good(['a', 'c', 'b,', 'd'],
                                          ['a', 'b', 'c', 'd'])


    def test_file_list_add_on_end_comma_space(self):
        self.__test_parsing_leftover_good(['a', 'c', 'b,', 'd,', ','],
                                          ['a', 'b', 'c', 'd'])


    def test_file_list_add_on_escaped_commas(self):
        self.__test_parsing_leftover_good(['a', 'c', 'b,', 'd\\,e\\,f'],
                                          ['a', 'b', 'c', 'd,e,f'])


    def test_file_list_add_on_escaped_commas_slashes(self):
        self.__test_parsing_leftover_good(['a', 'c', 'b,', 'd\\\\\\,e,f'],
                                          ['a', 'b', 'c', 'd\\,e', 'f'])


    def test_file_list_all_opt(self):
        class opt(object):
            flist_obj = cli_mock.create_file('f\ng\nh\n')
            flist = flist_obj.name
            inline = 'a b,c,d e'
        self.__test_parsing_all_good(opt(), ['i', 'j'],
                                     ['a', 'b', 'c', 'd', 'e',
                                      'f', 'g', 'h', 'i', 'j'])


    def test_file_list_all_opt_empty_file(self):
        class opt(object):
            flist_obj = cli_mock.create_file('')
            flist = flist_obj.name
            inline = 'a b,c,d e'
        self.__test_parsing_all_bad(opt(), ['i', 'j'])


    def test_file_list_all_opt_in_common(self):
        class opt(object):
            flist_obj = cli_mock.create_file('f\nc\na\n')
            flist = flist_obj.name
            inline = 'a b,c,d e'
        self.__test_parsing_all_good(opt(), ['i','j,d'],
                                     ['a', 'b', 'c', 'd', 'e', 'f', 'i', 'j'])


    def test_file_list_all_opt_in_common_space(self):
        class opt(object):
            flist_obj = cli_mock.create_file('a b c\nd,e\nf\ng')
            flist = flist_obj.name
            inline = 'a b,c,d h'
        self.__test_parsing_all_good(opt(), ['i','j,d'],
                                     ['a', 'b', 'c', 'd', 'e',
                                      'f', 'g', 'h', 'i', 'j'])


    def test_file_list_all_opt_in_common_weird(self):
        class opt(object):
            flist_obj = cli_mock.create_file('a b c\nd,e\nf\ng, \n, ,,')
            flist = flist_obj.name
            inline = 'a b,c,d h, ,  ,,  '
        self.__test_parsing_all_good(opt(), ['i','j,d'],
                                     ['a', 'b', 'c', 'd', 'e',
                                      'f', 'g', 'h', 'i', 'j'])


    def test_file_list_all_opt_in_common_escaped_commas(self):
        class opt(object):
            flist_obj = cli_mock.create_file('a\\,b\\,c\nd,e\nf\ng')
            flist = flist_obj.name
            inline = 'a\\,b\\,c,d h'
        self.__test_parsing_all_good(opt(), ['i','j,d'],
                                     ['a,b,c', 'd', 'e', 'f', 'g', 'h',
                                      'i', 'j'])


    def test_file_list_all_opt_in_common_escaped_commas_slashes(self):
        class opt(object):
            flist_obj = cli_mock.create_file('a\\,b\\\\\\,c\nd,e\nf,ghi, ,, j,')
            flist = flist_obj.name
            inline = 'a\\,b\\\\\\,c,d h,ijk'
        self.__test_parsing_all_good(opt(), ['i','j,d'],
                                     ['a,b\\,c', 'd', 'e', 'f', 'ghi', 'h',
                                      'i', 'j', 'ijk'])


class atest_unittest(cli_mock.cli_unittest):
    def setUp(self):
        super(atest_unittest, self).setUp()
        self.atest = topic_common.atest()
        self.atest.afe = rpc.afe_comm()
        if 'AUTOTEST_WEB' in os.environ:
            del os.environ['AUTOTEST_WEB']


    def tearDown(self):
        self.atest = None
        super(atest_unittest, self).tearDown()


    def test_invalid_arg_kill(self):
        self.atest.kill_on_failure = True
        self.god.mock_io()
        sys.exit.expect_call(1).and_raises(cli_mock.ExitException)
        self.assertRaises(cli_mock.ExitException,
                          self.atest.invalid_arg, 'This is bad')
        (output, err) = self.god.unmock_io()
        self.god.check_playback()
        self.assert_(err.find('This is bad') >= 0)


    def test_invalid_arg_continue(self):
        self.god.mock_io()
        self.atest.invalid_arg('This is sort of ok')
        (output, err) = self.god.unmock_io()
        self.assert_(err.find('This is sort of ok') >= 0)


    def test_failure_continue(self):
        self.atest.failure('This is partly bad', item='item0',
                           what_failed='something important')
        err = self.atest.failed['something important']
        self.assert_('This is partly bad' in err.keys())


    def test_failure_continue_multiple_different_errors(self):
        self.atest.failure('This is partly bad', item='item0',
                           what_failed='something important')
        self.atest.failure('This is really bad', item='item0',
                           what_failed='something really important')
        err = self.atest.failed['something important']
        self.assert_('This is partly bad' in err)
        self.assert_('This is really bad' not in err)
        err = self.atest.failed['something really important']
        self.assert_('This is partly bad' not in err)
        self.assert_('This is really bad' in err)


    def test_failure_continue_multiple_same_errors(self):
        self.atest.failure('This is partly bad', item='item0',
                           what_failed='something important')
        self.atest.failure('This is really bad', item='item1',
                           what_failed='something important')
        errs = self.atest.failed['something important']
        self.assert_('This is partly bad' in errs)
        self.assert_('This is really bad' in errs)
        self.assert_(set(['item0']) in errs.values())
        self.assert_(set(['item1']) in errs.values())


    def test_failure_continue_multiple_errors_mixed(self):
        self.atest.failure('This is partly bad', item='item0',
                           what_failed='something important')
        self.atest.failure('This is really bad', item='item0',
                           what_failed='something really important')
        self.atest.failure('This is really bad', item='item1',
                           what_failed='something important')
        errs = self.atest.failed['something important']
        self.assert_('This is partly bad' in errs)
        self.assert_('This is really bad' in errs)
        self.assert_(set(['item0']) in errs.values())
        self.assert_(set(['item1']) in errs.values())

        errs = self.atest.failed['something really important']
        self.assert_('This is really bad' in errs)
        self.assert_('This is partly bad' not in errs)
        self.assert_(set(['item0']) in errs.values())
        self.assert_(set(['item1']) not in errs.values())


    def test_failure_continue_multiple_errors_mixed_same_error(self):
        self.atest.failure('This is partly bad', item='item0',
                           what_failed='something important')
        self.atest.failure('This is really bad', item='item0',
                           what_failed='something really important')
        self.atest.failure('This is partly bad', item='item1',
                           what_failed='something important')
        errs = self.atest.failed['something important']
        self.assert_('This is partly bad' in errs)
        self.assert_('This is really bad' not in errs)
        self.assert_(set(['item0', 'item1']) in errs.values())

        errs = self.atest.failed['something really important']
        self.assert_('This is really bad' in errs)
        self.assert_('This is partly bad' not in errs)
        self.assert_(set(['item0']) in errs.values())
        self.assert_(set(['item1']) not in errs.values())


    def test_failure_exit(self):
        self.atest.kill_on_failure = True
        self.god.mock_io()
        sys.exit.expect_call(1).and_raises(cli_mock.ExitException)
        self.assertRaises(cli_mock.ExitException,
                          self.atest.failure, 'This is partly bad')
        (output, err) = self.god.unmock_io()
        self.god.check_playback()
        self.assert_(err.find('This is partly bad') >= 0)


    def test_failure_exit_item(self):
        self.atest.kill_on_failure = True
        self.god.mock_io()
        sys.exit.expect_call(1).and_raises(cli_mock.ExitException)
        self.assertRaises(cli_mock.ExitException,
                          self.atest.failure, 'This is partly bad',
                          item='item0')
        (output, err) = self.god.unmock_io()
        self.god.check_playback()
        self.assertWords(err, ['This is partly bad'], ['item0'])


    def test_show_all_failures_common(self):
        self.atest.failure('This is partly bad', item='item0',
                           what_failed='something important')
        self.atest.failure('This is partly bad', item='item1',
                           what_failed='something important')
        self.god.mock_io()
        self.atest.show_all_failures()
        (output, err) = self.god.unmock_io()
        self.assertWords(err, ['something important',
                               'This is partly bad', 'item0', 'item1'])


    def test_parse_add_on(self):
        flist = cli_mock.create_file('host1\nhost2\nleft2')
        sys.argv = ['atest', '--web', 'fooweb', '--parse',
                    '--kill-on-failure', 'left1', 'left2', '-M', flist.name]
        self.atest.parser.add_option('-M', '--mlist', type='string')
        item_info = topic_common.item_parse_info(attribute_name='hosts',
                                                 filename_option='mlist',
                                                 use_leftover=True)
        (options, leftover) = self.atest.parse([item_info])
        self.assertEqualNoOrder(self.atest.hosts,
                                ['left1', 'left2', 'host1', 'host2'])

        self.assertEqual({'mlist': flist.name,
                          'web_server': 'fooweb',
                          'parse': True,
                          'parse_delim': '|',
                          'kill_on_failure': True,
                          'verbose': False,
                          'debug': False}, options)
        self.assertEqual(leftover, [])
        flist.clean()


    def test_parse_no_add_on(self):
        flist = cli_mock.create_file('host1\nhost2\nleft2')
        sys.argv = ['atest', '--web', 'fooweb', '--parse', '-g',
                    '--kill-on-failure', 'left1', 'left2', '-M', flist.name]
        self.atest.parser.add_option('-M', '--mlist', type='string')
        item_info = topic_common.item_parse_info(attribute_name='hosts',
                                                 filename_option='mlist')
        (options, leftover) = self.atest.parse([item_info])
        self.assertEqualNoOrder(self.atest.hosts,
                                ['left2', 'host1', 'host2'])

        self.assertEqual({'mlist': flist.name,
                          'web_server': 'fooweb',
                          'parse': True,
                          'parse_delim': '|',
                          'kill_on_failure': True,
                          'verbose': False,
                          'debug': True}, options)
        self.assertEqual(leftover, ['left1', 'left2'])
        flist.clean()


    def test_parse_add_on_first(self):
        flist = cli_mock.create_file('host1\nhost2\nleft2')
        ulist = cli_mock.create_file('user1\nuser2\nuser3\n')
        sys.argv = ['atest', '-g', '--parse', '--ulist', ulist.name,
                    '-u', 'myuser,youruser',
                    '--kill-on-failure', 'left1', 'left2', '-M', flist.name]
        self.atest.parser.add_option('-M', '--mlist', type='string')
        self.atest.parser.add_option('-U', '--ulist', type='string')
        self.atest.parser.add_option('-u', '--user', type='string')
        host_info = topic_common.item_parse_info(attribute_name='hosts',
                                                 filename_option='mlist',
                                                 use_leftover=True)
        user_info = topic_common.item_parse_info(attribute_name='users',
                                                 inline_option='user',
                                                 filename_option='ulist')

        (options, leftover) = self.atest.parse([host_info, user_info])
        self.assertEqualNoOrder(self.atest.hosts,
                                ['left1', 'left2', 'host1', 'host2'])
        self.assertEqualNoOrder(self.atest.users,
                                ['user1', 'user2', 'user3',
                                 'myuser', 'youruser'])

        self.assertEqual({'mlist': flist.name,
                          'ulist': ulist.name,
                          'user': 'myuser,youruser',
                          'web_server': None,
                          'parse': True,
                          'parse_delim': '|',
                          'kill_on_failure': True,
                          'verbose': False,
                          'debug': True}, options)
        self.assertEqual(leftover, [])
        flist.clean()
        ulist.clean()


    def test_parse_add_on_second(self):
        flist = cli_mock.create_file('host1\nhost2\nleft2')
        ulist = cli_mock.create_file('user1\nuser2\nuser3\n')
        sys.argv = ['atest', '-g', '--parse', '-U', ulist.name,
                    '-u', 'myuser,youruser',
                    '--kill-on-failure', 'left1', 'left2', '-M', flist.name]
        self.atest.parser.add_option('-M', '--mlist', type='string')
        self.atest.parser.add_option('-U', '--ulist', type='string')
        self.atest.parser.add_option('-u', '--user', type='string')
        host_info = topic_common.item_parse_info(attribute_name='hosts',
                                                 filename_option='mlist',
                                                 use_leftover=True)
        user_info = topic_common.item_parse_info(attribute_name='users',
                                                 inline_option='user',
                                                 filename_option='ulist')
        (options, leftover) = self.atest.parse([host_info, user_info])

        self.assertEqualNoOrder(self.atest.hosts,
                                ['left1', 'left2', 'host1', 'host2'])
        self.assertEqualNoOrder(self.atest.users,
                                ['user1', 'user2', 'user3',
                                 'myuser', 'youruser'])

        self.assertEqual({'mlist': flist.name,
                          'ulist': ulist.name,
                          'user': 'myuser,youruser',
                          'web_server': None,
                          'parse': True,
                          'parse_delim': '|',
                          'kill_on_failure': True,
                          'verbose': False,
                          'debug': True}, options)
        self.assertEqual(leftover, [])
        flist.clean()
        ulist.clean()


    def test_parse_all_opts(self):
        flist = cli_mock.create_file('host1\nhost2\nleft2')
        ulist = cli_mock.create_file('user1\nuser2\nuser3\n')
        sys.argv = ['atest', '-g', '--parse', '--ulist', ulist.name,
                    '-u', 'myuser,youruser',
                    '--kill-on-failure', '-M', flist.name, 'left1', 'left2']
        self.atest.parser.add_option('-M', '--mlist', type='string')
        self.atest.parser.add_option('-U', '--ulist', type='string')
        self.atest.parser.add_option('-u', '--user', type='string')
        host_info = topic_common.item_parse_info(attribute_name='hosts',
                                                 filename_option='mlist',
                                                 use_leftover=True)
        user_info = topic_common.item_parse_info(attribute_name='users',
                                                 inline_option='user',
                                                 filename_option='ulist')
        (options, leftover) = self.atest.parse([host_info, user_info])
        self.assertEqualNoOrder(self.atest.hosts,
                                ['left1', 'left2', 'host1', 'host2'])
        self.assertEqualNoOrder(self.atest.users,
                                ['user1', 'user2', 'user3',
                                 'myuser', 'youruser'])

        self.assertEqual({'mlist': flist.name,
                          'ulist': ulist.name,
                          'user': 'myuser,youruser',
                          'web_server': None,
                          'parse': True,
                          'parse_delim': '|',
                          'kill_on_failure': True,
                          'verbose': False,
                          'debug': True}, options)
        self.assertEqual(leftover, [])
        flist.clean()
        ulist.clean()


    def test_parse_no_add_on_2(self):
        flist = cli_mock.create_file('host1\nhost2\nleft2')
        ulist = cli_mock.create_file('user1\nuser2\nuser3\n')
        sys.argv = ['atest', '-U', ulist.name,
                    '--kill-on-failure', '-M', flist.name]
        self.atest.parser.add_option('-M', '--mlist', type='string')
        self.atest.parser.add_option('-U', '--ulist', type='string')
        self.atest.parser.add_option('-u', '--user', type='string')
        host_info = topic_common.item_parse_info(attribute_name='hosts',
                                                 filename_option='mlist',
                                                 use_leftover=True)
        user_info = topic_common.item_parse_info(attribute_name='users',
                                                 inline_option='user',
                                                 filename_option='ulist')
        (options, leftover) = self.atest.parse([host_info, user_info])
        self.assertEqualNoOrder(self.atest.hosts,
                                ['left2', 'host1', 'host2'])
        self.assertEqualNoOrder(self.atest.users,
                                ['user1', 'user2', 'user3'])

        self.assertEqual({'mlist': flist.name,
                          'ulist': ulist.name,
                          'user': None,
                          'web_server': None,
                          'parse': False,
                          'parse_delim': '|',
                          'kill_on_failure': True,
                          'verbose': False,
                          'debug': False}, options)
        self.assertEqual(leftover, [])
        flist.clean()
        ulist.clean()


    def test_parse_no_flist_add_on(self):
        sys.argv = ['atest', '-g', '--parse', '-u', 'myuser,youruser',
                    '--kill-on-failure', 'left1', 'left2']
        self.atest.parser.add_option('-M', '--mlist', type='string')
        self.atest.parser.add_option('-U', '--ulist', type='string')
        self.atest.parser.add_option('-u', '--user', type='string')
        host_info = topic_common.item_parse_info(attribute_name='hosts',
                                                 use_leftover=True)
        user_info = topic_common.item_parse_info(attribute_name='users',
                                                 inline_option='user')
        (options, leftover) = self.atest.parse([host_info, user_info])
        self.assertEqualNoOrder(self.atest.hosts,
                                ['left1', 'left2'])
        self.assertEqualNoOrder(self.atest.users,
                                ['myuser', 'youruser'])

        self.assertEqual({'mlist': None,
                          'ulist': None,
                          'user': 'myuser,youruser',
                          'web_server': None,
                          'parse': True,
                          'parse_delim': '|',
                          'kill_on_failure': True,
                          'verbose': False,
                          'debug': True}, options)
        self.assertEqual(leftover, [])


    def test_parse_no_flist_no_add_on(self):
        sys.argv = ['atest', '-u', 'myuser,youruser', '--kill-on-failure',
                    '-a', 'acl1,acl2']
        self.atest.parser.add_option('-u', '--user', type='string')
        self.atest.parser.add_option('-a', '--acl', type='string')
        acl_info = topic_common.item_parse_info(attribute_name='acls',
                                                inline_option='acl')
        user_info = topic_common.item_parse_info(attribute_name='users',
                                                 inline_option='user')
        (options, leftover) = self.atest.parse([user_info, acl_info])
        self.assertEqualNoOrder(self.atest.acls,
                                ['acl1', 'acl2'])
        self.assertEqualNoOrder(self.atest.users,
                                ['myuser', 'youruser'])

        self.assertEqual({'user': 'myuser,youruser',
                          'acl': 'acl1,acl2',
                          'web_server': None,
                          'parse': False,
                          'parse_delim': '|',
                          'kill_on_failure': True,
                          'verbose': False,
                          'debug': False}, options)
        self.assertEqual(leftover, [])


    def test_parse_req_items_ok(self):
        sys.argv = ['atest', '-u', 'myuser,youruser']
        self.atest.parser.add_option('-u', '--user', type='string')
        user_info = topic_common.item_parse_info(attribute_name='users',
                                                 inline_option='user')
        (options, leftover) = self.atest.parse([user_info],
                                               req_items='users')
        self.assertEqualNoOrder(self.atest.users,
                                ['myuser', 'youruser'])

        self.assertEqual({'user': 'myuser,youruser',
                          'web_server': None,
                          'parse': False,
                          'parse_delim': '|',
                          'kill_on_failure': False,
                          'verbose': False,
                          'debug': False}, options)
        self.assertEqual(leftover, [])


    def test_parse_req_items_missing(self):
        sys.argv = ['atest', '-u', 'myuser,youruser', '--kill-on-failure']
        self.atest.parser.add_option('-u', '--user', type='string')
        acl_info = topic_common.item_parse_info(attribute_name='acls',
                                                inline_option='acl')
        user_info = topic_common.item_parse_info(attribute_name='users',
                                                 inline_option='user')
        self.god.mock_io()
        sys.exit.expect_call(1).and_raises(cli_mock.ExitException)
        self.assertRaises(cli_mock.ExitException,
                          self.atest.parse,
                          [user_info, acl_info],
                          'acls')
        self.assertEqualNoOrder(self.atest.users,
                                ['myuser', 'youruser'])

        self.assertEqualNoOrder(self.atest.acls, [])
        self.god.check_playback()
        self.god.unmock_io()


    def test_parse_bad_option(self):
        sys.argv = ['atest', '--unknown']
        self.god.stub_function(self.atest.parser, 'error')
        self.atest.parser.error.expect_call('no such option: --unknown').and_return(None)
        self.atest.parse()
        self.god.check_playback()


    def test_parse_all_set(self):
        sys.argv = ['atest', '--web', 'fooweb', '--parse', '--debug',
                    '--kill-on-failure', '--verbose', 'left1', 'left2',
                    '--parse-delim', '?']
        (options, leftover) = self.atest.parse()
        self.assertEqual({'web_server': 'fooweb',
                          'parse': True,
                          'parse_delim': '?',
                          'kill_on_failure': True,
                          'verbose': True,
                          'debug': True}, options)
        self.assertEqual(leftover, ['left1', 'left2'])


    def test_execute_rpc_bad_server(self):
        self.atest.afe = rpc.afe_comm('http://does_not_exist')
        self.god.mock_io()
        rpc.afe_comm.run.expect_call('myop').and_raises(urllib2.URLError("<urlopen error (-2, 'Name or service not known')>"))
        sys.exit.expect_call(1).and_raises(cli_mock.ExitException)
        self.assertRaises(cli_mock.ExitException,
                          self.atest.execute_rpc, 'myop')
        (output, err) = self.god.unmock_io()
        self.god.check_playback()
        self.assert_(err.find('http://does_not_exist') >= 0)


    #
    # Print Unit tests
    #
    def __test_print_fields(self, func, expected, **dargs):
        if not dargs.has_key('items'):
            dargs['items']=[{'hostname': 'h0',
                            'platform': 'p0',
                            'labels': [u'l0', u'l1'],
                            'locked': 1,
                            'id': 'id0',
                            'name': 'name0'},
                           {'hostname': 'h1',
                            'platform': 'p1',
                            'labels': [u'l2', u'l3'],
                            'locked': 0,
                            'id': 'id1',
                            'name': 'name1'}]
        self.god.mock_io()
        func(**dargs)
        (output, err) = self.god.unmock_io()
        self.assertEqual(expected, output)


    #
    # Print fields Standard
    #
    def __test_print_fields_std(self, keys, expected):
        self.__test_print_fields(self.atest.print_fields_std,
                                 expected, keys=keys)


    def test_print_fields_std_one_str(self):
        self.__test_print_fields_std(['hostname'],
                                     'Host: h0\n'
                                     'Host: h1\n')


    def test_print_fields_std_conv_bool(self):
        """Make sure the conversion functions are called"""
        self.__test_print_fields_std(['locked'],
                                     'Locked: True\n'
                                     'Locked: False\n')


    def test_print_fields_std_conv_label(self):
        """Make sure the conversion functions are called"""
        self.__test_print_fields_std(['labels'],
                                     'Labels: l0, l1\n'
                                     'Labels: l2, l3\n')


    def test_print_fields_std_all_fields(self):
        """Make sure the conversion functions are called"""
        self.__test_print_fields_std(['hostname', 'platform','locked'],
                                     'Host: h0\n'
                                     'Platform: p0\n'
                                     'Locked: True\n'
                                     'Host: h1\n'
                                     'Platform: p1\n'
                                     'Locked: False\n')


    #
    # Print fields parse
    #
    def __test_print_fields_parse(self, keys, expected):
        self.__test_print_fields(self.atest.print_fields_parse,
                                 expected, keys=keys)


    def test_print_fields_parse_one_str(self):
        self.__test_print_fields_parse(['hostname'],
                                       'Host=h0\n'
                                       'Host=h1\n')


    def test_print_fields_parse_conv_bool(self):
        self.__test_print_fields_parse(['locked'],
                                       'Locked=True\n'
                                       'Locked=False\n')


    def test_print_fields_parse_conv_label(self):
        self.__test_print_fields_parse(['labels'],
                                       'Labels=l0, l1\n'
                                       'Labels=l2, l3\n')


    def test_print_fields_parse_all_fields(self):
        self.__test_print_fields_parse(['hostname', 'platform', 'locked'],
                                       'Host=h0|Platform=p0|'
                                       'Locked=True\n'
                                       'Host=h1|Platform=p1|'
                                       'Locked=False\n')


    #
    # Print table standard
    #
    def __test_print_table_std(self, keys, expected):
        self.__test_print_fields(self.atest.print_table_std,
                                 expected, keys_header=keys)


    def test_print_table_std_all_fields(self):
        self.__test_print_table_std(['hostname', 'platform','locked'],
                                    'Host  Platform  Locked\n'
                                    'h0    p0        True\n'
                                    'h1    p1        False\n')

    # TODO JME - add long fields tests


    #
    # Print table parse
    #
    def __test_print_table_parse(self, keys, expected):
        self.__test_print_fields(self.atest.print_table_parse,
                                 expected, keys_header=keys)


    def test_print_table_parse_all_fields(self):
        self.__test_print_table_parse(['hostname', 'platform',
                                       'locked'],
                                      'Host=h0|Platform=p0|Locked=True\n'
                                      'Host=h1|Platform=p1|Locked=False\n')


    def test_print_table_parse_all_fields_2(self):
        self.atest.parse_delim = '?'
        self.__test_print_table_parse(['hostname', 'platform',
                                       'locked'],
                                      'Host=h0?Platform=p0?Locked=True\n'
                                      'Host=h1?Platform=p1?Locked=False\n')


    def test_print_table_parse_empty_fields(self):
        self.__test_print_fields(self.atest.print_table_parse,
                                 'Host=h0|Platform=p0\n'
                                 'Host=h1|Platform=p1|Labels=l2, l3\n',
                                 items=[{'hostname': 'h0',
                                         'platform': 'p0',
                                         'labels': [],
                                         'locked': 1,
                                         'id': 'id0',
                                         'name': 'name0'},
                                        {'hostname': 'h1',
                                         'platform': 'p1',
                                         'labels': [u'l2', u'l3'],
                                         'locked': 0,
                                         'id': 'id1',
                                         'name': 'name1'}],
                                 keys_header=['hostname', 'platform',
                                              'labels'])


    #
    # Print mix table standard
    #
    def __test_print_mix_table_std(self, keys_header, sublist_keys,
                                   expected):
        self.__test_print_fields(self.atest.print_table_std,
                                 expected,
                                 keys_header=keys_header,
                                 sublist_keys=sublist_keys)


    def test_print_mix_table(self):
        self.__test_print_mix_table_std(['name', 'hostname'], [],
                                        'Name   Host\n'
                                        'name0  h0\n'
                                        'name1  h1\n')


    def test_print_mix_table_sublist(self):
        self.__test_print_mix_table_std(['name', 'hostname'], ['labels'],
                                        'Name   Host\n'
                                        'name0  h0\n'
                                        'Labels: \n'
                                        '\tl0, l1\n\n\n'
                                        'name1  h1\n'
                                        'Labels: \n'
                                        '\tl2, l3\n\n\n')


    #
    # Print by ID standard
    #
    def __test_print_by_ids_std(self, expected):
        self.__test_print_fields(self.atest.print_by_ids_std,
                                 expected)


    def test_print_by_ids_std_all_fields(self):
        self.__test_print_by_ids_std('Id   Name\n'
                                     'id0  name0\n'
                                     'id1  name1\n')


    #
    # Print by ID parse
    #
    def __test_print_by_ids_parse(self, expected):
        self.__test_print_fields(self.atest.print_by_ids_parse,
                                 expected)


    def test_print_by_ids_parse_all_fields(self):
        self.__test_print_by_ids_parse('Id=id0|Name=name0|'
                                       'Id=id1|Name=name1\n')


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