Skip to content

Commit b53a752

Browse files
authored
Fix tests for fast_fallback (#12406)
* TCPSocket.new: Close resources in ensure * TCPSocket.new: Remove unnecessary comments * Socket.tcp: Make assert_separately in TestSocket more readable * Socket.tcp: Returning instead of exiting * Socket.tcp: Close resources in ensure * Socket.tcp: Avoid test failures on hosts that only support IPv4
1 parent 2f6c694 commit b53a752

File tree

2 files changed

+156
-153
lines changed

2 files changed

+156
-153
lines changed

test/socket/test_socket.rb

Lines changed: 112 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -780,17 +780,18 @@ def test_resolurion_error_error_code
780780

781781
def test_tcp_socket_v6_hostname_resolved_earlier
782782
opts = %w[-rsocket -W1]
783-
assert_separately opts, "#{<<-"begin;"}\n#{<<-'end;'}"
784-
785-
begin;
783+
assert_separately opts, <<~RUBY
784+
begin
786785
begin
786+
# Verify that "localhost" can be resolved to an IPv6 address
787+
Socket.getaddrinfo("localhost", 0, Socket::AF_INET6)
787788
server = TCPServer.new("::1", 0)
788-
rescue Errno::EADDRNOTAVAIL # IPv6 is not supported
789-
exit
789+
rescue Socket::ResolutionError, Errno::EADDRNOTAVAIL # IPv6 is not supported
790+
return
790791
end
791792
793+
_, port, = server.addr
792794
server_thread = Thread.new { server.accept }
793-
port = server.addr[1]
794795
795796
Addrinfo.define_singleton_method(:getaddrinfo) do |_, _, family, *_|
796797
case family
@@ -801,19 +802,21 @@ def test_tcp_socket_v6_hostname_resolved_earlier
801802
802803
socket = Socket.tcp("localhost", port)
803804
assert_true(socket.remote_address.ipv6?)
804-
server_thread.value.close
805-
server.close
806-
socket.close if socket && !socket.closed?
807-
end;
805+
ensure
806+
server_thread&.value&.close
807+
server&.close
808+
socket&.close
809+
end
810+
RUBY
808811
end
809812

810813
def test_tcp_socket_v4_hostname_resolved_earlier
811814
opts = %w[-rsocket -W1]
812-
assert_separately opts, "#{<<-"begin;"}\n#{<<-'end;'}"
813-
814-
begin;
815+
assert_separately opts, <<~RUBY
816+
begin
815817
server = TCPServer.new("127.0.0.1", 0)
816-
port = server.addr[1]
818+
_, port, = server.addr
819+
server_thread = Thread.new { server.accept }
817820
818821
Addrinfo.define_singleton_method(:getaddrinfo) do |_, _, family, *_|
819822
case family
@@ -822,27 +825,31 @@ def test_tcp_socket_v4_hostname_resolved_earlier
822825
end
823826
end
824827
825-
server_thread = Thread.new { server.accept }
826828
socket = Socket.tcp("localhost", port)
827829
assert_true(socket.remote_address.ipv4?)
828-
server_thread.value.close
829-
server.close
830-
socket.close if socket && !socket.closed?
831-
end;
830+
ensure
831+
server_thread&.value&.close
832+
server&.close
833+
socket&.close
834+
end
835+
RUBY
832836
end
833837

834838
def test_tcp_socket_v6_hostname_resolved_in_resolution_delay
835839
opts = %w[-rsocket -W1]
836-
assert_separately opts, "#{<<-"begin;"}\n#{<<-'end;'}"
837-
838-
begin;
840+
assert_separately opts, <<~RUBY
841+
begin
839842
begin
843+
# Verify that "localhost" can be resolved to an IPv6 address
844+
Socket.getaddrinfo("localhost", 0, Socket::AF_INET6)
840845
server = TCPServer.new("::1", 0)
841-
rescue Errno::EADDRNOTAVAIL # IPv6 is not supported
842-
exit
846+
rescue Socket::ResolutionError, Errno::EADDRNOTAVAIL # IPv6 is not supported
847+
return
843848
end
844849
845-
port = server.addr[1]
850+
_, port, = server.addr
851+
server_thread = Thread.new { server.accept }
852+
846853
delay_time = 0.025 # Socket::RESOLUTION_DELAY (private) is 0.05
847854
848855
Addrinfo.define_singleton_method(:getaddrinfo) do |_, _, family, *_|
@@ -852,24 +859,25 @@ def test_tcp_socket_v6_hostname_resolved_in_resolution_delay
852859
end
853860
end
854861
855-
server_thread = Thread.new { server.accept }
856862
socket = Socket.tcp("localhost", port)
857863
assert_true(socket.remote_address.ipv6?)
858-
server_thread.value.close
859-
server.close
860-
socket.close if socket && !socket.closed?
861-
end;
864+
ensure
865+
server_thread&.value&.close
866+
server&.close
867+
socket&.close
868+
end
869+
RUBY
862870
end
863871

864872
def test_tcp_socket_v6_hostname_resolved_earlier_and_v6_server_is_not_listening
865873
opts = %w[-rsocket -W1]
866-
assert_separately opts, "#{<<-"begin;"}\n#{<<-'end;'}"
867-
868-
begin;
874+
assert_separately opts, <<~RUBY
875+
begin
869876
ipv4_address = "127.0.0.1"
870-
ipv4_server = Socket.new(Socket::AF_INET, :STREAM)
871-
ipv4_server.bind(Socket.pack_sockaddr_in(0, ipv4_address))
872-
port = ipv4_server.connect_address.ip_port
877+
server = Socket.new(Socket::AF_INET, :STREAM)
878+
server.bind(Socket.pack_sockaddr_in(0, ipv4_address))
879+
port = server.connect_address.ip_port
880+
server_thread = Thread.new { server.listen(1); server.accept }
873881
874882
Addrinfo.define_singleton_method(:getaddrinfo) do |_, _, family, *_|
875883
case family
@@ -878,67 +886,71 @@ def test_tcp_socket_v6_hostname_resolved_earlier_and_v6_server_is_not_listening
878886
end
879887
end
880888
881-
ipv4_server_thread = Thread.new { ipv4_server.listen(1); ipv4_server.accept }
882889
socket = Socket.tcp("localhost", port)
883890
assert_equal(ipv4_address, socket.remote_address.ip_address)
884-
885-
accepted, _ = ipv4_server_thread.value
886-
accepted.close
887-
ipv4_server.close
888-
socket.close if socket && !socket.closed?
889-
end;
891+
ensure
892+
accepted, _ = server_thread&.value
893+
accepted&.close
894+
server&.close
895+
socket&.close
896+
end
897+
RUBY
890898
end
891899

892900
def test_tcp_socket_resolv_timeout
893901
opts = %w[-rsocket -W1]
894-
assert_separately opts, "#{<<-"begin;"}\n#{<<-'end;'}"
902+
assert_separately opts, <<~RUBY
903+
begin
904+
server = TCPServer.new("localhost", 0)
905+
_, port, = server.addr
895906
896-
begin;
897907
Addrinfo.define_singleton_method(:getaddrinfo) { |*_| sleep }
898-
port = TCPServer.new("localhost", 0).addr[1]
899908
900909
assert_raise(Errno::ETIMEDOUT) do
901910
Socket.tcp("localhost", port, resolv_timeout: 0.01)
902911
end
903-
end;
912+
ensure
913+
server&.close
914+
end
915+
RUBY
904916
end
905917

906918
def test_tcp_socket_resolv_timeout_with_connection_failure
907919
opts = %w[-rsocket -W1]
908-
assert_separately opts, "#{<<-"begin;"}\n#{<<-'end;'}"
909-
910-
begin;
911-
server = TCPServer.new("127.0.0.1", 12345)
912-
_, port, = server.addr
920+
assert_separately opts, <<~RUBY
921+
server = TCPServer.new("127.0.0.1", 12345)
922+
_, port, = server.addr
913923
914-
Addrinfo.define_singleton_method(:getaddrinfo) do |_, _, family, *_|
915-
if family == Socket::AF_INET6
916-
sleep
917-
else
918-
[Addrinfo.tcp("127.0.0.1", port)]
919-
end
924+
Addrinfo.define_singleton_method(:getaddrinfo) do |_, _, family, *_|
925+
if family == Socket::AF_INET6
926+
sleep
927+
else
928+
[Addrinfo.tcp("127.0.0.1", port)]
920929
end
930+
end
921931
922-
server.close
932+
server.close
923933
924-
assert_raise(Errno::ETIMEDOUT) do
925-
Socket.tcp("localhost", port, resolv_timeout: 0.01)
926-
end
927-
end;
934+
assert_raise(Errno::ETIMEDOUT) do
935+
Socket.tcp("localhost", port, resolv_timeout: 0.01)
936+
end
937+
RUBY
928938
end
929939

930940
def test_tcp_socket_one_hostname_resolution_succeeded_at_least
931941
opts = %w[-rsocket -W1]
932-
assert_separately opts, "#{<<-"begin;"}\n#{<<-'end;'}"
933-
934-
begin;
942+
assert_separately opts, <<~RUBY
943+
begin
935944
begin
945+
# Verify that "localhost" can be resolved to an IPv6 address
946+
Socket.getaddrinfo("localhost", 0, Socket::AF_INET6)
936947
server = TCPServer.new("::1", 0)
937-
rescue Errno::EADDRNOTAVAIL # IPv6 is not supported
938-
exit
948+
rescue Socket::ResolutionError, Errno::EADDRNOTAVAIL # IPv6 is not supported
949+
return
939950
end
940951
941-
port = server.addr[1]
952+
_, port, = server.addr
953+
server_thread = Thread.new { server.accept }
942954
943955
Addrinfo.define_singleton_method(:getaddrinfo) do |_, _, family, *_|
944956
case family
@@ -947,75 +959,81 @@ def test_tcp_socket_one_hostname_resolution_succeeded_at_least
947959
end
948960
end
949961
950-
server_thread = Thread.new { server.accept }
951962
socket = nil
952963
953964
assert_nothing_raised do
954965
socket = Socket.tcp("localhost", port)
955966
end
956-
957-
server_thread.value.close
958-
server.close
959-
socket.close if socket && !socket.closed?
960-
end;
967+
ensure
968+
server_thread&.value&.close
969+
server&.close
970+
socket&.close
971+
end
972+
RUBY
961973
end
962974

963975
def test_tcp_socket_all_hostname_resolution_failed
964976
opts = %w[-rsocket -W1]
965-
assert_separately opts, "#{<<-"begin;"}\n#{<<-'end;'}"
977+
assert_separately opts, <<~RUBY
978+
begin
979+
server = TCPServer.new("localhost", 0)
980+
_, port, = server.addr
966981
967-
begin;
968982
Addrinfo.define_singleton_method(:getaddrinfo) do |_, _, family, *_|
969983
case family
970984
when Socket::AF_INET6 then raise SocketError
971985
when Socket::AF_INET then sleep(0.001); raise SocketError, "Last hostname resolution error"
972986
end
973987
end
974-
port = TCPServer.new("localhost", 0).addr[1]
975988
976989
assert_raise_with_message(SocketError, "Last hostname resolution error") do
977990
Socket.tcp("localhost", port)
978991
end
979-
end;
992+
ensure
993+
server&.close
994+
end
995+
RUBY
980996
end
981997

982998
def test_tcp_socket_v6_address_passed
983999
opts = %w[-rsocket -W1]
984-
assert_separately opts, "#{<<-"begin;"}\n#{<<-'end;'}"
985-
986-
begin;
1000+
assert_separately opts, <<~RUBY
1001+
begin
9871002
begin
1003+
# Verify that "localhost" can be resolved to an IPv6 address
1004+
Socket.getaddrinfo("localhost", 0, Socket::AF_INET6)
9881005
server = TCPServer.new("::1", 0)
989-
rescue Errno::EADDRNOTAVAIL # IPv6 is not supported
990-
exit
1006+
rescue Socket::ResolutionError, Errno::EADDRNOTAVAIL # IPv6 is not supported
1007+
return
9911008
end
9921009
9931010
_, port, = server.addr
1011+
server_thread = Thread.new { server.accept }
9941012
9951013
Addrinfo.define_singleton_method(:getaddrinfo) do |*_|
9961014
[Addrinfo.tcp("::1", port)]
9971015
end
9981016
999-
server_thread = Thread.new { server.accept }
10001017
socket = Socket.tcp("::1", port)
1001-
10021018
assert_true(socket.remote_address.ipv6?)
1003-
server_thread.value.close
1004-
server.close
1005-
socket.close if socket && !socket.closed?
1006-
end;
1019+
ensure
1020+
server_thread&.value&.close
1021+
server&.close
1022+
socket&.close
1023+
end
1024+
RUBY
10071025
end
10081026

10091027
def test_tcp_socket_fast_fallback_is_false
10101028
server = TCPServer.new("127.0.0.1", 0)
10111029
_, port, = server.addr
10121030
server_thread = Thread.new { server.accept }
10131031
socket = Socket.tcp("127.0.0.1", port, fast_fallback: false)
1014-
10151032
assert_true(socket.remote_address.ipv4?)
1016-
server_thread.value.close
1017-
server.close
1018-
socket.close if socket && !socket.closed?
1033+
ensure
1034+
server_thread&.value&.close
1035+
server&.close
1036+
socket&.close
10191037
end
10201038

10211039
def test_tcp_fast_fallback

0 commit comments

Comments
 (0)