diff --git a/glance/tests/unit/common/__init__.py b/glance/tests/unit/common/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/glance/tests/unit/test_config.py b/glance/tests/unit/common/test_config.py similarity index 96% rename from glance/tests/unit/test_config.py rename to glance/tests/unit/common/test_config.py index 057df06e53..2dfede10d4 100644 --- a/glance/tests/unit/test_config.py +++ b/glance/tests/unit/common/test_config.py @@ -95,3 +95,6 @@ class TestPasteApp(test_utils.BaseTestCase): expected_middleware = context.UnauthenticatedContextMiddleware self._do_test_load_paste_app(expected_middleware, paste_config_file=paste_config_file) + + def test_get_path_non_exist(self): + self.assertRaises(RuntimeError, config._get_deployment_config_file) diff --git a/glance/tests/unit/test_utils.py b/glance/tests/unit/common/test_utils.py similarity index 62% rename from glance/tests/unit/test_utils.py rename to glance/tests/unit/common/test_utils.py index 37d79cca95..eb034b8d10 100644 --- a/glance/tests/unit/test_utils.py +++ b/glance/tests/unit/common/test_utils.py @@ -19,6 +19,8 @@ import os import StringIO import tempfile +import webob + from glance.common import exception from glance.common import utils from glance.tests import utils as test_utils @@ -62,6 +64,17 @@ class TestUtils(test_utils.BaseTestCase): meat = ''.join(chunks) self.assertEqual(meat, 'aaabbbcccdddeeefffggghhh') + def test_cooperative_reader_of_iterator_stop_iteration_err(self): + """Ensure cooperative reader supports iterator backends too""" + reader = utils.CooperativeReader([l * 3 for l in '']) + chunks = [] + while True: + chunks.append(reader.read(3)) + if chunks[-1] == '': + break + meat = ''.join(chunks) + self.assertEqual(meat, '') + def test_limiting_reader(self): """Ensure limiting reader class accesses all bytes of file""" BYTES = 1024 @@ -105,9 +118,75 @@ class TestUtils(test_utils.BaseTestCase): self.assertRaises(exception.ImageSizeLimitExceeded, _consume_all_read) + def test_bool_from_string(self): + actual = utils.bool_from_string('true') + self.assertEqual(True, actual) + + actual = utils.bool_from_string(1) + self.assertEqual(True, actual) + + def test_get_meta_from_headers(self): + resp = webob.Response() + resp.headers = {"x-image-meta-*": 'test'} + result = utils.get_image_meta_from_headers(resp) + self.assertEqual({'*': 'test', 'properties': {}}, result) + + def test_add_features_to_http_headers(self): + features_test1 = {'x-image-meta-size': 'test'} + url = ("http://glance.example.com/v1/" + "images/71c675ab-d94f-49cd-a114-e12490b328d9") + headers = {"x-image-meta-uri": url} + self.assertRaises(exception.UnsupportedHeaderFeature, + utils.add_features_to_http_headers, + features_test1, headers) + + def test_image_meta(self): + image_meta = {'x-image-meta-size': 'test'} + image_meta_properties = {'properties': {'test': "test"}} + actual = utils.image_meta_to_http_headers(image_meta) + actual_test2 = utils.image_meta_to_http_headers( + image_meta_properties) + self.assertEqual({'x-image-meta-x-image-meta-size': u'test'}, actual) + self.assertEqual({'x-image-meta-property-test': u'test'}, + actual_test2) + + def test_create_pretty_table(self): + class MyPrettyTable(utils.PrettyTable): + def __init__(self): + self.columns = [] + + # Test add column + my_pretty_table = MyPrettyTable() + my_pretty_table.add_column(1, label='test') + # Test make header + test_res = my_pretty_table.make_header() + self.assertEqual('t\n-', test_res) + # Test make row + result = my_pretty_table.make_row('t') + self.assertEqual("t", result) + result = my_pretty_table._clip_and_justify( + data='test', width=4, just=1) + self.assertEqual("test", result) + + def test_mutating(self): + class FakeContext(): + def __init__(self): + self.read_only = False + + class Fake(): + def __init__(self): + self.context = FakeContext() + + def fake_function(req, context): + return 'test passed' + + req = webob.Request.blank('/some_request') + result = utils.mutating(fake_function) + self.assertEqual("test passed", result(req, Fake())) + def test_validate_key_cert_key(self): var_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), - '../', 'var')) + '../../', 'var')) keyfile = os.path.join(var_dir, 'privatekey.key') certfile = os.path.join(var_dir, 'certificate.crt') utils.validate_key_cert(keyfile, certfile) diff --git a/glance/tests/unit/test_wsgi.py b/glance/tests/unit/common/test_wsgi.py similarity index 80% rename from glance/tests/unit/test_wsgi.py rename to glance/tests/unit/common/test_wsgi.py index cdd6567d81..67e6e3dc84 100644 --- a/glance/tests/unit/test_wsgi.py +++ b/glance/tests/unit/common/test_wsgi.py @@ -18,6 +18,7 @@ import socket import time +import datetime import eventlet.patcher import webob @@ -98,6 +99,28 @@ class ResourceTest(test_utils.BaseTestCase): self.assertEqual(actual, expected) + def test_get_action_args_invalid_index(self): + env = {'wsgiorg.routing_args': []} + expected = {} + actual = wsgi.Resource(None, None, None).get_action_args(env) + self.assertEqual(actual, expected) + + def test_get_action_args_del_controller_error(self): + actions = {'format': None, + 'action': 'update', + 'id': 12} + env = {'wsgiorg.routing_args': [None, actions]} + expected = {'action': 'update', 'id': 12} + actual = wsgi.Resource(None, None, None).get_action_args(env) + self.assertEqual(actual, expected) + + def test_get_action_args_del_format_error(self): + actions = {'action': 'update', 'id': 12} + env = {'wsgiorg.routing_args': [None, actions]} + expected = {'action': 'update', 'id': 12} + actual = wsgi.Resource(None, None, None).get_action_args(env) + self.assertEqual(actual, expected) + def test_dispatch(self): class Controller(object): def index(self, shirt, pants=None): @@ -136,6 +159,18 @@ class JSONResponseSerializerTest(test_utils.BaseTestCase): actual = wsgi.JSONResponseSerializer().to_json(fixture) self.assertEqual(actual, expected) + def test_to_json_with_date_format_value(self): + fixture = {"date": datetime.datetime(1, 3, 8, 2)} + expected = '{"date": "0001-03-08T02:00:00"}' + actual = wsgi.JSONResponseSerializer().to_json(fixture) + self.assertEqual(actual, expected) + + def test_to_json_with_more_deep_format(self): + fixture = {"is_public": True, "name": [{"name1": "test"}]} + expected = '{"is_public": true, "name": [{"name1": "test"}]}' + actual = wsgi.JSONResponseSerializer().to_json(fixture) + self.assertEqual(actual, expected) + def test_default(self): fixture = {"key": "value"} response = webob.Response() @@ -200,6 +235,26 @@ class JSONRequestDeserializerTest(test_utils.BaseTestCase): expected = {"body": {"key": "value"}} self.assertEqual(actual, expected) + def test_has_body_has_transfer_encoding(self): + request = wsgi.Request.blank('/') + request.method = 'POST' + request.body = 'fake_body' + request.headers['transfer-encoding'] = 0 + self.assertTrue('transfer-encoding' in request.headers) + self.assertTrue(wsgi.JSONRequestDeserializer().has_body(request)) + + def test_get_bind_addr_default_value(self): + expected = ('0.0.0.0', '123456') + actual = wsgi.get_bind_addr(default_port="123456") + self.assertEqual(expected, actual) + + +class ServerTest(test_utils.BaseTestCase): + def test_create_pool(self): + actual = wsgi.Server(threads=1).create_pool() + self.assertTrue(True, isinstance(actual, + eventlet.greenpool.GreenPool)) + class TestHelpers(test_utils.BaseTestCase): diff --git a/glance/tests/unit/v1/test_registry_client.py b/glance/tests/unit/v1/test_registry_client.py index cd775cf10f..d15da008e4 100644 --- a/glance/tests/unit/v1/test_registry_client.py +++ b/glance/tests/unit/v1/test_registry_client.py @@ -18,8 +18,11 @@ import copy import datetime +import testtools + from glance.common import config from glance.common import exception +from glance.common import client as test_client from glance import context from glance.db.sqlalchemy import api as db_api from glance.db.sqlalchemy import models as db_models @@ -1061,3 +1064,27 @@ class TestRegistryV1Client(base.IsolatedUnitTest): """Tests deleting image members""" self.client.add_member(UUID2, 'pattieblack') self.assertTrue(self.client.delete_member(UUID2, 'pattieblack')) + + +class TestBaseClient(testtools.TestCase): + """ + Test proper actions made for both valid and invalid requests + against a Registry service + """ + def test_connect_kwargs_default_values(self): + actual = test_client.BaseClient('127.0.0.1').get_connect_kwargs() + self.assertEqual({'timeout': None}, actual) + + def test_connect_kwargs(self): + base_client = test_client.BaseClient( + host='127.0.0.1', port=80, timeout=1, use_ssl=True) + actual = base_client.get_connect_kwargs() + expected = {'insecure': False, + 'key_file': None, + 'ca_file': '/etc/ssl/certs/ca-certificates.crt', + 'cert_file': None, + 'timeout': 1} + self.assertEqual(expected['insecure'], actual['insecure']) + self.assertEqual(expected['key_file'], actual['key_file']) + self.assertEqual(expected['cert_file'], actual['cert_file']) + self.assertEqual(expected['timeout'], actual['timeout'])