File 1062-kernel-test-Tweaked-host_and_addr-test-case.patch of Package erlang

From 30d26f10376f5d02316475ec4eca27a344abd0db Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Thu, 11 Jul 2024 07:28:43 +0200
Subject: [PATCH 1/2] [kernel|test] Tweaked host_and_addr test case

---
 lib/kernel/test/inet_SUITE.erl | 107 ++++++++++++++++++++++++++++++---
 1 file changed, 98 insertions(+), 9 deletions(-)

diff --git a/lib/kernel/test/inet_SUITE.erl b/lib/kernel/test/inet_SUITE.erl
index fedcd3d50f..599352196c 100644
--- a/lib/kernel/test/inet_SUITE.erl
+++ b/lib/kernel/test/inet_SUITE.erl
@@ -546,28 +546,117 @@ ipv4_to_ipv6(Config) when is_list(Config) ->
 
 host_and_addr() ->
     ?P("host_and_addr -> entry"),
+    %% [{timetrap,{minutes,5}}].
     [{timetrap,{minutes,5}}|required(hosts)].
 
 host_and_addr(Config) when is_list(Config) ->
-    lists:foreach(fun try_host/1, get_hosts(Config)),
+    ?P("host_and_addr -> entry with"
+       "~n   Config: ~p", [Config]),
+
+    Hosts = get_hosts(Config),
+
+    ?P("host_and_addr -> try hosts: "
+       "~n   ~p", [Hosts]),
+
+    lists:foreach(fun try_host/1, Hosts),
+
+    ?P("host_and_addr -> done"),
+
     ok.
 
-try_host({Ip0, Host}) ->
-    {ok, Ip}                             = inet:getaddr(Ip0, inet),
-    {ok,{hostent, _, _, inet, _, Ips1}}  = inet:gethostbyaddr(Ip),
-    {ok,{hostent, _, _, inet, _, _Ips2}} = inet:gethostbyname(Host),
-    true = lists:member(Ip, Ips1),
+try_host({IP0, Host}) ->
+    ?P("try_host -> entry with"
+       "~n   IP0:  ~p"
+       "~n   Host: ~p", [IP0, Host]),
+
+    {ok, IP} = inet:getaddr(IP0, inet),
+    ?P("try_host -> IP: ~p", [IP]),
+
+    IPs1 =
+        case inet:gethostbyaddr(IP) of
+            {ok, #hostent{h_name      = AHost,
+                          h_addr_list = AAddrs} = AHE} ->
+                ?P("try_host -> got hostent (by addr): "
+                   "~n   AHost:  ~p"
+                   "~n   AAddrs: ~p", [AHost, AAddrs]),
+                case string:prefix(AHost, Host) of
+                    nomatch ->
+                        %% 'Host' is not a prefix of 'AHost'
+                        %% Check if its the other way araound (just in case)
+                        case string:prefix(Host, AHost) of
+                            nomatch ->
+                                ?P("[GHBA] Host entry for wrong host: "
+                                   "~n   ~p"
+                                   "~n   => SKIP", [AHE]),
+                                exit({skip, {invalid_hostent, addr,
+                                             AHost, Host}});
+                            _ -> % Yes
+				?P("'HHost' prefix of 'Host'"),
+                                AAddrs
+                        end;
+                    _ -> % Yes
+			?P("'Host' prefix of 'AHost'"),
+                        AAddrs
+                end;
+            {error, AReason} ->
+                ?P("Failed get hostent (by addr) for ~p: "
+                   "~n   Reason: ~p"
+                   "~n   => SKIP", [IP, AReason]),
+                exit({skip, {failed_get_hostent, addr}})
+        end,
+
+    _IPs2 =
+        case inet:gethostbyname(Host) of
+            {ok, #hostent{h_name      = NHost,
+                          h_addr_list = NAddrs} = NHE} ->
+                ?P("try_host -> got hostent (by name): "
+                   "~n   NHost:  ~p"
+                   "~n   NAddrs: ~p", [NHost, NAddrs]),
+                case string:prefix(NHost, Host) of
+                    nomatch ->
+                        %% 'Host' is not a prefix of 'NHost'
+                        %% Check if its the other way araound (just in case)
+                        case string:prefix(Host, NHost) of
+                            nomatch ->
+                                ?P("[GHBN] Host entry for wrong host: "
+                                   "~n   ~p"
+                                   "~n   => SKIP", [NHE]),
+                                exit({skip, {invalid_hostent, name,
+                                             NHost, Host}});
+                            _ -> % Yes
+				?P("'NHost' prefix of 'Host'"),
+                                NAddrs
+                        end;
+                    _ -> % Yes
+			?P("'Host' prefix of 'NHost'"),
+                        NAddrs
+                end;
+            {error, NReason} ->
+                ?P("Failed get hostent (by name) for ~p: "
+                   "~n   Reason: ~p"
+                   "~n   => SKIP", [Host, NReason]),
+                exit({skip, {failed_get_hostent, name}})
+        end,
+
+    ?P("try_host -> verify IP: "
+       "~n   IP:   ~p"
+       "~n   IPs1: ~p", [IP, IPs1]),
+    true = lists:member(IP, IPs1),
+    
+    ?P("try_host -> host '~s' (~s) done", [Host, IP0]),
     ok.
 
 %% Get all hosts from the system using 'ypcat hosts' or the local
 %% equvivalent.
 
-get_hosts(_Config) -> 
+get_hosts(_Config) ->
+    Hosts = ct:get_config(test_hosts),
+    %% Hosts = _
     case os:type() of
 	{unix, _} ->
 	    List = lists:map(fun(X) ->
 				     atom_to_list(X)++" "
-			     end, ct:get_config(test_hosts)),
+			     end, Hosts),
 	    Cmd = "ypmatch "++List++" hosts.byname", 
 	    HostFile = os:cmd(Cmd),
 	    get_hosts(HostFile, [], [], []);
-- 
2.43.0

openSUSE Build Service is sponsored by