diff --git a/test/unit/proxy/test_sysmeta.py b/test/unit/proxy/test_sysmeta.py index 9548680791..1a7f82334e 100644 --- a/test/unit/proxy/test_sysmeta.py +++ b/test/unit/proxy/test_sysmeta.py @@ -19,6 +19,8 @@ import unittest import os from tempfile import mkdtemp import shutil + +from swift.common.middleware.copy import ServerSideCopyMiddleware from swift.common.storage_policy import StoragePolicy from swift.common.swob import Request from swift.common.utils import mkdirs, split_path @@ -133,6 +135,7 @@ class TestObjectSysmeta(unittest.TestCase): logger=debug_logger('proxy-ut'), account_ring=FakeRing(replicas=1), container_ring=FakeRing(replicas=1)) + self.copy_app = ServerSideCopyMiddleware(self.app, {}) monkey_patch_mimetools() self.tmpdir = mkdtemp() self.testdir = os.path.join(self.tmpdir, @@ -239,7 +242,7 @@ class TestObjectSysmeta(unittest.TestCase): self._assertInHeaders(resp, self.new_meta_headers) self._assertNotInHeaders(resp, self.original_meta_headers_2) - def _test_sysmeta_not_updated_by_POST(self): + def _test_sysmeta_not_updated_by_POST(self, app): # check sysmeta is not changed by a POST but user meta is replaced path = '/v1/a/c/o' @@ -247,7 +250,7 @@ class TestObjectSysmeta(unittest.TestCase): hdrs = dict(self.original_sysmeta_headers_1) hdrs.update(self.original_meta_headers_1) req = Request.blank(path, environ=env, headers=hdrs, body='x') - resp = req.get_response(self.app) + resp = req.get_response(app) self._assertStatus(resp, 201) env = {'REQUEST_METHOD': 'POST'} @@ -257,11 +260,11 @@ class TestObjectSysmeta(unittest.TestCase): hdrs.update(self.new_meta_headers) hdrs.update(self.bad_headers) req = Request.blank(path, environ=env, headers=hdrs) - resp = req.get_response(self.app) + resp = req.get_response(app) self._assertStatus(resp, 202) req = Request.blank(path, environ={}) - resp = req.get_response(self.app) + resp = req.get_response(app) self._assertStatus(resp, 200) self._assertInHeaders(resp, self.original_sysmeta_headers_1) self._assertNotInHeaders(resp, self.new_sysmeta_headers) @@ -274,12 +277,106 @@ class TestObjectSysmeta(unittest.TestCase): hdrs.update(self.new_sysmeta_headers) hdrs.update(self.bad_headers) req = Request.blank(path, environ=env, headers=hdrs, body='x') - resp = req.get_response(self.app) + resp = req.get_response(app) self._assertStatus(resp, 201) req = Request.blank(path, environ={}) - resp = req.get_response(self.app) + resp = req.get_response(app) self._assertStatus(resp, 200) self._assertInHeaders(resp, self.changed_sysmeta_headers) self._assertInHeaders(resp, self.new_sysmeta_headers) self._assertNotInHeaders(resp, self.original_sysmeta_headers_2) + + def test_sysmeta_not_updated_by_POST(self): + # test fast-post by issuing requests to the proxy app + self._test_sysmeta_not_updated_by_POST(self.app) + + def test_sysmeta_not_updated_by_POST_as_copy(self): + # test post-as-copy by issuing requests to the copy middleware app + self.copy_app.object_post_as_copy = True + self._test_sysmeta_not_updated_by_POST(self.copy_app) + + def test_sysmeta_updated_by_COPY(self): + # check sysmeta is updated by a COPY in same way as user meta by + # issuing requests to the copy middleware app + path = '/v1/a/c/o' + dest = '/c/o2' + env = {'REQUEST_METHOD': 'PUT'} + hdrs = dict(self.original_sysmeta_headers_1) + hdrs.update(self.original_sysmeta_headers_2) + hdrs.update(self.original_meta_headers_1) + hdrs.update(self.original_meta_headers_2) + req = Request.blank(path, environ=env, headers=hdrs, body='x') + resp = req.get_response(self.copy_app) + self._assertStatus(resp, 201) + + env = {'REQUEST_METHOD': 'COPY'} + hdrs = dict(self.changed_sysmeta_headers) + hdrs.update(self.new_sysmeta_headers) + hdrs.update(self.changed_meta_headers) + hdrs.update(self.new_meta_headers) + hdrs.update(self.bad_headers) + hdrs.update({'Destination': dest}) + req = Request.blank(path, environ=env, headers=hdrs) + resp = req.get_response(self.copy_app) + self._assertStatus(resp, 201) + self._assertInHeaders(resp, self.changed_sysmeta_headers) + self._assertInHeaders(resp, self.new_sysmeta_headers) + self._assertInHeaders(resp, self.original_sysmeta_headers_2) + self._assertInHeaders(resp, self.changed_meta_headers) + self._assertInHeaders(resp, self.new_meta_headers) + self._assertInHeaders(resp, self.original_meta_headers_2) + self._assertNotInHeaders(resp, self.bad_headers) + + req = Request.blank('/v1/a/c/o2', environ={}) + resp = req.get_response(self.copy_app) + self._assertStatus(resp, 200) + self._assertInHeaders(resp, self.changed_sysmeta_headers) + self._assertInHeaders(resp, self.new_sysmeta_headers) + self._assertInHeaders(resp, self.original_sysmeta_headers_2) + self._assertInHeaders(resp, self.changed_meta_headers) + self._assertInHeaders(resp, self.new_meta_headers) + self._assertInHeaders(resp, self.original_meta_headers_2) + self._assertNotInHeaders(resp, self.bad_headers) + + def test_sysmeta_updated_by_COPY_from(self): + # check sysmeta is updated by a PUT with x-copy-from in same way as + # user meta by issuing requests to the copy middleware app + path = '/v1/a/c/o' + env = {'REQUEST_METHOD': 'PUT'} + hdrs = dict(self.original_sysmeta_headers_1) + hdrs.update(self.original_sysmeta_headers_2) + hdrs.update(self.original_meta_headers_1) + hdrs.update(self.original_meta_headers_2) + req = Request.blank(path, environ=env, headers=hdrs, body='x') + resp = req.get_response(self.copy_app) + self._assertStatus(resp, 201) + + env = {'REQUEST_METHOD': 'PUT'} + hdrs = dict(self.changed_sysmeta_headers) + hdrs.update(self.new_sysmeta_headers) + hdrs.update(self.changed_meta_headers) + hdrs.update(self.new_meta_headers) + hdrs.update(self.bad_headers) + hdrs.update({'X-Copy-From': '/c/o'}) + req = Request.blank('/v1/a/c/o2', environ=env, headers=hdrs, body='') + resp = req.get_response(self.copy_app) + self._assertStatus(resp, 201) + self._assertInHeaders(resp, self.changed_sysmeta_headers) + self._assertInHeaders(resp, self.new_sysmeta_headers) + self._assertInHeaders(resp, self.original_sysmeta_headers_2) + self._assertInHeaders(resp, self.changed_meta_headers) + self._assertInHeaders(resp, self.new_meta_headers) + self._assertInHeaders(resp, self.original_meta_headers_2) + self._assertNotInHeaders(resp, self.bad_headers) + + req = Request.blank('/v1/a/c/o2', environ={}) + resp = req.get_response(self.copy_app) + self._assertStatus(resp, 200) + self._assertInHeaders(resp, self.changed_sysmeta_headers) + self._assertInHeaders(resp, self.new_sysmeta_headers) + self._assertInHeaders(resp, self.original_sysmeta_headers_2) + self._assertInHeaders(resp, self.changed_meta_headers) + self._assertInHeaders(resp, self.new_meta_headers) + self._assertInHeaders(resp, self.original_meta_headers_2) + self._assertNotInHeaders(resp, self.bad_headers)