anchor.diff:  
   %% Suite exports
   -export([suite/0, all/0, groups/0]).
  +-export([init_per_suite/1,    end_per_suite/1,
  +         init_per_testcase/2, end_per_testcase/2]).
   
   %% Test cases
   -export([
  
positive.code:     tc_end().
  
  
  api_b_send_and_recv_udp(Domain, Send, Recv) ->
      SockSrc = case socket:open(Domain, dgram, udp) of
                    {ok, S1} ->
                        S1;
                    {error, OR1} ->
                        ?FAIL({open, src, OR1})
                end,
      LAddr = which_local_addr(Domain),
      LSA   = #{family => Domain, addr => LAddr}, 
      case socket:bind(SockSrc, LSA) of
          {ok, _} ->
              ok;
          {error, BR1} ->
              ?FAIL({bind, src, BR1})
      end,
      SockDst = case socket:open(Domain, dgram, udp) of
                    {ok, S2} ->
                        S2;
                    {error, OR2} ->
                        ?FAIL({open, dst, OR2})
                end,
      case socket:bind(SockDst, LSA) of
          {ok, _} ->
              ok;
          {error, BR2} ->
              ?FAIL({bind, dst, BR2})
      end,
      Dst = case socket:sockname(SockDst) of
                {ok, SA} ->
                    SA;
                {ok, SNR} ->
                    ?FAIL({sockname, dst, SNR})
            end,
      ok = Send(SockSrc, ?BASIC_REQ, Dst),
      {ok, {Src, ?BASIC_REQ}} = Recv(SockDst),
      ok = Send(SockDst, ?BASIC_REP, Src),
      {ok, {Dst, ?BASIC_REP}} = Recv(SockSrc),
      socket:close(SockSrc),
      socket:close(SockDst),
  
negative.code: 
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the connect timeout option
  %% on an IPv4 TCP (stream) socket.
  to_connect_tcp4(suite) ->
      [];
  to_connect_tcp4(doc) ->
      [];
  to_connect_tcp4(_Config) when is_list(_Config) ->
      tc_begin(to_connect_tcp4),
      ok = to_connect_tcp(inet),
      tc_end().
      %% not_yet_implemented().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the connect timeout option
  %% on an IPv6 TCP (stream) socket.
  to_connect_tcp6(suite) ->
      [];
  to_connect_tcp6(doc) ->
      [];
  to_connect_tcp6(_Config) when is_list(_Config) ->
      %% tc_begin(to_connect_tcp6),
      %% ok = to_connect_tcp(inet6),
      %% tc_end().
      not_yet_implemented().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  to_connect_tcp(Domain) ->
      process_flag(trap_exit, true),
      p("init"),
      Client     = self(),
      LocalAddr  = which_local_addr(Domain),
      LocalSA    = #{family => Domain, addr => LocalAddr}, 
      ServerName = f("~s:server", [get_tc_name()]),
      Server = spawn_link(fun() ->
                                  set_tc_name(ServerName),
                                  p("open"),
                                  LSock = sock_open(Domain, stream, tcp),
                                  p("bind"),
                                  ServerLPort = sock_bind(LSock, LocalSA),
                                  p("listen on ~w", [ServerLPort]),
                                  sock_listen(LSock, 1),
                                  p("inform client"),
                                  Client ! {self(), ServerLPort},
                                  p("await termination command"),
                                  receive
                                      die ->
                                          p("terminating"),
                                          exit(normal)
                                  end
                          end),
      
      p("await server port"),
      ServerLPort = 
          receive
              {Server, Port} ->
                  Port
          end,
      p("open(s)"),
      CSock1       = sock_open(Domain, stream, tcp),
      CSock2       = sock_open(Domain, stream, tcp),
      CSock3       = sock_open(Domain, stream, tcp),
      p("bind(s)"),
      _ClientPort1 = sock_bind(CSock1, LocalSA),
      _ClientPort2 = sock_bind(CSock2, LocalSA),
      _ClientPort3 = sock_bind(CSock3, LocalSA),
      ServerSA = LocalSA#{port => ServerLPort},
      to_connect_tcp_await_timeout([CSock1, CSock2, CSock3], ServerSA),
      p("terminate server"),
      Server ! die,
      receive
          {'EXIT', Server, _} ->
              p("server terminated"),
              ok
      end,
      ok.
  
  
  to_connect_tcp_await_timeout(Socks, ServerSA) ->
      to_connect_tcp_await_timeout(Socks, ServerSA, 1).
  
  to_connect_tcp_await_timeout([], _ServerSA, _ID) ->
      ?FAIL(unexpected_success);
  to_connect_tcp_await_timeout([Sock|Socks], ServerSA, ID) ->
      p("~w: try connect", [ID]),
      case socket:connect(Sock, ServerSA, 5000) of
          {error, timeout} ->
              p("expected timeout (~w)", [ID]),
              ok;
          {error, Reason} ->
              p("failed connecting: ~p", [Reason]),
              ?FAIL({recv, Reason});
          ok ->
              p("unexpected success (~w) - try next", [ID]),
              to_connect_tcp_await_timeout(Socks, ServerSA, ID+1)
      end.
          
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the accept timeout option
  %% on an IPv4 TCP (stream) socket.
  to_accept_tcp4(suite) ->
      [];
  to_accept_tcp4(doc) ->
      [];
  to_accept_tcp4(_Config) when is_list(_Config) ->
      %% tc_begin(to_accept_tcp4),
      %% ok = to_accept_tcp(inet),
      %% tc_end().
      not_yet_implemented().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the accept timeout option
  %% on an IPv6 TCP (stream) socket.
  to_accept_tcp6(suite) ->
      [];
  to_accept_tcp6(doc) ->
      [];
  to_accept_tcp6(_Config) when is_list(_Config) ->
      %% tc_begin(to_accept_tcp6),
      %% ok = to_accept_tcp(inet6),
      %% tc_end().
      not_yet_implemented().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the send timeout option
  %% on an IPv4 TCP (stream) socket.
  to_send_tcp4(suite) ->
      [];
  to_send_tcp4(doc) ->
      [];
  to_send_tcp4(_Config) when is_list(_Config) ->
      %% tc_begin(to_send_tcp4),
      %% ok = to_send_tcp(inet),
      %% tc_end().
      not_yet_implemented().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the send timeout option
  %% on an IPv6 TCP (stream) socket.
  to_send_tcp6(suite) ->
      [];
  to_send_tcp6(doc) ->
      [];
  to_send_tcp6(_Config) when is_list(_Config) ->
      %% tc_begin(to_send_tcp6),
      %% ok = to_send_tcp(inet6),
      %% tc_end().
      not_yet_implemented().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the sendto timeout option
  %% on an IPv4 UDP (dgram) socket.
  to_sendto_udp4(suite) ->
      [];
  to_sendto_udp4(doc) ->
      [];
  to_sendto_udp4(_Config) when is_list(_Config) ->
      %% tc_begin(to_sendto_udp4),
      %% ok = to_sendto_udp(inet),
      %% tc_end().
      not_yet_implemented().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the sendto timeout option
  %% on an IPv6 UDP (dgram) socket.
  to_sendto_udp6(suite) ->
      [];
  to_sendto_udp6(doc) ->
      [];
  to_sendto_udp6(_Config) when is_list(_Config) ->
      %% tc_begin(to_sendto_udp6),
      %% ok = to_sendto_udp(inet6),
      %% tc_end().
      not_yet_implemented().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the sendmsg timeout option
  %% on an IPv4 TCP (stream) socket.
  to_sendmsg_tcp4(suite) ->
      [];
  to_sendmsg_tcp4(doc) ->
      [];
  to_sendmsg_tcp4(_Config) when is_list(_Config) ->
      %% tc_begin(to_sendmsg_tcp4),
      %% ok = to_sendmsg_tcp(inet),
      %% tc_end().
      not_yet_implemented().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the sendmsg timeout option
  %% on an IPv6 TCP (stream) socket.
  to_sendmsg_tcp6(suite) ->
      [];
  to_sendmsg_tcp6(doc) ->
      [];
  to_sendmsg_tcp6(_Config) when is_list(_Config) ->
      %% tc_begin(to_sendmsg_tcp6),
      %% ok = to_sendmsg_tcp(inet6),
      %% tc_end().
      not_yet_implemented().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the recv timeout option
  %% on an IPv4 UDP (dgram) socket. To test this we must connect
  %% the socket.
  to_recv_udp4(suite) ->
      [];
  to_recv_udp4(doc) ->
      [];
  to_recv_udp4(_Config) when is_list(_Config) ->
      %% tc_begin(to_recv_udp4),
      %% ok = to_recv_udp(inet),
      %% tc_end().
      not_yet_implemented().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the recv timeout option
  %% on an IPv6 UDP (dgram) socket. To test this we must connect
  %% the socket.
  to_recv_udp6(suite) ->
      [];
  to_recv_udp6(doc) ->
      [];
  to_recv_udp6(_Config) when is_list(_Config) ->
      %% tc_begin(to_recv_udp6),
      %% ok = to_recv_udp(inet6),
      %% tc_end().
      not_yet_implemented().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the recv timeout option
  %% on an IPv4 TCP (stream) socket.
  to_recv_tcp4(suite) ->
      [];
  to_recv_tcp4(doc) ->
      [];
  to_recv_tcp4(_Config) when is_list(_Config) ->
      tc_begin(to_recv_tcp4),
      ok = to_recv_tcp(inet),
      tc_end().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the recv timeout option
  %% on an IPv6 TCP (stream) socket.
  to_recv_tcp6(suite) ->
      [];
  to_recv_tcp6(doc) ->
      [];
  to_recv_tcp6(_Config) when is_list(_Config) ->
      %% tc_begin(to_recv_tcp6),
      %% ok = to_recv_tcp(inet6),
      %% tc_end().
      not_yet_implemented().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  to_recv_tcp(Domain) ->
      process_flag(trap_exit, true),
      p("server -> open"),
      LSock     = sock_open(Domain, stream, tcp),
      LocalAddr = which_local_addr(Domain),
      LocalSA   = #{family => Domain, addr => LocalAddr}, 
      p("server -> bind"),
      ServerLPort     = sock_bind(LSock, LocalSA),
      p("server(~w) -> listen", [ServerLPort]),
      sock_listen(LSock),
      ClientName = f("~s:client", [get_tc_name()]),
      Client = spawn_link(fun() ->
                                  set_tc_name(ClientName),
                                  p("open"),
                                  CSock      = sock_open(Domain, stream, tcp),
                                  p("bind"),
                                  ClientPort = sock_bind(CSock, LocalSA),
                                  p("[~w] connect to ~w", 
                                    [ClientPort, ServerLPort]),
                                  sock_connect(CSock, LocalSA#{port => ServerLPort}),
                                  p("await termination command"),
                                  receive
                                      die ->
                                          p("terminating"),
                                          exit(normal)
                                  end
                          end),
      p("server -> accept on ~w", [ServerLPort]),
      Sock      = sock_accept(LSock),
      p("server -> recv"),
      %% The zero (0) represents "give me everything you have"
      case socket:recv(Sock, 0, 5000) of
          {error, timeout} ->
              p("server -> expected timeout"),
              ok;
          {ok, _Data} ->
              ?FAIL(unexpected_success);
          {error, Reason} ->
              ?FAIL({recv, Reason})
      end,
      Client ! die,
      receive
          {'EXIT', Client, _} ->
              ok
      end,
      ok.
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the recvfrom timeout option
  %% on an IPv4 UDP (dgram) socket.
  to_recvfrom_udp4(suite) ->
      [];
  to_recvfrom_udp4(doc) ->
      [];
  to_recvfrom_udp4(_Config) when is_list(_Config) ->
      tc_begin(to_recvfrom_udp4),
      ok = to_recvfrom_udp(inet),
      tc_end().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the recvfrom timeout option
  %% on an IPv6 UDP (dgram) socket.
  to_recvfrom_udp6(suite) ->
      [];
  to_recvfrom_udp6(doc) ->
      [];
  to_recvfrom_udp6(_Config) when is_list(_Config) ->
      %% tc_begin(to_recvfrom_udp6),
      %% ok = to_recvfrom_udp(inet6),
      %% tc_end().
      not_yet_implemented().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  to_recvfrom_udp(Domain) ->
      process_flag(trap_exit, true),
      p("init"),
      LocalAddr = which_local_addr(Domain),
      LocalSA   = #{family => Domain, addr => LocalAddr}, 
      p("open"),
      Sock      = sock_open(Domain, dgram, udp),
      p("bind"),
      _Port     = sock_bind(Sock, LocalSA),
      p("recv"),
      case socket:recvfrom(Sock, 0, 5000) of
          {error, timeout} ->
              p("expected timeout"),
              ok;
          {ok, _SrcData} ->
              ?FAIL(unexpected_success);
          {error, Reason} ->
              ?FAIL({recv, Reason})
      end,
      ok.
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the recvmsg timeout option
  %% on an IPv4 UDP (dgram) socket.
  to_recvmsg_udp4(suite) ->
      [];
  to_recvmsg_udp4(doc) ->
      [];
  to_recvmsg_udp4(_Config) when is_list(_Config) ->
      %% not_yet_implemented().
      tc_begin(to_recvmsg_udp4),
      ok = to_recvmsg_udp(inet),
      tc_end().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the recvmsg timeout option
  %% on an IPv6 UDP (dgram) socket.
  to_recvmsg_udp6(suite) ->
      [];
  to_recvmsg_udp6(doc) ->
      [];
  to_recvmsg_udp6(_Config) when is_list(_Config) ->
      %% tc_begin(to_recvmsg_udp6),
      %% ok = to_recvmsg_udp(inet6),
      %% tc_end().
      not_yet_implemented().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  to_recvmsg_udp(Domain) ->
      process_flag(trap_exit, true),
      p("init"),
      LocalAddr = which_local_addr(Domain),
      LocalSA   = #{family => Domain, addr => LocalAddr}, 
      p("open"),
      Sock      = sock_open(Domain, dgram, udp),
      p("bind"),
      _Port     = sock_bind(Sock, LocalSA),
      p("recv"),
      case socket:recvmsg(Sock, 5000) of
          {error, timeout} ->
              p("expected timeout"),
              ok;
          {ok, _MsgHdr} ->
              ?FAIL(unexpected_success);
          {error, Reason} ->
              ?FAIL({recv, Reason})
      end,
      ok.
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the recvmsg timeout option
  %% on an IPv4 TCP (stream) socket.
  to_recvmsg_tcp4(suite) ->
      [];
  to_recvmsg_tcp4(doc) ->
      [];
  to_recvmsg_tcp4(_Config) when is_list(_Config) ->
      tc_begin(to_recvmsg_tcp4),
      ok = to_recvmsg_tcp(inet),
      tc_end().
      %% not_yet_implemented().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This test case is intended to test the recvmsg timeout option
  %% on an IPv6 TCP (stream) socket.
  to_recvmsg_tcp6(suite) ->
      [];
  to_recvmsg_tcp6(doc) ->
      [];
  to_recvmsg_tcp6(_Config) when is_list(_Config) ->
      %% tc_begin(to_recvmsg_tcp6),
      %% ok = to_recvmsg_tcp(inet6),
      %% tc_end().
      not_yet_implemented().
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  to_recvmsg_tcp(Domain) ->
      process_flag(trap_exit, true),
      p("server -> open"),
      LSock     = sock_open(Domain, stream, tcp),
      LocalAddr = which_local_addr(Domain),
      LocalSA   = #{family => Domain, addr => LocalAddr}, 
      p("server -> bind"),
      ServerLPort     = sock_bind(LSock, LocalSA),
      p("server(~w) -> listen", [ServerLPort]),
      sock_listen(LSock),
      ClientName = f("~s:client", [get_tc_name()]),
      Client = spawn_link(fun() ->
                                  set_tc_name(ClientName),
                                  p("open"),
                                  CSock      = sock_open(Domain, stream, tcp),
                                  p("bind"),
                                  ClientPort = sock_bind(CSock, LocalSA),
                                  p("[~w] connect to ~w", 
                                    [ClientPort, ServerLPort]),
                                  sock_connect(CSock, LocalSA#{port => ServerLPort}),
                                  p("await termination command"),
                                  receive
                                      die ->
                                          p("terminating"),
                                          exit(normal)
                                  end
                          end),
      p("server -> accept on ~w", [ServerLPort]),
      Sock      = sock_accept(LSock),
      p("server -> recv"),
      %% The zero (0) represents "give me everything you have"
      case socket:recvmsg(Sock, 5000) of
          {error, timeout} ->
              p("server -> expected timeout"),
              ok;
          {ok, _Data} ->
              ?FAIL(unexpected_success);
          {error, Reason} ->
              ?FAIL({recv, Reason})
      end,
      Client ! die,
      receive
          {'EXIT', Client, _} ->
              ok
      end,
      ok.
  
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  %% This gets the local address (not 127.0...)
  