130 lines
4.5 KiB
Python
130 lines
4.5 KiB
Python
# 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.
|
|
|
|
"""
|
|
Unit Tests for senlin.rpc.client
|
|
"""
|
|
from unittest import mock
|
|
|
|
from senlin.common import messaging
|
|
from senlin.rpc import client as rpc_client
|
|
from senlin.tests.unit.common import base
|
|
from senlin.tests.unit.common import utils
|
|
|
|
|
|
class EngineRpcAPITestCase(base.SenlinTestCase):
|
|
|
|
def setUp(self):
|
|
messaging.setup("fake://", optional=True)
|
|
self.addCleanup(messaging.cleanup)
|
|
self.context = utils.dummy_context()
|
|
|
|
# self.stubs = stubout.StubOutForTesting()
|
|
self.rpcapi = rpc_client.EngineClient()
|
|
super(EngineRpcAPITestCase, self).setUp()
|
|
|
|
@mock.patch.object(messaging, 'get_rpc_client')
|
|
def test_call(self, mock_client):
|
|
client = mock.Mock()
|
|
mock_client.return_value = client
|
|
|
|
method = 'fake_method'
|
|
req = mock.Mock()
|
|
rpcapi = rpc_client.EngineClient()
|
|
|
|
# with no version
|
|
res = rpcapi.call(self.context, method, req)
|
|
|
|
self.assertEqual(client, rpcapi._client)
|
|
client.call.assert_called_once_with(self.context, 'fake_method',
|
|
req=req)
|
|
self.assertEqual(res, client.call.return_value)
|
|
|
|
@mock.patch.object(messaging, 'get_rpc_client')
|
|
def test_call_with_version(self, mock_client):
|
|
client = mock.Mock()
|
|
mock_client.return_value = client
|
|
|
|
method = 'fake_method'
|
|
req = mock.Mock()
|
|
rpcapi = rpc_client.EngineClient()
|
|
|
|
# with version
|
|
res = rpcapi.call(self.context, method, req, version='123')
|
|
|
|
rpcapi._client.prepare.assert_called_once_with(version='123')
|
|
new_client = client.prepare.return_value
|
|
new_client.call.assert_called_once_with(self.context, 'fake_method',
|
|
req=req)
|
|
self.assertEqual(res, new_client.call.return_value)
|
|
|
|
@mock.patch.object(messaging, 'get_rpc_client')
|
|
def test_cast(self, mock_client):
|
|
client = mock.Mock()
|
|
mock_client.return_value = client
|
|
|
|
method = 'fake_method'
|
|
kwargs = {'key': 'value'}
|
|
rpcapi = rpc_client.EngineClient()
|
|
msg = rpcapi.make_msg(method, **kwargs)
|
|
|
|
# with no version
|
|
res = rpcapi.cast(self.context, msg)
|
|
|
|
self.assertEqual(client, rpcapi._client)
|
|
client.cast.assert_called_once_with(self.context, 'fake_method',
|
|
key='value')
|
|
self.assertEqual(res, client.cast.return_value)
|
|
|
|
# with version
|
|
res = rpcapi.cast(self.context, msg, version='123')
|
|
client.prepare.assert_called_once_with(version='123')
|
|
new_client = client.prepare.return_value
|
|
new_client.cast.assert_called_once_with(self.context, 'fake_method',
|
|
key='value')
|
|
self.assertEqual(res, new_client.cast.return_value)
|
|
|
|
def _test_engine_api(self, method, rpc_method, **kwargs):
|
|
ctxt = utils.dummy_context()
|
|
expected_retval = 'foo' if method == 'call' else None
|
|
|
|
kwargs.pop('version', None)
|
|
|
|
if 'expected_message' in kwargs:
|
|
expected_message = kwargs['expected_message']
|
|
del kwargs['expected_message']
|
|
else:
|
|
expected_message = self.rpcapi.make_msg(method, **kwargs)
|
|
|
|
cast_and_call = [
|
|
'profile_delete',
|
|
'policy_delete',
|
|
'cluster_delete',
|
|
'node_delete',
|
|
'receiver_delete',
|
|
'webhook_delete',
|
|
]
|
|
|
|
if rpc_method == 'call' and method in cast_and_call:
|
|
kwargs['cast'] = False
|
|
|
|
mock_rpc_method = self.patchobject(self.rpcapi, rpc_method,
|
|
return_value=expected_retval)
|
|
|
|
retval = getattr(self.rpcapi, method)(ctxt, **kwargs)
|
|
|
|
self.assertEqual(expected_retval, retval)
|
|
expected_args = [ctxt, expected_message, mock.ANY]
|
|
actual_args, _ = mock_rpc_method.call_args
|
|
for expected_arg, actual_arg in zip(expected_args, actual_args):
|
|
self.assertEqual(expected_arg, actual_arg)
|