async def test_connect_failure(serial): """Test serial transport connect failure.""" serial.side_effect = OSError("Boom") transport = SerialTransport("/test", 123456) with pytest.raises(TransportError): await transport.connect()
async def test_read_failure(serial): """Test serial transport read failure.""" mock_reader, mock_writer = serial.return_value transport = SerialTransport("/test", 123456) await transport.connect() assert serial.call_count == 1 assert serial.call_args == call(url="/test", baudrate=123456) mock_reader.readuntil.side_effect = asyncio.LimitOverrunError("Boom", consumed=2) with pytest.raises(TransportReadError): await transport.read() mock_reader.readuntil.side_effect = asyncio.IncompleteReadError( partial=b"partial_test", expected=20) with pytest.raises(TransportReadError) as exc_info: await transport.read() assert exc_info.value.partial_bytes == b"partial_test" mock_reader.readuntil.side_effect = OSError("Boom") with pytest.raises(TransportFailedError): await transport.read() await transport.disconnect() assert mock_writer.close.call_count == 1 assert mock_writer.wait_closed.call_count == 1
async def test_connect_disconnect(serial): """Test serial transport connect and disconnect.""" transport = SerialTransport("/test", 123456) await transport.connect() assert serial.call_count == 1 assert serial.call_args == call(url="/test", baudrate=123456) await transport.disconnect() _, mock_writer = serial.return_value assert mock_writer.close.call_count == 1 assert mock_writer.wait_closed.call_count == 1
async def test_disconnect_failure(serial): """Test serial transport disconnect failure.""" _, mock_writer = serial.return_value mock_writer.wait_closed.side_effect = OSError("Boom") transport = SerialTransport("/test", 123456) await transport.connect() # Disconnect error should be caught. await transport.disconnect() assert serial.call_count == 1 assert serial.call_args == call(url="/test", baudrate=123456) assert mock_writer.close.call_count == 1 assert mock_writer.wait_closed.call_count == 1
async def test_read_write(serial): """Test serial transport read and write.""" mock_reader, mock_writer = serial.return_value bytes_message = b"0;0;0;0;0;test\n" mock_reader.readuntil.return_value = bytes_message transport = SerialTransport("/test", 123456) await transport.connect() assert serial.call_count == 1 assert serial.call_args == call(url="/test", baudrate=123456) read = await transport.read() assert read == "0;0;0;0;0;test\n" await transport.write(read) assert mock_writer.write.call_count == 1 assert mock_writer.write.call_args == call(bytes_message) await transport.disconnect() assert mock_writer.close.call_count == 1 assert mock_writer.wait_closed.call_count == 1
async def test_write_failure(serial): """Test serial transport write failure.""" mock_reader, mock_writer = serial.return_value bytes_message = b"0;0;0;0;0;test\n" mock_reader.readuntil.return_value = bytes_message transport = SerialTransport("/test", 123456) await transport.connect() assert serial.call_count == 1 assert serial.call_args == call(url="/test", baudrate=123456) read = await transport.read() mock_writer.write.side_effect = OSError("Boom") with pytest.raises(TransportFailedError): await transport.write(read) await transport.disconnect() assert mock_writer.close.call_count == 1 assert mock_writer.wait_closed.call_count == 1
async def gateway_factory() -> Gateway: """Return a gateway.""" transport = SerialTransport(port, baud) gateway = Gateway(transport) return gateway