[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': {}}