-
Notifications
You must be signed in to change notification settings - Fork 37.7k
Description
Running p2p_invalid_messages.py
on its own shows a passing test, but it can fail when its run by test_runner.py
. This is because test_runner checks for an empty stderr and we have some exceptions from the asyncio event loop that aren't caught in our code.
The test does a send after we know the socket would have been closed so that any kind of RST will be realized and the connection is closed officially on our end; however, if the the extra send we do is done after the kernel has already acknowledged started the close, the send error is only caught during asyncio's asynchronous write buffer flushing task and the exception is printed to stderr.
1/1 - p2p_invalid_messages.py failed, Duration: 6 s
stdout:
2019-02-13T20:21:33.270000Z TestFramework (INFO): Initializing test directory /var/folders/y0/l8_5z4393lg2qlwdjc11n9380000gn/T/test_runner_₿_🏃_20190213_142133/p2p_invalid_messages_0
2019-02-13T20:21:34.068000Z TestFramework (INFO): Sending a bunch of large, junk messages to test memory exhaustion. May take a bit...
2019-02-13T20:21:37.903000Z TestFramework (INFO): Waiting for node to drop junk messages.
2019-02-13T20:21:38.011000Z TestFramework.mininode (WARNING): Connection lost to 127.0.0.1:11000 due to [Errno 41] Protocol wrong type for socket
2019-02-13T20:21:38.116000Z TestFramework (INFO): Sending a message with incorrect size of 2
2019-02-13T20:21:38.277000Z TestFramework (INFO): Sending a message with incorrect size of 77
2019-02-13T20:21:38.433000Z TestFramework (INFO): Sending a message with incorrect size of 78
2019-02-13T20:21:38.596000Z TestFramework (INFO): Sending a message with incorrect size of 79
2019-02-13T20:21:38.972000Z TestFramework (INFO): Stopping nodes
2019-02-13T20:21:39.232000Z TestFramework (INFO): Cleaning up /var/folders/y0/l8_5z4393lg2qlwdjc11n9380000gn/T/test_runner_₿_🏃_20190213_142133/p2p_invalid_messages_0 on exit
2019-02-13T20:21:39.232000Z TestFramework (INFO): Tests successful
stderr:
Fatal write error on socket transport
protocol: <test_framework.mininode.P2PDataStore object at 0x102fc8940>
transport: <_SelectorSocketTransport fd=10 read=polling write=<idle, bufsize=0>>
Traceback (most recent call last):
File "/usr/local/Cellar/python/3.7.2_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/selector_events.py", line 857, in write
n = self._sock.send(data)
OSError: [Errno 41] Protocol wrong type for socket
We can probably check for close prior to the extra send and I think there's a way to register an exception handler to the event loop for errors that happen outside of what your code is awaiting.