Skip to content

Commit

Permalink
More robust listening port lookup in test suites
Browse files Browse the repository at this point in the history
In particular, remove timing dependence by using diameter_reg:wait/1 to
wait on the term registered by diameter_{tcp,sctp} when opening a
listening socket.
  • Loading branch information
Anders Svensson committed Apr 11, 2013
1 parent 3c14f79 commit e4d6772
Show file tree
Hide file tree
Showing 7 changed files with 19 additions and 48 deletions.
2 changes: 1 addition & 1 deletion lib/diameter/test/diameter_capx_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -444,7 +444,7 @@ connect(Config, T, Opts) ->
{CRef, LRef}.

connect(LRef, Opts) ->
[PortNr] = ?util:lport(tcp, LRef, 20),
[PortNr] = ?util:lport(tcp, LRef),
{ok, CRef} = diameter:add_transport(?CLIENT,
{connect, opts(PortNr, Opts)}),
CRef.
Expand Down
2 changes: 1 addition & 1 deletion lib/diameter/test/diameter_event_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ start_server(Config) ->
ok = diameter:start_service(?SERVER, ?SERVICE(?SERVER, [?DICT_COMMON])),
LRef = ?util:listen(?SERVER, tcp, [{capabilities_cb, fun capx_cb/2},
{capx_timeout, ?SERVER_CAPX_TMO}]),
[PortNr] = ?util:lport(tcp, LRef, 20),
[PortNr] = ?util:lport(tcp, LRef),
?util:write_priv(Config, portnr, PortNr),
start = event(?SERVER).

Expand Down
2 changes: 1 addition & 1 deletion lib/diameter/test/diameter_examples_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ start(server) ->
ok = diameter:start(),
ok = server:start(),
{ok, Ref} = server:listen(tcp),
[_] = ?util:lport(tcp, Ref, 20),
[_] = ?util:lport(tcp, Ref),
ok;

start(client) ->
Expand Down
2 changes: 1 addition & 1 deletion lib/diameter/test/diameter_tls_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@ join(Strs) ->
server(Host, {Caps, Opts}) ->
ok = diameter:start_service(Host, ?SERVICE(Host, ?DICT_COMMON)),
{ok, LRef} = diameter:add_transport(Host, ?LISTEN(Caps, Opts)),
{LRef, hd([_] = ?util:lport(tcp, LRef, 20))}.
{LRef, hd([_] = ?util:lport(tcp, LRef))}.

