From 2a04e87b564c5e6adca1a58066911dcb2538a4eb Mon Sep 17 00:00:00 2001 From: Kota Tsuyuzaki Date: Wed, 1 Apr 2015 19:08:51 -0700 Subject: [PATCH] Add mktime function to test.functional.utils email.utils.parsedate and time.mktime is really useful for standard timestamp translation because we don't have to make a handmade format translation logic. However, it tends to make a long formula because everytime we have to call both parsedate and mktime to translate from RFC2822 format. In addition, unfortunately S3 uses also different timestamp formats from RFC2822 in the response xml. To get an easy way for the translation work, this patch add the mktime function to translate from any format supported by S3 to a float in epoch time. TODO: Currently mktime in this patch doesn't support the format of list objects last-modified timestamp. We should do it on the later patch. Change-Id: I51888bc625773f7673fe01e7bdc6636cf3709901 --- swift3/test/functional/test_multi_upload.py | 16 +++++-------- swift3/test/functional/utils.py | 25 +++++++++++++++++++++ 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/swift3/test/functional/test_multi_upload.py b/swift3/test/functional/test_multi_upload.py index 6aed21ef..d9c9b409 100644 --- a/swift3/test/functional/test_multi_upload.py +++ b/swift3/test/functional/test_multi_upload.py @@ -16,11 +16,10 @@ import unittest from hashlib import md5 from itertools import izip -from email.utils import parsedate -from time import mktime, strptime from swift3.etree import fromstring, tostring, Element, SubElement from swift3.test.functional import Swift3FunctionalTestCase +from swift3.test.functional.utils import mktime MIN_SEGMENT_SIZE = 5242880 @@ -151,9 +150,7 @@ class TestSwift3MultiUpload(Swift3FunctionalTestCase): self.assertEquals(headers['content-type'], 'text/html; charset=UTF-8') self.assertTrue('content-length' in headers) self.assertEquals(headers['content-length'], '0') - # TODO: make a function like as mktime in swift3.test.function.utils - expected_parts_list = [(headers['etag'], - mktime(parsedate(headers['date'])))] + expected_parts_list = [(headers['etag'], mktime(headers['date']))] # Upload Part Copy key, upload_id = uploads[1] @@ -167,8 +164,7 @@ class TestSwift3MultiUpload(Swift3FunctionalTestCase): self.conn.make_request('PUT', src_bucket, src_obj, body=src_content) _, headers, _ = self.conn.make_request('HEAD', src_bucket, src_obj) self.assertCommonResponseHeaders(headers) - last_modified_date_from_header = mktime( - parsedate(headers['last-modified'])) + last_modified_date_from_header = mktime(headers['last-modified']) status, headers, body, resp_etag = \ self._upload_part_copy(src_bucket, src_obj, bucket, @@ -184,8 +180,7 @@ class TestSwift3MultiUpload(Swift3FunctionalTestCase): last_modified = elem.find('LastModified').text self.assertTrue(last_modified is not None) - last_modified_from_xml = mktime( - strptime(last_modified, '%Y-%m-%dT%H:%M:%S')) + last_modified_from_xml = mktime(last_modified) self.assertEquals(last_modified_date_from_header, last_modified_from_xml) @@ -228,8 +223,7 @@ class TestSwift3MultiUpload(Swift3FunctionalTestCase): # the last-modified header drops mili-seconds info # by the constraint of the format. # For now, we can do either the format check or round check - # last_modified_from_xml = mktime( - # strptime(last_modified, '%Y-%m-%dT%H:%M:%S')) + # last_modified_from_xml = mktime(last_modified) # self.assertEquals(expected_date, # last_modified_from_xml) self.assertEquals(expected_etag, p.find('ETag').text) diff --git a/swift3/test/functional/utils.py b/swift3/test/functional/utils.py index 6e4d99c4..93691e54 100644 --- a/swift3/test/functional/utils.py +++ b/swift3/test/functional/utils.py @@ -16,6 +16,9 @@ from hashlib import md5 from swift3.etree import fromstring +import time +from email.utils import parsedate + def get_error_code(body): elem = fromstring(body, 'Error') @@ -24,3 +27,25 @@ def get_error_code(body): def calculate_md5(body): return md5(body).digest().encode('base64').strip() + + +def mktime(timestamp_str): + """ + mktime creates a float instance in epoch time really like as time.mktime + + the difference from time.mktime is allowing to 2 formats string for the + argumtent for the S3 testing usage. + TODO: support + + :param timestamp_str: a string of timestamp formatted as + (a) RFC2822 (e.g. date header) + (b) %Y-%m-%dT%H:%M:%S (e.g. copy result) + :return : a float instance in epoch time + """ + try: + epoch_time = time.mktime(parsedate(timestamp_str)) + except TypeError: + epoch_time = time.mktime( + time.strptime(timestamp_str, '%Y-%m-%dT%H:%M:%S')) + + return epoch_time