kivy / oscpy

An efficient OSC implementation compatible with python2.7 and 3.5+
MIT License
109 stars 27 forks source link

closed remote connection on windows. #48

Closed tshirtman closed 5 years ago

tshirtman commented 5 years ago

Describe the bug running tests on windows now fails, specifically, test test_server_different_port in test_server.py.

To reproduce

(.env) C:\Users\gqb\dev\oscpy>pytest -k test_server_different_port
Test session starts (platform: win32, Python 3.6.1, pytest 4.2.0, pytest-sugar 0.9.2)
rootdir: C:\Users\gqb\dev\oscpy, inifile:
plugins: sugar-0.9.2, cov-2.6.1
collecting ...

―――――――――――――――――――――――――――――――――――――――――――― test_server_different_port ――――――――――――――――――――――――――――――――――――――――――――

    def test_server_different_port():
        # used for storing values received by callback_3000
        checklist = []

        def callback_3000(*values):
            checklist.append(values[0])

        # server, will be tested:
        server_3000 = OSCThreadServer(encoding='utf8')
        sock_3000 = server_3000.listen( address='0.0.0.0', port=3000, default=True)
        server_3000.bind(b'/callback_3000', callback_3000)

        # clients sending to different ports, used to test the server:
        client_3000 = OSCClient(address='localhost', port=3000, encoding='utf8')

        # server sends message to himself, should work:
        server_3000.send_message(
            b'/callback_3000',
            ["a"],
            ip_address='localhost',
            port=3000
        )
        sleep(0.05)

        # client sends message to server, will be received properly:
        client_3000.send_message(b'/callback_3000', ["b"])
        sleep(0.05)

        # sever sends message on different port, might crash the server on windows:
        server_3000.send_message(
            b'/callback_3000',
            ["nobody is going to receive this"],
            ip_address='localhost',
            port=3001
        )
        sleep(0.05)

        # client sends message to server again. if server is dead, message
        # will not be received:
        client_3000.send_message(b'/callback_3000', ["c"])
        sleep(0.1)

        # if 'c' is missing in the received checklist, the server thread
        # crashed and could not recieve the last message from the client:
>       assert checklist == ['a', 'b', 'c']
E       AssertionError: assert ['a', 'b'] == ['a', 'b', 'c']
E         Right contains more items, first extra item: 'c'
E         Use -v to get the full diff

tests\test_server.py:927: AssertionError
----------------------------------------------- Captured stderr call -----------------------------------------------
Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Users\gqb\AppData\Local\Programs\Python\Python36\lib\threading.py", line 916, in _bootstrap_inner
    self.run()
  File "C:\Users\gqb\AppData\Local\Programs\Python\Python36\lib\threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "c:\users\gqb\dev\oscpy\oscpy\server.py", line 336, in _listen
    data, sender = sender_socket.recvfrom(65535)
ConnectionResetError: [WinError 10054] Une connexion existante a dû être fermée par l’hôte distant

 tests/test_server.py ⨯                                                                               100% ██████████

Results (0.56s):
       1 failed
         - tests/test_server.py:883 test_server_different_port
      80 deselected

(.env) C:\Users\gqb\dev\oscpy>

Expected behavior Test should pass, there is no reason that sending from client should crash the server.

Platform (please complete the following information):

Additional context doesn't reproduce in CI, only on a real windows, it seems…

tshirtman commented 5 years ago

https://stackoverflow.com/questions/29841257/why-am-i-getting-a-connectionreseterror-here hinted by this, i added another server to the test, to listen on port 3001, and now the test passes, so windows seems to actually care if someone is listening for udp messages, and causing a crash of the process if it has unread data, having another process listening on the target port, like

oscli dump -H localhost -P 3001 also allows the test to pass.