port error's response tests
Change-Id: Id0e1e7a6220fa4b7714f7b0ae5b6dcc41400bff1
This commit is contained in:
		
							
								
								
									
										132
									
								
								ec2api/tests/test_error_response.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								ec2api/tests/test_error_response.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,132 @@
 | 
			
		||||
#
 | 
			
		||||
# Copyright 2013 - Red Hat, Inc.
 | 
			
		||||
#
 | 
			
		||||
#    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.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
Unit tests for EC2 error responses.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
from lxml import etree
 | 
			
		||||
from oslotest import base as test_base
 | 
			
		||||
 | 
			
		||||
from ec2api import api as ec2
 | 
			
		||||
from ec2api import context
 | 
			
		||||
from ec2api import wsgi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TestClientExceptionEC2(Exception):
 | 
			
		||||
    ec2_code = 'ClientException.Test'
 | 
			
		||||
    message = "Test Client Exception."
 | 
			
		||||
    code = 400
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TestServerExceptionEC2(Exception):
 | 
			
		||||
    ec2_code = 'ServerException.Test'
 | 
			
		||||
    message = "Test Server Exception."
 | 
			
		||||
    code = 500
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Ec2ErrorResponseTestCase(test_base.BaseTestCase):
 | 
			
		||||
    """Test EC2 error responses.
 | 
			
		||||
 | 
			
		||||
    This deals mostly with api/ec2/__init__.py code, especially
 | 
			
		||||
    the ec2_error_ex helper.
 | 
			
		||||
    """
 | 
			
		||||
    def setUp(self):
 | 
			
		||||
        super(Ec2ErrorResponseTestCase, self).setUp()
 | 
			
		||||
        self.context = context.RequestContext('test_user_id',
 | 
			
		||||
                'test_project_id', None, None)
 | 
			
		||||
        self.req = wsgi.Request.blank('/test')
 | 
			
		||||
        self.req.environ['ec2api.context'] = self.context
 | 
			
		||||
 | 
			
		||||
    def _validate_ec2_error(self, response, http_status, ec2_code, msg=None,
 | 
			
		||||
                            unknown_msg=False):
 | 
			
		||||
        self.assertEqual(response.status_code, http_status,
 | 
			
		||||
                         'Expected HTTP status %s' % http_status)
 | 
			
		||||
        root_e = etree.XML(response.body)
 | 
			
		||||
        self.assertEqual(root_e.tag, 'Response',
 | 
			
		||||
                         "Top element must be Response.")
 | 
			
		||||
        errors_e = root_e.find('Errors')
 | 
			
		||||
        self.assertEqual(len(errors_e), 1,
 | 
			
		||||
                         "Expected exactly one Error element in Errors.")
 | 
			
		||||
        error_e = errors_e[0]
 | 
			
		||||
        self.assertEqual(error_e.tag, 'Error',
 | 
			
		||||
                         "Expected Error element.")
 | 
			
		||||
        # Code
 | 
			
		||||
        code_e = error_e.find('Code')
 | 
			
		||||
        self.assertIsNotNone(code_e, "Code element must be present.")
 | 
			
		||||
        self.assertEqual(code_e.text, ec2_code)
 | 
			
		||||
        # Message
 | 
			
		||||
        if msg or unknown_msg:
 | 
			
		||||
            message_e = error_e.find('Message')
 | 
			
		||||
            self.assertIsNotNone(code_e, "Message element must be present.")
 | 
			
		||||
            if msg:
 | 
			
		||||
                self.assertEqual(message_e.text, msg)
 | 
			
		||||
            elif unknown_msg:
 | 
			
		||||
                self.assertEqual(message_e.text, "Unknown error occurred.",
 | 
			
		||||
                                 "Error message should be anonymous.")
 | 
			
		||||
        # RequestID
 | 
			
		||||
        requestid_e = root_e.find('RequestID')
 | 
			
		||||
        self.assertIsNotNone(requestid_e,
 | 
			
		||||
                             'RequestID element should be present.')
 | 
			
		||||
        self.assertEqual(requestid_e.text, self.context.request_id)
 | 
			
		||||
 | 
			
		||||
    def test_exception_ec2_4xx(self):
 | 
			
		||||
        """Test response to EC2 exception with code = 400."""
 | 
			
		||||
        msg = "Test client failure."
 | 
			
		||||
        err = ec2.ec2_error_ex(TestClientExceptionEC2(msg), self.req)
 | 
			
		||||
        self._validate_ec2_error(err, TestClientExceptionEC2.code,
 | 
			
		||||
                                 TestClientExceptionEC2.ec2_code, msg)
 | 
			
		||||
 | 
			
		||||
    def test_exception_ec2_5xx(self):
 | 
			
		||||
        """Test response to EC2 exception with code = 500.
 | 
			
		||||
 | 
			
		||||
        Expected errors are treated as client ones even with 5xx code.
 | 
			
		||||
        """
 | 
			
		||||
        msg = "Test client failure with 5xx error code."
 | 
			
		||||
        err = ec2.ec2_error_ex(TestServerExceptionEC2(msg), self.req)
 | 
			
		||||
        self._validate_ec2_error(err, 400, TestServerExceptionEC2.ec2_code,
 | 
			
		||||
                                 msg)
 | 
			
		||||
 | 
			
		||||
    def test_unexpected_exception_ec2_4xx(self):
 | 
			
		||||
        """Test response to unexpected EC2 exception with code = 400."""
 | 
			
		||||
        msg = "Test unexpected client failure."
 | 
			
		||||
        err = ec2.ec2_error_ex(TestClientExceptionEC2(msg), self.req,
 | 
			
		||||
                           unexpected=True)
 | 
			
		||||
        self._validate_ec2_error(err, TestClientExceptionEC2.code,
 | 
			
		||||
                                 TestClientExceptionEC2.ec2_code, msg)
 | 
			
		||||
 | 
			
		||||
    def test_unexpected_exception_ec2_5xx(self):
 | 
			
		||||
        """Test response to unexpected EC2 exception with code = 500.
 | 
			
		||||
 | 
			
		||||
        Server exception messages (with code >= 500 or without code) should
 | 
			
		||||
        be filtered as they might contain sensitive information.
 | 
			
		||||
        """
 | 
			
		||||
        msg = "Test server failure."
 | 
			
		||||
        err = ec2.ec2_error_ex(TestServerExceptionEC2(msg), self.req,
 | 
			
		||||
                           unexpected=True)
 | 
			
		||||
        self._validate_ec2_error(err, TestServerExceptionEC2.code,
 | 
			
		||||
                                 TestServerExceptionEC2.ec2_code,
 | 
			
		||||
                                 unknown_msg=True)
 | 
			
		||||
 | 
			
		||||
    def test_unexpected_exception_builtin(self):
 | 
			
		||||
        """Test response to builtin unexpected exception.
 | 
			
		||||
 | 
			
		||||
        Server exception messages (with code >= 500 or without code) should
 | 
			
		||||
        be filtered as they might contain sensitive information.
 | 
			
		||||
        """
 | 
			
		||||
        msg = "Test server failure."
 | 
			
		||||
        err = ec2.ec2_error_ex(RuntimeError(msg), self.req, unexpected=True)
 | 
			
		||||
        self._validate_ec2_error(err, 500, 'RuntimeError', unknown_msg=True)
 | 
			
		||||
		Reference in New Issue
	
	Block a user