summaryrefslogtreecommitdiff
path: root/tests/unit/route53/test_connection.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unit/route53/test_connection.py')
-rw-r--r--tests/unit/route53/test_connection.py133
1 files changed, 124 insertions, 9 deletions
diff --git a/tests/unit/route53/test_connection.py b/tests/unit/route53/test_connection.py
index 16df3747..3c696c7a 100644
--- a/tests/unit/route53/test_connection.py
+++ b/tests/unit/route53/test_connection.py
@@ -20,10 +20,9 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.
#
-from tests.compat import mock, unittest
+from tests.compat import mock
import re
import xml.dom.minidom
-
from boto.exception import BotoServerError
from boto.route53.connection import Route53Connection
from boto.route53.exception import DNSServerError
@@ -33,6 +32,9 @@ from boto.route53.zone import Zone
from nose.plugins.attrib import attr
from tests.unit import AWSMockServiceTestCase
+from boto.compat import six
+urllib = six.moves.urllib
+
@attr(route53=True)
class TestRoute53Connection(AWSMockServiceTestCase):
@@ -52,7 +54,7 @@ class TestRoute53Connection(AWSMockServiceTestCase):
def test_typical_400(self):
self.set_http_response(status_code=400, header=[
- ['Code', 'Throttling'],
+ ['Code', 'AccessDenied'],
])
with self.assertRaises(DNSServerError) as err:
@@ -60,11 +62,22 @@ class TestRoute53Connection(AWSMockServiceTestCase):
self.assertTrue('It failed.' in str(err.exception))
- @mock.patch('time.sleep')
- def test_retryable_400(self, sleep_mock):
+ def test_retryable_400_prior_request_not_complete(self):
+ # Test ability to retry on ``PriorRequestNotComplete``.
self.set_http_response(status_code=400, header=[
['Code', 'PriorRequestNotComplete'],
])
+ self.do_retry_handler()
+
+ def test_retryable_400_throttling(self):
+ # Test ability to rety on ``Throttling``.
+ self.set_http_response(status_code=400, header=[
+ ['Code', 'Throttling'],
+ ])
+ self.do_retry_handler()
+
+ @mock.patch('time.sleep')
+ def do_retry_handler(self, sleep_mock):
def incr_retry_handler(func):
def _wrapper(*args, **kwargs):
@@ -88,6 +101,7 @@ class TestRoute53Connection(AWSMockServiceTestCase):
# Unpatch.
self.service_connection._retry_handler = orig_retry
+
@attr(route53=True)
class TestCreateZoneRoute53(AWSMockServiceTestCase):
connection_class = Route53Connection
@@ -138,6 +152,7 @@ class TestCreateZoneRoute53(AWSMockServiceTestCase):
self.assertEqual(response['CreateHostedZoneResponse']['DelegationSet']['NameServers'],
['ns-100.awsdns-01.com', 'ns-1000.awsdns-01.co.uk', 'ns-1000.awsdns-01.org', 'ns-900.awsdns-01.net'])
+
@attr(route53=True)
class TestGetZoneRoute53(AWSMockServiceTestCase):
connection_class = Route53Connection
@@ -195,6 +210,7 @@ class TestGetZoneRoute53(AWSMockServiceTestCase):
self.assertTrue(isinstance(response, Zone))
self.assertEqual(response.name, "example.com.")
+
@attr(route53=True)
class TestGetHostedZoneRoute53(AWSMockServiceTestCase):
connection_class = Route53Connection
@@ -232,6 +248,7 @@ class TestGetHostedZoneRoute53(AWSMockServiceTestCase):
self.assertEqual(response['GetHostedZoneResponse']['DelegationSet']['NameServers'],
['ns-1000.awsdns-40.org', 'ns-200.awsdns-30.com', 'ns-900.awsdns-50.net', 'ns-1000.awsdns-00.co.uk'])
+
@attr(route53=True)
class TestGetAllRRSetsRoute53(AWSMockServiceTestCase):
connection_class = Route53Connection
@@ -321,10 +338,9 @@ class TestGetAllRRSetsRoute53(AWSMockServiceTestCase):
self.set_http_response(status_code=200)
response = self.service_connection.get_all_rrsets("Z1111", "A", "example.com.")
-
self.assertIn(self.actual_request.path,
- ("/2013-04-01/hostedzone/Z1111/rrset?type=A&name=example.com.",
- "/2013-04-01/hostedzone/Z1111/rrset?name=example.com.&type=A"))
+ ("/2013-04-01/hostedzone/Z1111/rrset?type=A&name=example.com.",
+ "/2013-04-01/hostedzone/Z1111/rrset?name=example.com.&type=A"))
self.assertTrue(isinstance(response, ResourceRecordSets))
self.assertEqual(response.hosted_zone_id, "Z1111")
@@ -371,6 +387,104 @@ class TestGetAllRRSetsRoute53(AWSMockServiceTestCase):
self.assertEqual(healthcheck_record.identifier, 'latency-example-us-west-2-evaluate-health-healthcheck')
self.assertEqual(healthcheck_record.alias_dns_name, 'example-123456-evaluate-health-healthcheck.us-west-2.elb.amazonaws.com.')
+
+@attr(route53=True)
+class TestTruncatedGetAllRRSetsRoute53(AWSMockServiceTestCase):
+ connection_class = Route53Connection
+
+ def setUp(self):
+ super(TestTruncatedGetAllRRSetsRoute53, self).setUp()
+
+ def default_body(self):
+ return b"""
+<ListResourceRecordSetsResponse xmlns="https://route53.amazonaws.com/doc/2013-04-01/">
+ <ResourceRecordSets>
+ <ResourceRecordSet>
+ <Name>example.com.</Name>
+ <Type>NS</Type>
+ <TTL>900</TTL>
+ <ResourceRecords>
+ <ResourceRecord>
+ <Value>ns-91.awsdns-41.co.uk.</Value>
+ </ResourceRecord>
+ <ResourceRecord>
+ <Value>ns-1929.awsdns-93.net.</Value>
+ </ResourceRecord>
+ <ResourceRecord>
+ <Value>ns-12.awsdns-21.org.</Value>
+ </ResourceRecord>
+ <ResourceRecord>
+ <Value>ns-102.awsdns-96.com.</Value>
+ </ResourceRecord>
+ </ResourceRecords>
+ </ResourceRecordSet>
+ <ResourceRecordSet>
+ <Name>example.com.</Name>
+ <Type>SOA</Type>
+ <TTL>1800</TTL>
+ <ResourceRecords>
+ <ResourceRecord>
+ <Value>ns-1929.awsdns-93.net. hostmaster.awsdns.net. 1 10800 3600 604800 1800</Value>
+ </ResourceRecord>
+ </ResourceRecords>
+ </ResourceRecordSet>
+ <ResourceRecordSet>
+ <Name>wrr.example.com.</Name>
+ <Type>A</Type>
+ <SetIdentifier>primary</SetIdentifier>
+ <Weight>100</Weight>
+ <TTL>300</TTL>
+ <ResourceRecords>
+ <ResourceRecord><Value>127.0.0.1</Value></ResourceRecord>
+ </ResourceRecords>
+ </ResourceRecordSet>
+ </ResourceRecordSets>
+ <IsTruncated>true</IsTruncated>
+ <NextRecordName>wrr.example.com.</NextRecordName>
+ <NextRecordType>A</NextRecordType>
+ <NextRecordIdentifier>secondary</NextRecordIdentifier>
+ <MaxItems>3</MaxItems>
+</ListResourceRecordSetsResponse>"""
+
+ def paged_body(self):
+ return b"""
+<ListResourceRecordSetsResponse xmlns="https://route53.amazonaws.com/doc/2013-04-01/">
+ <ResourceRecordSets>
+ <ResourceRecordSet>
+ <Name>wrr.example.com.</Name>
+ <Type>A</Type>
+ <SetIdentifier>secondary</SetIdentifier>
+ <Weight>50</Weight>
+ <TTL>300</TTL>
+ <ResourceRecords>
+ <ResourceRecord><Value>127.0.0.2</Value></ResourceRecord>
+ </ResourceRecords>
+ </ResourceRecordSet>
+ </ResourceRecordSets>
+ <IsTruncated>false</IsTruncated>
+ <MaxItems>3</MaxItems>
+</ListResourceRecordSetsResponse>"""
+
+
+ def test_get_all_rr_sets(self):
+ self.set_http_response(status_code=200)
+ response = self.service_connection.get_all_rrsets("Z1111", maxitems=3)
+
+ # made first request
+ self.assertEqual(self.actual_request.path, '/2013-04-01/hostedzone/Z1111/rrset?maxitems=3')
+
+ # anticipate a second request when we page it
+ self.set_http_response(status_code=200, body=self.paged_body())
+
+ # this should trigger another call to get_all_rrsets
+ self.assertEqual(len(list(response)), 4)
+
+ url_parts = urllib.parse.urlparse(self.actual_request.path)
+ self.assertEqual(url_parts.path, '/2013-04-01/hostedzone/Z1111/rrset')
+ self.assertEqual(urllib.parse.parse_qs(url_parts.query),
+ dict(type=['A'], name=['wrr.example.com.'], identifier=['secondary']))
+
+
@attr(route53=True)
class TestCreateHealthCheckRoute53IpAddress(AWSMockServiceTestCase):
connection_class = Route53Connection
@@ -414,6 +528,7 @@ class TestCreateHealthCheckRoute53IpAddress(AWSMockServiceTestCase):
self.assertEqual(hc_resp['SearchString'], 'OK')
self.assertEqual(response['CreateHealthCheckResponse']['HealthCheck']['Id'], '34778cf8-e31e-4974-bad0-b108bd1623d3')
+
@attr(route53=True)
class TestCreateHealthCheckRoute53FQDN(AWSMockServiceTestCase):
connection_class = Route53Connection
@@ -455,6 +570,7 @@ class TestCreateHealthCheckRoute53FQDN(AWSMockServiceTestCase):
self.assertEqual(hc_resp['ResourcePath'], '/health_check')
self.assertEqual(response['CreateHealthCheckResponse']['HealthCheck']['Id'], 'f9abfe10-8d2a-4bbd-8f35-796f0f8572f2')
+
@attr(route53=True)
class TestChangeResourceRecordSetsRoute53(AWSMockServiceTestCase):
connection_class = Route53Connection
@@ -569,4 +685,3 @@ class TestChangeResourceRecordSetsRoute53(AWSMockServiceTestCase):
# Note: the alias XML should not include the TTL, even if it's specified in the object model
self.assertEqual(actual_xml, expected_xml)
-