File 1803-megaco-Add-a-bench-group-with-one-initial-test-case-.patch of Package erlang

From fc1c03f65ec3b345307c14594ecf0cfb6c133dc8 Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Mon, 7 Apr 2025 14:10:37 +0200
Subject: [PATCH 3/7] [megaco] Add a bench group with one initial test case
 (meas)

---
 .../examples/meas/megaco_codec_meas.erl       | 64 +++++++++++++++++--
 lib/megaco/test/megaco_bench.spec             |  2 +-
 lib/megaco/test/megaco_examples_SUITE.erl     | 64 +++++++++++++++++--
 3 files changed, 118 insertions(+), 12 deletions(-)

diff --git a/lib/megaco/examples/meas/megaco_codec_meas.erl b/lib/megaco/examples/meas/megaco_codec_meas.erl
index d2fd24dd1b..339e6c0cae 100644
--- a/lib/megaco/examples/meas/megaco_codec_meas.erl
+++ b/lib/megaco/examples/meas/megaco_codec_meas.erl
@@ -176,7 +176,8 @@ meas_init(Factor, Opts, MessagePackage, Codecs) ->
 	    ExpandedMessages = expand_messages(Codecs, Messages),
 	    Results = t1(Factor, Opts, ExpandedMessages, []), 
 	    display_time(Started, os:timestamp()),
-	    store_results(Results);
+	    %% store_results(Results);
+            process_results(Opts, Results);
 	Error ->
 	    Error
     end.
@@ -334,9 +335,7 @@ measure(_Factor, _Opts, _Dir, _Codec, _Conf, [], [], _MCount) ->
 
 measure(_Factor, _Opts, _Dir, _Codec, _Conf, [], Res, _MCount) ->
 
