Use HTTPretty in S3 test code

Remove the httplib specific mocks that are used within the S3
middleware. This won't work when we convert S3 middleware to use the
requests library.

Change-Id: Iee5f3089286c980bef3a19dc9d5068399946e217
Related-Bug: #1275598
This commit is contained in:
Jamie Lennox
2014-02-03 13:07:36 +10:00
parent eab811c307
commit 7736825235

View File

@@ -14,21 +14,18 @@
# License for the specific language governing permissions and limitations
# under the License.
import httpretty
import mock
import testtools
import webob
from keystoneclient.middleware import s3_token
from keystoneclient.openstack.common import jsonutils
from keystoneclient.tests import utils
class FakeHTTPResponse(object):
def __init__(self, status, body):
self.status = status
self.body = body
self.reason = ""
def read(self):
return self.body
GOOD_RESPONSE = {'access': {'token': {'id': 'TOKEN_ID',
'tenant': {'id': 'TENANT_ID'}}}}
class FakeApp(object):
@@ -39,47 +36,41 @@ class FakeApp(object):
return resp(env, start_response)
class FakeHTTPConnection(object):
def __init__(self, *args):
return
class S3TokenMiddlewareTestBase(utils.TestCase):
def getresponse(self):
return self.resp
TEST_PROTOCOL = 'https'
TEST_HOST = 'fakehost'
TEST_PORT = 35357
TEST_URL = '%s://%s:%d/v2.0/s3tokens' % (TEST_PROTOCOL,
TEST_HOST,
TEST_PORT)
def close(self):
pass
def request(self, method, path, **kwargs):
pass
class S3TokenMiddlewareTestBase(testtools.TestCase):
def setUp(self):
super(S3TokenMiddlewareTestBase, self).setUp()
self.conf = {
'auth_host': self.TEST_HOST,
'auth_port': self.TEST_PORT,
'auth_protocol': self.TEST_PROTOCOL,
}
httpretty.reset()
httpretty.enable()
self.addCleanup(httpretty.disable)
def start_fake_response(self, status, headers):
self.response_status = int(status.split(' ', 1)[0])
self.response_headers = dict(headers)
def good_request(cls, method, path, **kwargs):
cls.status = 201
ret = {'access': {'token':
{'id': 'TOKEN_ID',
'tenant': {'id': 'TENANT_ID'}}}}
body = jsonutils.dumps(ret)
cls.resp = FakeHTTPResponse(cls.status, body)
class S3TokenMiddlewareTestGood(S3TokenMiddlewareTestBase):
def setup_middleware_fake(self):
self.middleware.http_client_class = FakeHTTPConnection
self.middleware.http_client_class.request = good_request
def setUp(self):
self.middleware = s3_token.S3Token(FakeApp(), {})
self.setup_middleware_fake()
super(S3TokenMiddlewareTestGood, self).setUp()
self.middleware = s3_token.S3Token(FakeApp(), self.conf)
httpretty.register_uri(httpretty.POST, self.TEST_URL,
status=201, body=jsonutils.dumps(GOOD_RESPONSE))
# Ignore the request and pass to the next middleware in the
# pipeline if no path has been specified.
@@ -111,8 +102,9 @@ class S3TokenMiddlewareTestGood(S3TokenMiddlewareTestBase):
def test_authorized_http(self):
self.middleware = (
s3_token.filter_factory({'auth_protocol': 'http'})(FakeApp()))
self.setup_middleware_fake()
s3_token.filter_factory({'auth_protocol': 'http',
'auth_host': self.TEST_HOST,
'auth_port': self.TEST_PORT})(FakeApp()))
req = webob.Request.blank('/v1/AUTH_cfa/c/o')
req.headers['Authorization'] = 'access:signature'
req.headers['X-Storage-Token'] = 'token'
@@ -131,24 +123,19 @@ class S3TokenMiddlewareTestGood(S3TokenMiddlewareTestBase):
class S3TokenMiddlewareTestBad(S3TokenMiddlewareTestBase):
def setUp(self):
self.middleware = s3_token.S3Token(FakeApp(), {})
self.middleware.http_client_class = FakeHTTPConnection
super(S3TokenMiddlewareTestBad, self).setUp()
self.middleware = s3_token.S3Token(FakeApp(), self.conf)
def test_unauthorized_token(self):
def request(self, method, path, **kwargs):
ret = {"error":
{"message": "EC2 access key not found.",
"code": 401,
"title": "Unauthorized"}}
body = jsonutils.dumps(ret)
self.status = 403
self.resp = FakeHTTPResponse(self.status, body)
ret = {"error":
{"message": "EC2 access key not found.",
"code": 401,
"title": "Unauthorized"}}
httpretty.register_uri(httpretty.POST, self.TEST_URL,
status=403, body=jsonutils.dumps(ret))
req = webob.Request.blank('/v1/AUTH_cfa/c/o')
req.headers['Authorization'] = 'access:signature'
req.headers['X-Storage-Token'] = 'token'
self.middleware.http_client_class.request = request
resp = req.get_response(self.middleware)
s3_denied_req = self.middleware.deny_request('AccessDenied')
self.assertEqual(resp.body, s3_denied_req.body)
@@ -165,29 +152,24 @@ class S3TokenMiddlewareTestBad(S3TokenMiddlewareTestBase):
self.assertEqual(resp.status_int, s3_invalid_req.status_int)
def test_fail_to_connect_to_keystone(self):
def request(self, method, path, **kwargs):
raise s3_token.ServiceError
self.middleware.http_client_class.request = request
with mock.patch.object(self.middleware, '_json_request') as o:
s3_invalid_req = self.middleware.deny_request('InvalidURI')
o.side_effect = s3_token.ServiceError(s3_invalid_req)
req = webob.Request.blank('/v1/AUTH_cfa/c/o')
req.headers['Authorization'] = 'access:signature'
req.headers['X-Storage-Token'] = 'token'
self.middleware.http_client_class.status = 503
resp = req.get_response(self.middleware)
s3_invalid_req = self.middleware.deny_request('InvalidURI')
self.assertEqual(resp.body, s3_invalid_req.body)
self.assertEqual(resp.status_int, s3_invalid_req.status_int)
req = webob.Request.blank('/v1/AUTH_cfa/c/o')
req.headers['Authorization'] = 'access:signature'
req.headers['X-Storage-Token'] = 'token'
resp = req.get_response(self.middleware)
self.assertEqual(resp.body, s3_invalid_req.body)
self.assertEqual(resp.status_int, s3_invalid_req.status_int)
def test_bad_reply(self):
def request(self, method, path, **kwargs):
body = "<badreply>"
self.status = 201
self.resp = FakeHTTPResponse(self.status, body)
httpretty.register_uri(httpretty.POST, self.TEST_URL,
status=201, body="<badreply>")
req = webob.Request.blank('/v1/AUTH_cfa/c/o')
req.headers['Authorization'] = 'access:signature'
req.headers['X-Storage-Token'] = 'token'
self.middleware.http_client_class.request = request
resp = req.get_response(self.middleware)
s3_invalid_req = self.middleware.deny_request('InvalidURI')
self.assertEqual(resp.body, s3_invalid_req.body)