import socket from unittest import mock import pytest from ophyd_devices.utils.socket import SocketIO class DummySocket: AF_INET = 2 SOCK_STREAM = 1 def __init__(self) -> None: self.address_family = None self.socket_kind = None self.timeout = None def socket(self, address_family, socket_kind): self.address_family = address_family self.socket_kind = socket_kind return self def settimeout(self, timeout): self.timeout = timeout def send(self, msg, *args, **kwargs): self.send_buffer = msg def connect(self, address): self.host = address[0] self.port = address[1] self.connected = True def close(self): self.connected = False def test_socket_init(): socketio = SocketIO("localhost", 8080) assert socketio.host == "localhost" assert socketio.port == 8080 assert socketio.is_open == False assert socketio.sock.family == socket.AF_INET assert socketio.sock.type == socket.SOCK_STREAM def test_socket_put(): dsocket = DummySocket() socketio = SocketIO("localhost", 8080) socketio.sock = dsocket socketio.put(b"message") assert dsocket.send_buffer == b"message" def test_open(): dsocket = DummySocket() socketio = SocketIO("localhost", 8080) socketio.sock = dsocket socketio.open() assert socketio.is_open == True assert socketio.sock.host == socketio.host assert socketio.sock.port == socketio.port def test_socket_open_with_timeout(): dsocket = DummySocket() socketio = SocketIO("localhost", 8080) socketio.sock = dsocket with mock.patch.object(dsocket, "connect") as mock_connect: socketio.open(timeout=0.1) mock_connect.assert_called_once() mock_connect.reset_mock() # There is a 1s sleep in the retry loop, mock_connect should be called only once mock_connect.side_effect = Exception("Connection failed") with pytest.raises(ConnectionError): socketio.open(timeout=0.4) mock_connect.assert_called_once() def test_close(): socketio = SocketIO("localhost", 8080) socketio.close() assert socketio.sock == None assert socketio.is_open == False