# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You 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. import sys import unittest import hashlib from mock import Mock from libcloud.py3 import StringIO from libcloud.py3 import PY3 from libcloud.py3 import b if PY3: from io import FileIO as file from libcloud.storage.base import StorageDriver from test import StorageMockHttp # pylint: disable-msg=E0611 class BaseStorageTests(unittest.TestCase): def setUp(self): self.send_called = 0 StorageDriver.connectionCls.conn_classes = (None, StorageMockHttp) self.driver1 = StorageDriver('username', 'key', host='localhost') self.driver1.supports_chunked_encoding = True self.driver2 = StorageDriver('username', 'key', host='localhost') self.driver2.supports_chunked_encoding = False def test__upload_object_iterator_must_have_next_method(self): class Iterator(object): def next(self): pass class Iterator2(file): def __init__(self): pass class SomeClass(object): pass valid_iterators = [Iterator(), Iterator2(), StringIO('bar')] invalid_iterators = ['foobar', '', False, True, 1, object()] def upload_func(*args, **kwargs): return True, 'barfoo', 100 kwargs = {'object_name': 'foo', 'content_type': 'foo/bar', 'upload_func': upload_func, 'upload_func_kwargs': {}, 'request_path': '/', 'headers': {}} for value in valid_iterators: kwargs['iterator'] = value self.driver1._upload_object(**kwargs) for value in invalid_iterators: kwargs['iterator'] = value try: self.driver1._upload_object(**kwargs) except AttributeError: pass else: self.fail('Exception was not thrown') def test_upload_zero_bytes_long_object_via_stream(self): iterator = Mock() if PY3: iterator.__next__ = Mock() iterator.__next__.side_effect = StopIteration() else: iterator.next.side_effect = StopIteration() def mock_send(data): self.send_called += 1 response = Mock() response.connection.connection.send = mock_send # Normal success, data_hash, bytes_transferred = \ self.driver1._stream_data(response=response, iterator=iterator, chunked=False, calculate_hash=True) self.assertTrue(success) self.assertEqual(data_hash, hashlib.md5(b('')).hexdigest()) self.assertEqual(bytes_transferred, 0) self.assertEqual(self.send_called, 1) # Chunked success, data_hash, bytes_transferred = \ self.driver1._stream_data(response=response, iterator=iterator, chunked=True, calculate_hash=True) self.assertTrue(success) self.assertEqual(data_hash, hashlib.md5(b('')).hexdigest()) self.assertEqual(bytes_transferred, 0) self.assertEqual(self.send_called, 5) def test__upload_data(self): def mock_send(data): self.send_called += 1 response = Mock() response.connection.connection.send = mock_send data = '123456789901234567' success, data_hash, bytes_transferred = \ self.driver1._upload_data(response=response, data=data, calculate_hash=True) self.assertTrue(success) self.assertEqual(data_hash, hashlib.md5(b(data)).hexdigest()) self.assertEqual(bytes_transferred, (len(data))) self.assertEqual(self.send_called, 1) def test__get_hash_function(self): self.driver1.hash_type = 'md5' func = self.driver1._get_hash_function() self.assertTrue(func) self.driver1.hash_type = 'sha1' func = self.driver1._get_hash_function() self.assertTrue(func) try: self.driver1.hash_type = 'invalid-hash-function' func = self.driver1._get_hash_function() except RuntimeError: pass else: self.fail('Invalid hash type but exception was not thrown') if __name__ == '__main__': sys.exit(unittest.main())