test_object_versioning.py: used mocked Timestamps
Replace hard-coded timestamps/versions with dynamically generated timestamps/versions in unit tests. Change-Id: I0b36078c004f20f0cda4c91de0da17e382766fc4 Signed-off-by: Alistair Coles <alistairncoles@gmail.com>
This commit is contained in:
@@ -23,7 +23,8 @@ import urllib.parse
|
||||
from swift.common import swob, utils
|
||||
from swift.common.middleware import versioned_writes, copy, symlink, \
|
||||
listing_formats
|
||||
from swift.common.swob import Request, wsgi_quote, str_to_wsgi
|
||||
from swift.common.swob import Request, wsgi_quote, str_to_wsgi, \
|
||||
date_header_format
|
||||
from swift.common.middleware.symlink import TGT_OBJ_SYSMETA_SYMLINK_HDR, \
|
||||
ALLOW_RESERVED_NAMES, SYMLOOP_EXTEND
|
||||
from swift.common.middleware.versioned_writes.object_versioning import \
|
||||
@@ -32,8 +33,10 @@ from swift.common.middleware.versioned_writes.object_versioning import \
|
||||
from swift.common.request_helpers import get_reserved_name
|
||||
from swift.common.storage_policy import StoragePolicy
|
||||
from swift.common.utils import md5
|
||||
from swift.common.utils.timestamp import Timestamp
|
||||
from swift.proxy.controllers.base import get_cache_key
|
||||
from test.unit import patch_policies, FakeMemcache, make_timestamp_iter
|
||||
from test.unit import patch_policies, FakeMemcache, make_timestamp_iter, \
|
||||
mock_timestamp_now
|
||||
from test.unit.common.middleware.helpers import FakeSwift
|
||||
|
||||
|
||||
@@ -577,15 +580,14 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
self.assertEqual(len(self.authorized), 1)
|
||||
self.assertRequestEqual(req, self.authorized[0])
|
||||
|
||||
@mock.patch('swift.common.middleware.versioned_writes.object_versioning.'
|
||||
'time.time', return_value=1234)
|
||||
def test_PUT_overwrite(self, mock_time):
|
||||
def test_PUT_overwrite(self):
|
||||
ts_now = Timestamp.now()
|
||||
self.app.register('GET', '/v1/a/c/o', swob.HTTPOk, {
|
||||
SYSMETA_VERSIONS_SYMLINK: 'true',
|
||||
TGT_OBJ_SYSMETA_SYMLINK_HDR: 'c-unique/whatever'}, '')
|
||||
self.app.register(
|
||||
'PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999'),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal),
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'PUT', '/v1/a/c/o', swob.HTTPCreated, {}, 'passed')
|
||||
@@ -599,7 +601,8 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
'Content-Length': len(put_body)},
|
||||
environ={'swift.cache': self.cache_version_on,
|
||||
'swift.trans_id': 'fake_trans_id'})
|
||||
status, headers, body = self.call_ov(req)
|
||||
with mock_timestamp_now(ts_now):
|
||||
status, headers, body = self.call_ov(req)
|
||||
self.assertEqual(status, '201 Created')
|
||||
self.assertEqual(len(self.authorized), 2)
|
||||
self.assertRequestEqual(req, self.authorized[0])
|
||||
@@ -608,7 +611,7 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
self.assertEqual(self.app.calls, [
|
||||
('GET', '/v1/a/c/o?symlink=get'),
|
||||
('PUT', self.build_versions_path(
|
||||
obj='o', version='9999998765.99999')),
|
||||
obj='o', version=(~ts_now).internal)),
|
||||
('PUT', '/v1/a/c/o'),
|
||||
])
|
||||
|
||||
@@ -620,7 +623,7 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
SYMLOOP_EXTEND: 'true',
|
||||
ALLOW_RESERVED_NAMES: 'true',
|
||||
TGT_OBJ_SYSMETA_SYMLINK_HDR:
|
||||
self.build_symlink_path('c', 'o', '9999998765.99999'),
|
||||
self.build_symlink_path('c', 'o', (~ts_now).internal),
|
||||
'x-object-sysmeta-symlink-target-etag': md5(
|
||||
put_body.encode('utf8'), usedforsecurity=False).hexdigest(),
|
||||
'x-object-sysmeta-symlink-target-bytes': str(len(put_body)),
|
||||
@@ -630,15 +633,16 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
self.assertEqual(symlink_put_headers[k], v)
|
||||
|
||||
def test_POST(self):
|
||||
ts_now = Timestamp.now()
|
||||
self.app.register(
|
||||
'POST',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999'),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal),
|
||||
swob.HTTPAccepted, {}, '')
|
||||
self.app.register(
|
||||
'POST', '/v1/a/c/o', swob.HTTPTemporaryRedirect, {
|
||||
SYSMETA_VERSIONS_SYMLINK: 'true',
|
||||
'Location': self.build_versions_path(
|
||||
obj='o', version='9999998765.99999')}, '')
|
||||
obj='o', version=(~ts_now).internal)}, '')
|
||||
|
||||
# TODO: in symlink middleware, swift.leave_relative_location
|
||||
# is added by the middleware during the response
|
||||
@@ -651,7 +655,8 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
environ={'swift.cache': self.cache_version_on,
|
||||
'swift.leave_relative_location': 'true',
|
||||
'swift.trans_id': 'fake_trans_id'})
|
||||
status, headers, body = self.call_ov(req)
|
||||
with mock_timestamp_now(ts_now):
|
||||
status, headers, body = self.call_ov(req)
|
||||
self.assertEqual(status, '202 Accepted')
|
||||
|
||||
self.assertEqual(len(self.authorized), 1)
|
||||
@@ -661,7 +666,7 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
self.assertEqual(self.app.calls, [
|
||||
('POST', '/v1/a/c/o'),
|
||||
('POST', self.build_versions_path(
|
||||
obj='o', version='9999998765.99999')),
|
||||
obj='o', version=(~ts_now).internal)),
|
||||
])
|
||||
|
||||
expected_hdrs = {
|
||||
@@ -675,11 +680,12 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
def test_POST_mismatched_location(self):
|
||||
# This is a defensive chech, ideally a mistmached
|
||||
# versions container should never happen.
|
||||
ts_now = Timestamp.now()
|
||||
self.app.register(
|
||||
'POST', '/v1/a/c/o', swob.HTTPTemporaryRedirect, {
|
||||
SYSMETA_VERSIONS_SYMLINK: 'true',
|
||||
'Location': self.build_versions_path(
|
||||
cont='mismatched', obj='o', version='9999998765.99999')},
|
||||
cont='mismatched', obj='o', version=(~ts_now).internal)},
|
||||
'')
|
||||
|
||||
# TODO: in symlink middleware, swift.leave_relative_location
|
||||
@@ -693,7 +699,8 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
environ={'swift.cache': self.cache_version_on,
|
||||
'swift.leave_relative_location': 'true',
|
||||
'swift.trans_id': 'fake_trans_id'})
|
||||
status, headers, body = self.call_ov(req)
|
||||
with mock_timestamp_now(ts_now):
|
||||
status, headers, body = self.call_ov(req)
|
||||
self.assertEqual(status, '307 Temporary Redirect')
|
||||
|
||||
self.assertEqual(len(self.authorized), 1)
|
||||
@@ -705,6 +712,7 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
])
|
||||
|
||||
def test_POST_regular_symlink(self):
|
||||
ts_now = Timestamp.now()
|
||||
self.app.register(
|
||||
'POST', '/v1/a/c/o', swob.HTTPTemporaryRedirect, {
|
||||
'Location': '/v1/a/t/o'}, '')
|
||||
@@ -720,7 +728,8 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
environ={'swift.cache': self.cache_version_on,
|
||||
'swift.leave_relative_location': 'true',
|
||||
'swift.trans_id': 'fake_trans_id'})
|
||||
status, headers, body = self.call_ov(req)
|
||||
with mock_timestamp_now(ts_now):
|
||||
status, headers, body = self.call_ov(req)
|
||||
self.assertEqual(status, '307 Temporary Redirect')
|
||||
|
||||
self.assertEqual(len(self.authorized), 1)
|
||||
@@ -757,14 +766,13 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
|
||||
self.assertEqual(self.app.calls, [])
|
||||
|
||||
@mock.patch('swift.common.middleware.versioned_writes.object_versioning.'
|
||||
'time.time', return_value=1234)
|
||||
def test_PUT_overwrite_tombstone(self, mock_time):
|
||||
def test_PUT_overwrite_tombstone(self):
|
||||
ts_now = Timestamp.now()
|
||||
self.app.register(
|
||||
'GET', '/v1/a/c/o', swob.HTTPNotFound, {}, None)
|
||||
self.app.register(
|
||||
'PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999'),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal),
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'PUT', '/v1/a/c/o', swob.HTTPCreated, {}, 'passed')
|
||||
@@ -778,7 +786,8 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
'Content-Length': len(put_body)},
|
||||
environ={'swift.cache': self.cache_version_on,
|
||||
'swift.trans_id': 'fake_trans_id'})
|
||||
status, headers, body = self.call_ov(req)
|
||||
with mock_timestamp_now(ts_now):
|
||||
status, headers, body = self.call_ov(req)
|
||||
self.assertEqual(status, '201 Created')
|
||||
# authorized twice because of pre-flight check on PUT
|
||||
self.assertEqual(len(self.authorized), 2)
|
||||
@@ -789,7 +798,7 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
self.assertEqual(self.app.calls, [
|
||||
('GET', '/v1/a/c/o?symlink=get'),
|
||||
('PUT', self.build_versions_path(
|
||||
obj='o', version='9999998765.99999')),
|
||||
obj='o', version=(~ts_now).internal)),
|
||||
('PUT', '/v1/a/c/o'),
|
||||
])
|
||||
|
||||
@@ -799,7 +808,7 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
|
||||
expected_headers = {
|
||||
TGT_OBJ_SYSMETA_SYMLINK_HDR:
|
||||
self.build_symlink_path('c', 'o', '9999998765.99999'),
|
||||
self.build_symlink_path('c', 'o', (~ts_now).internal),
|
||||
'x-object-sysmeta-symlink-target-etag': md5(
|
||||
put_body.encode('utf8'), usedforsecurity=False).hexdigest(),
|
||||
'x-object-sysmeta-symlink-target-bytes': str(len(put_body)),
|
||||
@@ -808,9 +817,8 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
for k, v in expected_headers.items():
|
||||
self.assertEqual(symlink_put_headers[k], v)
|
||||
|
||||
@mock.patch('swift.common.middleware.versioned_writes.object_versioning.'
|
||||
'time.time', return_value=1234)
|
||||
def test_PUT_overwrite_object_with_DLO(self, mock_time):
|
||||
def test_PUT_overwrite_object_with_DLO(self):
|
||||
ts_now = Timestamp.now()
|
||||
self.app.register(
|
||||
'GET', '/v1/a/c/o', swob.HTTPOk,
|
||||
{'last-modified': 'Thu, 1 Jan 1970 00:01:00 GMT'}, 'old version')
|
||||
@@ -820,7 +828,7 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999'),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal),
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'PUT', '/v1/a/c/o', swob.HTTPCreated, {}, 'passed')
|
||||
@@ -830,7 +838,8 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
'X-Object-Manifest': 'req/manifest'},
|
||||
environ={'swift.cache': self.cache_version_on,
|
||||
'swift.trans_id': 'fake_trans_id'})
|
||||
status, headers, body = self.call_ov(req)
|
||||
with mock_timestamp_now(ts_now):
|
||||
status, headers, body = self.call_ov(req)
|
||||
self.assertEqual(status, '201 Created')
|
||||
self.assertEqual(len(self.authorized), 2)
|
||||
self.assertEqual(4, self.app.call_count)
|
||||
@@ -842,7 +851,7 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
('PUT',
|
||||
self.build_versions_path(obj='o', version='9999999939.99999')),
|
||||
('PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999')),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal)),
|
||||
('PUT', '/v1/a/c/o'),
|
||||
], self.app.calls)
|
||||
|
||||
@@ -857,7 +866,7 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
symlink_put_headers = calls[-1].headers
|
||||
expected_headers = {
|
||||
TGT_OBJ_SYSMETA_SYMLINK_HDR:
|
||||
self.build_symlink_path('c', 'o', '9999998765.99999'),
|
||||
self.build_symlink_path('c', 'o', (~ts_now).internal),
|
||||
'x-object-sysmeta-symlink-target-etag': md5(
|
||||
put_body.encode('utf8'), usedforsecurity=False).hexdigest(),
|
||||
'x-object-sysmeta-symlink-target-bytes': str(len(put_body)),
|
||||
@@ -866,9 +875,8 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
self.assertEqual(symlink_put_headers[k], v)
|
||||
self.assertNotIn('x-object-manifest', symlink_put_headers)
|
||||
|
||||
@mock.patch('swift.common.middleware.versioned_writes.object_versioning.'
|
||||
'time.time', return_value=1234)
|
||||
def test_PUT_overwrite_DLO_with_object(self, mock_time):
|
||||
def test_PUT_overwrite_DLO_with_object(self):
|
||||
ts_now = Timestamp.now()
|
||||
self.app.register('GET', '/v1/a/c/o', swob.HTTPOk,
|
||||
{'X-Object-Manifest': 'resp/manifest',
|
||||
'last-modified': 'Thu, 1 Jan 1970 00:01:00 GMT'},
|
||||
@@ -879,7 +887,7 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999'),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal),
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'PUT', '/v1/a/c/o', swob.HTTPCreated, {}, 'passed')
|
||||
@@ -888,7 +896,8 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
headers={'Content-Type': 'text/plain'},
|
||||
environ={'swift.cache': self.cache_version_on,
|
||||
'swift.trans_id': 'fake_trans_id'})
|
||||
status, headers, body = self.call_ov(req)
|
||||
with mock_timestamp_now(ts_now):
|
||||
status, headers, body = self.call_ov(req)
|
||||
self.assertEqual(status, '201 Created')
|
||||
self.assertEqual(len(self.authorized), 2)
|
||||
self.assertEqual(4, self.app.call_count)
|
||||
@@ -899,7 +908,7 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
('PUT',
|
||||
self.build_versions_path(obj='o', version='9999999939.99999')),
|
||||
('PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999')),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal)),
|
||||
('PUT', '/v1/a/c/o'),
|
||||
], self.app.calls)
|
||||
|
||||
@@ -919,7 +928,7 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
symlink_put_headers = calls[-1].headers
|
||||
expected_headers = {
|
||||
TGT_OBJ_SYSMETA_SYMLINK_HDR:
|
||||
self.build_symlink_path('c', 'o', '9999998765.99999'),
|
||||
self.build_symlink_path('c', 'o', (~ts_now).internal),
|
||||
'x-object-sysmeta-symlink-target-etag': md5(
|
||||
put_body.encode('utf8'), usedforsecurity=False).hexdigest(),
|
||||
'x-object-sysmeta-symlink-target-bytes': str(len(put_body)),
|
||||
@@ -928,9 +937,8 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
self.assertEqual(symlink_put_headers[k], v)
|
||||
self.assertNotIn('x-object-manifest', symlink_put_headers)
|
||||
|
||||
@mock.patch('swift.common.middleware.versioned_writes.object_versioning.'
|
||||
'time.time', return_value=1234)
|
||||
def test_PUT_overwrite_SLO_with_object(self, mock_time):
|
||||
def test_PUT_overwrite_SLO_with_object(self):
|
||||
ts_now = Timestamp.now()
|
||||
self.app.register('GET', '/v1/a/c/o', swob.HTTPOk, {
|
||||
'X-Static-Large-Object': 'True',
|
||||
# N.B. object-sever strips swift_bytes
|
||||
@@ -948,7 +956,7 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999'),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal),
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'PUT', '/v1/a/c/o', swob.HTTPCreated, {}, 'passed')
|
||||
@@ -957,7 +965,8 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
headers={'Content-Type': 'text/plain'},
|
||||
environ={'swift.cache': self.cache_version_on,
|
||||
'swift.trans_id': 'fake_trans_id'})
|
||||
status, headers, body = self.call_ov(req)
|
||||
with mock_timestamp_now(ts_now):
|
||||
status, headers, body = self.call_ov(req)
|
||||
self.assertEqual(status, '201 Created')
|
||||
self.assertEqual(len(self.authorized), 2)
|
||||
self.assertEqual(4, self.app.call_count)
|
||||
@@ -968,7 +977,7 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
('PUT',
|
||||
self.build_versions_path(obj='o', version='9999999939.99999')),
|
||||
('PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999')),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal)),
|
||||
('PUT', '/v1/a/c/o'),
|
||||
], self.app.calls)
|
||||
|
||||
@@ -999,7 +1008,7 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
symlink_put_headers = calls[-1].headers
|
||||
expected_headers = {
|
||||
TGT_OBJ_SYSMETA_SYMLINK_HDR:
|
||||
self.build_symlink_path('c', 'o', '9999998765.99999'),
|
||||
self.build_symlink_path('c', 'o', (~ts_now).internal),
|
||||
'x-object-sysmeta-symlink-target-etag': md5(
|
||||
put_body.encode('utf8'), usedforsecurity=False).hexdigest(),
|
||||
'x-object-sysmeta-symlink-target-bytes': str(len(put_body)),
|
||||
@@ -1008,19 +1017,22 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
self.assertEqual(symlink_put_headers[k], v)
|
||||
self.assertNotIn('x-object-manifest', symlink_put_headers)
|
||||
|
||||
@mock.patch('swift.common.middleware.versioned_writes.object_versioning.'
|
||||
'time.time', return_value=1234)
|
||||
def test_PUT_overwrite_object(self, mock_time):
|
||||
def test_PUT_overwrite_object(self):
|
||||
ts_iter = make_timestamp_iter()
|
||||
ts_old, ts_new = next(ts_iter), next(ts_iter)
|
||||
self.app.register(
|
||||
'GET', '/v1/a/c/o', swob.HTTPOk,
|
||||
{'last-modified': 'Thu, 1 Jan 1970 00:01:00 GMT'}, 'passed')
|
||||
{'x-timestamp': ts_old.normal,
|
||||
'x-backend-timestamp': ts_old.internal,
|
||||
'last-modified': date_header_format(ts_old)},
|
||||
'passed')
|
||||
self.app.register(
|
||||
'PUT',
|
||||
self.build_versions_path(obj='o', version='9999999939.99999'),
|
||||
self.build_versions_path(obj='o', version=(~ts_old).normal),
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999'),
|
||||
self.build_versions_path(obj='o', version=(~ts_new).internal),
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'PUT', '/v1/a/c/o', swob.HTTPCreated, {}, 'passed')
|
||||
@@ -1035,7 +1047,8 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
'Content-Length': len(put_body)},
|
||||
environ={'swift.cache': self.cache_version_on,
|
||||
'swift.trans_id': 'fake_trans_id'})
|
||||
status, headers, body = self.call_ov(req)
|
||||
with mock_timestamp_now(ts_new):
|
||||
status, headers, body = self.call_ov(req)
|
||||
self.assertEqual(status, '201 Created')
|
||||
# authorized twice because of pre-flight check on PUT
|
||||
self.assertEqual(len(self.authorized), 2)
|
||||
@@ -1046,9 +1059,9 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
self.assertEqual(self.app.calls, [
|
||||
('GET', '/v1/a/c/o?symlink=get'),
|
||||
('PUT',
|
||||
self.build_versions_path(obj='o', version='9999999939.99999')),
|
||||
self.build_versions_path(obj='o', version=(~ts_old).normal)),
|
||||
('PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999')),
|
||||
self.build_versions_path(obj='o', version=(~ts_new).internal)),
|
||||
('PUT', '/v1/a/c/o'),
|
||||
])
|
||||
|
||||
@@ -1058,7 +1071,7 @@ class ObjectVersioningTestCase(ObjectVersioningBaseTestCase):
|
||||
|
||||
expected_headers = {
|
||||
TGT_OBJ_SYSMETA_SYMLINK_HDR:
|
||||
self.build_symlink_path('c', 'o', '9999998765.99999'),
|
||||
self.build_symlink_path('c', 'o', (~ts_new).internal),
|
||||
'x-object-sysmeta-symlink-target-etag': md5(
|
||||
put_body.encode('utf8'), usedforsecurity=False).hexdigest(),
|
||||
'x-object-sysmeta-symlink-target-bytes': str(len(put_body)),
|
||||
@@ -1267,10 +1280,7 @@ class ObjectVersioningTestDisabled(ObjectVersioningBaseTestCase):
|
||||
obj_put_headers = self.app.call_list[-1].headers
|
||||
self.assertNotIn(SYSMETA_VERSIONS_SYMLINK, obj_put_headers)
|
||||
|
||||
@mock.patch('swift.common.middleware.versioned_writes.object_versioning.'
|
||||
'time.time', return_value=1234)
|
||||
def test_PUT_with_recent_versioned_marker_versioning_disabled(self,
|
||||
mock_time):
|
||||
def test_PUT_with_recent_versioned_marker_versioning_disabled(self):
|
||||
# During object PUT with a versioning disabled, if the most
|
||||
# recent versioned object is a DELETE marker will a non-null
|
||||
# version-id, then the DELETE marker should not be removed.
|
||||
@@ -1325,9 +1335,7 @@ class ObjectVersioningTestDisabled(ObjectVersioningBaseTestCase):
|
||||
obj_put_headers = self.app.call_list[-1].headers
|
||||
self.assertNotIn(SYSMETA_VERSIONS_SYMLINK, obj_put_headers)
|
||||
|
||||
@mock.patch('swift.common.middleware.versioned_writes.object_versioning.'
|
||||
'time.time', return_value=1234)
|
||||
def test_delete_object_with_versioning_disabled(self, mock_time):
|
||||
def test_delete_object_with_versioning_disabled(self):
|
||||
# When versioning is disabled, swift will simply issue the
|
||||
# original request to the versioned container
|
||||
self.app.register(
|
||||
@@ -1342,15 +1350,16 @@ class ObjectVersioningTestDisabled(ObjectVersioningBaseTestCase):
|
||||
self.assertRequestEqual(req, self.authorized[0])
|
||||
|
||||
def test_POST_symlink(self):
|
||||
ts_now = Timestamp.now()
|
||||
self.app.register(
|
||||
'POST',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999'),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal),
|
||||
swob.HTTPAccepted, {}, '')
|
||||
self.app.register(
|
||||
'POST', '/v1/a/c/o', swob.HTTPTemporaryRedirect, {
|
||||
SYSMETA_VERSIONS_SYMLINK: 'true',
|
||||
'Location': self.build_versions_path(
|
||||
obj='o', version='9999998765.99999')}, '')
|
||||
obj='o', version=(~ts_now).internal)}, '')
|
||||
|
||||
# TODO: in symlink middleware, swift.leave_relative_location
|
||||
# is added by the middleware during the response
|
||||
@@ -1363,7 +1372,8 @@ class ObjectVersioningTestDisabled(ObjectVersioningBaseTestCase):
|
||||
environ={'swift.cache': self.cache_version_off,
|
||||
'swift.leave_relative_location': 'true',
|
||||
'swift.trans_id': 'fake_trans_id'})
|
||||
status, headers, body = self.call_ov(req)
|
||||
with mock_timestamp_now(ts_now):
|
||||
status, headers, body = self.call_ov(req)
|
||||
self.assertEqual(status, '202 Accepted')
|
||||
|
||||
self.assertEqual(len(self.authorized), 1)
|
||||
@@ -1373,7 +1383,7 @@ class ObjectVersioningTestDisabled(ObjectVersioningBaseTestCase):
|
||||
self.assertEqual(self.app.calls, [
|
||||
('POST', '/v1/a/c/o'),
|
||||
('POST',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999')),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal)),
|
||||
])
|
||||
|
||||
expected_hdrs = {
|
||||
@@ -1440,15 +1450,14 @@ class ObjectVersioningTestDelete(ObjectVersioningBaseTestCase):
|
||||
self.assertNotIn('GET', called_method)
|
||||
self.assertEqual(1, self.app.call_count)
|
||||
|
||||
@mock.patch('swift.common.middleware.versioned_writes.object_versioning.'
|
||||
'time.time', return_value=1234)
|
||||
def test_put_delete_marker_no_object_success(self, mock_time):
|
||||
def test_put_delete_marker_no_object_success(self):
|
||||
ts_now = Timestamp.now()
|
||||
self.app.register(
|
||||
'GET', '/v1/a/c/o', swob.HTTPNotFound,
|
||||
{}, 'passed')
|
||||
self.app.register(
|
||||
'PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999'),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal),
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'DELETE', '/v1/a/c/o', swob.HTTPNotFound, {}, None)
|
||||
@@ -1458,7 +1467,8 @@ class ObjectVersioningTestDelete(ObjectVersioningBaseTestCase):
|
||||
environ={'REQUEST_METHOD': 'DELETE',
|
||||
'swift.cache': self.cache_version_on,
|
||||
'CONTENT_LENGTH': '0'})
|
||||
status, headers, body = self.call_ov(req)
|
||||
with mock_timestamp_now(ts_now):
|
||||
status, headers, body = self.call_ov(req)
|
||||
self.assertEqual(status, '404 Not Found')
|
||||
self.assertEqual(len(self.authorized), 2)
|
||||
|
||||
@@ -1470,9 +1480,8 @@ class ObjectVersioningTestDelete(ObjectVersioningBaseTestCase):
|
||||
self.assertEqual('application/x-deleted;swift_versions_deleted=1',
|
||||
calls[1].headers.get('Content-Type'))
|
||||
|
||||
@mock.patch('swift.common.middleware.versioned_writes.object_versioning.'
|
||||
'time.time', return_value=1234)
|
||||
def test_delete_marker_over_object_success(self, mock_time):
|
||||
def test_delete_marker_over_object_success(self):
|
||||
ts_now = Timestamp.now()
|
||||
self.app.register(
|
||||
'GET', '/v1/a/c/o', swob.HTTPOk,
|
||||
{'last-modified': 'Thu, 1 Jan 1970 00:01:00 GMT'}, 'passed')
|
||||
@@ -1482,7 +1491,7 @@ class ObjectVersioningTestDelete(ObjectVersioningBaseTestCase):
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999'),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal),
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'DELETE', '/v1/a/c/o', swob.HTTPNoContent, {}, None)
|
||||
@@ -1492,7 +1501,8 @@ class ObjectVersioningTestDelete(ObjectVersioningBaseTestCase):
|
||||
environ={'REQUEST_METHOD': 'DELETE',
|
||||
'swift.cache': self.cache_version_on,
|
||||
'CONTENT_LENGTH': '0'})
|
||||
status, headers, body = self.call_ov(req)
|
||||
with mock_timestamp_now(ts_now):
|
||||
status, headers, body = self.call_ov(req)
|
||||
self.assertEqual(status, '204 No Content')
|
||||
self.assertEqual(b'', body)
|
||||
self.assertEqual(len(self.authorized), 2)
|
||||
@@ -1509,14 +1519,13 @@ class ObjectVersioningTestDelete(ObjectVersioningBaseTestCase):
|
||||
self.assertEqual('application/x-deleted;swift_versions_deleted=1',
|
||||
calls[2].headers.get('Content-Type'))
|
||||
|
||||
@mock.patch('swift.common.middleware.versioned_writes.object_versioning.'
|
||||
'time.time', return_value=1234)
|
||||
def test_delete_marker_over_versioned_object_success(self, mock_time):
|
||||
def test_delete_marker_over_versioned_object_success(self):
|
||||
ts_now = Timestamp.now()
|
||||
self.app.register('GET', '/v1/a/c/o', swob.HTTPOk,
|
||||
{SYSMETA_VERSIONS_SYMLINK: 'true'}, 'passed')
|
||||
self.app.register(
|
||||
'PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999'),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal),
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'DELETE', '/v1/a/c/o', swob.HTTPNoContent, {}, None)
|
||||
@@ -1526,7 +1535,8 @@ class ObjectVersioningTestDelete(ObjectVersioningBaseTestCase):
|
||||
environ={'REQUEST_METHOD': 'DELETE',
|
||||
'swift.cache': self.cache_version_on,
|
||||
'CONTENT_LENGTH': '0'})
|
||||
status, headers, body = self.call_ov(req)
|
||||
with mock_timestamp_now(ts_now):
|
||||
status, headers, body = self.call_ov(req)
|
||||
self.assertEqual(status, '204 No Content')
|
||||
self.assertEqual(b'', body)
|
||||
self.assertEqual(len(self.authorized), 2)
|
||||
@@ -1538,7 +1548,7 @@ class ObjectVersioningTestDelete(ObjectVersioningBaseTestCase):
|
||||
self.assertEqual(['GET', 'PUT', 'DELETE'],
|
||||
[c.method for c in calls])
|
||||
self.assertEqual(
|
||||
self.build_versions_path(obj='o', version='9999998765.99999'),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal),
|
||||
calls[1].path)
|
||||
self.assertEqual('application/x-deleted;swift_versions_deleted=1',
|
||||
calls[1].headers.get('Content-Type'))
|
||||
@@ -1562,9 +1572,8 @@ class ObjectVersioningTestDelete(ObjectVersioningBaseTestCase):
|
||||
|
||||
|
||||
class ObjectVersioningTestCopy(ObjectVersioningBaseTestCase):
|
||||
@mock.patch('swift.common.middleware.versioned_writes.object_versioning.'
|
||||
'time.time', return_value=1234)
|
||||
def test_COPY_overwrite_tombstone(self, mock_time):
|
||||
def test_COPY_overwrite_tombstone(self):
|
||||
ts_now = Timestamp.now()
|
||||
self.cache_version_on.set(get_cache_key('a', 'src_cont'),
|
||||
{'status': 200})
|
||||
src_body = 'stuff' * 100
|
||||
@@ -1574,7 +1583,7 @@ class ObjectVersioningTestCopy(ObjectVersioningBaseTestCase):
|
||||
'GET', '/v1/a/src_cont/src_obj', swob.HTTPOk, {}, src_body)
|
||||
self.app.register(
|
||||
'PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999'),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal),
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'PUT', '/v1/a/c/o', swob.HTTPCreated, {}, 'passed')
|
||||
@@ -1585,7 +1594,8 @@ class ObjectVersioningTestCopy(ObjectVersioningBaseTestCase):
|
||||
'CONTENT_LENGTH': '100'},
|
||||
headers={'Destination': 'c/o'})
|
||||
|
||||
status, headers, body = self.call_ov(req)
|
||||
with mock_timestamp_now(ts_now):
|
||||
status, headers, body = self.call_ov(req)
|
||||
self.assertEqual(status, '201 Created')
|
||||
self.assertEqual(len(self.authorized), 3)
|
||||
|
||||
@@ -1593,13 +1603,13 @@ class ObjectVersioningTestCopy(ObjectVersioningBaseTestCase):
|
||||
('GET', '/v1/a/src_cont/src_obj'),
|
||||
('GET', '/v1/a/c/o?symlink=get'),
|
||||
('PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999')),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal)),
|
||||
('PUT', '/v1/a/c/o'),
|
||||
])
|
||||
|
||||
expected_headers = {
|
||||
TGT_OBJ_SYSMETA_SYMLINK_HDR:
|
||||
self.build_symlink_path('c', 'o', '9999998765.99999'),
|
||||
self.build_symlink_path('c', 'o', (~ts_now).internal),
|
||||
'x-object-sysmeta-symlink-target-etag': md5(
|
||||
src_body.encode('utf8'), usedforsecurity=False).hexdigest(),
|
||||
'x-object-sysmeta-symlink-target-bytes': str(len(src_body)),
|
||||
@@ -1608,9 +1618,8 @@ class ObjectVersioningTestCopy(ObjectVersioningBaseTestCase):
|
||||
for k, v in expected_headers.items():
|
||||
self.assertEqual(symlink_put_headers[k], v)
|
||||
|
||||
@mock.patch('swift.common.middleware.versioned_writes.object_versioning.'
|
||||
'time.time', return_value=1234)
|
||||
def test_COPY_overwrite_object(self, mock_time):
|
||||
def test_COPY_overwrite_object(self):
|
||||
ts_now = Timestamp.now()
|
||||
self.cache_version_on.set(get_cache_key('a', 'src_cont'),
|
||||
{'status': 200})
|
||||
src_body = 'stuff' * 100
|
||||
@@ -1625,7 +1634,7 @@ class ObjectVersioningTestCopy(ObjectVersioningBaseTestCase):
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999'),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal),
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'PUT', '/v1/a/c/o', swob.HTTPCreated, {}, 'passed')
|
||||
@@ -1636,7 +1645,8 @@ class ObjectVersioningTestCopy(ObjectVersioningBaseTestCase):
|
||||
'CONTENT_LENGTH': '100'},
|
||||
headers={'Destination': 'c/o'})
|
||||
|
||||
status, headers, body = self.call_ov(req)
|
||||
with mock_timestamp_now(ts_now):
|
||||
status, headers, body = self.call_ov(req)
|
||||
self.assertEqual(status, '201 Created')
|
||||
self.assertEqual(len(self.authorized), 3)
|
||||
|
||||
@@ -1646,13 +1656,13 @@ class ObjectVersioningTestCopy(ObjectVersioningBaseTestCase):
|
||||
('PUT',
|
||||
self.build_versions_path(obj='o', version='9999999939.99999')),
|
||||
('PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999')),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal)),
|
||||
('PUT', '/v1/a/c/o'),
|
||||
])
|
||||
|
||||
expected_headers = {
|
||||
TGT_OBJ_SYSMETA_SYMLINK_HDR:
|
||||
self.build_symlink_path('c', 'o', '9999998765.99999'),
|
||||
self.build_symlink_path('c', 'o', (~ts_now).internal),
|
||||
'x-object-sysmeta-symlink-target-etag': md5(
|
||||
src_body.encode('utf8'), usedforsecurity=False).hexdigest(),
|
||||
'x-object-sysmeta-symlink-target-bytes': str(len(src_body)),
|
||||
@@ -1661,9 +1671,8 @@ class ObjectVersioningTestCopy(ObjectVersioningBaseTestCase):
|
||||
for k, v in expected_headers.items():
|
||||
self.assertEqual(symlink_put_headers[k], v)
|
||||
|
||||
@mock.patch('swift.common.middleware.versioned_writes.object_versioning.'
|
||||
'time.time', return_value=1234)
|
||||
def test_COPY_overwrite_version_symlink(self, mock_time):
|
||||
def test_COPY_overwrite_version_symlink(self):
|
||||
ts_now = Timestamp.now()
|
||||
self.cache_version_on.set(get_cache_key('a', 'src_cont'),
|
||||
{'status': 200})
|
||||
src_body = 'stuff' * 100
|
||||
@@ -1674,7 +1683,7 @@ class ObjectVersioningTestCopy(ObjectVersioningBaseTestCase):
|
||||
TGT_OBJ_SYSMETA_SYMLINK_HDR: 'c-unique/whatever'}, '')
|
||||
self.app.register(
|
||||
'PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999'),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal),
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'PUT', '/v1/a/c/o', swob.HTTPCreated, {}, 'passed')
|
||||
@@ -1685,7 +1694,8 @@ class ObjectVersioningTestCopy(ObjectVersioningBaseTestCase):
|
||||
'CONTENT_LENGTH': '100'},
|
||||
headers={'Destination': 'c/o'})
|
||||
|
||||
status, headers, body = self.call_ov(req)
|
||||
with mock_timestamp_now(ts_now):
|
||||
status, headers, body = self.call_ov(req)
|
||||
self.assertEqual(status, '201 Created')
|
||||
self.assertEqual(len(self.authorized), 3)
|
||||
|
||||
@@ -1693,13 +1703,13 @@ class ObjectVersioningTestCopy(ObjectVersioningBaseTestCase):
|
||||
('GET', '/v1/a/src_cont/src_obj'),
|
||||
('GET', '/v1/a/c/o?symlink=get'),
|
||||
('PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999')),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal)),
|
||||
('PUT', '/v1/a/c/o'),
|
||||
])
|
||||
|
||||
expected_headers = {
|
||||
TGT_OBJ_SYSMETA_SYMLINK_HDR:
|
||||
self.build_symlink_path('c', 'o', '9999998765.99999'),
|
||||
self.build_symlink_path('c', 'o', (~ts_now).internal),
|
||||
'x-object-sysmeta-symlink-target-etag': md5(
|
||||
src_body.encode('utf8'), usedforsecurity=False).hexdigest(),
|
||||
'x-object-sysmeta-symlink-target-bytes': str(len(src_body)),
|
||||
@@ -1708,9 +1718,8 @@ class ObjectVersioningTestCopy(ObjectVersioningBaseTestCase):
|
||||
for k, v in expected_headers.items():
|
||||
self.assertEqual(symlink_put_headers[k], v)
|
||||
|
||||
@mock.patch('swift.common.middleware.versioned_writes.object_versioning.'
|
||||
'time.time', return_value=1234)
|
||||
def test_copy_new_version_different_account(self, mock_time):
|
||||
def test_copy_new_version_different_account(self):
|
||||
ts_now = Timestamp.now()
|
||||
self.cache_version_on.set(get_cache_key('src_acc'),
|
||||
{'status': 200})
|
||||
self.cache_version_on.set(get_cache_key('src_acc', 'src_cont'),
|
||||
@@ -1723,7 +1732,7 @@ class ObjectVersioningTestCopy(ObjectVersioningBaseTestCase):
|
||||
TGT_OBJ_SYSMETA_SYMLINK_HDR: 'c-unique/whatever'}, '')
|
||||
self.app.register(
|
||||
'PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999'),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal),
|
||||
swob.HTTPCreated, {}, 'passed')
|
||||
self.app.register(
|
||||
'PUT', '/v1/a/c/o', swob.HTTPCreated, {}, 'passed')
|
||||
@@ -1735,7 +1744,8 @@ class ObjectVersioningTestCopy(ObjectVersioningBaseTestCase):
|
||||
headers={'Destination': 'c/o',
|
||||
'Destination-Account': 'a'})
|
||||
|
||||
status, headers, body = self.call_ov(req)
|
||||
with mock_timestamp_now(ts_now):
|
||||
status, headers, body = self.call_ov(req)
|
||||
self.assertEqual(status, '201 Created')
|
||||
self.assertEqual(len(self.authorized), 3)
|
||||
|
||||
@@ -1743,13 +1753,13 @@ class ObjectVersioningTestCopy(ObjectVersioningBaseTestCase):
|
||||
('GET', '/v1/src_acc/src_cont/src_obj'),
|
||||
('GET', '/v1/a/c/o?symlink=get'),
|
||||
('PUT',
|
||||
self.build_versions_path(obj='o', version='9999998765.99999')),
|
||||
self.build_versions_path(obj='o', version=(~ts_now).internal)),
|
||||
('PUT', '/v1/a/c/o'),
|
||||
])
|
||||
|
||||
expected_headers = {
|
||||
TGT_OBJ_SYSMETA_SYMLINK_HDR:
|
||||
self.build_symlink_path('c', 'o', '9999998765.99999'),
|
||||
self.build_symlink_path('c', 'o', (~ts_now).internal),
|
||||
'x-object-sysmeta-symlink-target-etag': md5(
|
||||
src_body.encode('utf8'), usedforsecurity=False).hexdigest(),
|
||||
'x-object-sysmeta-symlink-target-bytes': str(len(src_body)),
|
||||
|
||||
Reference in New Issue
Block a user