1from tests.unit import unittest
2from tests.unit import AWSMockServiceTestCase
3
4from boto.cloudfront import CloudFrontConnection
5from boto.cloudfront.distribution import Distribution, DistributionConfig, DistributionSummary
6from boto.cloudfront.origin import CustomOrigin
7
8
9class TestCloudFrontConnection(AWSMockServiceTestCase):
10    connection_class = CloudFrontConnection
11
12    def setUp(self):
13        super(TestCloudFrontConnection, self).setUp()
14
15    def test_get_all_distributions(self):
16        body = b"""
17        <DistributionList xmlns="http://cloudfront.amazonaws.com/doc/2010-11-01/">
18            <Marker></Marker>
19            <MaxItems>100</MaxItems>
20            <IsTruncated>false</IsTruncated>
21            <DistributionSummary>
22                <Id>EEEEEEEEEEEEE</Id>
23                <Status>InProgress</Status>
24                <LastModifiedTime>2014-02-03T11:03:41.087Z</LastModifiedTime>
25                <DomainName>abcdef12345678.cloudfront.net</DomainName>
26                <CustomOrigin>
27                    <DNSName>example.com</DNSName>
28                    <HTTPPort>80</HTTPPort>
29                    <HTTPSPort>443</HTTPSPort>
30                    <OriginProtocolPolicy>http-only</OriginProtocolPolicy>
31                </CustomOrigin>
32                <CNAME>static.example.com</CNAME>
33                <Enabled>true</Enabled>
34            </DistributionSummary>
35        </DistributionList>
36        """
37        self.set_http_response(status_code=200, body=body)
38        response = self.service_connection.get_all_distributions()
39
40        self.assertTrue(isinstance(response, list))
41        self.assertEqual(len(response), 1)
42        self.assertTrue(isinstance(response[0], DistributionSummary))
43        self.assertEqual(response[0].id, "EEEEEEEEEEEEE")
44        self.assertEqual(response[0].domain_name, "abcdef12345678.cloudfront.net")
45        self.assertEqual(response[0].status, "InProgress")
46        self.assertEqual(response[0].cnames, ["static.example.com"])
47        self.assertEqual(response[0].enabled, True)
48        self.assertTrue(isinstance(response[0].origin, CustomOrigin))
49        self.assertEqual(response[0].origin.dns_name, "example.com")
50        self.assertEqual(response[0].origin.http_port, 80)
51        self.assertEqual(response[0].origin.https_port, 443)
52        self.assertEqual(response[0].origin.origin_protocol_policy, 'http-only')
53
54    def test_get_distribution_config(self):
55        body = b"""
56        <DistributionConfig xmlns="http://cloudfront.amazonaws.com/doc/2010-11-01/">
57        <CustomOrigin>
58            <DNSName>example.com</DNSName>
59            <HTTPPort>80</HTTPPort>
60            <HTTPSPort>443</HTTPSPort>
61            <OriginProtocolPolicy>http-only</OriginProtocolPolicy>
62        </CustomOrigin>
63        <CallerReference>1234567890123</CallerReference>
64        <CNAME>static.example.com</CNAME>
65        <Enabled>true</Enabled>
66        </DistributionConfig>
67        """
68
69        self.set_http_response(status_code=200, body=body, header={"Etag": "AABBCC"})
70        response = self.service_connection.get_distribution_config('EEEEEEEEEEEEE')
71
72        self.assertTrue(isinstance(response, DistributionConfig))
73        self.assertTrue(isinstance(response.origin, CustomOrigin))
74        self.assertEqual(response.origin.dns_name, "example.com")
75        self.assertEqual(response.origin.http_port, 80)
76        self.assertEqual(response.origin.https_port, 443)
77        self.assertEqual(response.origin.origin_protocol_policy, "http-only")
78        self.assertEqual(response.cnames, ["static.example.com"])
79        self.assertTrue(response.enabled)
80        self.assertEqual(response.etag, "AABBCC")
81
82    def test_set_distribution_config(self):
83        get_body = b"""
84        <DistributionConfig xmlns="http://cloudfront.amazonaws.com/doc/2010-11-01/">
85        <CustomOrigin>
86            <DNSName>example.com</DNSName>
87            <HTTPPort>80</HTTPPort>
88            <HTTPSPort>443</HTTPSPort>
89            <OriginProtocolPolicy>http-only</OriginProtocolPolicy>
90        </CustomOrigin>
91        <CallerReference>1234567890123</CallerReference>
92        <CNAME>static.example.com</CNAME>
93        <Enabled>true</Enabled>
94        </DistributionConfig>
95        """
96
97        put_body = b"""
98        <Distribution xmlns="http://cloudfront.amazonaws.com/doc/2010-11-01/">
99            <Id>EEEEEE</Id>
100            <Status>InProgress</Status>
101            <LastModifiedTime>2014-02-04T10:47:53.493Z</LastModifiedTime>
102            <InProgressInvalidationBatches>0</InProgressInvalidationBatches>
103            <DomainName>d2000000000000.cloudfront.net</DomainName>
104            <DistributionConfig>
105                <CustomOrigin>
106                    <DNSName>example.com</DNSName>
107                    <HTTPPort>80</HTTPPort>
108                    <HTTPSPort>443</HTTPSPort>
109                    <OriginProtocolPolicy>match-viewer</OriginProtocolPolicy>
110                </CustomOrigin>
111                <CallerReference>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</CallerReference>
112                <Comment>this is a comment</Comment>
113                <Enabled>false</Enabled>
114            </DistributionConfig>
115        </Distribution>
116        """
117
118        self.set_http_response(status_code=200, body=get_body, header={"Etag": "AA"})
119        conf = self.service_connection.get_distribution_config('EEEEEEE')
120
121        self.set_http_response(status_code=200, body=put_body, header={"Etag": "AABBCCD"})
122        conf.comment = 'this is a comment'
123        response = self.service_connection.set_distribution_config('EEEEEEE', conf.etag, conf)
124
125        self.assertEqual(response, "AABBCCD")
126
127    def test_get_distribution_info(self):
128        body = b"""
129        <Distribution xmlns="http://cloudfront.amazonaws.com/doc/2010-11-01/">
130            <Id>EEEEEEEEEEEEE</Id>
131            <Status>InProgress</Status>
132            <LastModifiedTime>2014-02-03T11:03:41.087Z</LastModifiedTime>
133            <InProgressInvalidationBatches>0</InProgressInvalidationBatches>
134            <DomainName>abcdef12345678.cloudfront.net</DomainName>
135            <DistributionConfig>
136                <CustomOrigin>
137                    <DNSName>example.com</DNSName>
138                    <HTTPPort>80</HTTPPort>
139                    <HTTPSPort>443</HTTPSPort>
140                    <OriginProtocolPolicy>http-only</OriginProtocolPolicy>
141                </CustomOrigin>
142                <CallerReference>1111111111111</CallerReference>
143                <CNAME>static.example.com</CNAME>
144                <Enabled>true</Enabled>
145            </DistributionConfig>
146        </Distribution>
147        """
148
149        self.set_http_response(status_code=200, body=body)
150        response = self.service_connection.get_distribution_info('EEEEEEEEEEEEE')
151
152        self.assertTrue(isinstance(response, Distribution))
153        self.assertTrue(isinstance(response.config, DistributionConfig))
154        self.assertTrue(isinstance(response.config.origin, CustomOrigin))
155        self.assertEqual(response.config.origin.dns_name, "example.com")
156        self.assertEqual(response.config.origin.http_port, 80)
157        self.assertEqual(response.config.origin.https_port, 443)
158        self.assertEqual(response.config.origin.origin_protocol_policy, "http-only")
159        self.assertEqual(response.config.cnames, ["static.example.com"])
160        self.assertTrue(response.config.enabled)
161        self.assertEqual(response.id, "EEEEEEEEEEEEE")
162        self.assertEqual(response.status, "InProgress")
163        self.assertEqual(response.domain_name, "abcdef12345678.cloudfront.net")
164        self.assertEqual(response.in_progress_invalidation_batches, 0)
165
166    def test_create_distribution(self):
167        body = b"""
168        <Distribution xmlns="http://cloudfront.amazonaws.com/doc/2010-11-01/">
169            <Id>EEEEEEEEEEEEEE</Id>
170            <Status>InProgress</Status>
171            <LastModifiedTime>2014-02-04T10:34:07.873Z</LastModifiedTime>
172            <InProgressInvalidationBatches>0</InProgressInvalidationBatches>
173            <DomainName>d2000000000000.cloudfront.net</DomainName>
174            <DistributionConfig>
175                <CustomOrigin>
176                    <DNSName>example.com</DNSName>
177                    <HTTPPort>80</HTTPPort>
178                    <HTTPSPort>443</HTTPSPort>
179                    <OriginProtocolPolicy>match-viewer</OriginProtocolPolicy>
180                </CustomOrigin>
181                <CallerReference>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</CallerReference>
182                <Comment>example.com distribution</Comment>
183                <Enabled>false</Enabled>
184            </DistributionConfig>
185        </Distribution>
186        """
187
188        self.set_http_response(status_code=201, body=body)
189        origin = CustomOrigin("example.com", origin_protocol_policy="match_viewer")
190        response = self.service_connection.create_distribution(origin, enabled=False, comment="example.com distribution")
191
192        self.assertTrue(isinstance(response, Distribution))
193        self.assertTrue(isinstance(response.config, DistributionConfig))
194        self.assertTrue(isinstance(response.config.origin, CustomOrigin))
195        self.assertEqual(response.config.origin.dns_name, "example.com")
196        self.assertEqual(response.config.origin.http_port, 80)
197        self.assertEqual(response.config.origin.https_port, 443)
198        self.assertEqual(response.config.origin.origin_protocol_policy, "match-viewer")
199        self.assertEqual(response.config.cnames, [])
200        self.assertTrue(not response.config.enabled)
201        self.assertEqual(response.id, "EEEEEEEEEEEEEE")
202        self.assertEqual(response.status, "InProgress")
203        self.assertEqual(response.domain_name, "d2000000000000.cloudfront.net")
204        self.assertEqual(response.in_progress_invalidation_batches, 0)
205