summaryrefslogtreecommitdiff
path: root/keystoneclient/tests/unit/test_ec2utils.py
diff options
context:
space:
mode:
authorJamie Lennox <jamielennox@redhat.com>2015-02-11 19:03:25 +1100
committerJamie Lennox <jamielennox@redhat.com>2015-02-11 19:03:25 +1100
commit6bd93179a2966f2b5c67e297628510ac73689fb3 (patch)
treefaf3a93a16fb49b4a742f74b6fcdd20f8a0ebd0e /keystoneclient/tests/unit/test_ec2utils.py
parent58ac2de5d4a6b58e8bd5d430a04199a4d40427a8 (diff)
downloadpython-keystoneclient-6bd93179a2966f2b5c67e297628510ac73689fb3.tar.gz
Move tests to the unit subdirectory
Move all the existing tests to the unit/ subdirectory. This gives us some room to add a functional/ directory later with other tests. Change-Id: I0fb8d5b628eb8ee1f35f05f42d0c0ac9f285e8c3 Implements: functional-testing
Diffstat (limited to 'keystoneclient/tests/unit/test_ec2utils.py')
-rw-r--r--keystoneclient/tests/unit/test_ec2utils.py262
1 files changed, 262 insertions, 0 deletions
diff --git a/keystoneclient/tests/unit/test_ec2utils.py b/keystoneclient/tests/unit/test_ec2utils.py
new file mode 100644
index 0000000..71fc176
--- /dev/null
+++ b/keystoneclient/tests/unit/test_ec2utils.py
@@ -0,0 +1,262 @@
+# Copyright 2012 OpenStack Foundation
+#
+# 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.
+
+from __future__ import unicode_literals
+
+import testtools
+
+from keystoneclient.contrib.ec2 import utils
+
+
+class Ec2SignerTest(testtools.TestCase):
+
+ def setUp(self):
+ super(Ec2SignerTest, self).setUp()
+ self.access = '966afbde20b84200ae4e62e09acf46b2'
+ self.secret = '89cdf9e94e2643cab35b8b8ac5a51f83'
+ self.signer = utils.Ec2Signer(self.secret)
+
+ def test_v4_creds_header(self):
+ auth_str = 'AWS4-HMAC-SHA256 blah'
+ credentials = {'host': '127.0.0.1',
+ 'verb': 'GET',
+ 'path': '/v1/',
+ 'params': {},
+ 'headers': {'Authorization': auth_str}}
+ self.assertTrue(self.signer._v4_creds(credentials))
+
+ def test_v4_creds_param(self):
+ credentials = {'host': '127.0.0.1',
+ 'verb': 'GET',
+ 'path': '/v1/',
+ 'params': {'X-Amz-Algorithm': 'AWS4-HMAC-SHA256'},
+ 'headers': {}}
+ self.assertTrue(self.signer._v4_creds(credentials))
+
+ def test_v4_creds_false(self):
+ credentials = {'host': '127.0.0.1',
+ 'verb': 'GET',
+ 'path': '/v1/',
+ 'params': {'SignatureVersion': '0',
+ 'AWSAccessKeyId': self.access,
+ 'Timestamp': '2012-11-27T11:47:02Z',
+ 'Action': 'Foo'}}
+ self.assertFalse(self.signer._v4_creds(credentials))
+
+ def test_generate_0(self):
+ """Test generate function for v0 signature."""
+ credentials = {'host': '127.0.0.1',
+ 'verb': 'GET',
+ 'path': '/v1/',
+ 'params': {'SignatureVersion': '0',
+ 'AWSAccessKeyId': self.access,
+ 'Timestamp': '2012-11-27T11:47:02Z',
+ 'Action': 'Foo'}}
+ signature = self.signer.generate(credentials)
+ expected = 'SmXQEZAUdQw5glv5mX8mmixBtas='
+ self.assertEqual(signature, expected)
+
+ def test_generate_1(self):
+ """Test generate function for v1 signature."""
+ credentials = {'host': '127.0.0.1',
+ 'verb': 'GET',
+ 'path': '/v1/',
+ 'params': {'SignatureVersion': '1',
+ 'AWSAccessKeyId': self.access}}
+ signature = self.signer.generate(credentials)
+ expected = 'VRnoQH/EhVTTLhwRLfuL7jmFW9c='
+ self.assertEqual(signature, expected)
+
+ def test_generate_v2_SHA256(self):
+ """Test generate function for v2 signature, SHA256."""
+ credentials = {'host': '127.0.0.1',
+ 'verb': 'GET',
+ 'path': '/v1/',
+ 'params': {'SignatureVersion': '2',
+ 'AWSAccessKeyId': self.access}}
+ signature = self.signer.generate(credentials)
+ expected = 'odsGmT811GffUO0Eu13Pq+xTzKNIjJ6NhgZU74tYX/w='
+ self.assertEqual(signature, expected)
+
+ def test_generate_v2_SHA1(self):
+ """Test generate function for v2 signature, SHA1."""
+ credentials = {'host': '127.0.0.1',
+ 'verb': 'GET',
+ 'path': '/v1/',
+ 'params': {'SignatureVersion': '2',
+ 'AWSAccessKeyId': self.access}}
+ self.signer.hmac_256 = None
+ signature = self.signer.generate(credentials)
+ expected = 'ZqCxMI4ZtTXWI175743mJ0hy/Gc='
+ self.assertEqual(signature, expected)
+
+ def test_generate_v4(self):
+ """Test v4 generator with data from AWS docs example.
+
+ see:
+ http://docs.aws.amazon.com/general/latest/gr/
+ sigv4-create-canonical-request.html
+ and
+ http://docs.aws.amazon.com/general/latest/gr/
+ sigv4-signed-request-examples.html
+ """
+ # Create a new signer object with the AWS example key
+ secret = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'
+ signer = utils.Ec2Signer(secret)
+
+ body_hash = ('b6359072c78d70ebee1e81adcbab4f0'
+ '1bf2c23245fa365ef83fe8f1f955085e2')
+ auth_str = ('AWS4-HMAC-SHA256 '
+ 'Credential=AKIAIOSFODNN7EXAMPLE/20110909/'
+ 'us-east-1/iam/aws4_request,'
+ 'SignedHeaders=content-type;host;x-amz-date,')
+ headers = {'Content-type':
+ 'application/x-www-form-urlencoded; charset=utf-8',
+ 'X-Amz-Date': '20110909T233600Z',
+ 'Host': 'iam.amazonaws.com',
+ 'Authorization': auth_str}
+ # Note the example in the AWS docs is inconsistent, previous
+ # examples specify no query string, but the final POST example
+ # does, apparently incorrectly since an empty parameter list
+ # aligns all steps and the final signature with the examples
+ params = {'Action': 'CreateUser',
+ 'UserName': 'NewUser',
+ 'Version': '2010-05-08',
+ 'X-Amz-Algorithm': 'AWS4-HMAC-SHA256',
+ 'X-Amz-Credential': 'AKIAEXAMPLE/20140611/'
+ 'us-east-1/iam/aws4_request',
+ 'X-Amz-Date': '20140611T231318Z',
+ 'X-Amz-Expires': '30',
+ 'X-Amz-SignedHeaders': 'host',
+ 'X-Amz-Signature': 'ced6826de92d2bdeed8f846f0bf508e8'
+ '559e98e4b0199114b84c54174deb456c'}
+ credentials = {'host': 'iam.amazonaws.com',
+ 'verb': 'POST',
+ 'path': '/',
+ 'params': params,
+ 'headers': headers,
+ 'body_hash': body_hash}
+ signature = signer.generate(credentials)
+ expected = ('ced6826de92d2bdeed8f846f0bf508e8'
+ '559e98e4b0199114b84c54174deb456c')
+ self.assertEqual(signature, expected)
+
+ def test_generate_v4_port(self):
+ """Test v4 generator with host:port format."""
+ # Create a new signer object with the AWS example key
+ secret = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'
+ signer = utils.Ec2Signer(secret)
+
+ body_hash = ('b6359072c78d70ebee1e81adcbab4f0'
+ '1bf2c23245fa365ef83fe8f1f955085e2')
+ auth_str = ('AWS4-HMAC-SHA256 '
+ 'Credential=AKIAIOSFODNN7EXAMPLE/20110909/'
+ 'us-east-1/iam/aws4_request,'
+ 'SignedHeaders=content-type;host;x-amz-date,')
+ headers = {'Content-type':
+ 'application/x-www-form-urlencoded; charset=utf-8',
+ 'X-Amz-Date': '20110909T233600Z',
+ 'Host': 'foo:8000',
+ 'Authorization': auth_str}
+ # Note the example in the AWS docs is inconsistent, previous
+ # examples specify no query string, but the final POST example
+ # does, apparently incorrectly since an empty parameter list
+ # aligns all steps and the final signature with the examples
+ params = {}
+ credentials = {'host': 'foo:8000',
+ 'verb': 'POST',
+ 'path': '/',
+ 'params': params,
+ 'headers': headers,
+ 'body_hash': body_hash}
+ signature = signer.generate(credentials)
+
+ expected = ('26dd92ea79aaa49f533d13b1055acdc'
+ 'd7d7321460d64621f96cc79c4f4d4ab2b')
+ self.assertEqual(signature, expected)
+
+ def test_generate_v4_port_strip(self):
+ """Test v4 generator with host:port format, but for an old
+ (<2.9.3) version of boto, where the port should be stripped
+ to match boto behavior.
+ """
+ # Create a new signer object with the AWS example key
+ secret = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'
+ signer = utils.Ec2Signer(secret)
+
+ body_hash = ('b6359072c78d70ebee1e81adcbab4f0'
+ '1bf2c23245fa365ef83fe8f1f955085e2')
+ auth_str = ('AWS4-HMAC-SHA256 '
+ 'Credential=AKIAIOSFODNN7EXAMPLE/20110909/'
+ 'us-east-1/iam/aws4_request,'
+ 'SignedHeaders=content-type;host;x-amz-date,')
+ headers = {'Content-type':
+ 'application/x-www-form-urlencoded; charset=utf-8',
+ 'X-Amz-Date': '20110909T233600Z',
+ 'Host': 'foo:8000',
+ 'Authorization': auth_str,
+ 'User-Agent': 'Boto/2.9.2 (linux2)'}
+ # Note the example in the AWS docs is inconsistent, previous
+ # examples specify no query string, but the final POST example
+ # does, apparently incorrectly since an empty parameter list
+ # aligns all steps and the final signature with the examples
+ params = {}
+ credentials = {'host': 'foo:8000',
+ 'verb': 'POST',
+ 'path': '/',
+ 'params': params,
+ 'headers': headers,
+ 'body_hash': body_hash}
+ signature = signer.generate(credentials)
+
+ expected = ('9a4b2276a5039ada3b90f72ea8ec1745'
+ '14b92b909fb106b22ad910c5d75a54f4')
+ self.assertEqual(expected, signature)
+
+ def test_generate_v4_port_nostrip(self):
+ """Test v4 generator with host:port format, but for an new
+ (>=2.9.3) version of boto, where the port should not be stripped.
+ """
+ # Create a new signer object with the AWS example key
+ secret = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'
+ signer = utils.Ec2Signer(secret)
+
+ body_hash = ('b6359072c78d70ebee1e81adcbab4f0'
+ '1bf2c23245fa365ef83fe8f1f955085e2')
+ auth_str = ('AWS4-HMAC-SHA256 '
+ 'Credential=AKIAIOSFODNN7EXAMPLE/20110909/'
+ 'us-east-1/iam/aws4_request,'
+ 'SignedHeaders=content-type;host;x-amz-date,')
+ headers = {'Content-type':
+ 'application/x-www-form-urlencoded; charset=utf-8',
+ 'X-Amz-Date': '20110909T233600Z',
+ 'Host': 'foo:8000',
+ 'Authorization': auth_str,
+ 'User-Agent': 'Boto/2.9.3 (linux2)'}
+ # Note the example in the AWS docs is inconsistent, previous
+ # examples specify no query string, but the final POST example
+ # does, apparently incorrectly since an empty parameter list
+ # aligns all steps and the final signature with the examples
+ params = {}
+ credentials = {'host': 'foo:8000',
+ 'verb': 'POST',
+ 'path': '/',
+ 'params': params,
+ 'headers': headers,
+ 'body_hash': body_hash}
+ signature = signer.generate(credentials)
+
+ expected = ('26dd92ea79aaa49f533d13b1055acdc'
+ 'd7d7321460d64621f96cc79c4f4d4ab2b')
+ self.assertEqual(expected, signature)