tempest/tempest/tests/lib/common/test_http.py

191 lines
6.6 KiB
Python

# All Rights Reserved.
#
# 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 urllib3
from tempest.lib.common import http
from tempest.tests import base
CERT_NONE = 'CERT_NONE'
CERT_REQUIRED = 'CERT_REQUIRED'
CERT_LOCATION = '/etc/ssl/certs/ca-certificates.crt'
PROXY_URL = 'http://myproxy:3128'
REQUEST_URL = 'http://10.0.0.107:5000/v2.0'
REQUEST_METHOD = 'GET'
class TestClosingHttp(base.TestCase):
def closing_http(self, **kwargs):
return http.ClosingHttp(**kwargs)
def test_closing_http(self):
connection = self.closing_http()
self.assertNotIn('cert_reqs', connection.connection_pool_kw)
self.assertNotIn('ca_certs', connection.connection_pool_kw)
self.assertNotIn('timeout', connection.connection_pool_kw)
def test_closing_http_with_ca_certs(self):
connection = self.closing_http(ca_certs=CERT_LOCATION)
self.assertEqual(CERT_REQUIRED,
connection.connection_pool_kw['cert_reqs'])
self.assertEqual(CERT_LOCATION,
connection.connection_pool_kw['ca_certs'])
def test_closing_http_with_dscv(self):
connection = self.closing_http(
disable_ssl_certificate_validation=True)
self.assertEqual(CERT_NONE,
connection.connection_pool_kw['cert_reqs'])
self.assertNotIn('ca_certs',
connection.connection_pool_kw)
def test_closing_http_with_ca_certs_and_dscv(self):
connection = self.closing_http(
disable_ssl_certificate_validation=True,
ca_certs=CERT_LOCATION)
self.assertEqual(CERT_NONE,
connection.connection_pool_kw['cert_reqs'])
self.assertNotIn('ca_certs',
connection.connection_pool_kw)
def test_closing_http_with_timeout(self):
timeout = 30
connection = self.closing_http(timeout=timeout)
self.assertEqual(timeout,
connection.connection_pool_kw['timeout'])
def test_request(self):
# Given
connection = self.closing_http()
http_response = urllib3.HTTPResponse()
request = self.patch('urllib3.PoolManager.request',
return_value=http_response)
retry = self.patch('urllib3.util.Retry')
# When
response, data = connection.request(
method=REQUEST_METHOD,
url=REQUEST_URL)
# Then
request.assert_called_once_with(
REQUEST_METHOD,
REQUEST_URL,
headers={'connection': 'close'},
retries=retry(raise_on_redirect=False, redirect=5))
self.assertEqual(
{'content-location': REQUEST_URL,
'status': str(http_response.status)},
response)
self.assertEqual(http_response.status, response.status)
self.assertEqual(http_response.reason, response.reason)
self.assertEqual(http_response.version, response.version)
self.assertEqual(http_response.data, data)
def test_request_with_fields(self):
# Given
connection = self.closing_http()
http_response = urllib3.HTTPResponse()
request = self.patch('urllib3.PoolManager.request',
return_value=http_response)
retry = self.patch('urllib3.util.Retry')
fields = object()
# When
connection.request(
method=REQUEST_METHOD,
url=REQUEST_URL,
fields=fields)
# Then
request.assert_called_once_with(
REQUEST_METHOD,
REQUEST_URL,
fields=fields,
headers=dict(connection='close'),
retries=retry(raise_on_redirect=False, redirect=5))
def test_request_with_headers(self):
# Given
connection = self.closing_http()
headers = {'Xtra Key': 'Xtra Value'}
http_response = urllib3.HTTPResponse(headers=headers)
request = self.patch('urllib3.PoolManager.request',
return_value=http_response)
retry = self.patch('urllib3.util.Retry')
# When
response, _ = connection.request(
method=REQUEST_METHOD,
url=REQUEST_URL,
headers=headers)
# Then
request.assert_called_once_with(
REQUEST_METHOD,
REQUEST_URL,
headers=dict(headers, connection='close'),
retries=retry(raise_on_redirect=False, redirect=5))
self.assertEqual(
{'content-location': REQUEST_URL,
'status': str(http_response.status),
'xtra key': 'Xtra Value'},
response)
class TestClosingProxyHttp(TestClosingHttp):
def closing_http(self, proxy_url=PROXY_URL, **kwargs):
connection = http.ClosingProxyHttp(proxy_url=proxy_url, **kwargs)
self.assertHasProxy(connection, proxy_url)
return connection
def test_class_without_proxy_url(self):
self.assertRaises(ValueError, http.ClosingProxyHttp, None)
def assertHasProxy(self, connection, proxy_url):
self.assertIsInstance(connection, http.ClosingProxyHttp)
proxy = connection.proxy
self.assertEqual(proxy_url,
'%s://%s:%i' % (proxy.scheme,
proxy.host,
proxy.port))
class TestClosingHttpRedirects(base.TestCase):
def test_redirect_default(self):
connection = http.ClosingHttp()
self.assertTrue(connection.follow_redirects)
def test_redirect_off(self):
connection = http.ClosingHttp(follow_redirects=False)
self.assertFalse(connection.follow_redirects)
class TestClosingProxyHttpRedirects(base.TestCase):
def test_redirect_default(self):
connection = http.ClosingProxyHttp(proxy_url=PROXY_URL)
self.assertTrue(connection.follow_redirects)
def test_redirect_off(self):
connection = http.ClosingProxyHttp(follow_redirects=False,
proxy_url=PROXY_URL)
self.assertFalse(connection.follow_redirects)