Files
ophyd_devices/tests/test_socket.py

88 lines
2.2 KiB
Python

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