Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_comm.py
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,10 @@ def start_server(port):
pydev_log.info(msg)

new_socket, _addr = s.accept()
try:
new_socket.setsockopt(socket_module.IPPROTO_TCP, socket_module.TCP_NODELAY, 1)
except (AttributeError, OSError):
pass # May not be available everywhere.
pydev_log.info("Connection accepted")
# closing server socket is not necessary but we don't need it
s.close()
Expand Down Expand Up @@ -525,6 +529,10 @@ def start_client(host, port):
s.setsockopt(socket_module.IPPROTO_TCP, socket_module.TCP_KEEPCNT, 5)
except (AttributeError, OSError):
pass # May not be available everywhere.
try:
s.setsockopt(socket_module.IPPROTO_TCP, socket_module.TCP_NODELAY, 1)
except (AttributeError, OSError):
pass # May not be available everywhere.

try:
# 10 seconds default timeout
Expand Down
57 changes: 57 additions & 0 deletions src/debugpy/_vendored/pydevd/tests_python/test_pydevd_comm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
from unittest import mock

import pytest

from _pydevd_bundle import pydevd_comm


def start_client(monkeypatch, sock):
monkeypatch.setattr(pydevd_comm, "socket", mock.Mock(return_value=sock))
monkeypatch.setattr(
pydevd_comm.socket_module,
"getaddrinfo",
lambda *_: [(pydevd_comm.AF_INET, pydevd_comm.SOCK_STREAM, 0, "", ("127.0.0.1", 5678))],
)
assert pydevd_comm.start_client("localhost", 5678) is sock
sock.connect.assert_called_once_with(("localhost", 5678))


def test_start_client_sets_tcp_nodelay(monkeypatch):
sock = mock.Mock()
monkeypatch.setattr(pydevd_comm.socket_module, "TCP_NODELAY", mock.sentinel.tcp_nodelay)
Comment thread
nightcityblade marked this conversation as resolved.
Outdated

start_client(monkeypatch, sock)
sock.setsockopt.assert_any_call(pydevd_comm.socket_module.IPPROTO_TCP, mock.sentinel.tcp_nodelay, 1)


@pytest.mark.parametrize("error", [AttributeError, OSError])
def test_start_client_ignores_tcp_nodelay_error(monkeypatch, error):
sock = mock.Mock()
sock.setsockopt.side_effect = error
monkeypatch.setattr(pydevd_comm.socket_module, "TCP_NODELAY", mock.sentinel.tcp_nodelay)

start_client(monkeypatch, sock)
sock.setsockopt.assert_any_call(pydevd_comm.socket_module.IPPROTO_TCP, mock.sentinel.tcp_nodelay, 1)


def test_start_server_sets_tcp_nodelay(monkeypatch):
server, accepted = mock.Mock(), mock.Mock()
address = ("127.0.0.1", 5678)
server.configure_mock(**{"accept.return_value": (accepted, address), "getsockname.return_value": address})
monkeypatch.setattr(pydevd_comm, "create_server_socket", mock.Mock(return_value=server))
monkeypatch.setattr(pydevd_comm.socket_module, "TCP_NODELAY", mock.sentinel.tcp_nodelay)
assert pydevd_comm.start_server(0) is accepted
accepted.setsockopt.assert_called_once_with(pydevd_comm.socket_module.IPPROTO_TCP, mock.sentinel.tcp_nodelay, 1)


@pytest.mark.parametrize("error", [AttributeError, OSError])
def test_start_server_ignores_tcp_nodelay_error(monkeypatch, error):
server, accepted = mock.Mock(), mock.Mock()
address = ("127.0.0.1", 5678)
server.configure_mock(**{"accept.return_value": (accepted, address), "getsockname.return_value": address})
accepted.setsockopt.side_effect = error
monkeypatch.setattr(pydevd_comm, "create_server_socket", mock.Mock(return_value=server))
monkeypatch.setattr(pydevd_comm.socket_module, "TCP_NODELAY", mock.sentinel.tcp_nodelay)

assert pydevd_comm.start_server(0) is accepted
accepted.setsockopt.assert_called_once_with(pydevd_comm.socket_module.IPPROTO_TCP, mock.sentinel.tcp_nodelay, 1)