| OLD | NEW |
| 1 # -*- coding: utf-8 -*- | 1 # -*- coding: utf-8 -*- |
| 2 # Copyright 2013 Google Inc. All Rights Reserved. | 2 # Copyright 2013 Google Inc. All Rights Reserved. |
| 3 # | 3 # |
| 4 # Licensed under the Apache License, Version 2.0 (the "License"); | 4 # Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 # you may not use this file except in compliance with the License. | 5 # you may not use this file except in compliance with the License. |
| 6 # You may obtain a copy of the License at | 6 # You may obtain a copy of the License at |
| 7 # | 7 # |
| 8 # http://www.apache.org/licenses/LICENSE-2.0 | 8 # http://www.apache.org/licenses/LICENSE-2.0 |
| 9 # | 9 # |
| 10 # Unless required by applicable law or agreed to in writing, software | 10 # Unless required by applicable law or agreed to in writing, software |
| 11 # distributed under the License is distributed on an "AS IS" BASIS, | 11 # distributed under the License is distributed on an "AS IS" BASIS, |
| 12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 # See the License for the specific language governing permissions and | 13 # See the License for the specific language governing permissions and |
| 14 # limitations under the License. | 14 # limitations under the License. |
| 15 | 15 |
| 16 from __future__ import absolute_import | 16 from __future__ import absolute_import |
| 17 | 17 |
| 18 from contextlib import contextmanager | 18 from contextlib import contextmanager |
| 19 import functools | 19 import functools |
| 20 import os | 20 import os |
| 21 import pkgutil | 21 import pkgutil |
| 22 import posixpath | 22 import posixpath |
| 23 import re | 23 import re |
| 24 import tempfile | 24 import tempfile |
| 25 import unittest | 25 import unittest |
| 26 import urlparse | 26 import urlparse |
| 27 | 27 |
| 28 import boto | 28 import boto |
| 29 import crcmod |
| 29 import gslib.tests as gslib_tests | 30 import gslib.tests as gslib_tests |
| 31 from gslib.util import UsingCrcmodExtension |
| 30 | 32 |
| 31 if not hasattr(unittest.TestCase, 'assertIsNone'): | 33 if not hasattr(unittest.TestCase, 'assertIsNone'): |
| 32 # external dependency unittest2 required for Python <= 2.6 | 34 # external dependency unittest2 required for Python <= 2.6 |
| 33 import unittest2 as unittest # pylint: disable=g-import-not-at-top | 35 import unittest2 as unittest # pylint: disable=g-import-not-at-top |
| 34 | 36 |
| 35 # Flags for running different types of tests. | 37 # Flags for running different types of tests. |
| 36 RUN_INTEGRATION_TESTS = True | 38 RUN_INTEGRATION_TESTS = True |
| 37 RUN_UNIT_TESTS = True | 39 RUN_UNIT_TESTS = True |
| 38 RUN_S3_TESTS = False | 40 RUN_S3_TESTS = False |
| 39 | 41 |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 if name == TEST_BOTO_REMOVE_SECTION: | 221 if name == TEST_BOTO_REMOVE_SECTION: |
| 220 sections_to_remove.append(section) | 222 sections_to_remove.append(section) |
| 221 else: | 223 else: |
| 222 boto.config.remove_option(section, name) | 224 boto.config.remove_option(section, name) |
| 223 else: | 225 else: |
| 224 boto.config.set(section, name, value) | 226 boto.config.set(section, name, value) |
| 225 for section in sections_to_remove: | 227 for section in sections_to_remove: |
| 226 boto.config.remove_section(section) | 228 boto.config.remove_section(section) |
| 227 | 229 |
| 228 | 230 |
| 229 def PerformsFileToObjectUpload(func): | 231 def SequentialAndParallelTransfer(func): |
| 230 """Decorator indicating that a test uploads from a local file to an object. | 232 """Decorator for tests that perform file to object transfers, or vice versa. |
| 231 | 233 |
| 232 This forces the test to run once normally, and again with special boto | 234 This forces the test to run once normally, and again with special boto |
| 233 config settings that will ensure that the test follows the parallel composite | 235 config settings that will ensure that the test follows the parallel composite |
| 234 upload code path. | 236 upload and/or sliced object download code paths. |
| 235 | 237 |
| 236 Args: | 238 Args: |
| 237 func: Function to wrap. | 239 func: Function to wrap. |
| 238 | 240 |
| 239 Returns: | 241 Returns: |
| 240 Wrapped function. | 242 Wrapped function. |
| 241 """ | 243 """ |
| 242 @functools.wraps(func) | 244 @functools.wraps(func) |
| 243 def Wrapper(*args, **kwargs): | 245 def Wrapper(*args, **kwargs): |
| 244 # Run the test normally once. | 246 # Run the test normally once. |
| 245 func(*args, **kwargs) | 247 func(*args, **kwargs) |
| 246 | 248 |
| 247 # Try again, forcing parallel composite uploads. | 249 if not RUN_S3_TESTS and UsingCrcmodExtension(crcmod): |
| 248 with SetBotoConfigForTest([ | 250 # Try again, forcing parallel upload and sliced download. |
| 249 ('GSUtil', 'parallel_composite_upload_threshold', '1'), | 251 with SetBotoConfigForTest([ |
| 250 ('GSUtil', 'check_hashes', 'always')]): | 252 ('GSUtil', 'parallel_composite_upload_threshold', '1'), |
| 251 func(*args, **kwargs) | 253 ('GSUtil', 'sliced_object_download_threshold', '1'), |
| 254 ('GSUtil', 'sliced_object_download_max_components', '3'), |
| 255 ('GSUtil', 'check_hashes', 'always')]): |
| 256 func(*args, **kwargs) |
| 252 | 257 |
| 253 return Wrapper | 258 return Wrapper |
| 254 | 259 |
| 255 | 260 |
| 256 @contextmanager | 261 @contextmanager |
| 257 def SetBotoConfigForTest(boto_config_list): | 262 def SetBotoConfigForTest(boto_config_list): |
| 258 """Sets the input list of boto configs for the duration of a 'with' clause. | 263 """Sets the input list of boto configs for the duration of a 'with' clause. |
| 259 | 264 |
| 260 Args: | 265 Args: |
| 261 boto_config_list: list of tuples of: | 266 boto_config_list: list of tuples of: |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 pass | 365 pass |
| 361 | 366 |
| 362 if new_working_directory: | 367 if new_working_directory: |
| 363 os.chdir(new_working_directory) | 368 os.chdir(new_working_directory) |
| 364 | 369 |
| 365 try: | 370 try: |
| 366 yield | 371 yield |
| 367 finally: | 372 finally: |
| 368 if new_working_directory and prev_working_directory: | 373 if new_working_directory and prev_working_directory: |
| 369 os.chdir(prev_working_directory) | 374 os.chdir(prev_working_directory) |
| OLD | NEW |