diff --git a/test/unit/cli/test_info.py b/test/unit/cli/test_info.py index 677f275d98..a97362dcbc 100644 --- a/test/unit/cli/test_info.py +++ b/test/unit/cli/test_info.py @@ -25,7 +25,8 @@ from swift.common import ring, utils from swift.common.swob import Request from swift.common.storage_policy import StoragePolicy, POLICIES from swift.cli.info import print_db_info_metadata, print_ring_locations, \ - print_info, print_obj_metadata, print_obj, InfoSystemExit + print_info, print_obj_metadata, print_obj, InfoSystemExit, \ + print_item_locations from swift.account.server import AccountController from swift.container.server import ContainerController from swift.obj.diskfile import write_metadata @@ -231,6 +232,171 @@ No user metadata found in db file''' % POLICIES[0].name self.assertTrue(exp_obj1 in out.getvalue()) self.assertTrue(exp_obj2 in out.getvalue()) + def test_print_item_locations_invalid_args(self): + # No target specified + self.assertRaises(InfoSystemExit, print_item_locations, + None) + # Need a ring or policy + self.assertRaises(InfoSystemExit, print_item_locations, + None, account='account', obj='object') + # No account specified + self.assertRaises(InfoSystemExit, print_item_locations, + None, container='con') + # No policy named 'xyz' (unrecognized policy) + self.assertRaises(InfoSystemExit, print_item_locations, + None, obj='object', policy_name='xyz') + # No container specified + objring = ring.Ring(self.testdir, ring_name='object') + self.assertRaises(InfoSystemExit, print_item_locations, + objring, account='account', obj='object') + + def test_print_item_locations_ring_policy_mismatch_no_target(self): + out = StringIO() + with mock.patch('sys.stdout', out): + objring = ring.Ring(self.testdir, ring_name='object') + # Test mismatch of ring and policy name (valid policy) + self.assertRaises(InfoSystemExit, print_item_locations, + objring, policy_name='zero') + self.assertTrue('Warning: mismatch between ring and policy name!' + in out.getvalue()) + self.assertTrue('No target specified' in out.getvalue()) + + def test_print_item_locations_invalid_policy_no_target(self): + out = StringIO() + policy_name = 'nineteen' + with mock.patch('sys.stdout', out): + objring = ring.Ring(self.testdir, ring_name='object') + self.assertRaises(InfoSystemExit, print_item_locations, + objring, policy_name=policy_name) + exp_msg = 'Warning: Policy %s is not valid' % policy_name + self.assertTrue(exp_msg in out.getvalue()) + self.assertTrue('No target specified' in out.getvalue()) + + def test_print_item_locations_policy_object(self): + out = StringIO() + part = '1' + with mock.patch('sys.stdout', out): + print_item_locations(None, partition=part, policy_name='zero', + swift_dir=self.testdir) + exp_part_msg = 'Partition\t%s' % part + exp_acct_msg = 'Account \tNone' + exp_cont_msg = 'Container\tNone' + exp_obj_msg = 'Object \tNone' + self.assertTrue(exp_part_msg in out.getvalue()) + self.assertTrue(exp_acct_msg in out.getvalue()) + self.assertTrue(exp_cont_msg in out.getvalue()) + self.assertTrue(exp_obj_msg in out.getvalue()) + + def test_print_item_locations_dashed_ring_name_partition(self): + out = StringIO() + part = '1' + with mock.patch('sys.stdout', out): + print_item_locations(None, policy_name='one', + ring_name='foo-bar', partition=part, + swift_dir=self.testdir) + exp_part_msg = 'Partition\t%s' % part + exp_acct_msg = 'Account \tNone' + exp_cont_msg = 'Container\tNone' + exp_obj_msg = 'Object \tNone' + self.assertTrue(exp_part_msg in out.getvalue()) + self.assertTrue(exp_acct_msg in out.getvalue()) + self.assertTrue(exp_cont_msg in out.getvalue()) + self.assertTrue(exp_obj_msg in out.getvalue()) + + def test_print_item_locations_account_with_ring(self): + out = StringIO() + account = 'account' + with mock.patch('sys.stdout', out): + account_ring = ring.Ring(self.testdir, ring_name=account) + print_item_locations(account_ring, account=account) + exp_msg = 'Account \t%s' % account + self.assertTrue(exp_msg in out.getvalue()) + exp_warning = 'Warning: account specified ' + \ + 'but ring not named "account"' + self.assertTrue(exp_warning in out.getvalue()) + exp_acct_msg = 'Account \t%s' % account + exp_cont_msg = 'Container\tNone' + exp_obj_msg = 'Object \tNone' + self.assertTrue(exp_acct_msg in out.getvalue()) + self.assertTrue(exp_cont_msg in out.getvalue()) + self.assertTrue(exp_obj_msg in out.getvalue()) + + def test_print_item_locations_account_no_ring(self): + out = StringIO() + account = 'account' + with mock.patch('sys.stdout', out): + print_item_locations(None, account=account, + swift_dir=self.testdir) + exp_acct_msg = 'Account \t%s' % account + exp_cont_msg = 'Container\tNone' + exp_obj_msg = 'Object \tNone' + self.assertTrue(exp_acct_msg in out.getvalue()) + self.assertTrue(exp_cont_msg in out.getvalue()) + self.assertTrue(exp_obj_msg in out.getvalue()) + + def test_print_item_locations_account_container_ring(self): + out = StringIO() + account = 'account' + container = 'container' + with mock.patch('sys.stdout', out): + container_ring = ring.Ring(self.testdir, ring_name='container') + print_item_locations(container_ring, account=account, + container=container) + exp_acct_msg = 'Account \t%s' % account + exp_cont_msg = 'Container\t%s' % container + exp_obj_msg = 'Object \tNone' + self.assertTrue(exp_acct_msg in out.getvalue()) + self.assertTrue(exp_cont_msg in out.getvalue()) + self.assertTrue(exp_obj_msg in out.getvalue()) + + def test_print_item_locations_account_container_no_ring(self): + out = StringIO() + account = 'account' + container = 'container' + with mock.patch('sys.stdout', out): + print_item_locations(None, account=account, + container=container, swift_dir=self.testdir) + exp_acct_msg = 'Account \t%s' % account + exp_cont_msg = 'Container\t%s' % container + exp_obj_msg = 'Object \tNone' + self.assertTrue(exp_acct_msg in out.getvalue()) + self.assertTrue(exp_cont_msg in out.getvalue()) + self.assertTrue(exp_obj_msg in out.getvalue()) + + def test_print_item_locations_account_container_object_ring(self): + out = StringIO() + account = 'account' + container = 'container' + obj = 'object' + with mock.patch('sys.stdout', out): + object_ring = ring.Ring(self.testdir, ring_name='object') + print_item_locations(object_ring, ring_name='object', + account=account, container=container, + obj=obj) + exp_acct_msg = 'Account \t%s' % account + exp_cont_msg = 'Container\t%s' % container + exp_obj_msg = 'Object \t%s' % obj + self.assertTrue(exp_acct_msg in out.getvalue()) + self.assertTrue(exp_cont_msg in out.getvalue()) + self.assertTrue(exp_obj_msg in out.getvalue()) + + def test_print_item_locations_account_container_object_dashed_ring(self): + out = StringIO() + account = 'account' + container = 'container' + obj = 'object' + with mock.patch('sys.stdout', out): + object_ring = ring.Ring(self.testdir, ring_name='object-1') + print_item_locations(object_ring, ring_name='object-1', + account=account, container=container, + obj=obj) + exp_acct_msg = 'Account \t%s' % account + exp_cont_msg = 'Container\t%s' % container + exp_obj_msg = 'Object \t%s' % obj + self.assertTrue(exp_acct_msg in out.getvalue()) + self.assertTrue(exp_cont_msg in out.getvalue()) + self.assertTrue(exp_obj_msg in out.getvalue()) + def test_print_info(self): db_file = 'foo' self.assertRaises(InfoSystemExit, print_info, 'object', db_file)