okami.mom/albedo

git clone https://git.nkp.pet/okami.mom/albedo

nekomimi.pettest: surface a reset before the status line as the reset, not ResponseNotReady122feb9

main
1.7 KiB53 linesraw
1"""Catches a daemon connection reset surfacing as ``ResponseNotReady``.
2
3``_Response.close`` read headers that ``begin()`` never set, which replaced the
4reset, so the ``OSError`` retry in the listener-restart test failed. That reset
5only lands inside a restart window, so E2E reaches it rarely; this drives the
6real connection against a socket that resets every request.
7"""
8
9import socket
10import struct
11import sys
12import threading
13import unittest
14from pathlib import Path
15
16ROOT = Path(__file__).resolve().parents[2]
17sys.path.insert(0, str(ROOT / "test" / "e2e"))
18import harness  # noqa: E402
19
20
21class ResetTest(unittest.TestCase):
22    def reset_server(self):
23        """Returns the port of a listener that resets each connection."""
24        server = socket.socket()
25        server.bind(("127.0.0.1", 0))
26        server.listen()
27        self.addCleanup(server.close)
28
29        def reset_each_request():
30            while True:
31                try:
32                    peer, _ = server.accept()
33                except OSError:
34                    return
35                peer.recv(4096)
36                peer.setsockopt(
37                    socket.SOL_SOCKET, socket.SO_LINGER, struct.pack("ii", 1, 0)
38                )
39                peer.close()
40
41        threading.Thread(target=reset_each_request, daemon=True).start()
42        return server.getsockname()[1]
43
44    def test_a_reset_before_the_status_line_is_raised_as_the_reset(self):
45        connection = harness._Connection(self.reset_server(), "token")
46        self.addCleanup(connection.close)
47        connection.request("GET", "/server")
48        with self.assertRaises(ConnectionError):
49            connection.getresponse()
50
51
52if __name__ == "__main__":
53    unittest.main()