return
}
- if subs.IsTransactionReserved() {
- err := fmt.Errorf("Currently parallel or queued transactions are not allowed")
- xapp.Logger.Error("XAPP-SubReq: %s", idstring(trans, subs, err))
- return
- }
-
//
// Wake subs request
//
return
}
- if subs.IsTransactionReserved() {
- err := fmt.Errorf("Currently parallel or queued transactions are not allowed")
- xapp.Logger.Error("XAPP-SubDelReq: %s", idstring(trans, subs, err))
- return
- }
-
//
// Wake subs delete
//
xapp.Logger.Debug("SUBS-SubReq: Handling %s parent %s", idstring(trans, subs, nil), parentTrans.String())
+ subs.mutex.Lock()
if subs.SubRespMsg != nil {
- xapp.Logger.Debug("SUBS-SubReq: Handling (immediate response) %s parent %s", idstring(nil, subs, nil), parentTrans.String())
+ xapp.Logger.Debug("SUBS-SubReq: Handling (immediate resp response) %s parent %s", idstring(nil, subs, nil), parentTrans.String())
parentTrans.SendEvent(subs.SubRespMsg, 0)
+ subs.mutex.Unlock()
+ return
+ }
+ if subs.SubFailMsg != nil {
+ xapp.Logger.Debug("SUBS-SubReq: Handling (immediate fail response) %s parent %s", idstring(nil, subs, nil), parentTrans.String())
+ parentTrans.SendEvent(subs.SubFailMsg, 0)
+ subs.mutex.Unlock()
+ go c.registry.RemoveFromSubscription(subs, parentTrans, 5*time.Second)
return
}
+ if subs.valid == false {
+ xapp.Logger.Debug("SUBS-SubReq: Handling (immediate nil response) %s parent %s", idstring(nil, subs, nil), parentTrans.String())
+ parentTrans.SendEvent(nil, 0)
+ subs.mutex.Unlock()
+ go c.registry.RemoveFromSubscription(subs, parentTrans, 5*time.Second)
+ return
+ }
+ subs.mutex.Unlock()
event := c.sendE2TSubscriptionRequest(subs, trans, parentTrans)
switch themsg := event.(type) {
case *e2ap.E2APSubscriptionResponse:
+ subs.mutex.Lock()
subs.SubRespMsg = themsg
+ subs.mutex.Unlock()
parentTrans.SendEvent(event, 0)
return
case *e2ap.E2APSubscriptionFailure:
- //TODO: Possible delete and one retry for subs req
+ subs.mutex.Lock()
+ subs.SubFailMsg = themsg
+ subs.mutex.Unlock()
parentTrans.SendEvent(event, 0)
default:
xapp.Logger.Info("SUBS-SubReq: internal delete due event(%s) %s", typeofSubsMessage(event), idstring(trans, subs, nil))
+ subs.mutex.Lock()
+ subs.valid = false
+ subs.mutex.Unlock()
c.sendE2TSubscriptionDeleteRequest(subs, trans, parentTrans)
parentTrans.SendEvent(nil, 0)
}
//-------------------------------------------------------------------
// SUBS DELETE Handling
//-------------------------------------------------------------------
+
func (c *Control) handleSubscriptionDelete(subs *Subscription, parentTrans *Transaction) {
trans := c.tracker.NewTransaction(subs.GetMeid())
xapp.Logger.Debug("SUBS-SubDelReq: Handling %s parent %s", idstring(trans, subs, nil), parentTrans.String())
- event := c.sendE2TSubscriptionDeleteRequest(subs, trans, parentTrans)
+ subs.mutex.Lock()
+ if subs.valid && subs.EpList.HasEndpoint(parentTrans.GetEndpoint()) && subs.EpList.Size() == 1 {
+ subs.valid = false
+ subs.mutex.Unlock()
+ c.sendE2TSubscriptionDeleteRequest(subs, trans, parentTrans)
+ } else {
+ subs.mutex.Unlock()
+ }
+
+ subDelRespMsg := &e2ap.E2APSubscriptionDeleteResponse{}
+ subDelRespMsg.RequestId.Id = subs.SubReqMsg.RequestId.Id
+ subDelRespMsg.RequestId.Seq = uint32(subs.GetSubId())
+ subDelRespMsg.FunctionId = subs.SubReqMsg.FunctionId
+ parentTrans.SendEvent(subDelRespMsg, 0)
- parentTrans.SendEvent(event, 0)
go c.registry.RemoveFromSubscription(subs, parentTrans, 5*time.Second)
}
waiter := rtmgrHttp.AllocNextEvent(false)
newSubsId := mainCtrl.get_subid(t)
- xappConn1.handle_xapp_subs_req(t, nil)
+ xappConn1.handle_xapp_subs_req(t, nil, nil)
waiter.WaitResult(t)
//Wait that subs is cleaned
xappConn1.TestMsgCnt(t)
xappConn2.TestMsgCnt(t)
e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 10)
}
//-----------------------------------------------------------------------------
xapp.Logger.Info("TestSubReqAndSubDelOk")
waiter := rtmgrHttp.AllocNextEvent(true)
- cretrans := xappConn1.handle_xapp_subs_req(t, nil)
+ cretrans := xappConn1.handle_xapp_subs_req(t, nil, nil)
waiter.WaitResult(t)
crereq, cremsg := e2termConn.handle_e2term_subs_req(t)
xappConn1.TestMsgCnt(t)
xappConn2.TestMsgCnt(t)
e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 10)
}
//-----------------------------------------------------------------------------
xapp.Logger.Info("TestSubReqRetransmission")
//Subs Create
- cretrans := xappConn1.handle_xapp_subs_req(t, nil)
+ cretrans := xappConn1.handle_xapp_subs_req(t, nil, nil)
crereq, cremsg := e2termConn.handle_e2term_subs_req(t)
seqBef := mainCtrl.get_msgcounter(t)
- xappConn1.handle_xapp_subs_req(t, cretrans) //Retransmitted SubReq
+ xappConn1.handle_xapp_subs_req(t, nil, cretrans) //Retransmitted SubReq
mainCtrl.wait_msgcounter_change(t, seqBef, 10)
e2termConn.handle_e2term_subs_resp(t, crereq, cremsg)
xappConn1.TestMsgCnt(t)
xappConn2.TestMsgCnt(t)
e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 10)
}
//-----------------------------------------------------------------------------
xapp.Logger.Info("TestSubDelReqRetransmission")
//Subs Create
- cretrans := xappConn1.handle_xapp_subs_req(t, nil)
+ cretrans := xappConn1.handle_xapp_subs_req(t, nil, nil)
crereq, cremsg := e2termConn.handle_e2term_subs_req(t)
e2termConn.handle_e2term_subs_resp(t, crereq, cremsg)
e2SubsId := xappConn1.handle_xapp_subs_resp(t, cretrans)
xappConn1.TestMsgCnt(t)
xappConn2.TestMsgCnt(t)
e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 10)
}
//-----------------------------------------------------------------------------
// | [SUBS CREATE] |
// | | |
// | | |
-// | SubDelReq | |
+// | SubDelReq 1 | |
// |------------->| |
// | | |
-// | | SubDelReq |
+// | | SubDelReq 1 |
// | |------------->|
// | | |
-// | SubDelReq | |
+// | SubDelReq 2 | |
// | (same sub) | |
// | (diff xid) | |
// |------------->| |
// | | |
-// | | SubDelResp |
+// | | SubDelResp 1 |
// | |<-------------|
// | | |
-// | SubDelResp | |
+// | SubDelResp 1 | |
+// |<-------------| |
+// | | |
+// | SubDelResp 2 | |
// |<-------------| |
//
//-----------------------------------------------------------------------------
+
func TestSubDelReqCollision(t *testing.T) {
xapp.Logger.Info("TestSubDelReqCollision")
//Subs Create
- cretrans := xappConn1.handle_xapp_subs_req(t, nil)
+ cretrans := xappConn1.handle_xapp_subs_req(t, nil, nil)
crereq, cremsg := e2termConn.handle_e2term_subs_req(t)
e2termConn.handle_e2term_subs_resp(t, crereq, cremsg)
e2SubsId := xappConn1.handle_xapp_subs_resp(t, cretrans)
//Subs Delete
- deltrans := xappConn1.handle_xapp_subs_del_req(t, nil, e2SubsId)
- delreq, delmsg := e2termConn.handle_e2term_subs_del_req(t)
+ xappConn1.handle_xapp_subs_del_req(t, nil, e2SubsId)
+ delreq1, delmsg1 := e2termConn.handle_e2term_subs_del_req(t)
+ // Subs Delete colliding
seqBef := mainCtrl.get_msgcounter(t)
- deltranscol := xappConn1.newXappTransaction(nil, "RAN_NAME_1")
- xappConn1.handle_xapp_subs_del_req(t, deltranscol, e2SubsId) //Colliding SubDelReq
+ deltranscol2 := xappConn1.newXappTransaction(nil, "RAN_NAME_1")
+ xappConn1.handle_xapp_subs_del_req(t, deltranscol2, e2SubsId) //Colliding SubDelReq
mainCtrl.wait_msgcounter_change(t, seqBef, 10)
- e2termConn.handle_e2term_subs_del_resp(t, delreq, delmsg)
- xappConn1.handle_xapp_subs_del_resp(t, deltrans)
+ // Del resp for first and second
+ e2termConn.handle_e2term_subs_del_resp(t, delreq1, delmsg1)
+
+ // don't care in which order responses are received
+ xappConn1.handle_xapp_subs_del_resp(t, nil)
+ xappConn1.handle_xapp_subs_del_resp(t, nil)
//Wait that subs is cleaned
mainCtrl.wait_subs_clean(t, e2SubsId, 10)
xappConn1.TestMsgCnt(t)
xappConn2.TestMsgCnt(t)
e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 10)
}
//-----------------------------------------------------------------------------
xapp.Logger.Info("TestSubReqAndSubDelOkTwoParallel")
//Req1
- cretrans1 := xappConn1.handle_xapp_subs_req(t, nil)
+ rparams1 := &test_subs_req_params{}
+ rparams1.Init()
+ rparams1.req.EventTriggerDefinition.ProcedureCode = 5
+ cretrans1 := xappConn1.handle_xapp_subs_req(t, rparams1, nil)
crereq1, cremsg1 := e2termConn.handle_e2term_subs_req(t)
//Req2
- cretrans2 := xappConn2.handle_xapp_subs_req(t, nil)
+ rparams2 := &test_subs_req_params{}
+ rparams2.Init()
+ rparams2.req.EventTriggerDefinition.ProcedureCode = 28
+ cretrans2 := xappConn2.handle_xapp_subs_req(t, rparams2, nil)
crereq2, cremsg2 := e2termConn.handle_e2term_subs_req(t)
//Resp1
xappConn1.TestMsgCnt(t)
xappConn2.TestMsgCnt(t)
e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 10)
}
//-----------------------------------------------------------------------------
//Req1
cretrans1 := xappConn1.newXappTransaction(nil, "RAN_NAME_1")
- xappConn1.handle_xapp_subs_req(t, cretrans1)
+ xappConn1.handle_xapp_subs_req(t, nil, cretrans1)
crereq1, cremsg1 := e2termConn.handle_e2term_subs_req(t)
e2termConn.handle_e2term_subs_resp(t, crereq1, cremsg1)
e2SubsId1 := xappConn1.handle_xapp_subs_resp(t, cretrans1)
//Req2
cretrans2 := xappConn1.newXappTransaction(nil, "RAN_NAME_2")
- xappConn1.handle_xapp_subs_req(t, cretrans2)
+ xappConn1.handle_xapp_subs_req(t, nil, cretrans2)
crereq2, cremsg2 := e2termConn.handle_e2term_subs_req(t)
e2termConn.handle_e2term_subs_resp(t, crereq2, cremsg2)
e2SubsId2 := xappConn1.handle_xapp_subs_resp(t, cretrans2)
xappConn1.TestMsgCnt(t)
xappConn2.TestMsgCnt(t)
e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 10)
}
//-----------------------------------------------------------------------------
xapp.Logger.Info("TestSubReqRetryInSubmgr start")
// Xapp: Send SubsReq
- cretrans := xappConn1.handle_xapp_subs_req(t, nil)
+ cretrans := xappConn1.handle_xapp_subs_req(t, nil, nil)
// E2t: Receive 1st SubsReq
e2termConn.handle_e2term_subs_req(t)
xappConn1.TestMsgCnt(t)
xappConn2.TestMsgCnt(t)
e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 10)
}
//-----------------------------------------------------------------------------
xapp.Logger.Info("TestSubReqTwoRetriesNoRespSubDelRespInSubmgr start")
// Xapp: Send SubsReq
- xappConn1.handle_xapp_subs_req(t, nil)
+ xappConn1.handle_xapp_subs_req(t, nil, nil)
// E2t: Receive 1st SubsReq
e2termConn.handle_e2term_subs_req(t)
xappConn1.TestMsgCnt(t)
xappConn2.TestMsgCnt(t)
e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 10)
}
//-----------------------------------------------------------------------------
xapp.Logger.Info("TestSubReqTwoRetriesNoRespAtAllInSubmgr start")
// Xapp: Send SubsReq
- xappConn1.handle_xapp_subs_req(t, nil)
+ xappConn1.handle_xapp_subs_req(t, nil, nil)
// E2t: Receive 1st SubsReq
e2termConn.handle_e2term_subs_req(t)
xappConn1.TestMsgCnt(t)
xappConn2.TestMsgCnt(t)
e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 10)
}
//-----------------------------------------------------------------------------
xapp.Logger.Info("TestSubReqSubFailRespInSubmgr start")
// Xapp: Send SubsReq
- cretrans := xappConn1.handle_xapp_subs_req(t, nil)
+ cretrans := xappConn1.handle_xapp_subs_req(t, nil, nil)
// E2t: Receive SubsReq and send SubsFail
crereq, cremsg := e2termConn.handle_e2term_subs_req(t)
xappConn1.TestMsgCnt(t)
xappConn2.TestMsgCnt(t)
e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 10)
}
//-----------------------------------------------------------------------------
xapp.Logger.Info("TestSubDelReqRetryInSubmgr start")
// Subs Create
- cretrans := xappConn1.handle_xapp_subs_req(t, nil)
+ cretrans := xappConn1.handle_xapp_subs_req(t, nil, nil)
crereq, cremsg := e2termConn.handle_e2term_subs_req(t)
e2termConn.handle_e2term_subs_resp(t, crereq, cremsg)
e2SubsId := xappConn1.handle_xapp_subs_resp(t, cretrans)
xappConn1.TestMsgCnt(t)
xappConn2.TestMsgCnt(t)
e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 10)
}
//-----------------------------------------------------------------------------
xapp.Logger.Info("TestSubDelReTwoRetriesNoRespInSubmgr start")
// Subs Create
- cretrans := xappConn1.handle_xapp_subs_req(t, nil)
+ cretrans := xappConn1.handle_xapp_subs_req(t, nil, nil)
crereq, cremsg := e2termConn.handle_e2term_subs_req(t)
e2termConn.handle_e2term_subs_resp(t, crereq, cremsg)
e2SubsId := xappConn1.handle_xapp_subs_resp(t, cretrans)
xappConn1.TestMsgCnt(t)
xappConn2.TestMsgCnt(t)
e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 10)
}
//-----------------------------------------------------------------------------
xapp.Logger.Info("TestSubReqSubDelFailRespInSubmgr start")
// Subs Create
- cretrans := xappConn1.handle_xapp_subs_req(t, nil)
+ cretrans := xappConn1.handle_xapp_subs_req(t, nil, nil)
crereq, cremsg := e2termConn.handle_e2term_subs_req(t)
e2termConn.handle_e2term_subs_resp(t, crereq, cremsg)
e2SubsId := xappConn1.handle_xapp_subs_resp(t, cretrans)
xappConn1.TestMsgCnt(t)
xappConn2.TestMsgCnt(t)
e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 10)
+}
+
+//-----------------------------------------------------------------------------
+// TestSubReqAndSubDelOkSameAction
+//
+// stub stub
+// +-------+ +---------+ +---------+
+// | xapp | | submgr | | e2term |
+// +-------+ +---------+ +---------+
+// | | |
+// | | |
+// | | |
+// | SubReq1 | |
+// |------------->| |
+// | | |
+// | | SubReq1 |
+// | |------------->|
+// | | SubResp1 |
+// | |<-------------|
+// | SubResp1 | |
+// |<-------------| |
+// | | |
+// | SubReq2 | |
+// |------------->| |
+// | | |
+// | SubResp2 | |
+// |<-------------| |
+// | | |
+// | SubDelReq 1 | |
+// |------------->| |
+// | | |
+// | SubDelResp 1 | |
+// |<-------------| |
+// | | |
+// | SubDelReq 2 | |
+// |------------->| |
+// | | |
+// | | SubDelReq 2 |
+// | |------------->|
+// | | |
+// | | SubDelReq 2 |
+// | |------------->|
+// | | |
+// | SubDelResp 2 | |
+// |<-------------| |
+//
+//-----------------------------------------------------------------------------
+func TestSubReqAndSubDelOkSameAction(t *testing.T) {
+ xapp.Logger.Info("TestSubReqAndSubDelOkSameAction")
+
+ //Req1
+ rparams1 := &test_subs_req_params{}
+ rparams1.Init()
+ cretrans1 := xappConn1.handle_xapp_subs_req(t, rparams1, nil)
+ crereq1, cremsg1 := e2termConn.handle_e2term_subs_req(t)
+ e2termConn.handle_e2term_subs_resp(t, crereq1, cremsg1)
+ e2SubsId1 := xappConn1.handle_xapp_subs_resp(t, cretrans1)
+
+ //Req2
+ rparams2 := &test_subs_req_params{}
+ rparams2.Init()
+ cretrans2 := xappConn2.handle_xapp_subs_req(t, rparams2, nil)
+ //crereq2, cremsg2 := e2termConn.handle_e2term_subs_req(t)
+ //e2termConn.handle_e2term_subs_resp(t, crereq2, cremsg2)
+ e2SubsId2 := xappConn2.handle_xapp_subs_resp(t, cretrans2)
+
+ //Del1
+ deltrans1 := xappConn1.handle_xapp_subs_del_req(t, nil, e2SubsId1)
+ //e2termConn.handle_e2term_subs_del_req(t)
+ //e2termConn.handle_e2term_subs_del_resp(t, delreq1, delmsg1)
+ xappConn1.handle_xapp_subs_del_resp(t, deltrans1)
+ //Wait that subs is cleaned
+ //mainCtrl.wait_subs_clean(t, e2SubsId1, 10)
+
+ //Del2
+ deltrans2 := xappConn2.handle_xapp_subs_del_req(t, nil, e2SubsId2)
+ delreq2, delmsg2 := e2termConn.handle_e2term_subs_del_req(t)
+ e2termConn.handle_e2term_subs_del_resp(t, delreq2, delmsg2)
+ xappConn2.handle_xapp_subs_del_resp(t, deltrans2)
+ //Wait that subs is cleaned
+ mainCtrl.wait_subs_clean(t, e2SubsId2, 10)
+
+ xappConn1.TestMsgCnt(t)
+ xappConn2.TestMsgCnt(t)
+ e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 10)
+}
+
+//-----------------------------------------------------------------------------
+// TestSubReqAndSubDelOkSameActionParallel
+//
+// stub stub
+// +-------+ +---------+ +---------+
+// | xapp | | submgr | | e2term |
+// +-------+ +---------+ +---------+
+// | | |
+// | | |
+// | | |
+// | SubReq1 | |
+// |------------->| |
+// | | |
+// | | SubReq1 |
+// | |------------->|
+// | SubReq2 | |
+// |------------->| |
+// | | SubResp1 |
+// | |<-------------|
+// | SubResp1 | |
+// |<-------------| |
+// | | |
+// | SubResp2 | |
+// |<-------------| |
+// | | |
+// | SubDelReq 1 | |
+// |------------->| |
+// | | |
+// | SubDelResp 1 | |
+// |<-------------| |
+// | | |
+// | SubDelReq 2 | |
+// |------------->| |
+// | | |
+// | | SubDelReq 2 |
+// | |------------->|
+// | | |
+// | | SubDelReq 2 |
+// | |------------->|
+// | | |
+// | SubDelResp 2 | |
+// |<-------------| |
+//
+//-----------------------------------------------------------------------------
+func TestSubReqAndSubDelOkSameActionParallel(t *testing.T) {
+ xapp.Logger.Info("TestSubReqAndSubDelOkSameActionParallel")
+
+ //Req1
+ rparams1 := &test_subs_req_params{}
+ rparams1.Init()
+ cretrans1 := xappConn1.handle_xapp_subs_req(t, rparams1, nil)
+ crereq1, cremsg1 := e2termConn.handle_e2term_subs_req(t)
+
+ //Req2
+ rparams2 := &test_subs_req_params{}
+ rparams2.Init()
+ cretrans2 := xappConn2.handle_xapp_subs_req(t, rparams2, nil)
+
+ //Resp1
+ e2termConn.handle_e2term_subs_resp(t, crereq1, cremsg1)
+ e2SubsId1 := xappConn1.handle_xapp_subs_resp(t, cretrans1)
+
+ //Resp2
+ e2SubsId2 := xappConn2.handle_xapp_subs_resp(t, cretrans2)
+
+ //Del1
+ deltrans1 := xappConn1.handle_xapp_subs_del_req(t, nil, e2SubsId1)
+ xappConn1.handle_xapp_subs_del_resp(t, deltrans1)
+
+ //Del2
+ deltrans2 := xappConn2.handle_xapp_subs_del_req(t, nil, e2SubsId2)
+ delreq2, delmsg2 := e2termConn.handle_e2term_subs_del_req(t)
+ e2termConn.handle_e2term_subs_del_resp(t, delreq2, delmsg2)
+ xappConn2.handle_xapp_subs_del_resp(t, deltrans2)
+
+ //Wait that subs is cleaned
+ mainCtrl.wait_subs_clean(t, e2SubsId2, 10)
+
+ xappConn1.TestMsgCnt(t)
+ xappConn2.TestMsgCnt(t)
+ e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 10)
+}
+
+//-----------------------------------------------------------------------------
+// TestSubReqAndSubDelNokSameActionParallel
+//
+// stub stub
+// +-------+ +---------+ +---------+
+// | xapp | | submgr | | e2term |
+// +-------+ +---------+ +---------+
+// | | |
+// | | |
+// | | |
+// | SubReq1 | |
+// |------------->| |
+// | | |
+// | | SubReq1 |
+// | |------------->|
+// | SubReq2 | |
+// |------------->| |
+// | | SubFail1 |
+// | |<-------------|
+// | SubFail1 | |
+// |<-------------| |
+// | | |
+// | SubFail2 | |
+// |<-------------| |
+//
+//-----------------------------------------------------------------------------
+func TestSubReqAndSubDelNokSameActionParallel(t *testing.T) {
+ xapp.Logger.Info("TestSubReqAndSubDelNokSameActionParallel")
+
+ //Req1
+ rparams1 := &test_subs_req_params{}
+ rparams1.Init()
+ cretrans1 := xappConn1.handle_xapp_subs_req(t, rparams1, nil)
+ crereq1, cremsg1 := e2termConn.handle_e2term_subs_req(t)
+
+ //Req2
+ rparams2 := &test_subs_req_params{}
+ rparams2.Init()
+ seqBef2 := mainCtrl.get_msgcounter(t)
+ cretrans2 := xappConn2.handle_xapp_subs_req(t, rparams2, nil)
+ mainCtrl.wait_msgcounter_change(t, seqBef2, 10)
+
+ //E2T Fail
+ fparams := &test_subs_fail_params{}
+ fparams.Set(crereq1)
+ e2termConn.handle_e2term_subs_fail(t, fparams, cremsg1)
+
+ //Fail1
+ e2SubsId1 := xappConn1.handle_xapp_subs_fail(t, cretrans1)
+ //Fail2
+ xappConn2.handle_xapp_subs_fail(t, cretrans2)
+
+ //Wait that subs is cleaned
+ mainCtrl.wait_subs_clean(t, e2SubsId1, 15)
+
+ xappConn1.TestMsgCnt(t)
+ xappConn2.TestMsgCnt(t)
+ e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 10)
+}
+
+//-----------------------------------------------------------------------------
+// TestSubReqAndSubDelNoAnswerSameActionParallel
+//
+// stub stub
+// +-------+ +---------+ +---------+
+// | xapp | | submgr | | e2term |
+// +-------+ +---------+ +---------+
+// | | |
+// | | |
+// | | |
+// | SubReq1 | |
+// |------------->| |
+// | | |
+// | | SubReq1 |
+// | |------------->|
+// | SubReq2 | |
+// |------------->| |
+// | | |
+// | | SubReq1 |
+// | |------------->|
+// | | |
+// | | |
+// | | SubDelReq |
+// | |------------->|
+// | | |
+// | | SubDelResp |
+// | |<-------------|
+//
+//-----------------------------------------------------------------------------
+func TestSubReqAndSubDelNoAnswerSameActionParallel(t *testing.T) {
+ xapp.Logger.Info("TestSubReqAndSubDelNoAnswerSameActionParallel")
+
+ //Req1
+ rparams1 := &test_subs_req_params{}
+ rparams1.Init()
+ xappConn1.handle_xapp_subs_req(t, rparams1, nil)
+
+ e2termConn.handle_e2term_subs_req(t)
+
+ //Req2
+ rparams2 := &test_subs_req_params{}
+ rparams2.Init()
+ seqBef2 := mainCtrl.get_msgcounter(t)
+ xappConn2.handle_xapp_subs_req(t, rparams2, nil)
+ mainCtrl.wait_msgcounter_change(t, seqBef2, 10)
+
+ //Req1 (retransmitted)
+ e2termConn.handle_e2term_subs_req(t)
+
+ delreq1, delmsg1 := e2termConn.handle_e2term_subs_del_req(t)
+ e2termConn.handle_e2term_subs_del_resp(t, delreq1, delmsg1)
+
+ //Wait that subs is cleaned
+ mainCtrl.wait_subs_clean(t, int(delreq1.RequestId.Seq), 10)
+
+ xappConn1.TestMsgCnt(t)
+ xappConn2.TestMsgCnt(t)
+ e2termConn.TestMsgCnt(t)
+ mainCtrl.wait_registry_empty(t, 15)
}