Skip to content

Commit

Permalink
Merge pull request #2390 from davidraker/rpc_inspection
Browse files Browse the repository at this point in the history
Rpc inspection
  • Loading branch information
craig8 authored Aug 7, 2020
2 parents bd99056 + 75a4981 commit c43e126
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 12 deletions.
2 changes: 2 additions & 0 deletions pytest.ini
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,6 @@ markers =
rmq_reconnect: rabbitmq reconnect tests
rmq_shutdown: rabbitmq shutdown tests
secure: Test platform and agents with secure platform options
rpc: Tests for RPC
mysqlfuncts: level one integration tests for mysqlfuncts
33 changes: 21 additions & 12 deletions volttron/platform/vip/agent/subsystems/rpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,11 +168,19 @@ def method(self, request, ident, name, args, kwargs,
del local.request
del local.batch

def _inspect(self, method):
params = inspect.getargspec(method)
if hasattr(method, 'im_self'):
params.args.pop(0)
response = {'params': params}
@staticmethod
def _inspect(method):
response = {'params': {}}
signature = inspect.signature(method)
for p in signature.parameters.values():
response['params'][p.name] = {
'kind': p.kind.name
}
if p.default is not inspect.Parameter.empty:
response['params'][p.name]['default'] = p.default
if p.annotation is not inspect.Parameter.empty:
annotation = p.annotation.__name__ if type(p.annotation) is type else str(p.annotation)
response['params'][p.name]['annotation'] = annotation
doc = inspect.getdoc(method)
if doc:
response['doc'] = doc
Expand All @@ -181,15 +189,16 @@ def _inspect(self, method):
cut = len(os.path.commonprefix([_ROOT_PACKAGE_PATH, source]))
source = source[cut:]
lineno = inspect.getsourcelines(method)[1]
except IOError:
except Exception:
pass
else:
response['source'] = source, lineno
try:
# pylint: disable=protected-access
response['return'] = method._returns
except AttributeError:
pass
response['source'] = {
'file': source,
'line_number': lineno
}
ret = signature.return_annotation
if ret is not inspect.Signature.empty:
response['return'] = ret.__name__ if type(ret) is type else str(ret)
return response


Expand Down
51 changes: 51 additions & 0 deletions volttrontesting/subsystems/test_rpc_subsystem.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import os
import pytest
import inspect
from volttron.platform.vip.agent import RPC
from volttron.platform.vip.agent import Agent
from typing import Optional, Union, List

class _ExporterTestAgent(Agent):
def __init__(self, **kwargs):
super(_ExporterTestAgent, self).__init__(**kwargs)

@RPC.export('test_method')
def test_method(self, param1: int, param2: Union[str, List[str]], *, param3: bool = True,
param4: Optional[Union[float, List[float]]] = None) -> dict:
"""Doc String"""
return {'param1': param1, 'param2': param2, param3: param3, 'param4': param4}


@pytest.mark.rpc
def test_method_inspection(volttron_instance):
""" Tests RPC Method Inspection
:param volttron_instance:
:return:
"""

lineno = inspect.getsourcelines(_ExporterTestAgent.test_method)[1]
test_output = {
'doc': 'Doc String',
'params': {'param1': {'annotation': 'int',
'kind': 'POSITIONAL_OR_KEYWORD'},
'param2': {'annotation': 'typing.Union[str, typing.List[str]]',
'kind': 'POSITIONAL_OR_KEYWORD'},
'param3': {'annotation': 'bool',
'default': True,
'kind': 'KEYWORD_ONLY'},
'param4': {'annotation': 'typing.Union[float, typing.List[float], '
'NoneType]',
'default': None,
'kind': 'KEYWORD_ONLY'}},
'return': 'dict',
'source': {'file': 'volttrontesting/subsystems/test_rpc_subsystem.py', # Must change if this file moves!
'line_number': lineno},
}

new_agent1 = volttron_instance.build_agent(identity='test_inspect1', agent_class=_ExporterTestAgent)
new_agent2 = volttron_instance.build_agent(identity='test_inspect2')

result = new_agent2.vip.rpc.call('test_inspect1', 'test_method.inspect').get()

assert result == test_output

0 comments on commit c43e126

Please sign in to comment.