| # pylint: disable-msg=C0111 |
| #!/usr/bin/python |
| # |
| # Copyright 2008 Google Inc. All Rights Reserved. |
| |
| """Test for atest.""" |
| |
| import unittest, os, sys, urllib2 |
| |
| import common |
| from autotest_lib.cli import cli_mock, topic_common, rpc |
| |
| |
| 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, |
| 'no_confirmation': False, |
| 'debug': False, |
| 'log_level':'ERROR'}, 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, |
| 'no_confirmation': False, |
| 'debug': True, |
| 'log_level':'ERROR'}, 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, |
| 'no_confirmation': False, |
| 'debug': True, |
| 'log_level':'ERROR'}, 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, |
| 'no_confirmation': False, |
| 'debug': True, |
| 'log_level':'ERROR'}, 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, |
| 'no_confirmation': False, |
| 'debug': True, |
| 'log_level':'ERROR'}, 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, |
| 'no_confirmation': False, |
| 'debug': False, |
| 'log_level':'ERROR'}, 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, |
| 'no_confirmation': False, |
| 'debug': True, |
| 'log_level':'ERROR'}, 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, |
| 'no_confirmation': False, |
| 'debug': False, |
| 'log_level':'ERROR'}, 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, |
| 'no_confirmation': False, |
| 'debug': False, |
| 'log_level':'ERROR'}, 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, |
| 'no_confirmation': False, |
| 'debug': True, |
| 'log_level':'ERROR'}, 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() |