From 28a3a97ad34499fc63754a7eb0b07c313e5b54b5 Mon Sep 17 00:00:00 2001 From: Hasan Date: Fri, 6 Nov 2026 16:05:40 +0500 Subject: [PATCH] TCPServer.new takes a nil host and a String port TCPServer.new([hostname,] port) passes both arguments to getaddrinfo, so the host can be nil and the port can be a String, either a number or a service name. The signature only allowed a String host and an Integer port, so calls such as TCPServer.new(nil, 0) and TCPServer.new("127.0.0.1", "8080") didn't type-check. Allow String? for the host and Integer | String for the port, return void from initialize, and add TCPServerSingletonTest#test_new. Fixes #1671 --- stdlib/socket/0/tcp_server.rbs | 2 +- test/stdlib/socket/TCPServer_test.rb | 37 ++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 test/stdlib/socket/TCPServer_test.rb diff --git a/stdlib/socket/0/tcp_server.rbs b/stdlib/socket/0/tcp_server.rbs index 05f3d3f473..8dd6246d38 100644 --- a/stdlib/socket/0/tcp_server.rbs +++ b/stdlib/socket/0/tcp_server.rbs @@ -188,5 +188,5 @@ class TCPServer < TCPSocket # getaddrinfo() returns multiple addresses, TCPServer.new tries to create a # server socket for each address and returns first one that is successful. # - def initialize: (?String host, Integer port) -> untyped + def initialize: (?String? host, Integer | String port) -> void end diff --git a/test/stdlib/socket/TCPServer_test.rb b/test/stdlib/socket/TCPServer_test.rb new file mode 100644 index 0000000000..b871b0d201 --- /dev/null +++ b/test/stdlib/socket/TCPServer_test.rb @@ -0,0 +1,37 @@ +require_relative "../test_helper" + +require "socket" + +class TCPServerSingletonTest < Test::Unit::TestCase + include TestHelper + + library "socket" + testing "singleton(::TCPServer)" + + def test_new + assert_send_type( + "(::Integer) -> ::TCPServer", + TCPServer, :new, 0 + ).close + + assert_send_type( + "(::String) -> ::TCPServer", + TCPServer, :new, "0" + ).close + + assert_send_type( + "(::String, ::Integer) -> ::TCPServer", + TCPServer, :new, "127.0.0.1", 0 + ).close + + assert_send_type( + "(::String, ::String) -> ::TCPServer", + TCPServer, :new, "127.0.0.1", "0" + ).close + + assert_send_type( + "(nil, ::Integer) -> ::TCPServer", + TCPServer, :new, nil, 0 + ).close + end +end