| Index: boto/tests/mock_storage_service.py
|
| diff --git a/boto/tests/mock_storage_service.py b/boto/tests/mock_storage_service.py
|
| deleted file mode 100644
|
| index 10b5253467ce77d3b7d06b5e38139f19842e0a81..0000000000000000000000000000000000000000
|
| --- a/boto/tests/mock_storage_service.py
|
| +++ /dev/null
|
| @@ -1,298 +0,0 @@
|
| -# Copyright 2010 Google Inc.
|
| -#
|
| -# Permission is hereby granted, free of charge, to any person obtaining a
|
| -# copy of this software and associated documentation files (the
|
| -# "Software"), to deal in the Software without restriction, including
|
| -# without limitation the rights to use, copy, modify, merge, publish, dis-
|
| -# tribute, sublicense, and/or sell copies of the Software, and to permit
|
| -# persons to whom the Software is furnished to do so, subject to the fol-
|
| -# lowing conditions:
|
| -#
|
| -# The above copyright notice and this permission notice shall be included
|
| -# in all copies or substantial portions of the Software.
|
| -#
|
| -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
| -# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
| -# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
| -# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
| -# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
| -# IN THE SOFTWARE.
|
| -
|
| -"""
|
| -Provides basic mocks of core storage service classes, for unit testing:
|
| -ACL, Key, Bucket, Connection, and StorageUri. We implement a subset of
|
| -the interfaces defined in the real boto classes, but don't handle most
|
| -of the optional params (which we indicate with the constant "NOT_IMPL").
|
| -"""
|
| -
|
| -import copy
|
| -import boto
|
| -
|
| -NOT_IMPL = None
|
| -
|
| -
|
| -class MockAcl(object):
|
| -
|
| - def __init__(self, parent=NOT_IMPL):
|
| - pass
|
| -
|
| - def startElement(self, name, attrs, connection):
|
| - pass
|
| -
|
| - def endElement(self, name, value, connection):
|
| - pass
|
| -
|
| - def to_xml(self):
|
| - return '<mock_ACL_XML/>'
|
| -
|
| -
|
| -class MockKey(object):
|
| -
|
| - def __init__(self, bucket=None, name=None):
|
| - self.bucket = bucket
|
| - self.name = name
|
| - self.data = None
|
| - self.size = None
|
| - self.content_encoding = None
|
| - self.content_type = None
|
| - self.last_modified = 'Wed, 06 Oct 2010 05:11:54 GMT'
|
| -
|
| - def get_contents_as_string(self, headers=NOT_IMPL,
|
| - cb=NOT_IMPL, num_cb=NOT_IMPL,
|
| - torrent=NOT_IMPL,
|
| - version_id=NOT_IMPL):
|
| - return self.data
|
| -
|
| - def get_contents_to_file(self, fp, headers=NOT_IMPL,
|
| - cb=NOT_IMPL, num_cb=NOT_IMPL,
|
| - torrent=NOT_IMPL,
|
| - version_id=NOT_IMPL,
|
| - res_download_handler=NOT_IMPL):
|
| - fp.write(self.data)
|
| -
|
| - def get_file(self, fp, headers=NOT_IMPL, cb=NOT_IMPL, num_cb=NOT_IMPL,
|
| - torrent=NOT_IMPL, version_id=NOT_IMPL,
|
| - override_num_retries=NOT_IMPL):
|
| - fp.write(self.data)
|
| -
|
| - def _handle_headers(self, headers):
|
| - if not headers:
|
| - return
|
| - if 'Content-Encoding' in headers:
|
| - self.content_encoding = headers['Content-Encoding']
|
| - if 'Content-Type' in headers:
|
| - self.content_type = headers['Content-Type']
|
| -
|
| - def open_read(self, headers=NOT_IMPL, query_args=NOT_IMPL,
|
| - override_num_retries=NOT_IMPL):
|
| - pass
|
| -
|
| - def set_contents_from_file(self, fp, headers=None, replace=NOT_IMPL,
|
| - cb=NOT_IMPL, num_cb=NOT_IMPL,
|
| - policy=NOT_IMPL, md5=NOT_IMPL,
|
| - res_upload_handler=NOT_IMPL):
|
| - self.data = fp.readlines()
|
| - self.size = len(self.data)
|
| - self._handle_headers(headers)
|
| -
|
| - def set_contents_from_string(self, s, headers=NOT_IMPL, replace=NOT_IMPL,
|
| - cb=NOT_IMPL, num_cb=NOT_IMPL, policy=NOT_IMPL,
|
| - md5=NOT_IMPL, reduced_redundancy=NOT_IMPL):
|
| - self.data = copy.copy(s)
|
| - self.size = len(s)
|
| - self._handle_headers(headers)
|
| -
|
| -
|
| -class MockBucket(object):
|
| -
|
| - def __init__(self, connection=NOT_IMPL, name=None, key_class=NOT_IMPL):
|
| - self.name = name
|
| - self.keys = {}
|
| - self.acls = {name: MockAcl()}
|
| -
|
| - def copy_key(self, new_key_name, src_bucket_name,
|
| - src_key_name, metadata=NOT_IMPL, src_version_id=NOT_IMPL,
|
| - storage_class=NOT_IMPL, preserve_acl=NOT_IMPL):
|
| - new_key = self.new_key(key_name=new_key_name)
|
| - src_key = mock_connection.get_bucket(
|
| - src_bucket_name).get_key(src_key_name)
|
| - new_key.data = copy.copy(src_key.data)
|
| - new_key.size = len(new_key.data)
|
| -
|
| - def get_acl(self, key_name='', headers=NOT_IMPL, version_id=NOT_IMPL):
|
| - if key_name:
|
| - # Return ACL for the key.
|
| - return self.acls[key_name]
|
| - else:
|
| - # Return ACL for the bucket.
|
| - return self.acls[self.name]
|
| -
|
| - def new_key(self, key_name=None):
|
| - mock_key = MockKey(self, key_name)
|
| - self.keys[key_name] = mock_key
|
| - self.acls[key_name] = MockAcl()
|
| - return mock_key
|
| -
|
| - def delete_key(self, key_name, headers=NOT_IMPL,
|
| - version_id=NOT_IMPL, mfa_token=NOT_IMPL):
|
| - if key_name not in self.keys:
|
| - raise boto.exception.StorageResponseError(404, 'Not Found')
|
| - del self.keys[key_name]
|
| -
|
| - def get_all_keys(self, headers=NOT_IMPL):
|
| - return self.keys.itervalues()
|
| -
|
| - def get_key(self, key_name, headers=NOT_IMPL, version_id=NOT_IMPL):
|
| - # Emulate behavior of boto when get_key called with non-existent key.
|
| - if key_name not in self.keys:
|
| - return None
|
| - return self.keys[key_name]
|
| -
|
| - def list(self, prefix='', delimiter=NOT_IMPL, marker=NOT_IMPL,
|
| - headers=NOT_IMPL):
|
| - # Return list instead of using a generator so we don't get
|
| - # 'dictionary changed size during iteration' error when performing
|
| - # deletions while iterating (e.g., during test cleanup).
|
| - result = []
|
| - for k in self.keys.itervalues():
|
| - if not prefix:
|
| - result.append(k)
|
| - elif k.name.startswith(prefix):
|
| - result.append(k)
|
| - return result
|
| -
|
| - def set_acl(self, acl_or_str, key_name='', headers=NOT_IMPL,
|
| - version_id=NOT_IMPL):
|
| - # We only handle setting ACL XML here; if you pass a canned ACL
|
| - # the get_acl call will just return that string name.
|
| - if key_name:
|
| - # Set ACL for the key.
|
| - self.acls[key_name] = acl_or_str
|
| - else:
|
| - # Set ACL for the bucket.
|
| - self.acls[self.name] = acl_or_str
|
| -
|
| -
|
| -class MockConnection(object):
|
| -
|
| - def __init__(self, aws_access_key_id=NOT_IMPL,
|
| - aws_secret_access_key=NOT_IMPL, is_secure=NOT_IMPL,
|
| - port=NOT_IMPL, proxy=NOT_IMPL, proxy_port=NOT_IMPL,
|
| - proxy_user=NOT_IMPL, proxy_pass=NOT_IMPL,
|
| - host=NOT_IMPL, debug=NOT_IMPL,
|
| - https_connection_factory=NOT_IMPL,
|
| - calling_format=NOT_IMPL,
|
| - path=NOT_IMPL, provider=NOT_IMPL,
|
| - bucket_class=NOT_IMPL):
|
| - self.buckets = {}
|
| -
|
| - def create_bucket(self, bucket_name, headers=NOT_IMPL, location=NOT_IMPL,
|
| - policy=NOT_IMPL):
|
| - if bucket_name in self.buckets:
|
| - raise boto.exception.StorageCreateError(
|
| - 409, 'BucketAlreadyOwnedByYou', 'bucket already exists')
|
| - mock_bucket = MockBucket(name=bucket_name)
|
| - self.buckets[bucket_name] = mock_bucket
|
| - return mock_bucket
|
| -
|
| - def delete_bucket(self, bucket, headers=NOT_IMPL):
|
| - if bucket not in self.buckets:
|
| - raise boto.exception.StorageResponseError(404, 'NoSuchBucket',
|
| - 'no such bucket')
|
| - del self.buckets[bucket]
|
| -
|
| - def get_bucket(self, bucket_name, validate=NOT_IMPL, headers=NOT_IMPL):
|
| - if bucket_name not in self.buckets:
|
| - raise boto.exception.StorageResponseError(404, 'NoSuchBucket',
|
| - 'Not Found')
|
| - return self.buckets[bucket_name]
|
| -
|
| - def get_all_buckets(self, headers=NOT_IMPL):
|
| - return self.buckets.itervalues()
|
| -
|
| -
|
| -# We only mock a single provider/connection.
|
| -mock_connection = MockConnection()
|
| -
|
| -
|
| -class MockBucketStorageUri(object):
|
| -
|
| - def __init__(self, scheme, bucket_name=None, object_name=None,
|
| - debug=NOT_IMPL):
|
| - self.scheme = scheme
|
| - self.bucket_name = bucket_name
|
| - self.object_name = object_name
|
| - if self.bucket_name and self.object_name:
|
| - self.uri = ('%s://%s/%s' % (self.scheme, self.bucket_name,
|
| - self.object_name))
|
| - elif self.bucket_name:
|
| - self.uri = ('%s://%s/' % (self.scheme, self.bucket_name))
|
| - else:
|
| - self.uri = ('%s://' % self.scheme)
|
| -
|
| - def __repr__(self):
|
| - """Returns string representation of URI."""
|
| - return self.uri
|
| -
|
| - def acl_class(self):
|
| - return MockAcl
|
| -
|
| - def canned_acls(self):
|
| - return boto.provider.Provider('aws').canned_acls
|
| -
|
| - def clone_replace_name(self, new_name):
|
| - return MockBucketStorageUri(self.scheme, self.bucket_name, new_name)
|
| -
|
| - def connect(self, access_key_id=NOT_IMPL, secret_access_key=NOT_IMPL):
|
| - return mock_connection
|
| -
|
| - def create_bucket(self, headers=NOT_IMPL, location=NOT_IMPL,
|
| - policy=NOT_IMPL):
|
| - return self.connect().create_bucket(self.bucket_name)
|
| -
|
| - def delete_bucket(self, headers=NOT_IMPL):
|
| - return self.connect().delete_bucket(self.bucket_name)
|
| -
|
| - def delete_key(self, validate=NOT_IMPL, headers=NOT_IMPL,
|
| - version_id=NOT_IMPL, mfa_token=NOT_IMPL):
|
| - self.get_bucket().delete_key(self.object_name)
|
| -
|
| - def equals(self, uri):
|
| - return self.uri == uri.uri
|
| -
|
| - def get_acl(self, validate=NOT_IMPL, headers=NOT_IMPL, version_id=NOT_IMPL):
|
| - return self.get_bucket().get_acl(self.object_name)
|
| -
|
| - def get_all_buckets(self, headers=NOT_IMPL):
|
| - return self.connect().get_all_buckets()
|
| -
|
| - def get_all_keys(self, validate=NOT_IMPL, headers=NOT_IMPL):
|
| - return self.get_bucket().get_all_keys(self)
|
| -
|
| - def get_bucket(self, validate=NOT_IMPL, headers=NOT_IMPL):
|
| - return self.connect().get_bucket(self.bucket_name)
|
| -
|
| - def get_key(self, validate=NOT_IMPL, headers=NOT_IMPL,
|
| - version_id=NOT_IMPL):
|
| - return self.get_bucket().get_key(self.object_name)
|
| -
|
| - def is_file_uri(self):
|
| - return False
|
| -
|
| - def is_cloud_uri(self):
|
| - return True
|
| -
|
| - def names_container(self):
|
| - return not self.object_name
|
| -
|
| - def names_singleton(self):
|
| - return self.object_name
|
| -
|
| - def new_key(self, validate=NOT_IMPL, headers=NOT_IMPL):
|
| - bucket = self.get_bucket()
|
| - return bucket.new_key(self.object_name)
|
| -
|
| - def set_acl(self, acl_or_str, key_name='', validate=NOT_IMPL,
|
| - headers=NOT_IMPL, version_id=NOT_IMPL):
|
| - self.get_bucket().set_acl(acl_or_str, key_name)
|
|
|