[Local Agent] b/282592569 Retrieve commission RPC request.
Change-Id: I7ffe0b50f01dbdd69b025eb53948c653bd0959eb
diff --git a/local_agent/local_agent.py b/local_agent/local_agent.py
index 25398d1..ae99195 100644
--- a/local_agent/local_agent.py
+++ b/local_agent/local_agent.py
@@ -50,6 +50,7 @@
'~/.config/google/local_agent_config.ini')
_START_TEST_SUITE_METHOD = 'startTestSuite'
_END_TEST_SUITE_METHOD = 'endTestSuite'
+_COMMISSION_DEVICE_METHOD = 'commissionDevice'
_USER_CONFIG_ROOT_KEY = 'ServerConfig'
_USER_CONFIG_AMS_HOST = 'AMS_HOST'
_USER_CONFIG_AMS_PORT = 'AMS_PORT'
@@ -67,6 +68,8 @@
START_TEST_SUITE = enum.auto()
END_TEST_SUITE = enum.auto()
DEVICE_QUERY_CONTROL = enum.auto()
+ COMMISSION_DEVICE = enum.auto()
+
# ======================== Module level functions ========================== #
def rpc_request_type(method: str) -> RpcRequestType:
@@ -82,6 +85,8 @@
return RpcRequestType.START_TEST_SUITE
elif method == _END_TEST_SUITE_METHOD:
return RpcRequestType.END_TEST_SUITE
+ elif method == _COMMISSION_DEVICE_METHOD:
+ return RpcRequestType.COMMISSION_DEVICE
else:
return RpcRequestType.DEVICE_QUERY_CONTROL
# ========================================================================== #
@@ -323,6 +328,9 @@
elif req_type == RpcRequestType.DEVICE_QUERY_CONTROL:
resp = self._translator.dispatch_to_cmd_handler(rpc_request)
+ elif req_type == RpcRequestType.COMMISSION_DEVICE:
+ resp = self._translator.commission_device(rpc_request)
+
else:
raise errors.InvalidRPCError(
f'Invalid RPC request type {req_type}.')
diff --git a/local_agent/tests/unit_tests/test_local_agent.py b/local_agent/tests/unit_tests/test_local_agent.py
index 184685b..b2d97a6 100644
--- a/local_agent/tests/unit_tests/test_local_agent.py
+++ b/local_agent/tests/unit_tests/test_local_agent.py
@@ -42,6 +42,7 @@
_FAKE_ARTIFACTS_DIR = 'fake-artifacts-dir'
_START_TEST_SUITE = 'startTestSuite'
_END_TEST_SUITE = 'endTestSuite'
+_COMMISSION_DEVICE = 'commissionDevice'
_LOCK_DEVICE = 'setLock'
_FAKE_CONTROLLER_PACKAGE = 'FAKE_CONTROLLER_PACKAGE'
#############################################################################
@@ -612,6 +613,18 @@
self.assertEqual(_FAKE_RPC_RESPONSE, rpc_response)
mock_dispatch.assert_called_once_with(fake_rpc_request)
+ @mock.patch.object(
+ translation_layer.TranslationLayer, 'commission_device')
+ def test_handle_rpc_request_commission_device(self, mock_commission):
+ """Verifies handle_rpc_request to commission device on success."""
+ mock_commission.return_value = _FAKE_RPC_RESPONSE
+ fake_rpc_request = {'method': _COMMISSION_DEVICE}
+
+ rpc_response = self.proc._handle_rpc_request(fake_rpc_request)
+
+ self.assertEqual(_FAKE_RPC_RESPONSE, rpc_response)
+ mock_commission.assert_called_once_with(fake_rpc_request)
+
@mock.patch.object(local_agent, 'rpc_request_type', return_value='')
def test_handle_rpc_request_invalid_rpc_type(self, mock_req_type):
"""Verifies handle_rpc_request on failure with invalid RPC type."""
diff --git a/local_agent/tests/unit_tests/test_translation_layer.py b/local_agent/tests/unit_tests/test_translation_layer.py
index ddfa844..f5871f1 100644
--- a/local_agent/tests/unit_tests/test_translation_layer.py
+++ b/local_agent/tests/unit_tests/test_translation_layer.py
@@ -28,8 +28,10 @@
_FAKE_DEVICE_TYPE = 'fake-device-type'
_FAKE_DEVICE_ID = 'fake-device-id'
_FAKE_CAPABILITY = 'fake-device-capability'
+_FAKE_PAIRING_CODE = 'fake-pairing-code'
_SET_ON = 'setOn'
_SET_LOCK = 'setLock'
+_COMMISSION_DEVICE = 'commissionDevice'
##############################################################################
@@ -218,6 +220,21 @@
self.mock_client.send_rpc_response.assert_called_once()
self.assertTrue(self.translator.is_rpc_timeout(_FAKE_DEVICE_ID))
+ def test_10_commission_device_on_failure_no_pairing_code(self):
+ """Verifies commission_device on failure when pairing code not found."""
+ invalid_rpc_request = rpc_request(_COMMISSION_DEVICE, {})
+ error_msg = 'Invalid rpc command, no pairingCode in params was found.'
+ with self.assertRaisesRegex(agent_errors.InvalidRPCError, error_msg):
+ self.translator.commission_device(invalid_rpc_request)
+
+ def test_10_commission_device_on_success(self):
+ """Verifies commission_device on success with pairing code provided."""
+ valid_rpc_request = rpc_request(
+ _COMMISSION_DEVICE, {'pairingCode': _FAKE_PAIRING_CODE})
+ response = self.translator.commission_device(valid_rpc_request)
+
+ # Id is fake and it was made by `rpc_request` wrapper.
+ self.assertEqual(response, {'id': 0, 'jsonrpc': '2.0', 'result': {}})
if __name__ == '__main__':
unittest.main(failfast=True)
diff --git a/local_agent/translation_layer/translation_layer.py b/local_agent/translation_layer/translation_layer.py
index eeb02e6..96d7cdc 100644
--- a/local_agent/translation_layer/translation_layer.py
+++ b/local_agent/translation_layer/translation_layer.py
@@ -280,3 +280,26 @@
'message': err_mesg}
self._ams_client.send_rpc_response(err_resp)
self._timeout_rpc.add(rpc_id)
+
+ def commission_device(self, rpc_request: Dict[str, str]) -> Dict[str, Any]:
+ """Subroutine for handling COMMISSION_DEVICE command.
+
+ Args:
+ rpc_request: JSON-RPC request.
+
+ Raises:
+ InvalidRPCError: Invalid RPC.
+
+ Returns:
+ RPC response.
+ """
+ pairing_code = rpc_request['params'].get('pairingCode')
+ if pairing_code is None:
+ raise agent_errors.InvalidRPCError(
+ 'Invalid rpc command, no pairingCode in params was found.')
+
+ id = rpc_request['id']
+ #TODO(kuruk): Use this pairing code to commission a matter device.
+ logger.info(f'Completed request for {id}, pairingCode: {pairing_code}')
+
+ return {'id': id, 'jsonrpc': '2.0', 'result': {}}