File 1804-megaco-Add-the-mestone1-test-case-to-the-bench-group.patch of Package erlang
From 74d89aaafbbfc0693012504dbe6573f99b61b9dc Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Mon, 7 Apr 2025 17:27:42 +0200
Subject: [PATCH 4/7] [megaco] Add the mestone1 test case to the bench group
---
.../examples/meas/megaco_codec_meas.erl | 1 -
.../examples/meas/megaco_codec_mstone1.erl | 60 +++++++++----
lib/megaco/test/megaco_examples_SUITE.erl | 84 ++++++++++++++-----
lib/megaco/test/megaco_test_lib.erl | 3 +
4 files changed, 111 insertions(+), 37 deletions(-)
diff --git a/lib/megaco/examples/meas/megaco_codec_meas.erl b/lib/megaco/examples/meas/megaco_codec_meas.erl
index 339e6c0cae..a7ea1a00e5 100644
--- a/lib/megaco/examples/meas/megaco_codec_meas.erl
+++ b/lib/megaco/examples/meas/megaco_codec_meas.erl
@@ -176,7 +176,6 @@ meas_init(Factor, Opts, MessagePackage, Codecs) ->
ExpandedMessages = expand_messages(Codecs, Messages),
Results = t1(Factor, Opts, ExpandedMessages, []),
display_time(Started, os:timestamp()),
- %% store_results(Results);
process_results(Opts, Results);
Error ->
Error
diff --git a/lib/megaco/examples/meas/megaco_codec_mstone1.erl b/lib/megaco/examples/meas/megaco_codec_mstone1.erl
index b2a59449e1..26ffc9fa57 100644
--- a/lib/megaco/examples/meas/megaco_codec_mstone1.erl
+++ b/lib/megaco/examples/meas/megaco_codec_mstone1.erl
@@ -42,7 +42,7 @@ application.
%% API
-export([
- start/0, start/1, start/2, start/3,
+ start/0, start/1, start/2, start/3, start/4,
start_flex/0, start_flex/1, start_flex/2,
start_no_drv/0, start_no_drv/1, start_no_drv/2,
start_only_drv/0, start_only_drv/1, start_only_drv/2
@@ -141,8 +141,20 @@ start(MessagePackage, Factor)
start(MessagePackage, ?MSTONE_RUN_TIME, Factor).
-doc false.
+start(Opts, RunTime, Factor) when is_map(Opts) ->
+ start(Opts, ?DEFAULT_MESSAGE_PACKAGE, RunTime, Factor);
start(MessagePackage, RunTime, Factor) ->
- do_start(MessagePackage, RunTime, Factor, ?DEFAULT_DRV_INCLUDE).
+ start(#{}, MessagePackage, RunTime, Factor).
+
+-doc false.
+start(#{bench := Bench},
+ MessagePackage, RunTime, Factor) ->
+ do_start(Bench,
+ MessagePackage, RunTime, Factor, ?DEFAULT_DRV_INCLUDE);
+start(_,
+ MessagePackage, RunTime, Factor) ->
+ do_start(false,
+ MessagePackage, RunTime, Factor, ?DEFAULT_DRV_INCLUDE).
-doc(#{equiv => start_flex/2}).
@@ -184,10 +196,12 @@ processed in total (for all processes) is the mstone value.
Factor :: pos_integer().
start_flex(MessagePackage, Factor) ->
- do_start(MessagePackage, ?MSTONE_RUN_TIME, Factor, flex).
+ do_start(false,
+ MessagePackage, ?MSTONE_RUN_TIME, Factor, flex).
start_flex(MessagePackage, RunTime, Factor) ->
- do_start(MessagePackage, RunTime, Factor, flex).
+ do_start(false,
+ MessagePackage, RunTime, Factor, flex).
-doc(#{equiv => start_only_drv/2}).
@@ -230,10 +244,12 @@ total (for all processes) is the mstone value.
Factor :: pos_integer().
start_only_drv(MessagePackage, Factor) ->
- do_start(MessagePackage, ?MSTONE_RUN_TIME, Factor, only_drv).
+ do_start(false,
+ MessagePackage, ?MSTONE_RUN_TIME, Factor, only_drv).
start_only_drv(MessagePackage, RunTime, Factor) ->
- do_start(MessagePackage, RunTime, Factor, only_drv).
+ do_start(false,
+ MessagePackage, RunTime, Factor, only_drv).
-doc(#{equiv => start_no_drv/2}).
@@ -276,17 +292,21 @@ total (for all processes) is the mstone value.
Factor :: pos_integer().
start_no_drv(MessagePackage, Factor) ->
- do_start(MessagePackage, ?MSTONE_RUN_TIME, Factor, no_drv).
+ do_start(false,
+ MessagePackage, ?MSTONE_RUN_TIME, Factor, no_drv).
start_no_drv(MessagePackage, RunTime, Factor) ->
- do_start(MessagePackage, RunTime, Factor, no_drv).
+ do_start(false,
+ MessagePackage, RunTime, Factor, no_drv).
-do_start(MessagePackageRaw, RunTimeRaw, FactorRaw, DrvInclude) ->
+do_start(Bench,
+ MessagePackageRaw, RunTimeRaw, FactorRaw, DrvInclude) ->
RunTime = parse_runtime(RunTimeRaw),
Factor = parse_factor(FactorRaw),
MessagePackage = parse_message_package(MessagePackageRaw),
- mstone_init(MessagePackage, RunTime, Factor, DrvInclude).
+ mstone_init(Bench,
+ MessagePackage, RunTime, Factor, DrvInclude).
parse_runtime(RunTimeAtom) ->
@@ -327,7 +347,8 @@ parse_message_package(BadMessagePackage) ->
%% pretty | compact | ber | per | erlang
%%
-mstone_init(MessagePackage, RunTime, Factor, DrvInclude) ->
+mstone_init(Bench,
+ MessagePackage, RunTime, Factor, DrvInclude) ->
%% io:format("MStone init with:"
%% "~n MessagePackage: ~p"
%% "~n RunTime: ~p ms"
@@ -335,9 +356,11 @@ mstone_init(MessagePackage, RunTime, Factor, DrvInclude) ->
%% "~n DrvInclude: ~p"
%% "~n", [MessagePackage, RunTime, Factor, DrvInclude]),
Codecs = ?MSTONE_CODECS,
- mstone_init(MessagePackage, RunTime, Factor, Codecs, DrvInclude).
+ mstone_init(Bench,
+ MessagePackage, RunTime, Factor, Codecs, DrvInclude).
-mstone_init(MessagePackage, RunTime, Factor, Codecs, DrvInclude) ->
+mstone_init(Bench,
+ MessagePackage, RunTime, Factor, Codecs, DrvInclude) ->
Parent = self(),
Pid = spawn(
fun() ->
@@ -347,11 +370,16 @@ mstone_init(MessagePackage, RunTime, Factor, Codecs, DrvInclude) ->
Parent ! {Done, self()}
end),
receive
- {done, Pid} ->
- ok;
+ {{ok, _} = OK, Pid} ->
+ mstone_maybe_bench(Bench, OK);
{{error, _} = ERROR, Pid} ->
ERROR
end.
+
+mstone_maybe_bench(true, {ok, MStone}) ->
+ {bench, MStone};
+mstone_maybe_bench(false, {ok, _}) ->
+ ok.
do_mstone(MessagePackage, RunTime, Factor, Codecs, DrvInclude) ->
io:format("~n", []),
@@ -368,7 +396,7 @@ do_mstone(MessagePackage, RunTime, Factor, Codecs, DrvInclude) ->
?LIB:stop_flex_scanner(Pid),
io:format("~n", []),
io:format("MStone: ~p~n", [MStone]),
- done
+ {ok, MStone}
catch
throw:{error, Reason} = ERROR ->
io:format("<ERROR> Failed starting flex scanner: "
diff --git a/lib/megaco/test/megaco_examples_SUITE.erl b/lib/megaco/test/megaco_examples_SUITE.erl
index 943e209d7c..f5ff36d58b 100644
--- a/lib/megaco/test/megaco_examples_SUITE.erl
+++ b/lib/megaco/test/megaco_examples_SUITE.erl
@@ -36,7 +36,7 @@
simple/1,
meas/1, bench_meas/1,
- mstone1/1,
+ mstone1/1, bench_mstone1/1,
mstone2/1
]).
@@ -83,8 +83,8 @@ meas_cases() ->
bench_cases() ->
[
- bench_meas%% ,
- %% bench_mstone1,
+ bench_meas,
+ bench_mstone1 %%,
%% bench_mstone2
].
@@ -183,7 +183,8 @@ init_per_testcase(Case, Config) when (Case =:= meas) orelse
?SKIP(flex_scanner_not_enabled)
end;
-init_per_testcase(mstone1 = Case, Config) ->
+init_per_testcase(Case, Config) when (Case =:= mstone1) orelse
+ (Case =:= bench_mstone1) ->
p("init_per_testcase -> entry with"
"~n Config: ~p"
@@ -254,7 +255,8 @@ end_per_testcase(Case, Config) when (Case =:= meas) orelse
end_per_testcase_meas(Case, example_meas_meas_modules(), Config);
-end_per_testcase(mstone1 = Case, Config) ->
+end_per_testcase(Case, Config) when (Case =:= mstone1) orelse
+ (Case =:= bench_mstone1) ->
p("end_per_testcase -> entry with"
"~n Config: ~p"
@@ -658,12 +660,18 @@ common_meas(TC, Opts0, Config) when is_map(Opts0) ->
end,
Opts = Opts0#{verbose => false},
Case = fun({Factor, WorkerNode}) ->
- do_meas(WorkerNode, megaco_codec_meas, start, [Factor, Opts])
+ CRes = do_meas(WorkerNode,
+ meas,
+ megaco_codec_meas, start, [Factor, Opts]),
+ p("~w:~w -> CRes: ~p", [?MODULE, ?FUNCTION_NAME, CRes]),
+ CRes
end,
Post = fun(_) -> ok end,
try_tc(TC, Pre, Case, Post).
-do_meas(Node, Mod, Func, Args) ->
+do_meas(Node,
+ BenchName,
+ Mod, Func, Args) ->
F = fun() ->
exit( rpc:call(Node, Mod, Func, Args) )
end,
@@ -674,8 +682,10 @@ do_meas(Node, Mod, Func, Args) ->
{'DOWN', MRef, process, Pid, {bench, Results}} ->
p("worker process terminated with bench results: "
"~n ~p", [Results]),
- publish_bench_results(meas, Results),
- ok;
+ Res = publish_bench_results(BenchName, Results),
+ p("publication: "
+ "~n ~p", [Res]),
+ Res;
{'DOWN', MRef, process, Pid,
{error, {failed_loading_flex_scanner_driver, Reason}}} ->
@@ -701,18 +711,38 @@ do_meas(Node, Mod, Func, Args) ->
"~n TC Stack: ~p", [TCTimeout, TCPid, TCSTack]),
exit(Pid, kill),
?SKIP(R)
- end,
- ok.
+ end.
-publish_bench_results(_Pre, []) ->
- ok;
-publish_bench_results(Pre, [{Name, {_, Enc, Dec}} | Results]) ->
+%%% A list means a list of results, so we cannot return a comment
+publish_bench_results(Pre, Results) when is_list(Results) ->
+ publish_bench_results_multiple(Pre, Results);
+publish_bench_results(Pre, Result) when is_integer(Result) ->
+ Event = #event{name = Pre,
+ data = [{suite, atom_to_list(?MODULE)},
+ {value, Result}]},
+ ct_event:notify(Event),
+ {comment, ?F("~w: ~p", [Pre, Result])}.
+
+publish_bench_results_multiple(Pre, Results) ->
+ publish_bench_results_multiple(Pre, Results, 0).
+
+publish_bench_results_multiple(Pre, [], Acc) ->
+ {Time, UnitStr} =
+ if
+ (Acc > 1000) ->
+ {Acc div 1000, "msec"};
+ true ->
+ {Acc, "nsec"}
+ end,
+ {comment, ?F("~w: ~w ~s", [Pre, Time, UnitStr])};
+publish_bench_results_multiple(Pre, [{Name, {_, Enc, Dec}} | Results], Acc) ->
+ Time = Enc + Dec,
Event = #event{name = list_to_atom(?F("~w_~w", [Pre, Name])),
data = [{suite, atom_to_list(?MODULE)},
- {value, Enc + Dec}]},
+ {value, Time}]},
ct_event:notify(Event),
- publish_bench_results(Pre, Results).
+ publish_bench_results_multiple(Pre, Results, Acc + Time).
@@ -723,6 +753,9 @@ publish_bench_results(Pre, [{Name, {_, Enc, Dec}} | Results]) ->
mstone1(suite) ->
[];
mstone1(Config) when is_list(Config) ->
+ common_mstone1(?FUNCTION_NAME, #{}, Config).
+
+common_mstone1(TC, Opts, Config) when is_list(Config) ->
Pre = fun() ->
%% The point of this is to make sure we
%% utilize as much of the host as possible...
@@ -738,14 +771,16 @@ mstone1(Config) when is_list(Config) ->
Case = fun({RunTime, Factor, WorkerNode}) ->
Mod = megaco_codec_mstone1,
Func = start,
- Args = [RunTime, Factor],
+ Args = [Opts, RunTime, Factor],
p("Run with: "
"~n Run Time: ~p min(s)"
"~n Factor: ~p", [RunTime, Factor]),
- do_meas(WorkerNode, Mod, Func, Args)
+ do_meas(WorkerNode,
+ mstone1,
+ Mod, Func, Args)
end,
Post = fun(_) -> ok end,
- try_tc(?FUNCTION_NAME, Pre, Case, Post).
+ try_tc(TC, Pre, Case, Post).
@@ -775,7 +810,9 @@ mstone2(Config) when is_list(Config) ->
"~n Factor: ~p"
"~n Run Time: ~p min(s)"
"~n Mode: ~p", [Factor, RunTime, Mode]),
- do_meas(WorkerNode, Mod, Func, Args)
+ do_meas(WorkerNode,
+ mstone2,
+ Mod, Func, Args)
end,
Post = fun(_) -> ok end,
try_tc(?FUNCTION_NAME, Pre, Case, Post).
@@ -792,6 +829,13 @@ bench_meas(Config) when is_list(Config) ->
%% ------------------ bench:mstone1 ---------------------
+
+bench_mstone1(suite) ->
+ [];
+bench_mstone1(Config) when is_list(Config) ->
+ common_mstone1(?FUNCTION_NAME, #{bench => true}, Config).
+
+
%% ------------------ bench:mstone2 ---------------------
diff --git a/lib/megaco/test/megaco_test_lib.erl b/lib/megaco/test/megaco_test_lib.erl
index 1f66ce3339..a5faa29bd1 100644
--- a/lib/megaco/test/megaco_test_lib.erl
+++ b/lib/megaco/test/megaco_test_lib.erl
@@ -2752,6 +2752,9 @@ try_tc(TCName, Name, Verbosity, Cond, Pre, Case, Post)
Post(State)
end),
tc_end("ok"),
+ io:format("~w:~w -> "
+ "~n Res: ~p"
+ "~n", [?MODULE, ?FUNCTION_NAME, Res]),
Res
end
catch
--
2.43.0