# 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}, 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}, 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}, 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}, 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}, 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}, 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}, 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}, 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}, 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}, 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()