# Copyright 2014 IBM Corp.
#
# 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.
#
# @author: Mohammad Banikazemi, IBM Corp


import contextlib
import mock

from neutron.extensions import portbindings
from neutron.tests.unit import _test_extension_portbindings as test_bindings
from neutron.tests.unit import test_db_plugin as test_plugin
from neutron.tests.unit import test_l3_plugin as test_l3_plugin

from neutron.plugins.ibm.common import constants


_plugin_name = ('neutron.plugins.ibm.'
                'sdnve_neutron_plugin.SdnvePluginV2')
HTTP_OK = 200


class MockClient(object):
    def sdnve_list(self, resource, **params):
        return (HTTP_OK, 'body')

    def sdnve_show(self, resource, specific, **params):
        return (HTTP_OK, 'body')

    def sdnve_create(self, resource, body):
        return (HTTP_OK, 'body')

    def sdnve_update(self, resource, specific, body=None):
        return (HTTP_OK, 'body')

    def sdnve_delete(self, resource, specific):
        return (HTTP_OK, 'body')

    def sdnve_get_tenant_byid(self, os_tenant_id):
        return (os_tenant_id, constants.TENANT_TYPE_OF)

    def sdnve_check_and_create_tenant(
        self, os_tenant_id, network_type=None):
        return os_tenant_id

    def sdnve_get_controller(self):
        return


class MockKeystoneClient(object):
    def __init__(self, **kwargs):
        pass

    def get_tenant_type(self, id):
        return constants.TENANT_TYPE_OF

    def get_tenant_name(self, id):
        return "tenant name"


class IBMPluginV2TestCase(test_plugin.NeutronDbPluginV2TestCase):
    def setUp(self):
        with contextlib.nested(
            mock.patch('neutron.plugins.ibm.sdnve_api.'
                       'KeystoneClient',
                       new=MockKeystoneClient),
            mock.patch('neutron.plugins.ibm.sdnve_api.'
                       'Client',
                       new=MockClient)):
            super(IBMPluginV2TestCase, self).setUp(plugin=_plugin_name)


class TestIBMBasicGet(test_plugin.TestBasicGet,
                      IBMPluginV2TestCase):
    pass


class TestIBMV2HTTPResponse(test_plugin.TestV2HTTPResponse,
                            IBMPluginV2TestCase):
    pass


class TestIBMNetworksV2(test_plugin.TestNetworksV2,
                        IBMPluginV2TestCase):
    pass


class TestIBMPortsV2(test_plugin.TestPortsV2,
                     IBMPluginV2TestCase):
    pass


class TestIBMSubnetsV2(test_plugin.TestSubnetsV2,
                       IBMPluginV2TestCase):
    pass


class TestIBMPortBinding(IBMPluginV2TestCase,
                         test_bindings.PortBindingsTestCase):
    VIF_TYPE = portbindings.VIF_TYPE_OVS


class IBMPluginRouterTestCase(test_l3_plugin.L3NatDBIntTestCase):

    def setUp(self):
        with contextlib.nested(
            mock.patch('neutron.plugins.ibm.sdnve_api.'
                       'KeystoneClient',
                       new=MockKeystoneClient),
            mock.patch('neutron.plugins.ibm.sdnve_api.'
                       'Client',
                       new=MockClient)):
            super(IBMPluginRouterTestCase, self).setUp(plugin=_plugin_name)
