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

openSUSE Build Service is sponsored by