diff --git a/pymodbus/client/mixin.py b/pymodbus/client/mixin.py index b17a89d5d..ac0c55911 100644 --- a/pymodbus/client/mixin.py +++ b/pymodbus/client/mixin.py @@ -9,6 +9,7 @@ import pymodbus.other_message as pdu_other_msg import pymodbus.register_read_message as pdu_reg_read import pymodbus.register_write_message as pdu_req_write +from pymodbus.exceptions import ModbusException from pymodbus.pdu import ModbusRequest, ModbusResponse @@ -45,7 +46,6 @@ def execute(self, request: ModbusRequest) -> ModbusResponse: """Execute request (code ???). :param request: Request to send - :returns: A deferred response handle :raises ModbusException: Call with custom function codes. @@ -53,11 +53,7 @@ def execute(self, request: ModbusRequest) -> ModbusResponse: .. tip:: Response is not interpreted. """ - - # The implementation of this method is only used in test, to secure that - # the methods uses the correct PDU. - # execute() will be overwritten in the transport class. - return request + raise ModbusException("Pymodbus internal ERROR") def read_coils( self, address: int, count: int = 1, slave: int = 0, **kwargs: Any @@ -68,7 +64,6 @@ def read_coils( :param count: (optional) Number of coils to read :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute( @@ -84,7 +79,6 @@ def read_discrete_inputs( :param count: (optional) Number of coils to read :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute( @@ -100,7 +94,6 @@ def read_holding_registers( :param count: (optional) Number of coils to read :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute( @@ -116,7 +109,6 @@ def read_input_registers( :param count: (optional) Number of coils to read :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute( @@ -132,7 +124,6 @@ def write_coil( :param value: Boolean to write :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute( @@ -148,7 +139,6 @@ def write_register( :param value: Value to write :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute( @@ -162,7 +152,6 @@ def read_exception_status( :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_other_msg.ReadExceptionStatusRequest(slave, **kwargs)) @@ -175,7 +164,6 @@ def diag_query_data( :param msg: Message to be returned :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_diag.ReturnQueryDataRequest(msg, slave, **kwargs)) @@ -188,7 +176,6 @@ def diag_restart_communication( :param toggle: True if toogled. :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute( @@ -202,7 +189,6 @@ def diag_read_diagnostic_register( :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_diag.ReturnDiagnosticRegisterRequest(slave, **kwargs)) @@ -214,7 +200,6 @@ def diag_change_ascii_input_delimeter( :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_diag.ChangeAsciiInputDelimiterRequest(slave, **kwargs)) @@ -226,7 +211,6 @@ def diag_force_listen_only( :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_diag.ForceListenOnlyModeRequest(slave, **kwargs)) @@ -238,7 +222,6 @@ def diag_clear_counters( :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_diag.ClearCountersRequest(slave, **kwargs)) @@ -250,7 +233,6 @@ def diag_read_bus_message_count( :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_diag.ReturnBusMessageCountRequest(slave, **kwargs)) @@ -262,7 +244,6 @@ def diag_read_bus_comm_error_count( :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute( @@ -276,7 +257,6 @@ def diag_read_bus_exception_error_count( :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute( @@ -290,7 +270,6 @@ def diag_read_slave_message_count( :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_diag.ReturnSlaveMessageCountRequest(slave, **kwargs)) @@ -302,7 +281,6 @@ def diag_read_slave_no_response_count( :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_diag.ReturnSlaveNoResponseCountRequest(slave, **kwargs)) @@ -314,7 +292,6 @@ def diag_read_slave_nak_count( :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_diag.ReturnSlaveNAKCountRequest(slave, **kwargs)) @@ -326,7 +303,6 @@ def diag_read_slave_busy_count( :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_diag.ReturnSlaveBusyCountRequest(slave, **kwargs)) @@ -338,7 +314,6 @@ def diag_read_bus_char_overrun_count( :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute( @@ -352,7 +327,6 @@ def diag_read_iop_overrun_count( :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_diag.ReturnIopOverrunCountRequest(slave, **kwargs)) @@ -364,7 +338,6 @@ def diag_clear_overrun_counter( :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_diag.ClearOverrunCountRequest(slave, **kwargs)) @@ -376,7 +349,6 @@ def diag_getclear_modbus_response( :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_diag.GetClearModbusPlusRequest(slave, **kwargs)) @@ -387,7 +359,6 @@ def diag_get_comm_event_counter( """Diagnose get event counter (code 0x0B). :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_other_msg.GetCommEventCounterRequest(**kwargs)) @@ -398,7 +369,6 @@ def diag_get_comm_event_log( """Diagnose get event counter (code 0x0C). :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_other_msg.GetCommEventLogRequest(**kwargs)) @@ -412,7 +382,6 @@ def write_coils( :param values: List of booleans to write :param slave: (optional) Modbus slave ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute( @@ -432,7 +401,6 @@ def write_registers( :param values: List of booleans to write :param slave: (optional) Modbus slave unit ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute( @@ -448,7 +416,6 @@ def report_slave_id( :param slave: (optional) Modbus slave unit ID :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_other_msg.ReportSlaveIdRequest(slave, **kwargs)) @@ -460,7 +427,6 @@ def read_file_record( :param records: List of (Reference type, File number, Record Number, Record Length) :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_file_msg.ReadFileRecordRequest(records, **kwargs)) @@ -472,7 +438,6 @@ def write_file_record( :param records: List of (Reference type, File number, Record Number, Record Length) :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_file_msg.WriteFileRecordRequest(records, **kwargs)) @@ -490,7 +455,6 @@ def mask_write_register( :param and_mask: The and bitmask to apply to the register address :param or_mask: The or bitmask to apply to the register address :param kwargs: (optional) Experimental parameters. - :returns: A deferred response handle :raises ModbusException: """ return self.execute( @@ -514,7 +478,6 @@ def readwrite_registers( :param values: The registers to write to the specified address :param slave: (optional) Modbus slave unit ID :param kwargs: - :returns: A deferred response handle :raises ModbusException: """ return self.execute( @@ -535,7 +498,6 @@ def read_fifo_queue( :param address: The address to start reading from :param kwargs: - :returns: A deferred response handle :raises ModbusException: """ return self.execute(pdu_file_msg.ReadFifoQueueRequest(address, **kwargs)) @@ -550,7 +512,6 @@ def read_device_information( :param read_code: The device information read code :param object_id: The object to read from :param kwargs: - :returns: A deferred response handle :raises ModbusException: """ return self.execute( diff --git a/test/test_client.py b/test/test_client.py index 77645d36e..7f3483606 100755 --- a/test/test_client.py +++ b/test/test_client.py @@ -38,7 +38,7 @@ ], ) @pytest.mark.parametrize( - "method, arg, response", + "method, arg, pdu_request", [ ("read_coils", 1, pdu_bit_read.ReadCoilsRequest), ("read_discrete_inputs", 1, pdu_bit_read.ReadDiscreteInputsRequest), @@ -90,10 +90,18 @@ ("mask_write_register", 1, pdu_req_write.MaskWriteRegisterRequest), ], ) -def test_client_mixin(arglist, method, arg, response): +def test_client_mixin(arglist, method, arg, pdu_request): """Test mixin responses.""" - rr = getattr(ModbusClientMixin(), method)(**arglist[arg]) - assert isinstance(rr, response) + pdu_to_call = None + + def fake_execute(_self, request): + """Set PDU request.""" + nonlocal pdu_to_call + pdu_to_call = request + + with mock.patch.object(ModbusClientMixin, "execute", fake_execute): + getattr(ModbusClientMixin(), method)(**arglist[arg]) + assert isinstance(pdu_to_call, pdu_request) @pytest.mark.xdist_group(name="client")