OXIESEC PANEL
- Current Dir:
/
/
opt
/
gsutil
/
gslib
/
tests
Server IP: 2a02:4780:11:1594:0:ef5:22d7:a
Upload:
Create Dir:
Name
Size
Modified
Perms
📁
..
-
02/11/2025 08:19:48 AM
rwxr-xr-x
📄
__init__.py
808 bytes
12/09/2024 05:26:03 PM
rw-r--r--
📁
__pycache__
-
02/11/2025 08:19:49 AM
rwxr-xr-x
📄
mock_cloud_api.py
7.97 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
mock_logging_handler.py
1.28 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
rewrite_helper.py
2.8 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
signurl_signatures.py
5.7 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_Doption.py
9.72 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_acl.py
55.99 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_autoclass.py
6.85 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_boto_util.py
9.65 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_bucketconfig.py
4.98 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_bucketpolicyonly.py
3.78 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_cat.py
11.55 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_cloud_api_delegator.py
2 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_command.py
3.39 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_command_runner.py
20.66 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_compose.py
14.12 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_context_config.py
18.78 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_copy_helper_funcs.py
39.76 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_copy_objects_iterator.py
4.49 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_cors.py
12.45 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_cp.py
216 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_creds_config.py
8.64 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_daisy_chain_wrapper.py
14.13 KB
12/09/2024 05:26:03 PM
rw-r--r--
📁
test_data
-
12/09/2024 05:26:03 PM
rwxr-xr-x
📄
test_defacl.py
14.36 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_defstorageclass.py
5.43 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_du.py
10.61 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_encryption_helper.py
4.62 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_execution_util.py
3.88 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_file_part.py
3.38 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_gcs_json_api.py
2.9 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_gcs_json_credentials.py
9.85 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_gcs_json_media.py
7.44 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_gsutil.py
4.68 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_hash.py
9.58 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_hashing_helper.py
10.78 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_help.py
3.5 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_hmac.py
23.9 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_iam.py
90.67 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_kms.py
16.68 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_label.py
11.55 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_lifecycle.py
13.8 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_logging.py
3.5 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_ls.py
53.16 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_mb.py
19.64 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_metrics.py
51.65 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_mtls.py
2.01 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_mv.py
13.04 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_naming.py
63.11 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_notification.py
5.9 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_notification_pubsub.py
5.46 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_pap.py
5.91 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_parallel_cp.py
10.15 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_parallelism_framework.py
33.09 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_perfdiag.py
12.62 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_plurality_checkable_iterator.py
7.53 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_posix_util.py
2.03 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_psc.py
5.88 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_rb.py
2.93 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_requester_pays.py
11.7 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_resumable_streaming.py
12.36 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_retention.py
28.9 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_retention_util.py
5.49 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_rewrite.py
31.62 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_rm.py
33.72 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_rpo.py
10.22 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_rsync.py
149.33 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_rsync_funcs.py
3.36 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_seek_ahead_thread.py
8.79 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_setmeta.py
12.54 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_shim_util.py
64.19 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_signurl.py
24.69 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_stat.py
11.38 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_stet_cp.py
5.77 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_stet_util.py
7.38 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_storage_url.py
7.02 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_tabcomplete.py
14.31 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_temporary_file_util.py
1.54 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_trace.py
1.76 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_tracker_file.py
9.9 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_ubla.py
3.88 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_ui.py
67.42 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_update.py
10.37 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_user_agent_helper.py
5.34 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_util.py
19.85 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_versioning.py
3.61 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_web.py
6.54 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_wildcard_iterator.py
22.18 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_wrapped_credentials.py
13.95 KB
12/09/2024 05:26:03 PM
rw-r--r--
📁
testcase
-
12/09/2024 05:26:03 PM
rwxr-xr-x
📄
util.py
29.01 KB
12/09/2024 05:26:03 PM
rw-r--r--
Editing: mock_cloud_api.py
Close
# -*- coding: utf-8 -*- # Copyright 2014 Google Inc. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Implements a simple mock gsutil Cloud API for unit testing. gsutil 4 was primarily unit-tested using boto/gsutil 3's mock storage_uri class, since it was possible that changing out the underlying mocks would have had subtly different behavior and increased the risk of breaking back-compat. Most unit and integration tests in gsutil 4 still set up the test objects with storage_uris and boto, and the unit tests interact with test objects via storage uris and boto. This testing approach ties our tests heavily to boto; extending the boto mocks is difficult because it requires checking into boto. This also makes the unit test coverage boto-specific in several cases. MockCloudApi was initially written to cover some parallel composite upload cases that the boto mocks couldn't handle. It is not yet a full implementation. Eventually, we can move to full a mock Cloud API implementation. However, we need to ensure we don't lose boto coverage from mock storage_uri. """ from __future__ import absolute_import from __future__ import print_function from __future__ import division from __future__ import unicode_literals import six from gslib.cloud_api import ServiceException from gslib.discard_messages_queue import DiscardMessagesQueue from gslib.third_party.storage_apitools import storage_v1_messages as apitools_messages from gslib.utils.translation_helper import CreateBucketNotFoundException from gslib.utils.translation_helper import CreateObjectNotFoundException if six.PY3: long = int class MockObject(object): """Defines a mock cloud storage provider object.""" def __init__(self, root_object, contents=''): self.root_object = root_object self.contents = contents def __str__(self): return '%s/%s#%s' % (self.root_object.bucket, self.root_object.name, self.root_object.generation) def __repr__(self): return str(self) class MockBucket(object): """Defines a mock cloud storage provider bucket.""" def __init__(self, bucket_name, versioned=False): self.root_object = apitools_messages.Bucket( name=bucket_name, versioning=apitools_messages.Bucket.VersioningValue(enabled=versioned)) # Dict of object_name: (dict of 'live': MockObject # 'versioned': ordered list of MockObject). self.objects = {} def CreateObject(self, object_name, contents=''): return self.CreateObjectWithMetadata( MockObject(apitools_messages.Object(name=object_name, contents=contents))) def CreateObjectWithMetadata(self, apitools_object, contents=''): """Creates an object in the bucket according to the input metadata. This will create a new object version (ignoring the generation specified in the input object). Args: apitools_object: apitools Object. contents: optional object contents. Returns: apitools Object representing created object. """ # This modifies the apitools_object with a generation number. object_name = apitools_object.name if (self.root_object.versioning and self.root_object.versioning.enabled and apitools_object.name in self.objects): if 'live' in self.objects[object_name]: # Versioning enabled and object exists, create an object with a # generation 1 higher. apitools_object.generation = ( self.objects[object_name]['live'].root_object.generation + 1) # Move the live object to versioned. if 'versioned' not in self.objects[object_name]: self.objects[object_name]['versioned'] = [] self.objects[object_name]['versioned'].append( self.objects[object_name]['live']) elif ('versioned' in self.objects[object_name] and self.objects[object_name]['versioned']): # Versioning enabled but only archived objects exist, pick a generation # higher than the highest versioned object (which will be at the end). apitools_object.generation = ( self.objects[object_name]['versioned'][-1].root_object.generation + 1) else: # Versioning disabled or no objects exist yet with this name. apitools_object.generation = 1 self.objects[object_name] = {} new_object = MockObject(apitools_object, contents=contents) self.objects[object_name]['live'] = new_object return new_object class MockCloudApi(object): """Simple mock service for buckets/objects that implements Cloud API. Also includes some setup functions for tests. """ def __init__(self, provider='gs'): self.buckets = {} self.provider = provider self.status_queue = DiscardMessagesQueue() def MockCreateBucket(self, bucket_name): """Creates a simple bucket without exercising the API directly.""" if bucket_name in self.buckets: raise ServiceException('Bucket %s already exists.' % bucket_name, status=409) self.buckets[bucket_name] = MockBucket(bucket_name) def MockCreateVersionedBucket(self, bucket_name): """Creates a simple bucket without exercising the API directly.""" if bucket_name in self.buckets: raise ServiceException('Bucket %s already exists.' % bucket_name, status=409) self.buckets[bucket_name] = MockBucket(bucket_name, versioned=True) def MockCreateObject(self, bucket_name, object_name, contents=''): """Creates an object without exercising the API directly.""" if bucket_name not in self.buckets: self.MockCreateBucket(bucket_name) self.buckets[bucket_name].CreateObject(object_name, contents=contents) def MockCreateObjectWithMetadata(self, apitools_object, contents=''): """Creates an object without exercising the API directly.""" assert apitools_object.bucket, 'No bucket specified for mock object' assert apitools_object.name, 'No object name specified for mock object' if apitools_object.bucket not in self.buckets: self.MockCreateBucket(apitools_object.bucket) return self.buckets[apitools_object.bucket].CreateObjectWithMetadata( apitools_object, contents=contents).root_object # pylint: disable=unused-argument def GetObjectMetadata(self, bucket_name, object_name, generation=None, provider=None, fields=None): """See CloudApi class for function doc strings.""" if generation: generation = long(generation) if bucket_name in self.buckets: bucket = self.buckets[bucket_name] if object_name in bucket.objects and bucket.objects[object_name]: if generation: if 'versioned' in bucket.objects[object_name]: for obj in bucket.objects[object_name]['versioned']: if obj.root_object.generation == generation: return obj.root_object if 'live' in bucket.objects[object_name]: if (bucket.objects[object_name]['live'].root_object.generation == generation): return bucket.objects[object_name]['live'].root_object else: # Return live object. if 'live' in bucket.objects[object_name]: return bucket.objects[object_name]['live'].root_object raise CreateObjectNotFoundException(404, self.provider, bucket_name, object_name) raise CreateBucketNotFoundException(404, self.provider, bucket_name)