Miscellaneous (mostly test) cleanup
* Always use testtools.TestCase, since we're relying on testtools * Always use mock (as opposed to unittest.mock) since we're relying on mock * Add note about when a missing logging handler was added * Stop %-formatting the giant usage string that doesn't actually need any formatting * Prefer assertIs, assertIn, assertIsInstance over assertTrue * Use else-self.fail instead of sentinel values * Check resp.get('error') is None before checking resp['success'] is True, so test failures actually tell you something useful * Tighten some isinstance assertions * Import MockHttpTest from correct location * Only populate clean_os_environ once * Use setUp for setup, not __init__ * Replace assertIn(key, dict) and assertEqual(foo, dict[key]) with assertEqual(foo, dict.get(key)) when key is a literal and foo is not None * Use mock.patch.object instead of manually patching for tests * Use six.binary_type instead of type(''.encode('utf-8')) * Stop shadowing builtin bytes * Reclaim some margin * Stop checking the return-type of encode_utf8; we already know it's bytes Change-Id: I2138ea553378ce88810b7353147c8645a8f8c90e
This commit is contained in:
@@ -46,6 +46,7 @@ USER_METADATA_TYPE = tuple('x-%s-meta-' % type_ for type_ in
|
|||||||
try:
|
try:
|
||||||
from logging import NullHandler
|
from logging import NullHandler
|
||||||
except ImportError:
|
except ImportError:
|
||||||
|
# Added in Python 2.7
|
||||||
class NullHandler(logging.Handler):
|
class NullHandler(logging.Handler):
|
||||||
def handle(self, record):
|
def handle(self, record):
|
||||||
pass
|
pass
|
||||||
@@ -110,11 +111,7 @@ def quote(value, safe='/'):
|
|||||||
"""
|
"""
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
return _quote(value, safe=safe)
|
return _quote(value, safe=safe)
|
||||||
value = encode_utf8(value)
|
return _quote(encode_utf8(value), safe)
|
||||||
if isinstance(value, bytes):
|
|
||||||
return _quote(value, safe)
|
|
||||||
else:
|
|
||||||
return value
|
|
||||||
|
|
||||||
|
|
||||||
def encode_utf8(value):
|
def encode_utf8(value):
|
||||||
|
@@ -51,7 +51,7 @@ def immediate_exit(signum, frame):
|
|||||||
stderr.write(" Aborted\n")
|
stderr.write(" Aborted\n")
|
||||||
os_exit(2)
|
os_exit(2)
|
||||||
|
|
||||||
st_delete_options = '''[-all] [--leave-segments]
|
st_delete_options = '''[--all] [--leave-segments]
|
||||||
[--object-threads <threads>]
|
[--object-threads <threads>]
|
||||||
[--container-threads <threads>]
|
[--container-threads <threads>]
|
||||||
<container> [object]
|
<container> [object]
|
||||||
@@ -1151,7 +1151,7 @@ def main(arguments=None):
|
|||||||
version = client_version
|
version = client_version
|
||||||
parser = OptionParser(version='python-swiftclient %s' % version,
|
parser = OptionParser(version='python-swiftclient %s' % version,
|
||||||
usage='''
|
usage='''
|
||||||
usage: %%prog [--version] [--help] [--os-help] [--snet] [--verbose]
|
usage: %prog [--version] [--help] [--os-help] [--snet] [--verbose]
|
||||||
[--debug] [--info] [--quiet] [--auth <auth_url>]
|
[--debug] [--info] [--quiet] [--auth <auth_url>]
|
||||||
[--auth-version <auth_version>] [--user <username>]
|
[--auth-version <auth_version>] [--user <username>]
|
||||||
[--key <api_key>] [--retries <num_retries>]
|
[--key <api_key>] [--retries <num_retries>]
|
||||||
@@ -1191,29 +1191,29 @@ Positional arguments:
|
|||||||
auth Display auth related environment variables.
|
auth Display auth related environment variables.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
%%prog download --help
|
%prog download --help
|
||||||
|
|
||||||
%%prog -A https://auth.api.rackspacecloud.com/v1.0 -U user -K api_key stat -v
|
%prog -A https://auth.api.rackspacecloud.com/v1.0 -U user -K api_key stat -v
|
||||||
|
|
||||||
%%prog --os-auth-url https://api.example.com/v2.0 --os-tenant-name tenant \\
|
%prog --os-auth-url https://api.example.com/v2.0 --os-tenant-name tenant \\
|
||||||
--os-username user --os-password password list
|
--os-username user --os-password password list
|
||||||
|
|
||||||
%%prog --os-auth-url https://api.example.com/v3 --auth-version 3\\
|
%prog --os-auth-url https://api.example.com/v3 --auth-version 3\\
|
||||||
--os-project-name project1 --os-project-domain-name domain1 \\
|
--os-project-name project1 --os-project-domain-name domain1 \\
|
||||||
--os-username user --os-user-domain-name domain1 \\
|
--os-username user --os-user-domain-name domain1 \\
|
||||||
--os-password password list
|
--os-password password list
|
||||||
|
|
||||||
%%prog --os-auth-url https://api.example.com/v3 --auth-version 3\\
|
%prog --os-auth-url https://api.example.com/v3 --auth-version 3\\
|
||||||
--os-project-id 0123456789abcdef0123456789abcdef \\
|
--os-project-id 0123456789abcdef0123456789abcdef \\
|
||||||
--os-user-id abcdef0123456789abcdef0123456789 \\
|
--os-user-id abcdef0123456789abcdef0123456789 \\
|
||||||
--os-password password list
|
--os-password password list
|
||||||
|
|
||||||
%%prog --os-auth-token 6ee5eb33efad4e45ab46806eac010566 \\
|
%prog --os-auth-token 6ee5eb33efad4e45ab46806eac010566 \\
|
||||||
--os-storage-url https://10.1.5.2:8080/v1/AUTH_ced809b6a4baea7aeab61a \\
|
--os-storage-url https://10.1.5.2:8080/v1/AUTH_ced809b6a4baea7aeab61a \\
|
||||||
list
|
list
|
||||||
|
|
||||||
%%prog list --lh
|
%prog list --lh
|
||||||
'''.strip('\n') % globals())
|
'''.strip('\n'))
|
||||||
parser.add_option('--os-help', action='store_true', dest='os_help',
|
parser.add_option('--os-help', action='store_true', dest='os_help',
|
||||||
help='Show OpenStack authentication options.')
|
help='Show OpenStack authentication options.')
|
||||||
parser.add_option('--os_help', action='store_true', help=SUPPRESS_HELP)
|
parser.add_option('--os_help', action='store_true', help=SUPPRESS_HELP)
|
||||||
|
@@ -35,34 +35,30 @@ def config_true_value(value):
|
|||||||
(isinstance(value, six.string_types) and value.lower() in TRUE_VALUES)
|
(isinstance(value, six.string_types) and value.lower() in TRUE_VALUES)
|
||||||
|
|
||||||
|
|
||||||
def prt_bytes(bytes, human_flag):
|
def prt_bytes(num_bytes, human_flag):
|
||||||
"""
|
"""
|
||||||
convert a number > 1024 to printable format, either in 4 char -h format as
|
convert a number > 1024 to printable format, either in 4 char -h format as
|
||||||
with ls -lh or return as 12 char right justified string
|
with ls -lh or return as 12 char right justified string
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if human_flag:
|
if not human_flag:
|
||||||
suffix = ''
|
return '%12s' % num_bytes
|
||||||
mods = list('KMGTPEZY')
|
|
||||||
temp = float(bytes)
|
|
||||||
if temp > 0:
|
|
||||||
while temp > 1023:
|
|
||||||
try:
|
|
||||||
suffix = mods.pop(0)
|
|
||||||
except IndexError:
|
|
||||||
break
|
|
||||||
temp /= 1024.0
|
|
||||||
if suffix != '':
|
|
||||||
if temp >= 10:
|
|
||||||
bytes = '%3d%s' % (temp, suffix)
|
|
||||||
else:
|
|
||||||
bytes = '%.1f%s' % (temp, suffix)
|
|
||||||
if suffix == '': # must be < 1024
|
|
||||||
bytes = '%4s' % bytes
|
|
||||||
else:
|
|
||||||
bytes = '%12s' % bytes
|
|
||||||
|
|
||||||
return bytes
|
num = float(num_bytes)
|
||||||
|
suffixes = [None] + list('KMGTPEZY')
|
||||||
|
for suffix in suffixes[:-1]:
|
||||||
|
if num <= 1023:
|
||||||
|
break
|
||||||
|
num /= 1024.0
|
||||||
|
else:
|
||||||
|
suffix = suffixes[-1]
|
||||||
|
|
||||||
|
if not suffix: # num_bytes must be < 1024
|
||||||
|
return '%4s' % num_bytes
|
||||||
|
elif num >= 10:
|
||||||
|
return '%3d%s' % (num, suffix)
|
||||||
|
else:
|
||||||
|
return '%.1f%s' % (num, suffix)
|
||||||
|
|
||||||
|
|
||||||
def generate_temp_url(path, seconds, key, method, absolute=False):
|
def generate_temp_url(path, seconds, key, method, absolute=False):
|
||||||
|
@@ -13,11 +13,7 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
try:
|
import mock
|
||||||
from unittest import mock
|
|
||||||
except ImportError:
|
|
||||||
import mock
|
|
||||||
|
|
||||||
from six import StringIO
|
from six import StringIO
|
||||||
import testtools
|
import testtools
|
||||||
|
|
||||||
|
@@ -82,14 +82,13 @@ class TestConnectionThreadPoolExecutor(ThreadTestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Now a job that fails
|
# Now a job that fails
|
||||||
went_boom = False
|
|
||||||
try:
|
try:
|
||||||
f = pool.submit(self._func, "go boom")
|
f = pool.submit(self._func, "go boom")
|
||||||
f.result()
|
f.result()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
went_boom = True
|
|
||||||
self.assertEqual('I went boom!', str(e))
|
self.assertEqual('I went boom!', str(e))
|
||||||
self.assertTrue(went_boom)
|
else:
|
||||||
|
self.fail('I never went boom!')
|
||||||
|
|
||||||
# Has the connection been returned to the pool?
|
# Has the connection been returned to the pool?
|
||||||
f = pool.submit(self._func, "succeed")
|
f = pool.submit(self._func, "succeed")
|
||||||
@@ -106,24 +105,22 @@ class TestConnectionThreadPoolExecutor(ThreadTestCase):
|
|||||||
ctpe = mt.ConnectionThreadPoolExecutor(self._create_conn_fail, 1)
|
ctpe = mt.ConnectionThreadPoolExecutor(self._create_conn_fail, 1)
|
||||||
with ctpe as pool:
|
with ctpe as pool:
|
||||||
# Now a connection that fails
|
# Now a connection that fails
|
||||||
connection_failed = False
|
|
||||||
try:
|
try:
|
||||||
f = pool.submit(self._func, "succeed")
|
f = pool.submit(self._func, "succeed")
|
||||||
f.result()
|
f.result()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
connection_failed = True
|
|
||||||
self.assertEqual('This is a failed connection', str(e))
|
self.assertEqual('This is a failed connection', str(e))
|
||||||
self.assertTrue(connection_failed)
|
else:
|
||||||
|
self.fail('The connection did not fail')
|
||||||
|
|
||||||
# Make sure we don't lock up on failed connections
|
# Make sure we don't lock up on failed connections
|
||||||
connection_failed = False
|
|
||||||
try:
|
try:
|
||||||
f = pool.submit(self._func, "go boom")
|
f = pool.submit(self._func, "go boom")
|
||||||
f.result()
|
f.result()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
connection_failed = True
|
|
||||||
self.assertEqual('This is a failed connection', str(e))
|
self.assertEqual('This is a failed connection', str(e))
|
||||||
self.assertTrue(connection_failed)
|
else:
|
||||||
|
self.fail('The connection did not fail')
|
||||||
|
|
||||||
def test_lazy_connections(self):
|
def test_lazy_connections(self):
|
||||||
ctpe = mt.ConnectionThreadPoolExecutor(self._create_conn, 10)
|
ctpe = mt.ConnectionThreadPoolExecutor(self._create_conn, 10)
|
||||||
|
@@ -83,7 +83,7 @@ class TestSwiftReader(testtools.TestCase):
|
|||||||
self.assertEqual(sr._expected_etag, None)
|
self.assertEqual(sr._expected_etag, None)
|
||||||
|
|
||||||
self.assertNotEqual(sr._actual_md5, None)
|
self.assertNotEqual(sr._actual_md5, None)
|
||||||
self.assertTrue(isinstance(sr._actual_md5, self.md5_type))
|
self.assertIs(type(sr._actual_md5), self.md5_type)
|
||||||
|
|
||||||
def test_create_with_large_object_headers(self):
|
def test_create_with_large_object_headers(self):
|
||||||
# md5 should not be initialized if large object headers are present
|
# md5 should not be initialized if large object headers are present
|
||||||
@@ -110,7 +110,7 @@ class TestSwiftReader(testtools.TestCase):
|
|||||||
self.assertEqual(sr._expected_etag, None)
|
self.assertEqual(sr._expected_etag, None)
|
||||||
|
|
||||||
self.assertNotEqual(sr._actual_md5, None)
|
self.assertNotEqual(sr._actual_md5, None)
|
||||||
self.assertTrue(isinstance(sr._actual_md5, self.md5_type))
|
self.assertIs(type(sr._actual_md5), self.md5_type)
|
||||||
|
|
||||||
# Check Contentlength raises error if it isnt an integer
|
# Check Contentlength raises error if it isnt an integer
|
||||||
self.assertRaises(SwiftError, self.sr, 'path', 'body',
|
self.assertRaises(SwiftError, self.sr, 'path', 'body',
|
||||||
@@ -160,10 +160,10 @@ class _TestServiceBase(testtools.TestCase):
|
|||||||
if hasattr(self, 'assertDictEqual'):
|
if hasattr(self, 'assertDictEqual'):
|
||||||
self.assertDictEqual(a, b, m)
|
self.assertDictEqual(a, b, m)
|
||||||
else:
|
else:
|
||||||
self.assertTrue(isinstance(a, dict),
|
self.assertIsInstance(a, dict,
|
||||||
'First argument is not a dictionary')
|
'First argument is not a dictionary')
|
||||||
self.assertTrue(isinstance(b, dict),
|
self.assertIsInstance(b, dict,
|
||||||
'Second argument is not a dictionary')
|
'Second argument is not a dictionary')
|
||||||
self.assertEqual(len(a), len(b), m)
|
self.assertEqual(len(a), len(b), m)
|
||||||
for k, v in a.items():
|
for k, v in a.items():
|
||||||
self.assertIn(k, b, m)
|
self.assertIn(k, b, m)
|
||||||
@@ -248,7 +248,7 @@ class TestServiceDelete(_TestServiceBase):
|
|||||||
self._assertDictEqual(expected_r, self._get_queue(mock_q))
|
self._assertDictEqual(expected_r, self._get_queue(mock_q))
|
||||||
self.assertGreaterEqual(r['error_timestamp'], before)
|
self.assertGreaterEqual(r['error_timestamp'], before)
|
||||||
self.assertLessEqual(r['error_timestamp'], after)
|
self.assertLessEqual(r['error_timestamp'], after)
|
||||||
self.assertTrue('Traceback' in r['traceback'])
|
self.assertIn('Traceback', r['traceback'])
|
||||||
|
|
||||||
def test_delete_object(self):
|
def test_delete_object(self):
|
||||||
mock_q = Queue()
|
mock_q = Queue()
|
||||||
@@ -295,7 +295,7 @@ class TestServiceDelete(_TestServiceBase):
|
|||||||
self._assertDictEqual(expected_r, r)
|
self._assertDictEqual(expected_r, r)
|
||||||
self.assertGreaterEqual(r['error_timestamp'], before)
|
self.assertGreaterEqual(r['error_timestamp'], before)
|
||||||
self.assertLessEqual(r['error_timestamp'], after)
|
self.assertLessEqual(r['error_timestamp'], after)
|
||||||
self.assertTrue('Traceback' in r['traceback'])
|
self.assertIn('Traceback', r['traceback'])
|
||||||
|
|
||||||
def test_delete_object_slo_support(self):
|
def test_delete_object_slo_support(self):
|
||||||
# If SLO headers are present the delete call should include an
|
# If SLO headers are present the delete call should include an
|
||||||
@@ -395,14 +395,14 @@ class TestServiceDelete(_TestServiceBase):
|
|||||||
self._assertDictEqual(expected_r, r)
|
self._assertDictEqual(expected_r, r)
|
||||||
self.assertGreaterEqual(r['error_timestamp'], before)
|
self.assertGreaterEqual(r['error_timestamp'], before)
|
||||||
self.assertLessEqual(r['error_timestamp'], after)
|
self.assertLessEqual(r['error_timestamp'], after)
|
||||||
self.assertTrue('Traceback' in r['traceback'])
|
self.assertIn('Traceback', r['traceback'])
|
||||||
|
|
||||||
|
|
||||||
class TestSwiftError(testtools.TestCase):
|
class TestSwiftError(testtools.TestCase):
|
||||||
|
|
||||||
def test_is_exception(self):
|
def test_is_exception(self):
|
||||||
se = SwiftError(5)
|
se = SwiftError(5)
|
||||||
self.assertTrue(isinstance(se, Exception))
|
self.assertIsInstance(se, Exception)
|
||||||
|
|
||||||
def test_empty_swifterror_creation(self):
|
def test_empty_swifterror_creation(self):
|
||||||
se = SwiftError(5)
|
se = SwiftError(5)
|
||||||
@@ -444,7 +444,7 @@ class TestServiceUtils(testtools.TestCase):
|
|||||||
|
|
||||||
swiftclient.service.process_options(opt_c)
|
swiftclient.service.process_options(opt_c)
|
||||||
|
|
||||||
self.assertTrue('os_options' in opt_c)
|
self.assertIn('os_options', opt_c)
|
||||||
del opt_c['os_options']
|
del opt_c['os_options']
|
||||||
self.assertEqual(opt_c['auth_version'], '2.0')
|
self.assertEqual(opt_c['auth_version'], '2.0')
|
||||||
opt_c['auth_version'] = '1.0'
|
opt_c['auth_version'] = '1.0'
|
||||||
@@ -838,7 +838,8 @@ class TestService(testtools.TestCase):
|
|||||||
'c', [SwiftUploadObject(obj['path'])])
|
'c', [SwiftUploadObject(obj['path'])])
|
||||||
responses = [x for x in resp_iter]
|
responses = [x for x in resp_iter]
|
||||||
for resp in responses:
|
for resp in responses:
|
||||||
self.assertTrue(resp['success'])
|
self.assertIsNone(resp.get('error'))
|
||||||
|
self.assertIs(True, resp['success'])
|
||||||
self.assertEqual(2, len(responses))
|
self.assertEqual(2, len(responses))
|
||||||
create_container_resp, upload_obj_resp = responses
|
create_container_resp, upload_obj_resp = responses
|
||||||
self.assertEqual(create_container_resp['action'],
|
self.assertEqual(create_container_resp['action'],
|
||||||
@@ -934,7 +935,7 @@ class TestServiceUpload(_TestServiceBase):
|
|||||||
options={'segment_container': None,
|
options={'segment_container': None,
|
||||||
'checksum': False})
|
'checksum': False})
|
||||||
|
|
||||||
self.assertNotIn('error', r)
|
self.assertIsNone(r.get('error'))
|
||||||
self.assertEqual(mock_conn.put_object.call_count, 1)
|
self.assertEqual(mock_conn.put_object.call_count, 1)
|
||||||
mock_conn.put_object.assert_called_with('test_c_segments',
|
mock_conn.put_object.assert_called_with('test_c_segments',
|
||||||
'test_s_1',
|
'test_s_1',
|
||||||
@@ -973,8 +974,7 @@ class TestServiceUpload(_TestServiceBase):
|
|||||||
options={'segment_container': None,
|
options={'segment_container': None,
|
||||||
'checksum': True})
|
'checksum': True})
|
||||||
|
|
||||||
self.assertIn('error', r)
|
self.assertIn('md5 mismatch', str(r.get('error')))
|
||||||
self.assertIn('md5 mismatch', str(r['error']))
|
|
||||||
|
|
||||||
self.assertEqual(mock_conn.put_object.call_count, 1)
|
self.assertEqual(mock_conn.put_object.call_count, 1)
|
||||||
mock_conn.put_object.assert_called_with('test_c_segments',
|
mock_conn.put_object.assert_called_with('test_c_segments',
|
||||||
@@ -1128,9 +1128,8 @@ class TestServiceUpload(_TestServiceBase):
|
|||||||
'segment_size': 0,
|
'segment_size': 0,
|
||||||
'checksum': True})
|
'checksum': True})
|
||||||
|
|
||||||
self.assertEqual(r['success'], False)
|
self.assertIs(r['success'], False)
|
||||||
self.assertIn('error', r)
|
self.assertIn('md5 mismatch', str(r.get('error')))
|
||||||
self.assertIn('md5 mismatch', str(r['error']))
|
|
||||||
|
|
||||||
self.assertEqual(mock_conn.put_object.call_count, 1)
|
self.assertEqual(mock_conn.put_object.call_count, 1)
|
||||||
expected_headers = {'x-object-meta-mtime': mock.ANY}
|
expected_headers = {'x-object-meta-mtime': mock.ANY}
|
||||||
@@ -1165,9 +1164,9 @@ class TestServiceUpload(_TestServiceBase):
|
|||||||
'header': '',
|
'header': '',
|
||||||
'segment_size': 0})
|
'segment_size': 0})
|
||||||
|
|
||||||
self.assertTrue(r['success'])
|
self.assertIsNone(r.get('error'))
|
||||||
self.assertIn('status', r)
|
self.assertIs(True, r['success'])
|
||||||
self.assertEqual(r['status'], 'skipped-identical')
|
self.assertEqual(r.get('status'), 'skipped-identical')
|
||||||
self.assertEqual(mock_conn.put_object.call_count, 0)
|
self.assertEqual(mock_conn.put_object.call_count, 0)
|
||||||
self.assertEqual(mock_conn.head_object.call_count, 1)
|
self.assertEqual(mock_conn.head_object.call_count, 1)
|
||||||
mock_conn.head_object.assert_called_with('test_c', 'test_o')
|
mock_conn.head_object.assert_called_with('test_c', 'test_o')
|
||||||
@@ -1208,7 +1207,7 @@ class TestServiceUpload(_TestServiceBase):
|
|||||||
'segment_size': 10})
|
'segment_size': 10})
|
||||||
|
|
||||||
self.assertIsNone(r.get('error'))
|
self.assertIsNone(r.get('error'))
|
||||||
self.assertTrue(r['success'])
|
self.assertIs(True, r['success'])
|
||||||
self.assertEqual('skipped-identical', r.get('status'))
|
self.assertEqual('skipped-identical', r.get('status'))
|
||||||
self.assertEqual(0, mock_conn.put_object.call_count)
|
self.assertEqual(0, mock_conn.put_object.call_count)
|
||||||
self.assertEqual([mock.call('test_c', 'test_o')],
|
self.assertEqual([mock.call('test_c', 'test_o')],
|
||||||
@@ -1255,7 +1254,7 @@ class TestServiceUpload(_TestServiceBase):
|
|||||||
'segment_size': 10})
|
'segment_size': 10})
|
||||||
|
|
||||||
self.assertIsNone(r.get('error'))
|
self.assertIsNone(r.get('error'))
|
||||||
self.assertTrue(r['success'])
|
self.assertIs(True, r['success'])
|
||||||
self.assertEqual('skipped-identical', r.get('status'))
|
self.assertEqual('skipped-identical', r.get('status'))
|
||||||
self.assertEqual(0, mock_conn.put_object.call_count)
|
self.assertEqual(0, mock_conn.put_object.call_count)
|
||||||
self.assertEqual(1, mock_conn.head_object.call_count)
|
self.assertEqual(1, mock_conn.head_object.call_count)
|
||||||
@@ -1498,7 +1497,8 @@ class TestServiceDownload(_TestServiceBase):
|
|||||||
'test',
|
'test',
|
||||||
self.opts)
|
self.opts)
|
||||||
|
|
||||||
self.assertTrue(resp['success'])
|
self.assertIsNone(resp.get('error'))
|
||||||
|
self.assertIs(True, resp['success'])
|
||||||
self.assertEqual(resp['action'], 'download_object')
|
self.assertEqual(resp['action'], 'download_object')
|
||||||
self.assertEqual(resp['object'], 'test')
|
self.assertEqual(resp['object'], 'test')
|
||||||
self.assertEqual(resp['path'], 'test')
|
self.assertEqual(resp['path'], 'test')
|
||||||
@@ -1517,7 +1517,8 @@ class TestServiceDownload(_TestServiceBase):
|
|||||||
'example/test',
|
'example/test',
|
||||||
options)
|
options)
|
||||||
|
|
||||||
self.assertTrue(resp['success'])
|
self.assertIsNone(resp.get('error'))
|
||||||
|
self.assertIs(True, resp['success'])
|
||||||
self.assertEqual(resp['action'], 'download_object')
|
self.assertEqual(resp['action'], 'download_object')
|
||||||
self.assertEqual(resp['object'], 'example/test')
|
self.assertEqual(resp['object'], 'example/test')
|
||||||
self.assertEqual(resp['path'], 'temp_dir/example/test')
|
self.assertEqual(resp['path'], 'temp_dir/example/test')
|
||||||
@@ -1537,7 +1538,8 @@ class TestServiceDownload(_TestServiceBase):
|
|||||||
'example/test',
|
'example/test',
|
||||||
options)
|
options)
|
||||||
|
|
||||||
self.assertTrue(resp['success'])
|
self.assertIsNone(resp.get('error'))
|
||||||
|
self.assertIs(True, resp['success'])
|
||||||
self.assertEqual(resp['action'], 'download_object')
|
self.assertEqual(resp['action'], 'download_object')
|
||||||
self.assertEqual(resp['object'], 'example/test')
|
self.assertEqual(resp['object'], 'example/test')
|
||||||
self.assertEqual(resp['path'], 'test')
|
self.assertEqual(resp['path'], 'test')
|
||||||
@@ -1557,7 +1559,8 @@ class TestServiceDownload(_TestServiceBase):
|
|||||||
'example/test',
|
'example/test',
|
||||||
options)
|
options)
|
||||||
|
|
||||||
self.assertTrue(resp['success'])
|
self.assertIsNone(resp.get('error'))
|
||||||
|
self.assertIs(True, resp['success'])
|
||||||
self.assertEqual(resp['action'], 'download_object')
|
self.assertEqual(resp['action'], 'download_object')
|
||||||
self.assertEqual(resp['object'], 'example/test')
|
self.assertEqual(resp['object'], 'example/test')
|
||||||
self.assertEqual(resp['path'], 'test')
|
self.assertEqual(resp['path'], 'test')
|
||||||
@@ -1578,7 +1581,8 @@ class TestServiceDownload(_TestServiceBase):
|
|||||||
'example/test',
|
'example/test',
|
||||||
options)
|
options)
|
||||||
|
|
||||||
self.assertTrue(resp['success'])
|
self.assertIsNone(resp.get('error'))
|
||||||
|
self.assertIs(True, resp['success'])
|
||||||
self.assertEqual(resp['action'], 'download_object')
|
self.assertEqual(resp['action'], 'download_object')
|
||||||
self.assertEqual(resp['object'], 'example/test')
|
self.assertEqual(resp['object'], 'example/test')
|
||||||
self.assertEqual(resp['path'], 'new/dir/test')
|
self.assertEqual(resp['path'], 'new/dir/test')
|
||||||
|
@@ -19,7 +19,7 @@ import hashlib
|
|||||||
import mock
|
import mock
|
||||||
import os
|
import os
|
||||||
import tempfile
|
import tempfile
|
||||||
import unittest
|
import testtools
|
||||||
import textwrap
|
import textwrap
|
||||||
from testtools import ExpectedException
|
from testtools import ExpectedException
|
||||||
|
|
||||||
@@ -32,10 +32,9 @@ import swiftclient.shell
|
|||||||
import swiftclient.utils
|
import swiftclient.utils
|
||||||
|
|
||||||
from os.path import basename, dirname
|
from os.path import basename, dirname
|
||||||
from tests.unit.test_swiftclient import MockHttpTest
|
from .utils import (
|
||||||
from tests.unit.utils import (
|
|
||||||
CaptureOutput, fake_get_auth_keystone, _make_fake_import_keystone_client,
|
CaptureOutput, fake_get_auth_keystone, _make_fake_import_keystone_client,
|
||||||
FakeKeystone, StubResponse)
|
FakeKeystone, StubResponse, MockHttpTest)
|
||||||
from swiftclient.utils import EMPTY_ETAG
|
from swiftclient.utils import EMPTY_ETAG
|
||||||
|
|
||||||
|
|
||||||
@@ -55,12 +54,6 @@ for key in os.environ:
|
|||||||
if any(key.startswith(m) for m in environ_prefixes):
|
if any(key.startswith(m) for m in environ_prefixes):
|
||||||
clean_os_environ[key] = ''
|
clean_os_environ[key] = ''
|
||||||
|
|
||||||
clean_os_environ = {}
|
|
||||||
environ_prefixes = ('ST_', 'OS_')
|
|
||||||
for key in os.environ:
|
|
||||||
if any(key.startswith(m) for m in environ_prefixes):
|
|
||||||
clean_os_environ[key] = ''
|
|
||||||
|
|
||||||
|
|
||||||
def _make_args(cmd, opts, os_opts, separator='-', flags=None, cmd_args=None):
|
def _make_args(cmd, opts, os_opts, separator='-', flags=None, cmd_args=None):
|
||||||
"""
|
"""
|
||||||
@@ -112,9 +105,9 @@ def _make_cmd(cmd, opts, os_opts, use_env=False, flags=None, cmd_args=None):
|
|||||||
|
|
||||||
|
|
||||||
@mock.patch.dict(os.environ, mocked_os_environ)
|
@mock.patch.dict(os.environ, mocked_os_environ)
|
||||||
class TestShell(unittest.TestCase):
|
class TestShell(testtools.TestCase):
|
||||||
def __init__(self, *args, **kwargs):
|
def setUp(self):
|
||||||
super(TestShell, self).__init__(*args, **kwargs)
|
super(TestShell, self).setUp()
|
||||||
tmpfile = tempfile.NamedTemporaryFile(delete=False)
|
tmpfile = tempfile.NamedTemporaryFile(delete=False)
|
||||||
self.tmpfile = tmpfile.name
|
self.tmpfile = tmpfile.name
|
||||||
|
|
||||||
@@ -123,6 +116,7 @@ class TestShell(unittest.TestCase):
|
|||||||
os.remove(self.tmpfile)
|
os.remove(self.tmpfile)
|
||||||
except OSError:
|
except OSError:
|
||||||
pass
|
pass
|
||||||
|
super(TestShell, self).tearDown()
|
||||||
|
|
||||||
@mock.patch('swiftclient.service.Connection')
|
@mock.patch('swiftclient.service.Connection')
|
||||||
def test_stat_account(self, connection):
|
def test_stat_account(self, connection):
|
||||||
@@ -1024,12 +1018,12 @@ class TestShell(unittest.TestCase):
|
|||||||
output.clear()
|
output.clear()
|
||||||
|
|
||||||
|
|
||||||
class TestSubcommandHelp(unittest.TestCase):
|
class TestSubcommandHelp(testtools.TestCase):
|
||||||
|
|
||||||
def test_subcommand_help(self):
|
def test_subcommand_help(self):
|
||||||
for command in swiftclient.shell.commands:
|
for command in swiftclient.shell.commands:
|
||||||
help_var = 'st_%s_help' % command
|
help_var = 'st_%s_help' % command
|
||||||
self.assertTrue(help_var in vars(swiftclient.shell))
|
self.assertTrue(hasattr(swiftclient.shell, help_var))
|
||||||
with CaptureOutput() as out:
|
with CaptureOutput() as out:
|
||||||
argv = ['', command, '--help']
|
argv = ['', command, '--help']
|
||||||
self.assertRaises(SystemExit, swiftclient.shell.main, argv)
|
self.assertRaises(SystemExit, swiftclient.shell.main, argv)
|
||||||
@@ -1044,7 +1038,7 @@ class TestSubcommandHelp(unittest.TestCase):
|
|||||||
self.assertEqual(out.strip('\n'), expected)
|
self.assertEqual(out.strip('\n'), expected)
|
||||||
|
|
||||||
|
|
||||||
class TestBase(unittest.TestCase):
|
class TestBase(testtools.TestCase):
|
||||||
"""
|
"""
|
||||||
Provide some common methods to subclasses
|
Provide some common methods to subclasses
|
||||||
"""
|
"""
|
||||||
@@ -1106,7 +1100,7 @@ class TestParsing(TestBase):
|
|||||||
'service_type', 'project_id', 'auth_token',
|
'service_type', 'project_id', 'auth_token',
|
||||||
'project_domain_name']
|
'project_domain_name']
|
||||||
for key in expected_os_opts_keys:
|
for key in expected_os_opts_keys:
|
||||||
self.assertTrue(key in actual_os_opts_dict)
|
self.assertIn(key, actual_os_opts_dict)
|
||||||
cli_key = key
|
cli_key = key
|
||||||
if key == 'object_storage_url':
|
if key == 'object_storage_url':
|
||||||
# exceptions to the pattern...
|
# exceptions to the pattern...
|
||||||
@@ -1119,7 +1113,7 @@ class TestParsing(TestBase):
|
|||||||
self.assertEqual(expect, actual, 'Expected %s for %s, got %s'
|
self.assertEqual(expect, actual, 'Expected %s for %s, got %s'
|
||||||
% (expect, key, actual))
|
% (expect, key, actual))
|
||||||
for key in actual_os_opts_dict:
|
for key in actual_os_opts_dict:
|
||||||
self.assertTrue(key in expected_os_opts_keys)
|
self.assertIn(key, expected_os_opts_keys)
|
||||||
|
|
||||||
# check that equivalent keys have equal values
|
# check that equivalent keys have equal values
|
||||||
equivalents = [('os_username', 'user'),
|
equivalents = [('os_username', 'user'),
|
||||||
@@ -1446,9 +1440,7 @@ class TestKeystoneOptions(MockHttpTest):
|
|||||||
for key in self.all_os_opts.keys():
|
for key in self.all_os_opts.keys():
|
||||||
expected = os_opts.get(key, self.defaults.get(key))
|
expected = os_opts.get(key, self.defaults.get(key))
|
||||||
key = key.replace('-', '_')
|
key = key.replace('-', '_')
|
||||||
self.assertTrue(key in actual_args,
|
self.assertIn(key, actual_args)
|
||||||
'Expected key %s not found in args %s'
|
|
||||||
% (key, actual_args))
|
|
||||||
self.assertEqual(expected, actual_args[key],
|
self.assertEqual(expected, actual_args[key],
|
||||||
'Expected %s for key %s, found %s'
|
'Expected %s for key %s, found %s'
|
||||||
% (expected, key, actual_args[key]))
|
% (expected, key, actual_args[key]))
|
||||||
@@ -1464,16 +1456,12 @@ class TestKeystoneOptions(MockHttpTest):
|
|||||||
key = key.replace('-', '_')
|
key = key.replace('-', '_')
|
||||||
if key == 'region_name':
|
if key == 'region_name':
|
||||||
key = 'filter_value'
|
key = 'filter_value'
|
||||||
self.assertTrue(key in actual_args,
|
self.assertIn(key, actual_args)
|
||||||
'Expected key %s not found in args %s'
|
|
||||||
% (key, actual_args))
|
|
||||||
self.assertEqual(expected, actual_args[key],
|
self.assertEqual(expected, actual_args[key],
|
||||||
'Expected %s for key %s, found %s'
|
'Expected %s for key %s, found %s'
|
||||||
% (expected, key, actual_args[key]))
|
% (expected, key, actual_args[key]))
|
||||||
key, v = 'attr', 'region'
|
key, v = 'attr', 'region'
|
||||||
self.assertTrue(key in actual_args,
|
self.assertIn(key, actual_args)
|
||||||
'Expected key %s not found in args %s'
|
|
||||||
% (key, actual_args))
|
|
||||||
self.assertEqual(v, actual_args[key],
|
self.assertEqual(v, actual_args[key],
|
||||||
'Expected %s for key %s, found %s'
|
'Expected %s for key %s, found %s'
|
||||||
% (v, key, actual_args[key]))
|
% (v, key, actual_args[key]))
|
||||||
|
@@ -14,18 +14,14 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
import mock
|
||||||
try:
|
|
||||||
from unittest import mock
|
|
||||||
except ImportError:
|
|
||||||
import mock
|
|
||||||
|
|
||||||
import six
|
import six
|
||||||
import socket
|
import socket
|
||||||
import testtools
|
import testtools
|
||||||
import warnings
|
import warnings
|
||||||
import tempfile
|
import tempfile
|
||||||
from hashlib import md5
|
from hashlib import md5
|
||||||
|
from six import binary_type
|
||||||
from six.moves.urllib.parse import urlparse
|
from six.moves.urllib.parse import urlparse
|
||||||
|
|
||||||
from .utils import (MockHttpTest, fake_get_auth_keystone, StubResponse,
|
from .utils import (MockHttpTest, fake_get_auth_keystone, StubResponse,
|
||||||
@@ -44,7 +40,7 @@ class TestClientException(testtools.TestCase):
|
|||||||
|
|
||||||
def test_format(self):
|
def test_format(self):
|
||||||
exc = c.ClientException('something failed')
|
exc = c.ClientException('something failed')
|
||||||
self.assertTrue('something failed' in str(exc))
|
self.assertIn('something failed', str(exc))
|
||||||
test_kwargs = (
|
test_kwargs = (
|
||||||
'scheme',
|
'scheme',
|
||||||
'host',
|
'host',
|
||||||
@@ -60,7 +56,7 @@ class TestClientException(testtools.TestCase):
|
|||||||
'http_%s' % value: value,
|
'http_%s' % value: value,
|
||||||
}
|
}
|
||||||
exc = c.ClientException('test', **kwargs)
|
exc = c.ClientException('test', **kwargs)
|
||||||
self.assertTrue(value in str(exc))
|
self.assertIn(value, str(exc))
|
||||||
|
|
||||||
|
|
||||||
class MockHttpResponse(object):
|
class MockHttpResponse(object):
|
||||||
@@ -133,10 +129,10 @@ class TestHttpHelpers(MockHttpTest):
|
|||||||
def test_http_connection(self):
|
def test_http_connection(self):
|
||||||
url = 'http://www.test.com'
|
url = 'http://www.test.com'
|
||||||
_junk, conn = c.http_connection(url)
|
_junk, conn = c.http_connection(url)
|
||||||
self.assertTrue(isinstance(conn, c.HTTPConnection))
|
self.assertIs(type(conn), c.HTTPConnection)
|
||||||
url = 'https://www.test.com'
|
url = 'https://www.test.com'
|
||||||
_junk, conn = c.http_connection(url)
|
_junk, conn = c.http_connection(url)
|
||||||
self.assertTrue(isinstance(conn, c.HTTPConnection))
|
self.assertIs(type(conn), c.HTTPConnection)
|
||||||
url = 'ftp://www.test.com'
|
url = 'ftp://www.test.com'
|
||||||
self.assertRaises(c.ClientException, c.http_connection, url)
|
self.assertRaises(c.ClientException, c.http_connection, url)
|
||||||
|
|
||||||
@@ -146,18 +142,16 @@ class TestHttpHelpers(MockHttpTest):
|
|||||||
u'x-account-meta-\u0394': '123',
|
u'x-account-meta-\u0394': '123',
|
||||||
u'x-object-meta-\u0394': '123'}
|
u'x-object-meta-\u0394': '123'}
|
||||||
|
|
||||||
encoded_str_type = type(''.encode())
|
|
||||||
r = swiftclient.encode_meta_headers(headers)
|
r = swiftclient.encode_meta_headers(headers)
|
||||||
|
|
||||||
self.assertEqual(len(headers), len(r))
|
self.assertEqual(len(headers), len(r))
|
||||||
# ensure non meta headers are not encoded
|
# ensure non meta headers are not encoded
|
||||||
self.assertTrue('abc' in r)
|
self.assertIs(type(r.get('abc')), binary_type)
|
||||||
self.assertTrue(isinstance(r['abc'], encoded_str_type))
|
|
||||||
del r['abc']
|
del r['abc']
|
||||||
|
|
||||||
for k, v in r.items():
|
for k, v in r.items():
|
||||||
self.assertTrue(isinstance(k, encoded_str_type))
|
self.assertIs(type(k), binary_type)
|
||||||
self.assertTrue(isinstance(v, encoded_str_type))
|
self.assertIs(type(v), binary_type)
|
||||||
|
|
||||||
def test_set_user_agent_default(self):
|
def test_set_user_agent_default(self):
|
||||||
_junk, conn = c.http_connection('http://www.example.com')
|
_junk, conn = c.http_connection('http://www.example.com')
|
||||||
@@ -826,7 +820,7 @@ class TestPutObject(MockHttpTest):
|
|||||||
c.http_connection = self.fake_http_connection(200)
|
c.http_connection = self.fake_http_connection(200)
|
||||||
args = ('http://www.test.com', 'TOKEN', 'container', 'obj', 'body', 4)
|
args = ('http://www.test.com', 'TOKEN', 'container', 'obj', 'body', 4)
|
||||||
value = c.put_object(*args)
|
value = c.put_object(*args)
|
||||||
self.assertTrue(isinstance(value, six.string_types))
|
self.assertIsInstance(value, six.string_types)
|
||||||
self.assertEqual(value, EMPTY_ETAG)
|
self.assertEqual(value, EMPTY_ETAG)
|
||||||
self.assertRequests([
|
self.assertRequests([
|
||||||
('PUT', '/container/obj', 'body', {
|
('PUT', '/container/obj', 'body', {
|
||||||
@@ -852,7 +846,7 @@ class TestPutObject(MockHttpTest):
|
|||||||
conn[1].getresponse = resp.fake_response
|
conn[1].getresponse = resp.fake_response
|
||||||
conn[1]._request = resp._fake_request
|
conn[1]._request = resp._fake_request
|
||||||
value = c.put_object(*args, headers=headers, http_conn=conn)
|
value = c.put_object(*args, headers=headers, http_conn=conn)
|
||||||
self.assertTrue(isinstance(value, six.string_types))
|
self.assertIsInstance(value, six.string_types)
|
||||||
# Test for RFC-2616 encoded symbols
|
# Test for RFC-2616 encoded symbols
|
||||||
self.assertIn(("a-b", b".x:yz mn:fg:lp"),
|
self.assertIn(("a-b", b".x:yz mn:fg:lp"),
|
||||||
resp.buffer)
|
resp.buffer)
|
||||||
@@ -921,8 +915,7 @@ class TestPutObject(MockHttpTest):
|
|||||||
contents=mock_file, **kwarg)
|
contents=mock_file, **kwarg)
|
||||||
|
|
||||||
req_data = resp.requests_params['data']
|
req_data = resp.requests_params['data']
|
||||||
self.assertTrue(isinstance(req_data,
|
self.assertIs(type(req_data), swiftclient.utils.LengthWrapper)
|
||||||
swiftclient.utils.LengthWrapper))
|
|
||||||
self.assertEqual(raw_data_len, len(req_data.read()))
|
self.assertEqual(raw_data_len, len(req_data.read()))
|
||||||
|
|
||||||
def test_chunk_upload(self):
|
def test_chunk_upload(self):
|
||||||
@@ -1691,7 +1684,6 @@ class TestConnection(MockHttpTest):
|
|||||||
|
|
||||||
# check timeout is passed to keystone client
|
# check timeout is passed to keystone client
|
||||||
self.assertEqual(1, len(fake_ks.calls))
|
self.assertEqual(1, len(fake_ks.calls))
|
||||||
self.assertTrue('timeout' in fake_ks.calls[0])
|
|
||||||
self.assertEqual(33.0, fake_ks.calls[0].get('timeout'))
|
self.assertEqual(33.0, fake_ks.calls[0].get('timeout'))
|
||||||
# check timeout passed to HEAD for account
|
# check timeout passed to HEAD for account
|
||||||
self.assertEqual(timeouts, [33.0])
|
self.assertEqual(timeouts, [33.0])
|
||||||
@@ -1761,9 +1753,7 @@ class TestConnection(MockHttpTest):
|
|||||||
parsed = urlparse(url)
|
parsed = urlparse(url)
|
||||||
return parsed, LocalConnection()
|
return parsed, LocalConnection()
|
||||||
|
|
||||||
orig_conn = c.http_connection
|
with mock.patch.object(c, 'http_connection', local_http_connection):
|
||||||
try:
|
|
||||||
c.http_connection = local_http_connection
|
|
||||||
conn = c.Connection('http://www.example.com', 'asdf', 'asdf',
|
conn = c.Connection('http://www.example.com', 'asdf', 'asdf',
|
||||||
retries=1, starting_backoff=.0001)
|
retries=1, starting_backoff=.0001)
|
||||||
|
|
||||||
@@ -1795,8 +1785,6 @@ class TestConnection(MockHttpTest):
|
|||||||
self.assertEqual(contents.seeks, [])
|
self.assertEqual(contents.seeks, [])
|
||||||
self.assertEqual(str(exc), "put_object('c', 'o', ...) failure "
|
self.assertEqual(str(exc), "put_object('c', 'o', ...) failure "
|
||||||
"and no ability to reset contents for reupload.")
|
"and no ability to reset contents for reupload.")
|
||||||
finally:
|
|
||||||
c.http_connection = orig_conn
|
|
||||||
|
|
||||||
|
|
||||||
class TestResponseDict(MockHttpTest):
|
class TestResponseDict(MockHttpTest):
|
||||||
@@ -1841,10 +1829,8 @@ class TestResponseDict(MockHttpTest):
|
|||||||
*call[1:],
|
*call[1:],
|
||||||
response_dict=resp_dict)
|
response_dict=resp_dict)
|
||||||
|
|
||||||
self.assertTrue('test' in resp_dict)
|
self.assertEqual('should be untouched', resp_dict.get('test'))
|
||||||
self.assertEqual('should be untouched', resp_dict['test'])
|
self.assertEqual([{}], resp_dict.get('response_dicts'))
|
||||||
self.assertTrue('response_dicts' in resp_dict)
|
|
||||||
self.assertEqual([{}], resp_dict['response_dicts'])
|
|
||||||
|
|
||||||
def test_response_dict(self):
|
def test_response_dict(self):
|
||||||
# test response_dict is populated and
|
# test response_dict is populated and
|
||||||
@@ -1858,15 +1844,13 @@ class TestResponseDict(MockHttpTest):
|
|||||||
conn = c.Connection('http://127.0.0.1:8080', 'user', 'key')
|
conn = c.Connection('http://127.0.0.1:8080', 'user', 'key')
|
||||||
getattr(conn, call[0])(*call[1:], response_dict=resp_dict)
|
getattr(conn, call[0])(*call[1:], response_dict=resp_dict)
|
||||||
|
|
||||||
for key in ('test', 'status', 'headers', 'reason',
|
self.assertEqual('should be untouched',
|
||||||
'response_dicts'):
|
resp_dict.pop('test', None))
|
||||||
self.assertTrue(key in resp_dict)
|
self.assertEqual('Fake', resp_dict.get('reason'))
|
||||||
self.assertEqual('should be untouched', resp_dict.pop('test'))
|
self.assertEqual(200, resp_dict.get('status'))
|
||||||
self.assertEqual('Fake', resp_dict['reason'])
|
self.assertIn('headers', resp_dict)
|
||||||
self.assertEqual(200, resp_dict['status'])
|
self.assertEqual('yes', resp_dict['headers'].get('x-works'))
|
||||||
self.assertTrue('x-works' in resp_dict['headers'])
|
children = resp_dict.pop('response_dicts', [])
|
||||||
self.assertEqual('yes', resp_dict['headers']['x-works'])
|
|
||||||
children = resp_dict.pop('response_dicts')
|
|
||||||
self.assertEqual(1, len(children))
|
self.assertEqual(1, len(children))
|
||||||
self.assertEqual(resp_dict, children[0])
|
self.assertEqual(resp_dict, children[0])
|
||||||
|
|
||||||
@@ -1883,15 +1867,13 @@ class TestResponseDict(MockHttpTest):
|
|||||||
conn = c.Connection('http://127.0.0.1:8080', 'user', 'key')
|
conn = c.Connection('http://127.0.0.1:8080', 'user', 'key')
|
||||||
getattr(conn, call[0])(*call[1:], response_dict=resp_dict)
|
getattr(conn, call[0])(*call[1:], response_dict=resp_dict)
|
||||||
|
|
||||||
for key in ('test', 'status', 'headers', 'reason',
|
self.assertEqual('should be untouched',
|
||||||
'response_dicts'):
|
resp_dict.pop('test', None))
|
||||||
self.assertTrue(key in resp_dict)
|
self.assertEqual('Fake', resp_dict.get('reason'))
|
||||||
self.assertEqual('should be untouched', resp_dict.pop('test'))
|
self.assertEqual(200, resp_dict.get('status'))
|
||||||
self.assertEqual('Fake', resp_dict['reason'])
|
self.assertIn('headers', resp_dict)
|
||||||
self.assertEqual(200, resp_dict['status'])
|
self.assertEqual('yes', resp_dict['headers'].get('x-works'))
|
||||||
self.assertTrue('x-works' in resp_dict['headers'])
|
children = resp_dict.pop('response_dicts', [])
|
||||||
self.assertEqual('yes', resp_dict['headers']['x-works'])
|
|
||||||
children = resp_dict.pop('response_dicts')
|
|
||||||
self.assertEqual(2, len(children))
|
self.assertEqual(2, len(children))
|
||||||
self.assertEqual({'existing': 'response dict'}, children[0])
|
self.assertEqual({'existing': 'response dict'}, children[0])
|
||||||
self.assertEqual(resp_dict, children[1])
|
self.assertEqual(resp_dict, children[1])
|
||||||
@@ -1916,7 +1898,7 @@ class TestLogging(MockHttpTest):
|
|||||||
c.http_connection = self.fake_http_connection(200)
|
c.http_connection = self.fake_http_connection(200)
|
||||||
args = ('http://www.test.com', 'asdf', 'asdf', 'asdf', 'asdf')
|
args = ('http://www.test.com', 'asdf', 'asdf', 'asdf', 'asdf')
|
||||||
value = c.put_object(*args)
|
value = c.put_object(*args)
|
||||||
self.assertTrue(isinstance(value, six.string_types))
|
self.assertIsInstance(value, six.string_types)
|
||||||
|
|
||||||
def test_head_error(self):
|
def test_head_error(self):
|
||||||
c.http_connection = self.fake_http_connection(500)
|
c.http_connection = self.fake_http_connection(500)
|
||||||
@@ -1966,14 +1948,14 @@ class TestServiceToken(MockHttpTest):
|
|||||||
conn = c.Connection('http://www.test.com', 'asdf', 'asdf',
|
conn = c.Connection('http://www.test.com', 'asdf', 'asdf',
|
||||||
os_options=self.os_options)
|
os_options=self.os_options)
|
||||||
|
|
||||||
self.assertTrue(isinstance(conn, c.Connection))
|
self.assertIs(type(conn), c.Connection)
|
||||||
conn.get_auth = self.get_auth
|
conn.get_auth = self.get_auth
|
||||||
conn.get_service_auth = self.get_service_auth
|
conn.get_service_auth = self.get_service_auth
|
||||||
|
|
||||||
self.assertEqual(conn.attempts, 0)
|
self.assertEqual(conn.attempts, 0)
|
||||||
self.assertEqual(conn.service_token, None)
|
self.assertEqual(conn.service_token, None)
|
||||||
|
|
||||||
self.assertTrue(isinstance(conn, c.Connection))
|
self.assertIs(type(conn), c.Connection)
|
||||||
return conn
|
return conn
|
||||||
|
|
||||||
def get_auth(self):
|
def get_auth(self):
|
||||||
@@ -2057,8 +2039,7 @@ class TestServiceToken(MockHttpTest):
|
|||||||
for actual in self.iter_request_log():
|
for actual in self.iter_request_log():
|
||||||
self.assertEqual('GET', actual['method'])
|
self.assertEqual('GET', actual['method'])
|
||||||
actual_hdrs = actual['headers']
|
actual_hdrs = actual['headers']
|
||||||
self.assertTrue('X-Service-Token' in actual_hdrs)
|
self.assertEqual('stoken', actual_hdrs.get('X-Service-Token'))
|
||||||
self.assertEqual('stoken', actual_hdrs['X-Service-Token'])
|
|
||||||
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
||||||
self.assertEqual('http://storage_url.com/?format=json',
|
self.assertEqual('http://storage_url.com/?format=json',
|
||||||
actual['full_path'])
|
actual['full_path'])
|
||||||
@@ -2073,8 +2054,7 @@ class TestServiceToken(MockHttpTest):
|
|||||||
for actual in self.iter_request_log():
|
for actual in self.iter_request_log():
|
||||||
self.assertEqual('HEAD', actual['method'])
|
self.assertEqual('HEAD', actual['method'])
|
||||||
actual_hdrs = actual['headers']
|
actual_hdrs = actual['headers']
|
||||||
self.assertTrue('X-Service-Token' in actual_hdrs)
|
self.assertEqual('stoken', actual_hdrs.get('X-Service-Token'))
|
||||||
self.assertEqual('stoken', actual_hdrs['X-Service-Token'])
|
|
||||||
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
||||||
self.assertEqual('http://storage_url.com', actual['full_path'])
|
self.assertEqual('http://storage_url.com', actual['full_path'])
|
||||||
|
|
||||||
@@ -2089,8 +2069,7 @@ class TestServiceToken(MockHttpTest):
|
|||||||
for actual in self.iter_request_log():
|
for actual in self.iter_request_log():
|
||||||
self.assertEqual('POST', actual['method'])
|
self.assertEqual('POST', actual['method'])
|
||||||
actual_hdrs = actual['headers']
|
actual_hdrs = actual['headers']
|
||||||
self.assertTrue('X-Service-Token' in actual_hdrs)
|
self.assertEqual('stoken', actual_hdrs.get('X-Service-Token'))
|
||||||
self.assertEqual('stoken', actual_hdrs['X-Service-Token'])
|
|
||||||
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
||||||
self.assertEqual('http://storage_url.com', actual['full_path'])
|
self.assertEqual('http://storage_url.com', actual['full_path'])
|
||||||
self.assertEqual(conn.attempts, 1)
|
self.assertEqual(conn.attempts, 1)
|
||||||
@@ -2104,8 +2083,7 @@ class TestServiceToken(MockHttpTest):
|
|||||||
for actual in self.iter_request_log():
|
for actual in self.iter_request_log():
|
||||||
self.assertEqual('DELETE', actual['method'])
|
self.assertEqual('DELETE', actual['method'])
|
||||||
actual_hdrs = actual['headers']
|
actual_hdrs = actual['headers']
|
||||||
self.assertTrue('X-Service-Token' in actual_hdrs)
|
self.assertEqual('stoken', actual_hdrs.get('X-Service-Token'))
|
||||||
self.assertEqual('stoken', actual_hdrs['X-Service-Token'])
|
|
||||||
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
||||||
self.assertEqual('http://storage_url.com/container1',
|
self.assertEqual('http://storage_url.com/container1',
|
||||||
actual['full_path'])
|
actual['full_path'])
|
||||||
@@ -2121,8 +2099,7 @@ class TestServiceToken(MockHttpTest):
|
|||||||
for actual in self.iter_request_log():
|
for actual in self.iter_request_log():
|
||||||
self.assertEqual('GET', actual['method'])
|
self.assertEqual('GET', actual['method'])
|
||||||
actual_hdrs = actual['headers']
|
actual_hdrs = actual['headers']
|
||||||
self.assertTrue('X-Service-Token' in actual_hdrs)
|
self.assertEqual('stoken', actual_hdrs.get('X-Service-Token'))
|
||||||
self.assertEqual('stoken', actual_hdrs['X-Service-Token'])
|
|
||||||
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
||||||
self.assertEqual('http://storage_url.com/container1?format=json',
|
self.assertEqual('http://storage_url.com/container1?format=json',
|
||||||
actual['full_path'])
|
actual['full_path'])
|
||||||
@@ -2137,8 +2114,7 @@ class TestServiceToken(MockHttpTest):
|
|||||||
for actual in self.iter_request_log():
|
for actual in self.iter_request_log():
|
||||||
self.assertEqual('HEAD', actual['method'])
|
self.assertEqual('HEAD', actual['method'])
|
||||||
actual_hdrs = actual['headers']
|
actual_hdrs = actual['headers']
|
||||||
self.assertTrue('X-Service-Token' in actual_hdrs)
|
self.assertEqual('stoken', actual_hdrs.get('X-Service-Token'))
|
||||||
self.assertEqual('stoken', actual_hdrs['X-Service-Token'])
|
|
||||||
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
||||||
self.assertEqual('http://storage_url.com/container1',
|
self.assertEqual('http://storage_url.com/container1',
|
||||||
actual['full_path'])
|
actual['full_path'])
|
||||||
@@ -2153,8 +2129,7 @@ class TestServiceToken(MockHttpTest):
|
|||||||
for actual in self.iter_request_log():
|
for actual in self.iter_request_log():
|
||||||
self.assertEqual('POST', actual['method'])
|
self.assertEqual('POST', actual['method'])
|
||||||
actual_hdrs = actual['headers']
|
actual_hdrs = actual['headers']
|
||||||
self.assertTrue('X-Service-Token' in actual_hdrs)
|
self.assertEqual('stoken', actual_hdrs.get('X-Service-Token'))
|
||||||
self.assertEqual('stoken', actual_hdrs['X-Service-Token'])
|
|
||||||
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
||||||
self.assertEqual('http://storage_url.com/container1',
|
self.assertEqual('http://storage_url.com/container1',
|
||||||
actual['full_path'])
|
actual['full_path'])
|
||||||
@@ -2169,8 +2144,7 @@ class TestServiceToken(MockHttpTest):
|
|||||||
for actual in self.iter_request_log():
|
for actual in self.iter_request_log():
|
||||||
self.assertEqual('PUT', actual['method'])
|
self.assertEqual('PUT', actual['method'])
|
||||||
actual_hdrs = actual['headers']
|
actual_hdrs = actual['headers']
|
||||||
self.assertTrue('X-Service-Token' in actual_hdrs)
|
self.assertEqual('stoken', actual_hdrs.get('X-Service-Token'))
|
||||||
self.assertEqual('stoken', actual_hdrs['X-Service-Token'])
|
|
||||||
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
||||||
self.assertEqual('http://storage_url.com/container1',
|
self.assertEqual('http://storage_url.com/container1',
|
||||||
actual['full_path'])
|
actual['full_path'])
|
||||||
@@ -2185,8 +2159,7 @@ class TestServiceToken(MockHttpTest):
|
|||||||
for actual in self.iter_request_log():
|
for actual in self.iter_request_log():
|
||||||
self.assertEqual('GET', actual['method'])
|
self.assertEqual('GET', actual['method'])
|
||||||
actual_hdrs = actual['headers']
|
actual_hdrs = actual['headers']
|
||||||
self.assertTrue('X-Service-Token' in actual_hdrs)
|
self.assertEqual('stoken', actual_hdrs.get('X-Service-Token'))
|
||||||
self.assertEqual('stoken', actual_hdrs['X-Service-Token'])
|
|
||||||
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
||||||
self.assertEqual('http://storage_url.com/container1/obj1',
|
self.assertEqual('http://storage_url.com/container1/obj1',
|
||||||
actual['full_path'])
|
actual['full_path'])
|
||||||
@@ -2201,8 +2174,7 @@ class TestServiceToken(MockHttpTest):
|
|||||||
for actual in self.iter_request_log():
|
for actual in self.iter_request_log():
|
||||||
self.assertEqual('HEAD', actual['method'])
|
self.assertEqual('HEAD', actual['method'])
|
||||||
actual_hdrs = actual['headers']
|
actual_hdrs = actual['headers']
|
||||||
self.assertTrue('X-Service-Token' in actual_hdrs)
|
self.assertEqual('stoken', actual_hdrs.get('X-Service-Token'))
|
||||||
self.assertEqual('stoken', actual_hdrs['X-Service-Token'])
|
|
||||||
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
||||||
self.assertEqual('http://storage_url.com/container1/obj1',
|
self.assertEqual('http://storage_url.com/container1/obj1',
|
||||||
actual['full_path'])
|
actual['full_path'])
|
||||||
@@ -2217,8 +2189,7 @@ class TestServiceToken(MockHttpTest):
|
|||||||
for actual in self.iter_request_log():
|
for actual in self.iter_request_log():
|
||||||
self.assertEqual('PUT', actual['method'])
|
self.assertEqual('PUT', actual['method'])
|
||||||
actual_hdrs = actual['headers']
|
actual_hdrs = actual['headers']
|
||||||
self.assertTrue('X-Service-Token' in actual_hdrs)
|
self.assertEqual('stoken', actual_hdrs.get('X-Service-Token'))
|
||||||
self.assertEqual('stoken', actual_hdrs['X-Service-Token'])
|
|
||||||
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
||||||
self.assertEqual('http://storage_url.com/container1/obj1',
|
self.assertEqual('http://storage_url.com/container1/obj1',
|
||||||
actual['full_path'])
|
actual['full_path'])
|
||||||
@@ -2233,8 +2204,7 @@ class TestServiceToken(MockHttpTest):
|
|||||||
for actual in self.iter_request_log():
|
for actual in self.iter_request_log():
|
||||||
self.assertEqual('POST', actual['method'])
|
self.assertEqual('POST', actual['method'])
|
||||||
actual_hdrs = actual['headers']
|
actual_hdrs = actual['headers']
|
||||||
self.assertTrue('X-Service-Token' in actual_hdrs)
|
self.assertEqual('stoken', actual_hdrs.get('X-Service-Token'))
|
||||||
self.assertEqual('stoken', actual_hdrs['X-Service-Token'])
|
|
||||||
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
||||||
self.assertEqual('http://storage_url.com/container1/obj1',
|
self.assertEqual('http://storage_url.com/container1/obj1',
|
||||||
actual['full_path'])
|
actual['full_path'])
|
||||||
@@ -2249,8 +2219,7 @@ class TestServiceToken(MockHttpTest):
|
|||||||
for actual in self.iter_request_log():
|
for actual in self.iter_request_log():
|
||||||
self.assertEqual('DELETE', actual['method'])
|
self.assertEqual('DELETE', actual['method'])
|
||||||
actual_hdrs = actual['headers']
|
actual_hdrs = actual['headers']
|
||||||
self.assertTrue('X-Service-Token' in actual_hdrs)
|
self.assertEqual('stoken', actual_hdrs.get('X-Service-Token'))
|
||||||
self.assertEqual('stoken', actual_hdrs['X-Service-Token'])
|
|
||||||
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
self.assertEqual('token', actual_hdrs['X-Auth-Token'])
|
||||||
self.assertEqual('http://storage_url.com/container1/obj1?a_string',
|
self.assertEqual('http://storage_url.com/container1/obj1?a_string',
|
||||||
actual['full_path'])
|
actual['full_path'])
|
||||||
|
@@ -28,17 +28,13 @@ class TestConfigTrueValue(testtools.TestCase):
|
|||||||
for v in u.TRUE_VALUES:
|
for v in u.TRUE_VALUES:
|
||||||
self.assertEqual(v, v.lower())
|
self.assertEqual(v, v.lower())
|
||||||
|
|
||||||
|
@mock.patch.object(u, 'TRUE_VALUES', 'hello world'.split())
|
||||||
def test_config_true_value(self):
|
def test_config_true_value(self):
|
||||||
orig_trues = u.TRUE_VALUES
|
for val in 'hello world HELLO WORLD'.split():
|
||||||
try:
|
self.assertIs(u.config_true_value(val), True)
|
||||||
u.TRUE_VALUES = 'hello world'.split()
|
self.assertIs(u.config_true_value(True), True)
|
||||||
for val in 'hello world HELLO WORLD'.split():
|
self.assertIs(u.config_true_value('foo'), False)
|
||||||
self.assertTrue(u.config_true_value(val) is True)
|
self.assertIs(u.config_true_value(False), False)
|
||||||
self.assertTrue(u.config_true_value(True) is True)
|
|
||||||
self.assertTrue(u.config_true_value('foo') is False)
|
|
||||||
self.assertTrue(u.config_true_value(False) is False)
|
|
||||||
finally:
|
|
||||||
u.TRUE_VALUES = orig_trues
|
|
||||||
|
|
||||||
|
|
||||||
class TestPrtBytes(testtools.TestCase):
|
class TestPrtBytes(testtools.TestCase):
|
||||||
@@ -192,11 +188,11 @@ class TestReadableToIterable(testtools.TestCase):
|
|||||||
# Check creation with a real and noop md5 class
|
# Check creation with a real and noop md5 class
|
||||||
data = u.ReadableToIterable(None, None, md5=True)
|
data = u.ReadableToIterable(None, None, md5=True)
|
||||||
self.assertEqual(md5().hexdigest(), data.get_md5sum())
|
self.assertEqual(md5().hexdigest(), data.get_md5sum())
|
||||||
self.assertTrue(isinstance(data.md5sum, type(md5())))
|
self.assertIs(type(data.md5sum), type(md5()))
|
||||||
|
|
||||||
data = u.ReadableToIterable(None, None, md5=False)
|
data = u.ReadableToIterable(None, None, md5=False)
|
||||||
self.assertEqual('', data.get_md5sum())
|
self.assertEqual('', data.get_md5sum())
|
||||||
self.assertTrue(isinstance(data.md5sum, type(u.NoopMD5())))
|
self.assertIs(type(data.md5sum), u.NoopMD5)
|
||||||
|
|
||||||
def test_unicode(self):
|
def test_unicode(self):
|
||||||
# Check no errors are raised if unicode data is feed in.
|
# Check no errors are raised if unicode data is feed in.
|
||||||
|
@@ -263,9 +263,8 @@ class MockHttpTest(testtools.TestCase):
|
|||||||
conn.resp.status = status
|
conn.resp.status = status
|
||||||
if auth_token:
|
if auth_token:
|
||||||
headers = args[1]
|
headers = args[1]
|
||||||
self.assertTrue('X-Auth-Token' in headers)
|
self.assertEqual(auth_token,
|
||||||
actual_token = headers.get('X-Auth-Token')
|
headers.get('X-Auth-Token'))
|
||||||
self.assertEqual(auth_token, actual_token)
|
|
||||||
if query_string:
|
if query_string:
|
||||||
self.assertTrue(url.endswith('?' + query_string))
|
self.assertTrue(url.endswith('?' + query_string))
|
||||||
if url.endswith('invalid_cert') and not insecure:
|
if url.endswith('invalid_cert') and not insecure:
|
||||||
|
Reference in New Issue
Block a user