File 0753-megaco-segment-test-Improve-syncing-between-actors.patch of Package erlang

From 1c6e9b519bbc6221f7c52f54def9eb1e82258aae Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Thu, 14 Jan 2021 17:56:55 +0100
Subject: [PATCH] [megaco|segment|test] Improve syncing between actors

---
 lib/megaco/test/megaco_segment_SUITE.erl      | 95 ++++++++++++++++++-
 .../test/megaco_test_megaco_generator.erl     |  7 ++
 2 files changed, 98 insertions(+), 4 deletions(-)

diff --git a/lib/megaco/test/megaco_segment_SUITE.erl b/lib/megaco/test/megaco_segment_SUITE.erl
index a403c3309d..bea7ac6b7a 100644
--- a/lib/megaco/test/megaco_segment_SUITE.erl
+++ b/lib/megaco/test/megaco_segment_SUITE.erl
@@ -2827,6 +2827,42 @@ do_send_segmented_msg_ooo1([MgcNode, MgNode]) ->
     d("[MG] start the simulation"),
     {ok, MgId} = megaco_test_megaco_generator:exec(Mg, MgEvSeq),
 
+    %% Await MGC ready for segments
+    d("await MGC trigger event"),
+    MgcPid = 
+	receive
+	    {ready_for_segmented_msg, mgc, Pid1} ->
+		d("received MGC trigger event"),
+		Pid1
+	after 5000 ->
+		d("timeout waiting for MGC trigger event: ~p", 
+		  [megaco_test_lib:flush()]),
+		?ERROR(timeout_MGC_trigger_event)
+	end,
+
+    %% Await MG ready for segments
+    d("await MG trigger event"),
+    MgPid = 
+	receive
+	    {ready_for_segmented_msg, mg, Pid2} ->
+		d("received MG trigger event"),
+		Pid2
+	after 5000 ->
+		d("timeout waiting for MG trigger event: ~p", 
+		  [megaco_test_lib:flush()]),
+		?ERROR(timeout_MG_trigger_event)
+	end,
+
+    %% Instruct the MG to continue
+    d("send continue to MG"),
+    MgPid ! {continue_with_segmented_msg, self()}, 
+
+    sleep(500),
+
+    %% Instruct the MGC to continue
+    d("send continue to MGC"),
+    MgcPid ! {continue_with_segmented_msg, self()}, 
+
     d("await the generator reply(s)"),
     await_completion([MgcId, MgId]),
 
@@ -2853,6 +2889,8 @@ ssmo1_mgc_event_sequence(text, tcp) ->
     Mid       = {deviceName,"mgc"},
     ScrVerifyFun     = ssmo1_mgc_verify_service_change_req_msg_fun(),
     ServiceChangeRep = ssmo1_mgc_service_change_reply_msg(Mid, 1),
+    AnnounceReadySegs = ssmo1_mgc_announce_ready_for_segmented_msg_fun(),
+    AwaitContinueSegs = ssmo1_mgc_continue_with_segmented_msg_fun(),
     TermId1   = 
 	#megaco_term_id{id = ["00000000","00000000","00000001"]},
     CtxId1    = 1, 
@@ -2923,7 +2961,13 @@ ssmo1_mgc_event_sequence(text, tcp) ->
 	     {expect_accept, any},
              {expect_receive, "service-change-request",  {ScrVerifyFun, 5000}},
              {send, "service-change-reply",              ServiceChangeRep},
-	     {expect_nothing, 1000}, 
+
+             {trigger, "announce ready for segmented message",
+              AnnounceReadySegs},
+             {trigger, "await continue for segmented message",
+              AwaitContinueSegs},
+
+	     %% {expect_nothing, 1000}, 
              {send, "notify request",                    NotifyReq},
              {expect_receive, "notify reply: segment 1", {NrVerifyFun1, 1000}},
              {expect_receive, "notify reply: segment 2", {NrVerifyFun2, 1000}},