sopts(?SERVER1, Dir) ->
{inband_security([?TLS]),
Expand Down
28 changes: 5 additions & 23 deletions lib/diameter/test/diameter_transport_SUITE.erl
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2010-2011. All Rights Reserved.
%% Copyright Ericsson AB 2010-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
Expand Down Expand Up @@ -54,9 +54,6 @@
-define(RECV(Pat, Ret), receive Pat -> Ret end).
-define(RECV(Pat), ?RECV(Pat, now())).

%% Or not.
-define(WAIT(Ms), receive after Ms -> now() end).

%% Sockets are opened on the loopback address.
-define(ADDR, {127,0,0,1}).

Expand Down Expand Up @@ -209,7 +206,7 @@ init(accept, {Prot, Ref}) ->

init(gen_connect, {Prot, Ref}) ->
%% Lookup the peer's listening socket.
[PortNr] = ?util:lport(Prot, Ref, 20),
[PortNr] = ?util:lport(Prot, Ref),

%% Connect, send a message and receive it back.
{ok, Sock} = gen_connect(Prot, PortNr),
Expand All @@ -230,7 +227,8 @@ init(gen_accept, {Prot, Ref}) ->

init(connect, {Prot, Ref}) ->
%% Lookup the peer's listening socket.
[{?TEST_LISTENER(_, PortNr), _}] = match(?TEST_LISTENER(Ref, '_')),
[{?TEST_LISTENER(_, PortNr), _}]
= diameter_reg:wait(?TEST_LISTENER(Ref, '_')),

%% Start a connecting transport and receive notification of
%% the connection.
Expand All @@ -246,18 +244,6 @@ init(connect, {Prot, Ref}) ->
MRef = erlang:monitor(process, TPid),
?RECV({'DOWN', MRef, process, _, _}).

match(Pat) ->
match(Pat, 20).

match(Pat, T) ->
L = diameter_reg:match(Pat),
if [] /= L orelse 1 == T ->
L;
true ->
?WAIT(50),
match(Pat, T-1)
end.

bin(sctp, #diameter_packet{bin = Bin}) ->
Bin;
bin(tcp, Bin) ->
Expand Down Expand Up @@ -316,16 +302,12 @@ start_connect(tcp, T, Svc, Opts) ->

start_accept(Prot, Ref) ->
Pid = sync(accept, Ref),

%% Configure the same port number for transports on the same
%% reference.
[PortNr | _] = ?util:lport(Prot, Ref) ++ [0],
{Mod, Opts} = tmod(Prot),

try
{ok, TPid, [?ADDR]} = Mod:start({accept, Ref},
?SVC([?ADDR]),
[{port, PortNr} | Opts]),
[{port, 0} | Opts]),
?RECV(?TMSG({TPid, connected})),
TPid
after
Expand Down
29 changes: 9 additions & 20 deletions lib/diameter/test/diameter_util.erl
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2010-2012. All Rights Reserved.
%% Copyright Ericsson AB 2010-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
Expand Down Expand Up @@ -33,7 +33,6 @@

%% diameter-specific
-export([lport/2,
lport/3,
listen/2, listen/3,
connect/3, connect/4,
disconnect/4,
Expand Down Expand Up @@ -251,27 +250,17 @@ path(Config, Name) ->
filename:join([Dir, Name]).

%% ---------------------------------------------------------------------------
%% lport/2-3
%% lport/2
%%
%% Lookup the port number of a tcp/sctp listening transport.

lport(M, Ref) ->
lport(M, Ref, 1).
lport(M, {Node, Ref}) ->
rpc:call(Node, ?MODULE, lport, [M, Ref]);

lport(M, {Node, Ref}, Tries) ->
rpc:call(Node, ?MODULE, lport, [M, Ref, Tries]);

lport(M, Ref, Tries) ->
lp(tmod(M), Ref, Tries).

lp(M, Ref, T) ->
L = [N || {listen, N, _} <- M:ports(Ref)],
if [] /= L orelse T =< 1 ->
L;
true ->
receive after 50 -> ok end,
lp(M, Ref, T-1)
end.
lport(Prot, Ref) ->
Mod = tmod(Prot),
[_] = diameter_reg:wait({'_', listener, {Ref, '_'}}),
[N || {listen, N, _} <- Mod:ports(Ref)].

%% ---------------------------------------------------------------------------
%% listen/2-3
Expand All @@ -297,7 +286,7 @@ connect(Client, Prot, LRef) ->
connect(Client, Prot, LRef, []).

connect(Client, Prot, LRef, Opts) ->
[PortNr] = lport(Prot, LRef, 20),
[PortNr] = lport(Prot, LRef),
Client = diameter:service_info(Client, name), %% assert
true = diameter:subscribe(Client),
Ref = add_transport(Client, {connect, opts(Prot, PortNr) ++ Opts}),
Expand Down
2 changes: 1 addition & 1 deletion lib/diameter/test/diameter_watchdog_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -524,7 +524,7 @@ cfg(listen, _) ->
cfg(connect, Ref) ->
[{{_, _, SvcName}, _Pid}] = diameter_reg:wait({listen, Ref, '_'}),
[[{ref, LRef} | _]] = diameter:service_info(SvcName, transport),
[LP] = ?util:lport(tcp, LRef, 20),
[LP] = ?util:lport(tcp, LRef),
[{raddr, ?ADDR}, {rport, LP}].

%% ===========================================================================
Expand Down

0 comments on commit e4d6772

Please sign in to comment.