Merge "Split up backend/sysmeta header/footer preference tests"

This commit is contained in:
Jenkins
2016-07-29 21:22:02 +00:00
committed by Gerrit Code Review

View File

@@ -121,6 +121,7 @@ class TestObjectController(unittest.TestCase):
self.object_controller.logger) self.object_controller.logger)
self.logger = debug_logger('test-object-controller') self.logger = debug_logger('test-object-controller')
self.ts = make_timestamp_iter()
def tearDown(self): def tearDown(self):
"""Tear down for testing swift.object.server.ObjectController""" """Tear down for testing swift.object.server.ObjectController"""
@@ -1435,85 +1436,97 @@ class TestObjectController(unittest.TestCase):
with open(objfile) as fh: with open(objfile) as fh:
self.assertEqual(fh.read(), "obj data") self.assertEqual(fh.read(), "obj data")
def test_PUT_container_override_etag_in_footer(self): def _check_container_override_etag_preference(self, override_headers,
ts_iter = make_timestamp_iter() override_footers):
def mock_container_update(ctlr, op, account, container, obj, req,
headers_out, objdevice, policy):
calls_made.append((headers_out, policy))
calls_made = []
ts_put = next(self.ts)
def do_test(override_headers, override_footers): headers = {
def mock_container_update(ctlr, op, account, container, obj, req, 'X-Timestamp': ts_put.internal,
headers_out, objdevice, policy): 'Content-Type': 'text/plain',
calls_made.append((headers_out, policy)) 'Transfer-Encoding': 'chunked',
calls_made = [] 'Etag': 'other-etag',
ts_put = next(ts_iter) 'X-Backend-Obj-Metadata-Footer': 'yes',
'X-Backend-Obj-Multipart-Mime-Boundary': 'boundary'}
headers.update(override_headers)
req = Request.blank(
'/sda1/p/a/c/o', headers=headers,
environ={'REQUEST_METHOD': 'PUT'})
headers = { obj_etag = md5("obj data").hexdigest()
'X-Timestamp': ts_put.internal, footers = {'Etag': obj_etag}
'Content-Type': 'text/plain', footers.update(override_footers)
'Transfer-Encoding': 'chunked', footer_meta = json.dumps(footers)
'Etag': 'other-etag', footer_meta_cksum = md5(footer_meta).hexdigest()
'X-Backend-Obj-Metadata-Footer': 'yes',
'X-Backend-Obj-Multipart-Mime-Boundary': 'boundary'}
headers.update(override_headers)
req = Request.blank(
'/sda1/p/a/c/o', headers=headers,
environ={'REQUEST_METHOD': 'PUT'})
obj_etag = md5("obj data").hexdigest() req.body = "\r\n".join((
footers = {'Etag': obj_etag} "--boundary",
footers.update(override_footers) "",
footer_meta = json.dumps(footers) "obj data",
footer_meta_cksum = md5(footer_meta).hexdigest() "--boundary",
"Content-MD5: " + footer_meta_cksum,
"",
footer_meta,
"--boundary--",
))
req.headers.pop("Content-Length", None)
req.body = "\r\n".join(( with mock.patch(
"--boundary", 'swift.obj.server.ObjectController.container_update',
"", mock_container_update):
"obj data", resp = req.get_response(self.object_controller)
"--boundary", self.assertEqual(resp.etag, obj_etag)
"Content-MD5: " + footer_meta_cksum, self.assertEqual(resp.status_int, 201)
"", self.assertEqual(1, len(calls_made))
footer_meta, self.assertEqual({
"--boundary--", 'X-Size': str(len('obj data')),
)) 'X-Etag': 'update-etag',
req.headers.pop("Content-Length", None) 'X-Content-Type': 'text/plain',
'X-Timestamp': ts_put.internal,
}, calls_made[0][0])
self.assertEqual(POLICIES[0], calls_made[0][1])
with mock.patch( def test_lone_header_footer_override_preference(self):
'swift.obj.server.ObjectController.container_update', self._check_container_override_etag_preference(
mock_container_update): {'X-Backend-Container-Update-Override-Etag': 'update-etag'}, {})
resp = req.get_response(self.object_controller) self._check_container_override_etag_preference(
self.assertEqual(resp.etag, obj_etag) {}, {'X-Backend-Container-Update-Override-Etag': 'update-etag'})
self.assertEqual(resp.status_int, 201) self._check_container_override_etag_preference(
self.assertEqual(1, len(calls_made)) {'X-Object-Sysmeta-Container-Update-Override-Etag':
self.assertEqual({ 'update-etag'}, {})
'X-Size': str(len('obj data')), self._check_container_override_etag_preference(
'X-Etag': 'update-etag', {}, {'X-Object-Sysmeta-Container-Update-Override-Etag':
'X-Content-Type': 'text/plain', 'update-etag'}),
'X-Timestamp': ts_put.internal,
}, calls_made[0][0])
self.assertEqual(POLICIES[0], calls_made[0][1])
# lone headers/footers work def test_footer_trumps_header(self):
do_test({'X-Backend-Container-Update-Override-Etag': 'update-etag'}, self._check_container_override_etag_preference(
{}) {'X-Backend-Container-Update-Override-Etag': 'ignored-etag'},
do_test({}, {'X-Backend-Container-Update-Override-Etag': 'update-etag'})
{'X-Backend-Container-Update-Override-Etag': 'update-etag'}) self._check_container_override_etag_preference(
do_test({'X-Object-Sysmeta-Container-Update-Override-Etag': {'X-Object-Sysmeta-Container-Update-Override-Etag':
'update-etag'}, 'ignored-etag'},
{}) {'X-Object-Sysmeta-Container-Update-Override-Etag':
do_test({}, 'update-etag'})
{'X-Object-Sysmeta-Container-Update-Override-Etag':
def test_sysmeta_trumps_backend(self):
self._check_container_override_etag_preference(
{'X-Backend-Container-Update-Override-Etag': 'ignored-etag',
'X-Object-Sysmeta-Container-Update-Override-Etag':
'update-etag'}, {})
self._check_container_override_etag_preference(
{}, {'X-Backend-Container-Update-Override-Etag': 'ignored-etag',
'X-Object-Sysmeta-Container-Update-Override-Etag':
'update-etag'}) 'update-etag'})
# footer trumps header def test_sysmeta_header_trumps_backend_footer(self):
do_test({'X-Backend-Container-Update-Override-Etag': 'ignored-etag'}, headers = {'X-Object-Sysmeta-Container-Update-Override-Etag':
{'X-Backend-Container-Update-Override-Etag': 'update-etag'}) 'update-etag'}
do_test({'X-Object-Sysmeta-Container-Update-Override-Etag': footers = {'X-Backend-Container-Update-Override-Etag':
'ignored-etag'}, 'ignored-etag'}
{'X-Object-Sysmeta-Container-Update-Override-Etag': self._check_container_override_etag_preference(headers, footers)
'update-etag'})
# but sysmeta header trumps backend footer
do_test({'X-Object-Sysmeta-Container-Update-Override-Etag':
'update-etag'},
{'X-Backend-Container-Update-Override-Etag': 'ignored-etag'})
def test_PUT_etag_in_footer_mismatch(self): def test_PUT_etag_in_footer_mismatch(self):
timestamp = normalize_timestamp(time()) timestamp = normalize_timestamp(time())