File 3258-Add-tests-for-default-diameter-port-and-transport.patch of Package erlang
From 9c782a1ca74367259b8dae2b7cfdea8516b9c735 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20W=C4=85sowski?= <michal@erlang.org>
Date: Tue, 29 Apr 2025 16:59:06 +0200
Subject: [PATCH 3/3] Add tests for default diameter port and transport
---
lib/diameter/test/diameter_codec_SUITE.erl | 5 +-
lib/diameter/test/diameter_codec_test.erl | 102 +++++++++++----------
2 files changed, 57 insertions(+), 50 deletions(-)
diff --git a/lib/diameter/test/diameter_codec_SUITE.erl b/lib/diameter/test/diameter_codec_SUITE.erl
index fe7774f276..3a34565a22 100644
--- a/lib/diameter/test/diameter_codec_SUITE.erl
+++ b/lib/diameter/test/diameter_codec_SUITE.erl
@@ -164,7 +164,10 @@ run(gen) ->
lists:prefix("diameter_gen_", ?L(M))
end,
Ms),
- lists:foreach(fun diameter_codec_test:gen/1, Gs);
+ lists:foreach(fun(G) ->
+ diameter_codec_test:gen(G, 6733),
+ diameter_codec_test:gen(G, unknown)
+ end, Gs);
run(lib) ->
diameter_codec_test:lib();
diff --git a/lib/diameter/test/diameter_codec_test.erl b/lib/diameter/test/diameter_codec_test.erl
index 7feef0fa56..1587024ff5 100644
--- a/lib/diameter/test/diameter_codec_test.erl
+++ b/lib/diameter/test/diameter_codec_test.erl
@@ -21,7 +21,7 @@
-module(diameter_codec_test).
-export([base/0,
- gen/1,
+ gen/2,
lib/0]).
%%
@@ -43,17 +43,17 @@
base() ->
[] = run([[fun base/1, T] || T <- [zero, decode]]).
-gen(Mod) ->
+gen(Mod, Rfc) ->
Fs = [{Mod, F, []} || Mod /= diameter_gen_doic_rfc7683,
F <- [name, id, vendor_id, vendor_name]],
- [] = run(Fs ++ [[fun gen/2, Mod, T] || T <- [messages,
- command_codes,
- avp_types,
- grouped,
- enum,
- import_avps,
- import_groups,
- import_enums]]).
+ [] = run(Fs ++ [[fun gen/3, Mod, T, Rfc] || T <- [messages,
+ command_codes,
+ avp_types,
+ grouped,
+ enum,
+ import_avps,
+ import_groups,
+ import_enums]]).
lib() ->
Vs = {_,_,_} = values('Address'),
@@ -127,8 +127,8 @@ types() ->
%% Test of generated encode/decode module.
%% ------------------------------------------------------------------------
-gen(M, T) ->
- [] = run(lists:map(fun(X) -> [fun gen/3, M, T, X] end,
+gen(M, T, Rfc) ->
+ [] = run(lists:map(fun(X) -> [fun gen/4, M, T, X, Rfc] end,
fetch(T, dict(M)))).
fetch(T, Spec) ->
@@ -139,11 +139,11 @@ fetch(T, Spec) ->
[]
end.
-gen(M, messages = T, {Name, Code, Flags, ApplId, Avps})
+gen(M, messages = T, {Name, Code, Flags, ApplId, Avps}, Rfc)
when is_list(Name) ->
- gen(M, T, {?A(Name), Code, Flags, ApplId, Avps});
+ gen(M, T, {?A(Name), Code, Flags, ApplId, Avps}, Rfc);
-gen(M, messages, {Name, Code, Flags, _, _}) ->
+gen(M, messages, {Name, Code, Flags, _, _}, _Rfc) ->
Rname = M:msg2rec(Name),
Name = M:rec2msg(Rname),
{Code, F, _} = M:msg_header(Name),
@@ -157,16 +157,16 @@ gen(M, messages, {Name, Code, Flags, _, _}) ->
end,
[] = arity(M, Name, Rname);
-gen(M, command_codes, {Code, Req, Ans}) ->
+gen(M, command_codes, {Code, Req, Ans}, _Rfc) ->
Msgs = orddict:fetch(messages, dict(M)),
{_, Code, _, _, _} = lists:keyfind(Req, 1, Msgs),
{_, Code, _, _, _} = lists:keyfind(Ans, 1, Msgs);
-gen(M, avp_types = T, {Name, Code, Type, Flags})
+gen(M, avp_types = T, {Name, Code, Type, Flags}, Rfc)
when is_list(Name) ->
- gen(M, T, {?A(Name), Code, ?A(Type), Flags});
+ gen(M, T, {?A(Name), Code, ?A(Type), Flags}, Rfc);
-gen(M, avp_types, {Name, Code, Type, _Flags}) ->
+gen(M, avp_types, {Name, Code, Type, _Flags}, Rfc) ->
{Code, Flags, VendorId} = M:avp_header(Name),
0 = Flags band 2#00011111,
V = undefined /= VendorId,
@@ -174,57 +174,61 @@ gen(M, avp_types, {Name, Code, Type, _Flags}) ->
{Name, Type} = M:avp_name(Code, VendorId),
B = M:empty_value(Name, #{module => M}),
B = z(B),
- [] = avp_decode(M, Type, Name);
+ [] = avp_decode(M, Type, Name, Rfc);
-gen(M, grouped = T, {Name, Code, Vid, Avps})
+gen(M, grouped = T, {Name, Code, Vid, Avps}, Rfc)
when is_list(Name) ->
- gen(M, T, {?A(Name), Code, Vid, Avps});
+ gen(M, T, {?A(Name), Code, Vid, Avps}, Rfc);
-gen(M, grouped, {Name, _, _, _}) ->
+gen(M, grouped, {Name, _, _, _}, _Rfc) ->
Rname = M:name2rec(Name),
[] = arity(M, Name, Rname);
-gen(M, enum = T, {Name, ED})
+gen(M, enum = T, {Name, ED}, Rfc)
when is_list(Name) ->
- gen(M, T, {?A(Name), lists:map(fun({E,D}) -> {?A(E), D} end, ED)});
+ gen(M, T, {?A(Name), lists:map(fun({E,D}) -> {?A(E), D} end, ED)}, Rfc);
-gen(M, enum, {Name, ED}) ->
- [] = run([[fun enum/3, M, Name, T] || T <- ED]);
+gen(M, enum, {Name, ED}, Rfc) ->
+ [] = run([[fun enum/4, M, Name, T, Rfc] || T <- ED]);
-gen(M, Tag, {_Mod, L}) ->
+gen(M, Tag, {_Mod, L}, Rfc) ->
T = retag(Tag),
- [] = run([[fun gen/3, M, T, I] || I <- L]).
+ [] = run([[fun gen/4, M, T, I, Rfc] || I <- L]).
%% avp_decode/3
-avp_decode(Mod, Type, Name) ->
+avp_decode(Mod, Type, Name, Rfc) ->
{Ts, Fs, _} = values(Type, Name, Mod),
- [] = run([[fun avp_decode/5, Mod, Name, Type, true, V]
+ [] = run([[fun avp_decode/6, Mod, Name, Type, true, V, Rfc]
|| V <- v(Ts)]),
- [] = run([[fun avp_decode/5, Mod, Name, Type, false, V]
+ [] = run([[fun avp_decode/6, Mod, Name, Type, false, V, Rfc]
|| V <- v(Fs)]).
-avp_decode(Mod, Name, Type, Eq, Value) ->
- d(fun(X,V) -> avp(Mod, X, V, Name, Type) end, Eq, Value).
+avp_decode(Mod, Name, Type, Eq, Value, Rfc) ->
+ d(fun(X,V) -> avp(Mod, X, V, Name, Type, Rfc) end, Eq, Value).
-avp(Mod, decode = X, V, Name, 'Grouped') ->
- {Rec, _} = Mod:avp(X, V, Name, opts(Mod)),
+avp(Mod, decode = X, V, Name, 'Grouped', Rfc) ->
+ {Rec, _} = Mod:avp(X, V, Name, opts(Mod, Rfc)),
Rec;
-avp(Mod, decode = X, V, Name, _) ->
- Mod:avp(X, V, Name, opts(Mod));
-avp(Mod, encode = X, V, Name, _) ->
- iolist_to_binary(Mod:avp(X, V, Name, opts(Mod))).
-
-opts(Mod) ->
- (opts())#{module => Mod,
- app_dictionary => Mod}.
+avp(Mod, decode = X, V, Name, _, Rfc) ->
+ Mod:avp(X, V, Name, opts(Mod, Rfc));
+avp(Mod, encode = X, V, Name, _, Rfc) ->
+ iolist_to_binary(Mod:avp(X, V, Name, opts(Mod, Rfc))).
opts() ->
+ opts(6733).
+
+opts(Mod, Rfc) ->
+ (opts(Rfc))#{module => Mod,
+ app_dictionary => Mod}.
+
+opts(unknown) ->
#{decode_format => record,
string_decode => true,
strict_mbit => true,
- rfc => 6733,
- failed_avp => false}.
+ failed_avp => false};
+opts(Rfc) ->
+ maps:put(rfc, Rfc, opts(unknown)).
%% v/1
@@ -269,10 +273,10 @@ arity(M, Name, AvpName, Rec) ->
%% enum/3
-enum(M, Name, {_,E}) ->
+enum(M, Name, {_,E}, Rfc) ->
B = <<E:32>>,
- B = M:avp(encode, E, Name, opts(M)),
- E = M:avp(decode, B, Name, opts(M)).
+ B = M:avp(encode, E, Name, opts(M, Rfc)),
+ E = M:avp(decode, B, Name, opts(M, Rfc)).
retag(import_avps) -> avp_types;
retag(import_groups) -> grouped;
--
2.43.0