summaryrefslogtreecommitdiffstats
path: root/test/unit/proxy/controllers/test_account.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/unit/proxy/controllers/test_account.py')
-rw-r--r--test/unit/proxy/controllers/test_account.py218
1 files changed, 188 insertions, 30 deletions
diff --git a/test/unit/proxy/controllers/test_account.py b/test/unit/proxy/controllers/test_account.py
index 23ad0a1..a46dcc9 100644
--- a/test/unit/proxy/controllers/test_account.py
+++ b/test/unit/proxy/controllers/test_account.py
@@ -25,6 +25,7 @@ from test.unit import fake_http_connect, FakeRing, FakeMemcache
from swift.common.storage_policy import StoragePolicy
from swift.common.request_helpers import get_sys_meta_prefix
import swift.proxy.controllers.base
+from swift.proxy.controllers.base import get_account_info
from test.unit import patch_policies
@@ -36,6 +37,31 @@ class TestAccountController(unittest.TestCase):
None, FakeMemcache(),
account_ring=FakeRing(), container_ring=FakeRing())
+ def _make_callback_func(self, context):
+ def callback(ipaddr, port, device, partition, method, path,
+ headers=None, query_string=None, ssl=False):
+ context['method'] = method
+ context['path'] = path
+ context['headers'] = headers or {}
+ return callback
+
+ def _assert_responses(self, method, test_cases):
+ if method in ('PUT', 'DELETE'):
+ self.app.allow_account_management = True
+ controller = proxy_server.AccountController(self.app, 'AUTH_bob')
+
+ for responses, expected in test_cases:
+ with mock.patch(
+ 'swift.proxy.controllers.base.http_connect',
+ fake_http_connect(*responses)):
+ req = Request.blank('/v1/AUTH_bob')
+ resp = getattr(controller, method)(req)
+
+ self.assertEqual(expected,
+ resp.status_int,
+ 'Expected %s but got %s. Failed case: %s' %
+ (expected, resp.status_int, str(responses)))
+
def test_account_info_in_response_env(self):
controller = proxy_server.AccountController(self.app, 'AUTH_bob')
with mock.patch('swift.proxy.controllers.base.http_connect',
@@ -43,9 +69,10 @@ class TestAccountController(unittest.TestCase):
req = Request.blank('/v1/AUTH_bob', {'PATH_INFO': '/v1/AUTH_bob'})
resp = controller.HEAD(req)
self.assertEqual(2, resp.status_int // 100)
- self.assertTrue('swift.account/AUTH_bob' in resp.environ)
- self.assertEqual(headers_to_account_info(resp.headers),
- resp.environ['swift.account/AUTH_bob'])
+ self.assertIn('account/AUTH_bob', resp.environ['swift.infocache'])
+ self.assertEqual(
+ headers_to_account_info(resp.headers),
+ resp.environ['swift.infocache']['account/AUTH_bob'])
def test_swift_owner(self):
owner_headers = {
@@ -57,17 +84,17 @@ class TestAccountController(unittest.TestCase):
with mock.patch('swift.proxy.controllers.base.http_connect',
fake_http_connect(200, headers=owner_headers)):
resp = controller.HEAD(req)
- self.assertEquals(2, resp.status_int // 100)
+ self.assertEqual(2, resp.status_int // 100)
for key in owner_headers:
- self.assertTrue(key not in resp.headers)
+ self.assertNotIn(key, resp.headers)
req = Request.blank('/v1/a', environ={'swift_owner': True})
with mock.patch('swift.proxy.controllers.base.http_connect',
fake_http_connect(200, headers=owner_headers)):
resp = controller.HEAD(req)
- self.assertEquals(2, resp.status_int // 100)
+ self.assertEqual(2, resp.status_int // 100)
for key in owner_headers:
- self.assertTrue(key in resp.headers)
+ self.assertIn(key, resp.headers)
def test_get_deleted_account(self):
resp_headers = {
@@ -79,7 +106,7 @@ class TestAccountController(unittest.TestCase):
with mock.patch('swift.proxy.controllers.base.http_connect',
fake_http_connect(404, headers=resp_headers)):
resp = controller.HEAD(req)
- self.assertEquals(410, resp.status_int)
+ self.assertEqual(410, resp.status_int)
def test_long_acct_names(self):
long_acct_name = '%sLongAccountName' % (
@@ -90,25 +117,17 @@ class TestAccountController(unittest.TestCase):
with mock.patch('swift.proxy.controllers.base.http_connect',
fake_http_connect(200)):
resp = controller.HEAD(req)
- self.assertEquals(400, resp.status_int)
+ self.assertEqual(400, resp.status_int)
with mock.patch('swift.proxy.controllers.base.http_connect',
fake_http_connect(200)):
resp = controller.GET(req)
- self.assertEquals(400, resp.status_int)
+ self.assertEqual(400, resp.status_int)
with mock.patch('swift.proxy.controllers.base.http_connect',
fake_http_connect(200)):
resp = controller.POST(req)
- self.assertEquals(400, resp.status_int)
-
- def _make_callback_func(self, context):
- def callback(ipaddr, port, device, partition, method, path,
- headers=None, query_string=None, ssl=False):
- context['method'] = method
- context['path'] = path
- context['headers'] = headers or {}
- return callback
+ self.assertEqual(400, resp.status_int)
def test_sys_meta_headers_PUT(self):
# check that headers in sys meta namespace make it through
@@ -129,9 +148,9 @@ class TestAccountController(unittest.TestCase):
fake_http_connect(200, 200, give_connect=callback)):
controller.PUT(req)
self.assertEqual(context['method'], 'PUT')
- self.assertTrue(sys_meta_key in context['headers'])
+ self.assertIn(sys_meta_key, context['headers'])
self.assertEqual(context['headers'][sys_meta_key], 'foo')
- self.assertTrue(user_meta_key in context['headers'])
+ self.assertIn(user_meta_key, context['headers'])
self.assertEqual(context['headers'][user_meta_key], 'bar')
self.assertNotEqual(context['headers']['x-timestamp'], '1.0')
@@ -152,9 +171,9 @@ class TestAccountController(unittest.TestCase):
fake_http_connect(200, 200, give_connect=callback)):
controller.POST(req)
self.assertEqual(context['method'], 'POST')
- self.assertTrue(sys_meta_key in context['headers'])
+ self.assertIn(sys_meta_key, context['headers'])
self.assertEqual(context['headers'][sys_meta_key], 'foo')
- self.assertTrue(user_meta_key in context['headers'])
+ self.assertIn(user_meta_key, context['headers'])
self.assertEqual(context['headers'][user_meta_key], 'bar')
self.assertNotEqual(context['headers']['x-timestamp'], '1.0')
@@ -193,7 +212,7 @@ class TestAccountController(unittest.TestCase):
self.assertEqual(resp.headers.get(header), value)
else:
# blank ACLs should result in no header
- self.assert_(header not in resp.headers)
+ self.assertNotIn(header, resp.headers)
def test_add_acls_impossible_cases(self):
# For test coverage: verify that defensive coding does defend, in cases
@@ -208,19 +227,25 @@ class TestAccountController(unittest.TestCase):
self.assertEqual(1, len(resp.headers)) # we always get Content-Type
self.assertEqual(2, len(resp.environ))
- def test_memcache_key_impossible_cases(self):
+ def test_cache_key_impossible_cases(self):
# For test coverage: verify that defensive coding does defend, in cases
# that shouldn't arise naturally
- self.assertRaises(
- ValueError,
- lambda: swift.proxy.controllers.base.get_container_memcache_key(
- '/a', None))
+ with self.assertRaises(ValueError):
+ # Container needs account
+ swift.proxy.controllers.base.get_cache_key(None, 'c')
+
+ with self.assertRaises(ValueError):
+ # Object needs account
+ swift.proxy.controllers.base.get_cache_key(None, 'c', 'o')
+
+ with self.assertRaises(ValueError):
+ # Object needs container
+ swift.proxy.controllers.base.get_cache_key('a', None, 'o')
def test_stripping_swift_admin_headers(self):
# Verify that a GET/HEAD which receives privileged headers from the
# account server will strip those headers for non-swift_owners
- hdrs_ext, hdrs_int = self._make_user_and_sys_acl_headers_data()
headers = {
'x-account-meta-harmless': 'hi mom',
'x-account-meta-temp-url-key': 's3kr1t',
@@ -243,6 +268,139 @@ class TestAccountController(unittest.TestCase):
'x-account-meta-temp-url-key' in resp.headers)
self.assertEqual(privileged_header_present, env['swift_owner'])
+ def test_response_code_for_PUT(self):
+ PUT_TEST_CASES = [
+ ((201, 201, 201), 201),
+ ((201, 201, 404), 201),
+ ((201, 201, 503), 201),
+ ((201, 404, 404), 404),
+ ((201, 404, 503), 503),
+ ((201, 503, 503), 503),
+ ((404, 404, 404), 404),
+ ((404, 404, 503), 404),
+ ((404, 503, 503), 503),
+ ((503, 503, 503), 503)
+ ]
+ self._assert_responses('PUT', PUT_TEST_CASES)
+
+ def test_response_code_for_DELETE(self):
+ DELETE_TEST_CASES = [
+ ((204, 204, 204), 204),
+ ((204, 204, 404), 204),
+ ((204, 204, 503), 204),
+ ((204, 404, 404), 404),
+ ((204, 404, 503), 503),
+ ((204, 503, 503), 503),
+ ((404, 404, 404), 404),
+ ((404, 404, 503), 404),
+ ((404, 503, 503), 503),
+ ((503, 503, 503), 503)
+ ]
+ self._assert_responses('DELETE', DELETE_TEST_CASES)
+
+ def test_response_code_for_POST(self):
+ POST_TEST_CASES = [
+ ((204, 204, 204), 204),
+ ((204, 204, 404), 204),
+ ((204, 204, 503), 204),
+ ((204, 404, 404), 404),
+ ((204, 404, 503), 503),
+ ((204, 503, 503), 503),
+ ((404, 404, 404), 404),
+ ((404, 404, 503), 404),
+ ((404, 503, 503), 503),
+ ((503, 503, 503), 503)
+ ]
+ self._assert_responses('POST', POST_TEST_CASES)
+
+
+@patch_policies(
+ [StoragePolicy(0, 'zero', True, object_ring=FakeRing(replicas=4))])
+class TestAccountController4Replicas(TestAccountController):
+ def setUp(self):
+ self.app = proxy_server.Application(
+ None,
+ FakeMemcache(),
+ account_ring=FakeRing(replicas=4),
+ container_ring=FakeRing(replicas=4))
+
+ def test_response_code_for_PUT(self):
+ PUT_TEST_CASES = [
+ ((201, 201, 201, 201), 201),
+ ((201, 201, 201, 404), 201),
+ ((201, 201, 201, 503), 201),
+ ((201, 201, 404, 404), 201),
+ ((201, 201, 404, 503), 201),
+ ((201, 201, 503, 503), 201),
+ ((201, 404, 404, 404), 404),
+ ((201, 404, 404, 503), 404),
+ ((201, 404, 503, 503), 503),
+ ((201, 503, 503, 503), 503),
+ ((404, 404, 404, 404), 404),
+ ((404, 404, 404, 503), 404),
+ ((404, 404, 503, 503), 404),
+ ((404, 503, 503, 503), 503),
+ ((503, 503, 503, 503), 503)
+ ]
+ self._assert_responses('PUT', PUT_TEST_CASES)
+
+ def test_response_code_for_DELETE(self):
+ DELETE_TEST_CASES = [
+ ((204, 204, 204, 204), 204),
+ ((204, 204, 204, 404), 204),
+ ((204, 204, 204, 503), 204),
+ ((204, 204, 404, 404), 204),
+ ((204, 204, 404, 503), 204),
+ ((204, 204, 503, 503), 204),
+ ((204, 404, 404, 404), 404),
+ ((204, 404, 404, 503), 404),
+ ((204, 404, 503, 503), 503),
+ ((204, 503, 503, 503), 503),
+ ((404, 404, 404, 404), 404),
+ ((404, 404, 404, 503), 404),
+ ((404, 404, 503, 503), 404),
+ ((404, 503, 503, 503), 503),
+ ((503, 503, 503, 503), 503)
+ ]
+ self._assert_responses('DELETE', DELETE_TEST_CASES)
+
+ def test_response_code_for_POST(self):
+ POST_TEST_CASES = [
+ ((204, 204, 204, 204), 204),
+ ((204, 204, 204, 404), 204),
+ ((204, 204, 204, 503), 204),
+ ((204, 204, 404, 404), 204),
+ ((204, 204, 404, 503), 204),
+ ((204, 204, 503, 503), 204),
+ ((204, 404, 404, 404), 404),
+ ((204, 404, 404, 503), 404),
+ ((204, 404, 503, 503), 503),
+ ((204, 503, 503, 503), 503),
+ ((404, 404, 404, 404), 404),
+ ((404, 404, 404, 503), 404),
+ ((404, 404, 503, 503), 404),
+ ((404, 503, 503, 503), 503),
+ ((503, 503, 503, 503), 503)
+ ]
+ self._assert_responses('POST', POST_TEST_CASES)
+
+
+@patch_policies([StoragePolicy(0, 'zero', True, object_ring=FakeRing())])
+class TestGetAccountInfo(unittest.TestCase):
+ def setUp(self):
+ self.app = proxy_server.Application(
+ None, FakeMemcache(),
+ account_ring=FakeRing(), container_ring=FakeRing())
+
+ def test_get_deleted_account_410(self):
+ resp_headers = {'x-account-status': 'deleted'}
+
+ req = Request.blank('/v1/a')
+ with mock.patch('swift.proxy.controllers.base.http_connect',
+ fake_http_connect(404, headers=resp_headers)):
+ info = get_account_info(req.environ, self.app)
+ self.assertEqual(410, info.get('status'))
+
if __name__ == '__main__':
unittest.main()