anchor.diff:                    [[Dir, filename:join([Dir, "..", "ebin"])]]),
       Node.
   
  +concat(Prot, Svc) ->
  +    list_to_atom(atom_to_list(Prot) ++ atom_to_list(Svc)).
  +
   here() ->
       filename:dirname(code:which(?MODULE)).
   
  
positive.code: 
  %% start/1
  
  start(server) ->
      ok = diameter:start(),
      ok = server:start(),
      {ok, Ref} = server:listen(tcp),
      [_] = ?util:lport(tcp, Ref),
      ok;
  
  start(client) ->
      ok = diameter:start(),
      true = diameter:subscribe(client),
      ok = client:start(),
      {ok, Ref} = client:connect(tcp),
      receive #diameter_event{info = {up, Ref, _, _, _}} -> ok end;
  
  start(Config) ->
      Nodes = ?util:read_priv(Config, nodes),
      [] = [RC || {T,N} <- Nodes,
                  RC <- [rpc:call(N, ?MODULE, start, [T])],
                  RC /= ok].
  
  %% traffic/1
  
negative.code: all() ->
      [dict,
       code,
       {group, all}].
  
  groups() ->
      Tc = tc(),
      [{all, [parallel], [{group, P} || P <- ?PROTS]}
       | [{P, [], Tc} || P <- ?PROTS]].
  
  init_per_group(all, Config) ->
      Config;
  
  init_per_group(tcp = N, Config) ->
      [{group, N} | Config];
  
  init_per_group(sctp = N, Config) ->
      case gen_sctp:open() of
          {ok, Sock} ->
              gen_sctp:close(Sock),
              [{group, N} | Config];
          {error, E} when E == eprotonosupport;
                          E == esocktnosupport -> %% fail on any other reason
              {skip, no_sctp}
      end.
  
  end_per_group(_, _) ->
      ok.
  
  tc() ->
      [slave,
       enslave,
       start,
       traffic,
  