@@ -3053,6 +3097,23 @@ ssmo1_mgc_verify_service_change_req(#'MegacoMessage'{mess = Mess} = M) ->
 	    {error, {invalid_serviceChangeParms, Parms}}
     end.
 
+ssmo1_mgc_announce_ready_for_segmented_msg_fun() ->
+    TC = self(),
+    fun() ->
+            TC ! {ready_for_segmented_msg, mgc, self()}
+    end.
+
+ssmo1_mgc_continue_with_segmented_msg_fun() ->
+    TC = self(),
+    fun() ->
+            p("[MGC] await continue with segmented message"),
+            receive
+                {continue_with_segmented_msg, TC} ->
+                    p("[MGC] received continue with segmented message"),
+                    ok
+            end
+    end.
+
 ssmo1_mgc_verify_notify_reply_segment_msg_fun(SN, Last, 
 					     TransId, TermId, Cid) ->
     fun(Msg) -> 
@@ -3219,6 +3280,8 @@ ssmo1_mg_event_sequence(text, tcp) ->
     ConnectVerify = ssmo1_mg_verify_handle_connect_fun(),
     ServiceChangeReq = ssmo1_mg_service_change_request_ar(Mid, 1),
     ServiceChangeReplyVerify = ssmo1_mg_verify_service_change_reply_fun(),
+    AnnounceReadySegs = ssmo1_mg_announce_ready_for_segmented_msg_fun(),
+    AwaitContinueSegs = ssmo1_mg_continue_with_segmented_msg_fun(),
     Tid1 = #megaco_term_id{id = ["00000000","00000000","00000001"]},
     Tid2 = #megaco_term_id{id = ["00000000","00000000","00000002"]},
     Tid3 = #megaco_term_id{id = ["00000000","00000000","00000003"]},
@@ -3247,8 +3310,13 @@ ssmo1_mg_event_sequence(text, tcp) ->
              {megaco_callback, handle_trans_reply, ServiceChangeReplyVerify},
 	     {megaco_update_conn_info, protocol_version, ?VERSION}, 
 	     {megaco_update_conn_info, segment_send,     3}, 
-	     {megaco_update_conn_info, max_pdu_size,     128}, 
-             {sleep, 1000},
+	     {megaco_update_conn_info, max_pdu_size,     128},
+
+             {trigger, "announce ready for segmented message",
+              AnnounceReadySegs},
+             {trigger, "await continue for segmented message",
+              AwaitContinueSegs},
+
              {megaco_callback, handle_trans_request, NotifyReqVerify},
              {megaco_callback, handle_trans_ack,     AckVerify, 15000},
              megaco_stop_user,
@@ -3257,7 +3325,6 @@ ssmo1_mg_event_sequence(text, tcp) ->
             ],
     EvSeq.
 
-
 ssmo1_mg_verify_handle_connect_fun() ->
     fun(Ev) -> ssmo1_mg_verify_handle_connect(Ev) end.
 
@@ -3333,6 +3400,23 @@ ssmo1_mg_do_verify_scr(AR) ->
 	    {error, Reason6, ok}
     end.
 
+ssmo1_mg_announce_ready_for_segmented_msg_fun() ->
+    TC = self(),
+    fun() ->
+            TC ! {ready_for_segmented_msg, mg, self()}
+    end.
+
+ssmo1_mg_continue_with_segmented_msg_fun() ->
+    TC = self(),
+    fun() ->
+            p("[MG] await continue with segmented message"),
+            receive
+                {continue_with_segmented_msg, TC} ->
+                    p("[MG] received continue with segmented message"),
+                    ok
+            end
+    end.
+
 ssmo1_mg_verify_notify_request_fun(Tids) ->
     fun(Req) -> ssmo1_mg_verify_notify_request(Req, Tids) end.
 	     
@@ -7913,6 +7997,9 @@ try_tc(TCName, Name, Verbosity, Pre, Case, Post) ->
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
+p(F) ->
+    p(F, []).
+
 p(F, A) ->
     io:format("*** [~s] ~p ***"
 	      "~n   " ++ F ++ "~n", 
diff --git a/lib/megaco/test/megaco_test_megaco_generator.erl b/lib/megaco/test/megaco_test_megaco_generator.erl
index 4eedd8d731..f56b43fc8d 100644
--- a/lib/megaco/test/megaco_test_megaco_generator.erl
+++ b/lib/megaco/test/megaco_test_megaco_generator.erl
@@ -313,6 +313,9 @@ handle_parse({megaco_callback, Verifiers0} = _Instruction, State)
 handle_parse({trigger, Trigger} = Instruction, State)
   when is_function(Trigger) ->
     {ok, Instruction, State};
+handle_parse({trigger, Desc, Trigger} = Instruction, State)
+  when is_list(Desc) andalso is_function(Trigger) ->
+    {ok, Instruction, State};
 
 handle_parse(Instruction, _State) ->
     error({invalid_instruction, Instruction}).
@@ -770,6 +773,10 @@ handle_exec({trigger, Trigger}, State) when is_function(Trigger) ->
     p("trigger"),
     (catch Trigger()),
     {ok, State};
+handle_exec({trigger, Desc, Trigger}, State) when is_function(Trigger) ->
+    p("trigger: ~s", [Desc]),
+    (catch Trigger()),
+    {ok, State};
 
 handle_exec({sleep, To}, State) ->
     p("sleep ~p", [To]),
-- 
2.26.2

openSUSE Build Service is sponsored by