refactor test for x-delete-at w/t part_num and x-open-expired
We shouldn't allow a test to assume a strict coupling of client/server time and the test needs to be modified so that the functional test-suite pass for us. Change-Id: Ia1d8d9085bad5c6df744a4551eef9dcf56e6e261
This commit is contained in:
@@ -466,13 +466,10 @@ class TestSlo(Base):
|
|||||||
|
|
||||||
# data for segments
|
# data for segments
|
||||||
segments = [b'one', b'two', b'three', b'four']
|
segments = [b'one', b'two', b'three', b'four']
|
||||||
etags = []
|
etags = [md5hex(segment) for segment in segments]
|
||||||
for segment in segments:
|
|
||||||
etags.append(md5hex(segment))
|
|
||||||
|
|
||||||
def put_manifest(url, token, parsed, conn, object_segments):
|
def put_manifest(url, token, parsed, conn, object_segments,
|
||||||
now = int(time.time())
|
x_delete_after):
|
||||||
delete_time = now + 2
|
|
||||||
manifest_data = []
|
manifest_data = []
|
||||||
start = 0
|
start = 0
|
||||||
|
|
||||||
@@ -494,7 +491,7 @@ class TestSlo(Base):
|
|||||||
body=json.dumps(manifest_data),
|
body=json.dumps(manifest_data),
|
||||||
headers={
|
headers={
|
||||||
'X-Auth-Token': token,
|
'X-Auth-Token': token,
|
||||||
'X-Delete-At': delete_time,
|
'X-Delete-After': str(x_delete_after),
|
||||||
'X-Static-Large-Object': 'true',
|
'X-Static-Large-Object': 'true',
|
||||||
'Content-Type': 'application/json'
|
'Content-Type': 'application/json'
|
||||||
}
|
}
|
||||||
@@ -523,7 +520,7 @@ class TestSlo(Base):
|
|||||||
"Response status is not 201: %s" % body)
|
"Response status is not 201: %s" % body)
|
||||||
|
|
||||||
retry(put_segments, segments)
|
retry(put_segments, segments)
|
||||||
retry(put_manifest, segments)
|
retry(put_manifest, segments, 1)
|
||||||
|
|
||||||
# get the manifest
|
# get the manifest
|
||||||
def get_manifest(url, token, parsed, conn, extra_headers=None):
|
def get_manifest(url, token, parsed, conn, extra_headers=None):
|
||||||
@@ -537,17 +534,36 @@ class TestSlo(Base):
|
|||||||
'', headers)
|
'', headers)
|
||||||
return check_response(conn)
|
return check_response(conn)
|
||||||
|
|
||||||
resp = retry(get_manifest)
|
def get_manifest_still_expired(timeout=10, retry_delay=1):
|
||||||
self.assertEqual(resp.status, 200)
|
start_time = time.time()
|
||||||
# wait for the manifest to expire
|
while time.time() - start_time < timeout:
|
||||||
# the objects will also have expired at the same time
|
resp = retry(get_manifest)
|
||||||
# since their x-delete-at times are the same
|
resp.read()
|
||||||
time.sleep(3)
|
if resp.status == 404:
|
||||||
|
break
|
||||||
|
elif 200 <= resp.status < 300:
|
||||||
|
time.sleep(retry_delay)
|
||||||
|
else:
|
||||||
|
self.fail(
|
||||||
|
f'Unexpected response status {resp.status} for'
|
||||||
|
f'manifest {resp.url}.')
|
||||||
|
else:
|
||||||
|
self.fail(
|
||||||
|
f'manifest still returns {resp.status} after '
|
||||||
|
f'we set x-delete-after to 2s post object '
|
||||||
|
f'creation')
|
||||||
|
|
||||||
resp = retry(get_manifest)
|
self.assertEqual(resp.status, 404,
|
||||||
resp.read()
|
resp.headers.get('x-trans-id'))
|
||||||
# check to see manifest has expired
|
|
||||||
self.assertEqual(resp.status, 404, resp.headers.get('x-trans-id'))
|
get_manifest_still_expired()
|
||||||
|
|
||||||
|
def get_manifest_with_open_expire():
|
||||||
|
resp = retry(get_manifest, extra_headers={'X-Open-Expired': True})
|
||||||
|
self.assertEqual(resp.status, 200)
|
||||||
|
resp.read()
|
||||||
|
|
||||||
|
get_manifest_with_open_expire()
|
||||||
|
|
||||||
def get_or_head_part(url, token, parsed, conn,
|
def get_or_head_part(url, token, parsed, conn,
|
||||||
extra_headers=None, method='GET',
|
extra_headers=None, method='GET',
|
||||||
@@ -567,37 +583,41 @@ class TestSlo(Base):
|
|||||||
# read the expired object with magic x-open-expired header
|
# read the expired object with magic x-open-expired header
|
||||||
self.assertEqual(resp.status, 200)
|
self.assertEqual(resp.status, 200)
|
||||||
|
|
||||||
for objnum in range(len(segments)):
|
def check_parts_with_open_expire(method='GET'):
|
||||||
part_num = str(objnum + 1)
|
for objnum in range(len(segments)):
|
||||||
resp = retry(get_or_head_part,
|
part_num = str(objnum + 1)
|
||||||
extra_headers={'X-Open-Expired': True},
|
resp = retry(get_or_head_part,
|
||||||
part_number=part_num,)
|
extra_headers={'X-Open-Expired': True},
|
||||||
resp.read()
|
method=method, part_number=part_num)
|
||||||
self.assertEqual(resp.status, 206)
|
resp.read()
|
||||||
|
self.assertEqual(resp.status, 206)
|
||||||
|
|
||||||
for objnum in range(len(segments)):
|
check_parts_with_open_expire()
|
||||||
part_num = str(objnum + 1)
|
check_parts_with_open_expire('HEAD')
|
||||||
resp = retry(get_or_head_part,
|
|
||||||
extra_headers={'X-Open-Expired': True},
|
|
||||||
method='HEAD', part_number=part_num)
|
|
||||||
resp.read()
|
|
||||||
self.assertEqual(resp.status, 206)
|
|
||||||
|
|
||||||
# no x-open-expired case and it should 404
|
def check_part_still_expired(method='GET', timeout=10, retry_delay=1):
|
||||||
for objnum in range(len(segments)):
|
for objnum, segment in enumerate(segments):
|
||||||
part_num = str(objnum + 1)
|
part_num = str(objnum + 1)
|
||||||
resp = retry(get_or_head_part,
|
start_time = time.time()
|
||||||
method='HEAD', part_number=part_num)
|
while time.time() - start_time < timeout:
|
||||||
resp.read()
|
resp = retry(get_or_head_part, method=method,
|
||||||
self.assertEqual(resp.status, 404)
|
part_number=part_num)
|
||||||
|
resp.read()
|
||||||
|
if resp.status == 404:
|
||||||
|
break
|
||||||
|
elif 200 <= resp.status < 300:
|
||||||
|
time.sleep(retry_delay)
|
||||||
|
else:
|
||||||
|
self.fail(
|
||||||
|
f'Unexpected response status {resp.status} for'
|
||||||
|
f' part {part_num}.')
|
||||||
|
else:
|
||||||
|
self.fail(
|
||||||
|
f'Part {part_num} did not return 404 within {timeout}'
|
||||||
|
f' seconds.')
|
||||||
|
|
||||||
# same situation here
|
check_part_still_expired()
|
||||||
for objnum in range(len(segments)):
|
check_part_still_expired('HEAD', 5, 1)
|
||||||
part_num = str(objnum + 1)
|
|
||||||
resp = retry(get_or_head_part,
|
|
||||||
method='GET', part_number=part_num)
|
|
||||||
resp.read()
|
|
||||||
self.assertEqual(resp.status, 404)
|
|
||||||
|
|
||||||
def head_manifest(url, token, parsed, conn, extra_headers=None):
|
def head_manifest(url, token, parsed, conn, extra_headers=None):
|
||||||
headers = {'X-Auth-Token': token}
|
headers = {'X-Auth-Token': token}
|
||||||
|
|||||||
Reference in New Issue
Block a user