-    Eavg = avg([Etime/Ecnt || #stat{ecount = Ecnt, etime = Etime} <- Res]),
-    Davg = avg([Dtime/Dcnt || #stat{dcount = Dcnt, dtime = Dtime} <- Res]),
-    Savg = avg([Size       || #stat{size = Size} <- Res]),
+    {Savg, Eavg, Davg} = process_measure_results(Res),
 
     io:format("~n[~s] Measurment on ~p messages:"
 	      "~n  Average:"
@@ -378,6 +377,13 @@ measure(Factor, #{verbose := Verbose} = Opts,
 
     end.
 
+process_measure_results(Res) when is_list(Res) ->
+    Savg = avg([Size       || #stat{size = Size} <- Res]),
+    Eavg = avg([Etime/Ecnt || #stat{ecount = Ecnt, etime = Etime} <- Res]),
+    Davg = avg([Dtime/Dcnt || #stat{dcount = Dcnt, dtime = Dtime} <- Res]),
+    {Savg, Eavg, Davg}.
+
+
 
 do_measure(Factor, Opts, _Id, Codec, Conf, Name, BinMsg, MCount) ->
     %% io:format("~n~s~n", [binary_to_list(BinMsg)]),
@@ -510,6 +516,50 @@ do_measure_codec_loop(Codec, Func, Conf, Version, Bin, Count, _) ->
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
+process_results(#{bench := true}, Results) ->
+    ProcessedResults = process_bench_results(Results),
+    {bench, ProcessedResults};
+process_results(_, Results) ->
+    store_results(Results).
+
+process_bench_results(Results) ->
+    process_bench_results(Results, []).
+
+process_bench_results([] = _Results, AccProcessedResults) ->
+    lists:reverse(AccProcessedResults);
+process_bench_results([{BaseName, Config, Result} | Results],
+                      AccProcessedResults) ->
+    Name = process_bench_result_name(BaseName, Config),
+    ProcessedResult = process_measure_results(Result),
+    process_bench_results(Results,
+                          [{Name, ProcessedResult} | AccProcessedResults]).
+
+process_bench_result_name(pretty = BaseName, []) ->
+    BaseName;
+process_bench_result_name(pretty = BaseName, [flex_scanner]) ->
+    list_to_atom(f("~w_~w", [BaseName, flex]));
+process_bench_result_name(compact = BaseName, []) ->
+    BaseName;
+process_bench_result_name(compact = BaseName, [flex_scanner]) ->
+    list_to_atom(f("~w_~w", [BaseName, flex]));
+process_bench_result_name(ber = BaseName, []) ->
+    BaseName;
+process_bench_result_name(ber = BaseName, [native]) ->
+    list_to_atom(f("~w_~w", [BaseName, native]));
+process_bench_result_name(per = BaseName, []) ->
+    BaseName;
+process_bench_result_name(per = BaseName, [native]) ->
+    list_to_atom(f("~w_~w", [BaseName, native]));
+process_bench_result_name(erlang, []) ->
+    erl;
+process_bench_result_name(erlang, [megaco_compressed]) ->
+    erl_mc;
+process_bench_result_name(erlang, [compressed]) ->
+    erl_c;
+process_bench_result_name(erlang, [megaco_compressed, compressed]) ->
+    erl_mc_c.
+
+
 store_results(Results) ->
     io:format("storing: ~n", []),    
     store_excel_message_size(Results),
@@ -700,6 +750,12 @@ vprint(_, _, _) ->
     ok.
 
 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+f(F, A) ->
+    lists:flatten(io_lib:format(F, A)).
+
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 info(F, A) ->
diff --git a/lib/megaco/test/megaco_bench.spec b/lib/megaco/test/megaco_bench.spec
index 385019c3c7..5129b94f78 100644
--- a/lib/megaco/test/megaco_bench.spec
+++ b/lib/megaco/test/megaco_bench.spec
@@ -20,4 +20,4 @@
 %% %CopyrightEnd%
 %%
 
-{groups,"../megaco_test",megaco_examples_SUITE,[meas]}.
+{groups,"../megaco_test",megaco_examples_SUITE,[bench]}.
diff --git a/lib/megaco/test/megaco_examples_SUITE.erl b/lib/megaco/test/megaco_examples_SUITE.erl
index a2fa78f0c1..943e209d7c 100644
--- a/lib/megaco/test/megaco_examples_SUITE.erl
+++ b/lib/megaco/test/megaco_examples_SUITE.erl
@@ -35,7 +35,7 @@
 
          simple/1,
          
-         meas/1,
+         meas/1,    bench_meas/1,
          mstone1/1,
          mstone2/1
 
@@ -43,6 +43,7 @@
 
 
 -include_lib("common_test/include/ct.hrl").
+-include_lib("common_test/include/ct_event.hrl").
 -include("megaco_test_lib.hrl").
 -include_lib("megaco/include/megaco.hrl").
 -include_lib("megaco/include/megaco_message_v1.hrl").
@@ -52,6 +53,9 @@
 
 %%======================================================================
 %% Common Test interface functions
+%%
+%% The difference between the bench cases and the meas cases is simply
+%% how the results are reported.
 %%======================================================================
 
 suite() -> 
@@ -60,12 +64,14 @@ suite() ->
 all() -> 
     [
      simple,
-     {group, meas}
+     {group, meas},
+     {group, bench}
     ].
 
 groups() -> 
     [
-     {meas, [], meas_cases()}
+     {meas,  [], meas_cases()},
+     {bench, [], bench_cases()}
     ].
 
 meas_cases() ->
@@ -75,6 +81,12 @@ meas_cases() ->
      mstone2
     ].
 
+bench_cases() ->
+    [
+     bench_meas%% ,
+     %% bench_mstone1,
+     %% bench_mstone2
+    ].
 
 
 %%
@@ -156,7 +168,8 @@ init_per_testcase(simple = Case, Config) ->
 
     megaco_test_lib:init_per_testcase(Case, Config);
 
-init_per_testcase(meas = Case, Config) ->
+init_per_testcase(Case, Config) when (Case =:= meas) orelse
+                                     (Case =:= bench_meas) ->
 
     p("init_per_testcase -> entry with"
       "~n   Config: ~p"
@@ -229,7 +242,8 @@ end_per_testcase(simple = Case, Config) ->
 
     megaco_test_lib:end_per_testcase(Case, Config);
 
-end_per_testcase(meas = Case, Config) ->
+end_per_testcase(Case, Config) when (Case =:= meas) orelse
+                                    (Case =:= bench_meas) ->
 
     p("end_per_testcase -> entry with"
       "~n   Config: ~p"
@@ -613,6 +627,9 @@ users(Proxy) ->
 meas(suite) ->
     [];
 meas(Config) when is_list(Config) ->
+    common_meas(?FUNCTION_NAME, #{}, Config).
+
+common_meas(TC, Opts0, Config) when is_map(Opts0) ->
     Pre  = fun() ->
                    MFactor = ?config(megaco_factor, Config),
                    {Time, Factor} =
@@ -639,12 +656,12 @@ meas(Config) when is_list(Config) ->
                    WorkerNode = ?config(worker_node, Config),
                    {Factor, WorkerNode}
            end,
-    Opts = #{verbose => false},
+    Opts = Opts0#{verbose => false},
     Case = fun({Factor, WorkerNode}) ->
                    do_meas(WorkerNode, megaco_codec_meas, start, [Factor, Opts])
            end,
     Post = fun(_) -> ok end,
-    try_tc(?FUNCTION_NAME, Pre, Case, Post).
+    try_tc(TC, Pre, Case, Post).
 
 do_meas(Node, Mod, Func, Args) ->
     F = fun() ->
@@ -654,6 +671,12 @@ do_meas(Node, Mod, Func, Args) ->
     {Pid, MRef} = spawn_monitor(F),
     p("await completion"),
     receive
+        {'DOWN', MRef, process, Pid, {bench, Results}} ->
+            p("worker process terminated with bench results: "
+              "~n      ~p", [Results]),
+            publish_bench_results(meas, Results),
+            ok;
+
         {'DOWN', MRef, process, Pid,
          {error, {failed_loading_flex_scanner_driver, Reason}}} ->
             p("<ERROR> worker process failed loading flex scanner: "
@@ -682,6 +705,16 @@ do_meas(Node, Mod, Func, Args) ->
     ok.
 
 
+publish_bench_results(_Pre, []) ->
+    ok;
+publish_bench_results(Pre, [{Name, {_, Enc, Dec}} | Results]) ->
+    Event = #event{name = list_to_atom(?F("~w_~w", [Pre, Name])),
+                   data = [{suite, atom_to_list(?MODULE)},
+                           {value, Enc + Dec}]},
+    ct_event:notify(Event),
+    publish_bench_results(Pre, Results).
+    
+                    
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
@@ -748,6 +781,23 @@ mstone2(Config) when is_list(Config) ->
     try_tc(?FUNCTION_NAME, Pre, Case, Post).
 
 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% ------------------ bench:meas ------------------------
+
+bench_meas(suite) ->
+    [];
+bench_meas(Config) when is_list(Config) ->
+    common_meas(?FUNCTION_NAME, #{bench => true}, Config).
+
+
+%% ------------------ bench:mstone1 ---------------------
+%% ------------------ bench:mstone2 ---------------------
+
+
+
+
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 start_unique_node(Pre) ->
-- 
2.43.0

openSUSE Build Service is sponsored by