summaryrefslogtreecommitdiff
path: root/test/unit/common/middleware/test_cname_lookup.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/unit/common/middleware/test_cname_lookup.py')
-rw-r--r--test/unit/common/middleware/test_cname_lookup.py166
1 files changed, 166 insertions, 0 deletions
diff --git a/test/unit/common/middleware/test_cname_lookup.py b/test/unit/common/middleware/test_cname_lookup.py
new file mode 100644
index 000000000..12ab7ad1f
--- /dev/null
+++ b/test/unit/common/middleware/test_cname_lookup.py
@@ -0,0 +1,166 @@
+# Copyright (c) 2010-2012 OpenStack, LLC.
+#
+# 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.
+
+import unittest
+from nose import SkipTest
+
+from webob import Request
+
+try:
+ # this test requires the dnspython package to be installed
+ import dns.resolver
+except ImportError:
+ skip = True
+else: # executed if the try has no errors
+ skip = False
+from swift.common.middleware import cname_lookup
+
+class FakeApp(object):
+
+ def __call__(self, env, start_response):
+ return "FAKE APP"
+
+
+def start_response(*args):
+ pass
+
+
+class TestCNAMELookup(unittest.TestCase):
+
+ def setUp(self):
+ if skip:
+ raise SkipTest
+ self.app = cname_lookup.CNAMELookupMiddleware(FakeApp(),
+ {'lookup_depth': 2})
+
+ def test_passthrough(self):
+
+ def my_lookup(d):
+ return 0, d
+ cname_lookup.lookup_cname = my_lookup
+
+ req = Request.blank('/', environ={'REQUEST_METHOD': 'GET'},
+ headers={'Host': 'foo.example.com'})
+ resp = self.app(req.environ, start_response)
+ self.assertEquals(resp, 'FAKE APP')
+ req = Request.blank('/', environ={'REQUEST_METHOD': 'GET'},
+ headers={'Host': 'foo.example.com:8080'})
+ resp = self.app(req.environ, start_response)
+ self.assertEquals(resp, 'FAKE APP')
+
+ def test_good_lookup(self):
+ req = Request.blank('/', environ={'REQUEST_METHOD': 'GET'},
+ headers={'Host': 'mysite.com'})
+
+ def my_lookup(d):
+ return 0, '%s.example.com' % d
+ cname_lookup.lookup_cname = my_lookup
+
+ resp = self.app(req.environ, start_response)
+ self.assertEquals(resp, 'FAKE APP')
+ req = Request.blank('/', environ={'REQUEST_METHOD': 'GET'},
+ headers={'Host': 'mysite.com:8080'})
+ resp = self.app(req.environ, start_response)
+ self.assertEquals(resp, 'FAKE APP')
+
+ def test_lookup_chain_too_long(self):
+ req = Request.blank('/', environ={'REQUEST_METHOD': 'GET'},
+ headers={'Host': 'mysite.com'})
+
+ def my_lookup(d):
+ if d == 'mysite.com':
+ site = 'level1.foo.com'
+ elif d == 'level1.foo.com':
+ site = 'level2.foo.com'
+ elif d == 'level2.foo.com':
+ site = 'bar.example.com'
+ return 0, site
+ cname_lookup.lookup_cname = my_lookup
+
+ resp = self.app(req.environ, start_response)
+ self.assertEquals(resp, ['CNAME lookup failed after 2 tries'])
+
+ def test_lookup_chain_bad_target(self):
+ req = Request.blank('/', environ={'REQUEST_METHOD': 'GET'},
+ headers={'Host': 'mysite.com'})
+
+ def my_lookup(d):
+ return 0, 'some.invalid.site.com'
+ cname_lookup.lookup_cname = my_lookup
+
+ resp = self.app(req.environ, start_response)
+ self.assertEquals(resp,
+ ['CNAME lookup failed to resolve to a valid domain'])
+
+ def test_something_weird(self):
+ req = Request.blank('/', environ={'REQUEST_METHOD': 'GET'},
+ headers={'Host': 'mysite.com'})
+
+ def my_lookup(d):
+ return 0, None
+ cname_lookup.lookup_cname = my_lookup
+
+ resp = self.app(req.environ, start_response)
+ self.assertEquals(resp,
+ ['CNAME lookup failed to resolve to a valid domain'])
+
+ def test_with_memcache(self):
+ def my_lookup(d):
+ return 0, '%s.example.com' % d
+ cname_lookup.lookup_cname = my_lookup
+ class memcache_stub(object):
+ def __init__(self):
+ self.cache = {}
+ def get(self, key):
+ return self.cache.get(key, None)
+ def set(self, key, value, *a, **kw):
+ self.cache[key] = value
+ memcache = memcache_stub()
+ req = Request.blank('/', environ={'REQUEST_METHOD': 'GET',
+ 'swift.cache': memcache},
+ headers={'Host': 'mysite.com'})
+ resp = self.app(req.environ, start_response)
+ self.assertEquals(resp, 'FAKE APP')
+ req = Request.blank('/', environ={'REQUEST_METHOD': 'GET',
+ 'swift.cache': memcache},
+ headers={'Host': 'mysite.com'})
+ resp = self.app(req.environ, start_response)
+ self.assertEquals(resp, 'FAKE APP')
+
+ def test_cname_matching_ending_not_domain(self):
+ req = Request.blank('/', environ={'REQUEST_METHOD': 'GET'},
+ headers={'Host': 'foo.com'})
+
+ def my_lookup(d):
+ return 0, 'c.aexample.com'
+ cname_lookup.lookup_cname = my_lookup
+
+ resp = self.app(req.environ, start_response)
+ self.assertEquals(resp,
+ ['CNAME lookup failed to resolve to a valid domain'])
+
+ def test_cname_configured_with_empty_storage_domain(self):
+ app = cname_lookup.CNAMELookupMiddleware(FakeApp(),
+ {'storage_domain': '',
+ 'lookup_depth': 2})
+ req = Request.blank('/', environ={'REQUEST_METHOD': 'GET'},
+ headers={'Host': 'c.a.example.com'})
+
+ def my_lookup(d):
+ return 0, None
+ cname_lookup.lookup_cname = my_lookup
+
+ resp = app(req.environ, start_response)
+ self.assertEquals(resp, 'FAKE APP')