File 0495-kernel-inet-sockopt-test-Skip-for-eaddrinuse.patch of Package erlang
From 2f26615af29df826266f9ba2bcfb1d6853a42a34 Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Thu, 6 May 2021 14:13:34 +0200
Subject: [PATCH 1/2] [kernel|inet-sockopt|test] Skip for eaddrinuse
When creating the IPv4 (inet) socket, we must handle
that the IPv4 port could already be used = eaddrinuse
and therefor skip (instead of fail).
---
lib/kernel/test/inet_sockopt_SUITE.erl | 74 +++++++++++++++++++-------
1 file changed, 54 insertions(+), 20 deletions(-)
diff --git a/lib/kernel/test/inet_sockopt_SUITE.erl b/lib/kernel/test/inet_sockopt_SUITE.erl
index 8587555981..ff24b2f0c3 100644
--- a/lib/kernel/test/inet_sockopt_SUITE.erl
+++ b/lib/kernel/test/inet_sockopt_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
-module(inet_sockopt_SUITE).
-include_lib("common_test/include/ct.hrl").
+-include("kernel_test_lib.hrl").
-define(C_GET_IPPROTO_TCP,1).
@@ -625,43 +626,74 @@ ipv6_v6only_close(Module, Socket) ->
%% Test using socket option ipv6_v6only for UDP.
use_ipv6_v6only_udp(Config) when is_list(Config) ->
+ ?TC_TRY(use_ipv6_v6only_udp,
+ fun() -> do_use_ipv6_v6only_udp(Config) end).
+
+do_use_ipv6_v6only_udp(Config) ->
case gen_udp:open(0, [inet6,{ip,{0,0,0,0,0,0,0,1}}, {ipv6_v6only,true}]) of
{ok,S6} ->
+ ?P("IPv6 socket option created - ensure ipv6_v6only"),
case inet:getopts(S6, [ipv6_v6only]) of
{ok,[{ipv6_v6only,true}]} ->
use_ipv6_v6only_udp(Config, S6);
- {ok,Other} ->
- {skipped,{getopts,Other}}
+ {ok, Other} ->
+ ?P("IPv6 socket option created - "
+ "failed ensuring ipv6_v6only"),
+ exit({skip, {getopts, Other}})
end;
- {error,_} ->
- {skipped,"Socket type not supported"}
+ {error, OReason} ->
+ ?P("failed create IPv6 socket: "
+ "~n ~p", [OReason]),
+ exit({skip, "Socket type not supported"})
end.
use_ipv6_v6only_udp(_Config, S6) ->
- {ok,Port} = inet:port(S6),
- {ok,S4} = gen_udp:open(Port, [inet]),
+ {ok, Port} = inet:port(S6),
+ ?P("IPv6 socket port number: ~w", [Port]),
+ S4 = case gen_udp:open(Port, [inet]) of
+ {ok, Sock4} ->
+ ?P("IPv4 socket created with port number ~w", [Port]),
+ Sock4;
+ {error, eaddrinuse = Reason} ->
+ ?P("failed create IPv4 socket: ~p => skip", [Reason]),
+ exit({skip, Reason});
+ {error, Reason} ->
+ ?P("failed create IPv4 socket: "
+ "~n ~p", [Reason]),
+ ct:fail({failed_open, inet, Reason})
+ end,
E6 = " IPv6-echo.",
E4 = " IPv4-echo.",
- Sender =
- spawn_link(fun () -> use_ipv6_v6only_udp_sender(Port, E6, E4) end),
+ {Sender, MRef} =
+ spawn_monitor(fun () ->
+ use_ipv6_v6only_udp_sender(Port, E6, E4)
+ end),
use_ipv6_v6only_udp_listener(
- S6, S4, E6, E4, monitor(process, Sender)).
+ S6, S4, E6, E4, Sender, MRef).
-use_ipv6_v6only_udp_listener(S6, S4, E6, E4, Mref) ->
+use_ipv6_v6only_udp_listener(S6, S4, E6, E4, Sender, Mref) ->
+ ?P("await upd message"),
receive
{udp,S6,IP,P,Data} ->
+ ?P("received (IPv6) upd message"),
ok = gen_udp:send(S6, IP, P, [Data|E6]),
- use_ipv6_v6only_udp_listener(S6, S4, E6, E4, Mref);
+ use_ipv6_v6only_udp_listener(S6, S4, E6, E4, Sender, Mref);
{udp,S4,IP,P,Data} ->
+ ?P("received (IPv4) upd message"),
ok = gen_udp:send(S4, IP, P, [Data|E4]),
- use_ipv6_v6only_udp_listener(S6, S4, E6, E4, Mref);
- {'DOWN',Mref,_,_,normal} ->
+ use_ipv6_v6only_udp_listener(S6, S4, E6, E4, Sender, Mref);
+ {'DOWN', Mref,_,_, normal} ->
+ ?P("received expected normal down message"),
ok;
- {'DOWN',Mref,_,_,Result} ->
+ {'DOWN', Mref,_,_, Result} ->
%% Since we are linked we will never arrive here
+ ?P("received expected down message: "
+ "~n ~p", [Result]),
Result;
Other ->
- exit({failed,{listener_unexpected,Other}})
+ ?P("received unexpected message: "
+ "~n ~p", [Other]),
+ exit({failed, {listener_unexpected, Other}})
end.
use_ipv6_v6only_udp_sender(Port, E6, E4) ->
@@ -675,14 +707,16 @@ use_ipv6_v6only_udp_sender(Port, E6, E4) ->
sndrcv(Ip, Port, Opts, Data) ->
{ok,S} = gen_udp:open(0, Opts),
- io:format("[~w:~w] ! ~s~n", [Ip,Port,Data]),
+ ?P("[~w:~w] ! ~s", [Ip, Port, Data]),
ok = gen_udp:send(S, Ip, Port, Data),
receive
- {udp,S,Ip,Port,RecData} ->
- io:format("[~w:~w] : ~s~n", [Ip,Port,RecData]),
+ {udp, S, Ip, Port, RecData} ->
+ ?P("[~w:~w] : ~s", [Ip, Port, RecData]),
RecData;
Other ->
- exit({failed,{sndrcv_unexpectec,Other}})
+ ?P("received unexpected message: "
+ "~n ~p", [Other]),
+ exit({failed, {sndrcv_unexpectec, Other}})
end.
--
2.26.2