37 lines
1.2 KiB
Python
37 lines
1.2 KiB
Python
"""The locator test client's framing survives fragmented timeout polls."""
|
|
|
|
import socket
|
|
import threading
|
|
import unittest
|
|
from unittest.mock import Mock
|
|
|
|
from locator_test_client import encode_packet, read_packet, recv_exactly
|
|
|
|
|
|
class LocatorClientTest(unittest.TestCase):
|
|
def test_partial_header_and_payload_survive_timeouts(self) -> None:
|
|
payload = {"vlc": 5.5}
|
|
packet = encode_packet(payload, 7)
|
|
sock = Mock()
|
|
sock.recv.side_effect = [packet[:3], socket.timeout(), packet[3:8],
|
|
packet[8:10], socket.timeout(), packet[10:]]
|
|
self.assertEqual(read_packet(sock), (7, payload))
|
|
|
|
def test_timeout_wait_can_be_stopped_without_losing_thread(self) -> None:
|
|
stop = threading.Event()
|
|
sock = Mock()
|
|
|
|
def receive(_size):
|
|
stop.set()
|
|
raise socket.timeout()
|
|
|
|
sock.recv.side_effect = receive
|
|
with self.assertRaisesRegex(ConnectionError, "stopped"):
|
|
recv_exactly(sock, 8, stop)
|
|
|
|
def test_eof_in_the_middle_of_packet_is_reported(self) -> None:
|
|
sock = Mock()
|
|
sock.recv.side_effect = [b"123", b""]
|
|
with self.assertRaisesRegex(ConnectionError, "closed"):
|
|
read_packet(sock)
|