| Index: third_party/boto/tests/unit/s3/test_connection.py
|
| ===================================================================
|
| --- third_party/boto/tests/unit/s3/test_connection.py (revision 33376)
|
| +++ third_party/boto/tests/unit/s3/test_connection.py (working copy)
|
| @@ -19,10 +19,15 @@
|
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
| # IN THE SOFTWARE.
|
| #
|
| +import mock
|
| +import time
|
| +
|
| from tests.unit import unittest
|
| from tests.unit import AWSMockServiceTestCase
|
| +from tests.unit import MockServiceWithConfigTestCase
|
|
|
| -from boto.s3.connection import S3Connection
|
| +from boto.s3.connection import S3Connection, HostRequiredError
|
| +from boto.s3.connection import S3ResponseError, Bucket
|
|
|
|
|
| class TestSignatureAlteration(AWSMockServiceTestCase):
|
| @@ -46,6 +51,92 @@
|
| )
|
|
|
|
|
| +class TestSigV4HostError(MockServiceWithConfigTestCase):
|
| + connection_class = S3Connection
|
| +
|
| + def test_historical_behavior(self):
|
| + self.assertEqual(
|
| + self.service_connection._required_auth_capability(),
|
| + ['s3']
|
| + )
|
| + self.assertEqual(self.service_connection.host, 's3.amazonaws.com')
|
| +
|
| + def test_sigv4_opt_in(self):
|
| + # Switch it at the config, so we can check to see how the host is
|
| + # handled.
|
| + self.config = {
|
| + 's3': {
|
| + 'use-sigv4': True,
|
| + }
|
| + }
|
| +
|
| + with self.assertRaises(HostRequiredError):
|
| + # No host+SigV4 == KABOOM
|
| + self.connection_class(
|
| + aws_access_key_id='less',
|
| + aws_secret_access_key='more'
|
| + )
|
| +
|
| + # Ensure passing a ``host`` still works.
|
| + conn = self.connection_class(
|
| + aws_access_key_id='less',
|
| + aws_secret_access_key='more',
|
| + host='s3.cn-north-1.amazonaws.com.cn'
|
| + )
|
| + self.assertEqual(
|
| + conn._required_auth_capability(),
|
| + ['hmac-v4-s3']
|
| + )
|
| + self.assertEqual(
|
| + conn.host,
|
| + 's3.cn-north-1.amazonaws.com.cn'
|
| + )
|
| +
|
| +
|
| +class TestSigV4Presigned(MockServiceWithConfigTestCase):
|
| + connection_class = S3Connection
|
| +
|
| + def test_sigv4_presign(self):
|
| + self.config = {
|
| + 's3': {
|
| + 'use-sigv4': True,
|
| + }
|
| + }
|
| +
|
| + conn = self.connection_class(
|
| + aws_access_key_id='less',
|
| + aws_secret_access_key='more',
|
| + host='s3.amazonaws.com'
|
| + )
|
| +
|
| + # Here we force an input iso_date to ensure we always get the
|
| + # same signature.
|
| + url = conn.generate_url_sigv4(86400, 'GET', bucket='examplebucket',
|
| + key='test.txt', iso_date='20140625T000000Z')
|
| +
|
| + self.assertIn('a937f5fbc125d98ac8f04c49e0204ea1526a7b8ca058000a54c192457be05b7d', url)
|
| +
|
| + def test_sigv4_presign_optional_params(self):
|
| + self.config = {
|
| + 's3': {
|
| + 'use-sigv4': True,
|
| + }
|
| + }
|
| +
|
| + conn = self.connection_class(
|
| + aws_access_key_id='less',
|
| + aws_secret_access_key='more',
|
| + security_token='token',
|
| + host='s3.amazonaws.com'
|
| + )
|
| +
|
| + url = conn.generate_url_sigv4(86400, 'GET', bucket='examplebucket',
|
| + key='test.txt', version_id=2)
|
| +
|
| + self.assertIn('VersionId=2', url)
|
| + self.assertIn('X-Amz-Security-Token=token', url)
|
| +
|
| +
|
| class TestUnicodeCallingFormat(AWSMockServiceTestCase):
|
| connection_class = S3Connection
|
|
|
| @@ -78,5 +169,53 @@
|
| self.service_connection.get_all_buckets()
|
|
|
|
|
| +class TestHeadBucket(AWSMockServiceTestCase):
|
| + connection_class = S3Connection
|
| +
|
| + def default_body(self):
|
| + # HEAD requests always have an empty body.
|
| + return ""
|
| +
|
| + def test_head_bucket_success(self):
|
| + self.set_http_response(status_code=200)
|
| + buck = self.service_connection.head_bucket('my-test-bucket')
|
| + self.assertTrue(isinstance(buck, Bucket))
|
| + self.assertEqual(buck.name, 'my-test-bucket')
|
| +
|
| + def test_head_bucket_forbidden(self):
|
| + self.set_http_response(status_code=403)
|
| +
|
| + with self.assertRaises(S3ResponseError) as cm:
|
| + self.service_connection.head_bucket('cant-touch-this')
|
| +
|
| + err = cm.exception
|
| + self.assertEqual(err.status, 403)
|
| + self.assertEqual(err.error_code, 'AccessDenied')
|
| + self.assertEqual(err.message, 'Access Denied')
|
| +
|
| + def test_head_bucket_notfound(self):
|
| + self.set_http_response(status_code=404)
|
| +
|
| + with self.assertRaises(S3ResponseError) as cm:
|
| + self.service_connection.head_bucket('totally-doesnt-exist')
|
| +
|
| + err = cm.exception
|
| + self.assertEqual(err.status, 404)
|
| + self.assertEqual(err.error_code, 'NoSuchBucket')
|
| + self.assertEqual(err.message, 'The specified bucket does not exist')
|
| +
|
| + def test_head_bucket_other(self):
|
| + self.set_http_response(status_code=405)
|
| +
|
| + with self.assertRaises(S3ResponseError) as cm:
|
| + self.service_connection.head_bucket('you-broke-it')
|
| +
|
| + err = cm.exception
|
| + self.assertEqual(err.status, 405)
|
| + # We don't have special-cases for this error status.
|
| + self.assertEqual(err.error_code, None)
|
| + self.assertEqual(err.message, '')
|
| +
|
| +
|
| if __name__ == "__main__":
|
| unittest.main()
|
|
|