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