1from tests.unit import unittest 2 3from boto.exception import BotoServerError, S3CreateError, JSONResponseError 4 5from httpretty import HTTPretty, httprettified 6 7 8class TestBotoServerError(unittest.TestCase): 9 10 def test_botoservererror_basics(self): 11 bse = BotoServerError('400', 'Bad Request') 12 self.assertEqual(bse.status, '400') 13 self.assertEqual(bse.reason, 'Bad Request') 14 15 def test_message_elb_xml(self): 16 # This test XML response comes from #509 17 xml = """ 18<ErrorResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2011-11-15/"> 19 <Error> 20 <Type>Sender</Type> 21 <Code>LoadBalancerNotFound</Code> 22 <Message>Cannot find Load Balancer webapp-balancer2</Message> 23 </Error> 24 <RequestId>093f80d0-4473-11e1-9234-edce8ec08e2d</RequestId> 25</ErrorResponse>""" 26 bse = BotoServerError('400', 'Bad Request', body=xml) 27 28 self.assertEqual(bse.error_message, 'Cannot find Load Balancer webapp-balancer2') 29 self.assertEqual(bse.error_message, bse.message) 30 self.assertEqual(bse.request_id, '093f80d0-4473-11e1-9234-edce8ec08e2d') 31 self.assertEqual(bse.error_code, 'LoadBalancerNotFound') 32 self.assertEqual(bse.status, '400') 33 self.assertEqual(bse.reason, 'Bad Request') 34 35 def test_message_sd_xml(self): 36 # Sample XML response from: https://forums.aws.amazon.com/thread.jspa?threadID=87393 37 xml = """ 38<Response> 39 <Errors> 40 <Error> 41 <Code>AuthorizationFailure</Code> 42 <Message>Session does not have permission to perform (sdb:CreateDomain) on resource (arn:aws:sdb:us-east-1:xxxxxxx:domain/test_domain). Contact account owner.</Message> 43 <BoxUsage>0.0055590278</BoxUsage> 44 </Error> 45 </Errors> 46 <RequestID>e73bb2bb-63e3-9cdc-f220-6332de66dbbe</RequestID> 47</Response>""" 48 bse = BotoServerError('403', 'Forbidden', body=xml) 49 self.assertEqual( 50 bse.error_message, 51 'Session does not have permission to perform (sdb:CreateDomain) on ' 52 'resource (arn:aws:sdb:us-east-1:xxxxxxx:domain/test_domain). ' 53 'Contact account owner.') 54 self.assertEqual(bse.error_message, bse.message) 55 self.assertEqual(bse.box_usage, '0.0055590278') 56 self.assertEqual(bse.error_code, 'AuthorizationFailure') 57 self.assertEqual(bse.status, '403') 58 self.assertEqual(bse.reason, 'Forbidden') 59 60 @httprettified 61 def test_xmlns_not_loaded(self): 62 xml = '<ErrorResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2011-11-15/">' 63 bse = BotoServerError('403', 'Forbidden', body=xml) 64 self.assertEqual([], HTTPretty.latest_requests) 65 66 @httprettified 67 def test_xml_entity_not_loaded(self): 68 xml = '<!DOCTYPE Message [<!ENTITY xxe SYSTEM "http://aws.amazon.com/">]><Message>error:&xxe;</Message>' 69 bse = BotoServerError('403', 'Forbidden', body=xml) 70 self.assertEqual([], HTTPretty.latest_requests) 71 72 def test_message_storage_create_error(self): 73 # This test value comes from https://answers.launchpad.net/duplicity/+question/150801 74 xml = """<?xml version="1.0" encoding="UTF-8"?> 75<Error> 76 <Code>BucketAlreadyOwnedByYou</Code> 77 <Message>Your previous request to create the named bucket succeeded and you already own it.</Message> 78 <BucketName>cmsbk</BucketName> 79 <RequestId>FF8B86A32CC3FE4F</RequestId> 80 <HostId>6ENGL3DT9f0n7Tkv4qdKIs/uBNCMMA6QUFapw265WmodFDluP57esOOkecp55qhh</HostId> 81</Error> 82""" 83 s3ce = S3CreateError('409', 'Conflict', body=xml) 84 85 self.assertEqual(s3ce.bucket, 'cmsbk') 86 self.assertEqual(s3ce.error_code, 'BucketAlreadyOwnedByYou') 87 self.assertEqual(s3ce.status, '409') 88 self.assertEqual(s3ce.reason, 'Conflict') 89 self.assertEqual( 90 s3ce.error_message, 91 'Your previous request to create the named bucket succeeded ' 92 'and you already own it.') 93 self.assertEqual(s3ce.error_message, s3ce.message) 94 self.assertEqual(s3ce.request_id, 'FF8B86A32CC3FE4F') 95 96 def test_message_json_response_error(self): 97 # This test comes from https://forums.aws.amazon.com/thread.jspa?messageID=374936 98 body = { 99 '__type': 'com.amazon.coral.validate#ValidationException', 100 'message': 'The attempted filter operation is not supported ' 101 'for the provided filter argument count'} 102 103 jre = JSONResponseError('400', 'Bad Request', body=body) 104 105 self.assertEqual(jre.status, '400') 106 self.assertEqual(jre.reason, 'Bad Request') 107 self.assertEqual(jre.error_message, body['message']) 108 self.assertEqual(jre.error_message, jre.message) 109 self.assertEqual(jre.code, 'ValidationException') 110 self.assertEqual(jre.code, jre.error_code) 111 112 def test_message_not_xml(self): 113 body = 'This is not XML' 114 115 bse = BotoServerError('400', 'Bad Request', body=body) 116 self.assertEqual(bse.error_message, 'This is not XML') 117 118 def test_getters(self): 119 body = "This is the body" 120 121 bse = BotoServerError('400', 'Bad Request', body=body) 122 self.assertEqual(bse.code, bse.error_code) 123 self.assertEqual(bse.message, bse.error_message) 124