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
	 Tim Burke
					Tim Burke