Index: tools/telemetry/third_party/gsutil/gslib/tests/mock_cloud_api.py |
diff --git a/tools/telemetry/third_party/gsutil/gslib/tests/mock_cloud_api.py b/tools/telemetry/third_party/gsutil/gslib/tests/mock_cloud_api.py |
deleted file mode 100644 |
index d1cee12cfc6370a956cdfc59c736026e54d77aa7..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/third_party/gsutil/gslib/tests/mock_cloud_api.py |
+++ /dev/null |
@@ -1,179 +0,0 @@ |
-# -*- 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 gslib.cloud_api import ServiceException |
-from gslib.third_party.storage_apitools import storage_v1_messages as apitools_messages |
-from gslib.translation_helper import CreateBucketNotFoundException |
-from gslib.translation_helper import CreateObjectNotFoundException |
- |
- |
-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 |
- |
- 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) |