# 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 mock

from nova import cache_utils
from nova import test


class TestOsloCache(test.NoDBTestCase):
    def test_get_default_cache_region(self):
        region = cache_utils._get_default_cache_region(expiration_time=60)
        self.assertEqual(60, region.expiration_time)
        self.assertIsNotNone(region)

    def test_get_default_cache_region_default_expiration_time(self):
        region = cache_utils._get_default_cache_region(expiration_time=0)
        # default oslo.cache expiration_time value 600 was taken
        self.assertEqual(600, region.expiration_time)
        self.assertIsNotNone(region)

    @mock.patch('dogpile.cache.region.CacheRegion.configure')
    def test_get_client(self, mock_cacheregion):
        self.assertIsNotNone(
                cache_utils.get_client(expiration_time=60))

        self.flags(group='cache', enabled=True)
        self.assertIsNotNone(
                cache_utils.get_client(expiration_time=60))

        self.flags(group='cache', enabled=False)
        client = cache_utils.get_client(expiration_time=60)
        self.assertIsNotNone(client.region)

        mock_cacheregion.assert_has_calls(
                [mock.call('oslo_cache.dict',
                           arguments={'expiration_time': 60},
                           expiration_time=60),
                 mock.call('dogpile.cache.null',
                           _config_argument_dict=mock.ANY,
                           _config_prefix='cache.oslo.arguments.',
                           expiration_time=60,
                           wrap=None),
                 mock.call('oslo_cache.dict',
                           arguments={'expiration_time': 60},
                           expiration_time=60)],
        )

    @mock.patch('dogpile.cache.region.CacheRegion.configure')
    def test_get_custom_cache_region(self, mock_cacheregion):
        self.assertRaises(RuntimeError,
                          cache_utils._get_custom_cache_region)
        self.assertIsNotNone(
                cache_utils._get_custom_cache_region(
                        backend='oslo_cache.dict'))
        self.assertIsNotNone(
                cache_utils._get_custom_cache_region(
                        backend='dogpile.cache.memcached',
                        url=['localhost:11211']))
        mock_cacheregion.assert_has_calls(
                [mock.call('oslo_cache.dict',
                           arguments={'expiration_time': 604800},
                           expiration_time=604800),
                 mock.call('dogpile.cache.memcached',
                           arguments={'url': ['localhost:11211']},
                           expiration_time=604800)]
        )

    @mock.patch('dogpile.cache.region.CacheRegion.configure')
    def test_get_memcached_client(self, mock_cacheregion):
        self.flags(group='cache', enabled=True)
        self.flags(group='cache', memcache_servers=['localhost:11211'])
        self.assertIsNotNone(
                cache_utils.get_memcached_client(expiration_time=60))

        mock_cacheregion.assert_has_calls(
                [mock.call('dogpile.cache.null',
                           _config_argument_dict=mock.ANY,
                           _config_prefix='cache.oslo.arguments.',
                           expiration_time=60, wrap=None)]
        )
