@@ -84,6 +84,33 @@ check_server_ports_available_manual_conflict_ipv6_test() ->
8484 end
8585 ).
8686
87+ check_server_ports_available_manual_different_ipv4_ip_no_conflict_test () ->
88+ with_ipv4_alias_support (
89+ {127 , 0 , 0 , 2 },
90+ fun () ->
91+ {ok , Blocker } = gen_tcp :listen (
92+ 0 ,
93+ [binary , {reuseaddr , true }, {active , false }, {ip , {127 , 0 , 0 , 2 }}]
94+ ),
95+ {ok , {_ , Port }} = inet :sockname (Blocker ),
96+ try
97+ with_env (
98+ #{
99+ port_discovery => manual ,
100+ tcp_server_port => Port ,
101+ ssl_server_port => false ,
102+ socket_ip => {127 , 0 , 0 , 1 }
103+ },
104+ fun () ->
105+ ? assertEqual (ok , gen_rpc :check_server_ports_available ())
106+ end
107+ )
108+ after
109+ ok = gen_tcp :close (Blocker )
110+ end
111+ end
112+ ).
113+
87114maybe_with_blocker (Port , Fun ) ->
88115 case gen_tcp :listen (Port , [binary , {reuseaddr , true }, {active , false }, {ip , {127 , 0 , 0 , 1 }}]) of
89116 {ok , Blocker } ->
@@ -142,3 +169,14 @@ with_ipv6_support(Fun) ->
142169 {error , Reason } ->
143170 error ({unexpected_ipv6_probe_error , Reason })
144171 end .
172+
173+ with_ipv4_alias_support (IP , Fun ) ->
174+ case gen_tcp :listen (0 , [binary , {reuseaddr , true }, {active , false }, {ip , IP }]) of
175+ {ok , Probe } ->
176+ ok = gen_tcp :close (Probe ),
177+ Fun ();
178+ {error , eaddrnotavail } ->
179+ ok ;
180+ {error , Reason } ->
181+ error ({unexpected_ipv4_alias_probe_error , IP , Reason })
182+ end .
0 commit comments