# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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 sys

from mock import Mock

from libcloud.common.base import BaseDriver

from libcloud.test import unittest


class BaseDriverTestCase(unittest.TestCase):
    def test_timeout_argument_propagation_and_preservation(self):
        class DummyDriver1(BaseDriver):
            pass

        # 1. No timeout provided
        DummyDriver1.connectionCls = Mock()
        DummyDriver1(key="foo")
        call_kwargs = DummyDriver1.connectionCls.call_args[1]
        self.assertIsNone(call_kwargs["timeout"])
        self.assertIsNone(call_kwargs["retry_delay"])

        # 2. Timeout provided as constructor argument
        class DummyDriver1(BaseDriver):
            pass

        DummyDriver1.connectionCls = Mock()
        DummyDriver1(key="foo", timeout=12)
        call_kwargs = DummyDriver1.connectionCls.call_args[1]
        self.assertEqual(call_kwargs["timeout"], 12)
        self.assertIsNone(call_kwargs["retry_delay"])

        # 3. timeout provided via "_ex_connection_class_kwargs" method
        class DummyDriver2(BaseDriver):
            def _ex_connection_class_kwargs(self):
                result = {}
                result["timeout"] = 13
                return result

        DummyDriver2.connectionCls = Mock()
        DummyDriver2(key="foo")
        call_kwargs = DummyDriver2.connectionCls.call_args[1]

        # 4. Value provided via "_ex_connection_class_kwargs" and constructor,
        # constructor should win
        DummyDriver2.connectionCls = Mock()
        DummyDriver2(key="foo", timeout=14, retry_delay=10)
        call_kwargs = DummyDriver2.connectionCls.call_args[1]
        self.assertEqual(call_kwargs["timeout"], 14)
        self.assertEqual(call_kwargs["retry_delay"], 10)


if __name__ == "__main__":
    sys.exit(unittest.main())
