+//-----------------------------------------------------------------------------
+// TestRESTSubDelReqAndRouteDeleteNok
+//
+// stub stub stub
+// +-------+ +---------+ +---------+ +---------+
+// | xapp | | submgr | | rtmgr | | e2term |
+// +-------+ +---------+ +---------+ +---------+
+// | | | |
+// | RESTSubReq | | |
+// |---------------->| | |
+// | | | |
+// | RESTSubResp | | |
+// |<----------------| | |
+// | | SubReq | |
+// | |---------------------------->|
+// | | SubResp | |
+// | |<----------------------------|
+// | RESTNotif | | |
+// |<----------------| | |
+// | | | |
+// | | | |
+// | RESTSubDelReq | | |
+// |---------------->| | |
+// | RESTSubDelResp | | |
+// |<----------------| | |
+// | | SubSelReq | |
+// | |---------------------------->|
+// | | SubSelResp | |
+// | |<----------------------------|
+// | | RouteDelete | |
+// | |------------->| |
+// | | Routedelete | |
+// | | status:400 | |
+// | |(Bad request) | |
+// | |<-------------| |
+//
+//-----------------------------------------------------------------------------
+
+func TestRESTSubDelReqAndRouteDeleteNok(t *testing.T) {
+
+ // Init counter check
+ mainCtrl.CounterValuesToBeVeriefied(t, CountersToBeAdded{
+ Counter{cRestSubReqFromXapp, 1},
+ Counter{cRestSubRespToXapp, 1},
+ Counter{cSubReqToE2, 1},
+ Counter{cSubRespFromE2, 1},
+ Counter{cRestSubNotifToXapp, 1},
+ Counter{cRestSubDelReqFromXapp, 1},
+ Counter{cRouteDeleteFail, 1},
+ Counter{cSubDelReqToE2, 1},
+ Counter{cSubDelRespFromE2, 1},
+ Counter{cRestSubDelRespToXapp, 1},
+ })
+
+ var params *teststube2ap.RESTSubsReqParams = nil
+
+ //Subs Create
+ restSubId, e2SubsId := createSubscription(t, xappConn1, e2termConn1, params)
+
+ queryXappSubscription(t, int64(e2SubsId), "RAN_NAME_1", []string{"localhost:13560"})
+
+ waiter := rtmgrHttp.AllocNextEvent(false)
+ xappConn1.SendRESTSubsDelReq(t, &restSubId)
+ delreq, delmsg := e2termConn1.RecvSubsDelReq(t)
+ e2termConn1.SendSubsDelResp(t, delreq, delmsg)
+ waiter.WaitResult(t)
+
+ waitSubsCleanup(t, e2SubsId, 10)
+ mainCtrl.VerifyCounterValues(t)
+ mainCtrl.VerifyAllClean(t)
+}
+
+//-----------------------------------------------------------------------------
+// TestRESTSubMergeDelAndRouteUpdateNok
+//
+// stub stub stub stub
+// +-------+ +-------+ +---------+ +---------+ +---------+
+// | xapp1 | | xapp2 | | submgr | | rtmgr | | e2term |
+// +-------+ +-------+ +---------+ +---------+ +---------+
+// | | | | |
+// | RESTSubReq1 | | |
+// |------------------------>| | |
+// | RESTSubResp2 | | |
+// |<------------------------| | |
+// | | | | |
+// | | | RouteCreate | |
+// | | |------------->| |
+// | | | CreateResp | |
+// | | |<-------------| |
+// | | | SubReq | |
+// | | |---------------------------->|
+// | | | SubResp | |
+// | | |<----------------------------|
+// | RESTNotif1 | | |
+// |<------------------------| | |
+// | | | | |
+// | | RESTSubReq2 | | |
+// | |------------>| | |
+// | | RESTSubResp2| | |
+// | |<------------| | |
+// | | | RouteCreate | |
+// | | |------------->| |
+// | | | CreateResp | |
+// | | |<-------------| |
+// | | | SubReq | |
+// | | |---------------------------->|
+// | | | SubResp | |
+// | | |<----------------------------|
+// | | RESTNotif2 | | |
+// | |<------------| | |
+// | | | | |
+// | [SUBS INT DELETE] | |
+// | | | | |
+// | RESTSubDelReq1 | | |
+// |------------------------>| | |
+// | RESTSubDelResp1 | | |
+// |<------------------------| | |
+// | | | SubDelReq | |
+// | | |---------------------------->|
+// | | | SubDelResp | |
+// | | |<----------------------------|
+// | | | RouteUpdate | |
+// | | |------------->| |
+// | | | RouteUpdate | |
+// | | | status:400 | |
+// | | |(Bad request) | |
+// | | |<-------------| |
+// | | | | |
+// | | RESTSubDelReq2 | |
+// | |------------>| | |
+// | | RESTSubDelResp2 | |
+// | |<------------| | |
+// | | | SubDelReq | |
+// | | |---------------------------->|
+// | | | SubdelResp | |
+// | | |<----------------------------|
+// | | | RouteDelete | |
+// | | |------------->| |
+// | | | Deleteresp | |
+// | | |<-------------| |
+
+//-----------------------------------------------------------------------------
+
+func TestRESTSubMergeDelAndRouteUpdateNok(t *testing.T) {
+
+ mainCtrl.CounterValuesToBeVeriefied(t, CountersToBeAdded{
+ Counter{cRestSubReqFromXapp, 2},
+ Counter{cMergedSubscriptions, 1},
+ Counter{cRestSubRespToXapp, 2},
+ Counter{cSubReqToE2, 1},
+ Counter{cSubRespFromE2, 1},
+ Counter{cRestSubNotifToXapp, 2},
+ Counter{cRestSubDelReqFromXapp, 2},
+ Counter{cRouteDeleteUpdateFail, 1},
+ Counter{cSubDelReqToE2, 1},
+ Counter{cSubDelRespFromE2, 1},
+ Counter{cRestSubDelRespToXapp, 2},
+ Counter{cUnmergedSubscriptions, 1},
+ })
+
+ var params *teststube2ap.RESTSubsReqParams = nil
+
+ //Subs Create
+ restSubId, e2SubsId := createSubscription(t, xappConn1, e2termConn1, params)
+
+ queryXappSubscription(t, int64(e2SubsId), "RAN_NAME_1", []string{"localhost:13560"})
+ restSubId2, e2SubsId2 := createXapp2MergedSubscription(t, "RAN_NAME_1")
+
+ queryXappSubscription(t, int64(e2SubsId), "RAN_NAME_1", []string{"localhost:13560", "localhost:13660"})
+
+ //Del1, this shall fail on rtmgr side
+ waiter := rtmgrHttp.AllocNextEvent(false)
+ xappConn1.SendRESTSubsDelReq(t, &restSubId)
+ waiter.WaitResult(t)
+
+ queryXappSubscription(t, int64(e2SubsId), "RAN_NAME_1", []string{"localhost:13660"})
+
+ //Del2
+ deleteXapp2Subscription(t, &restSubId2)
+
+ waitSubsCleanup(t, e2SubsId2, 10)
+ mainCtrl.VerifyCounterValues(t)
+ mainCtrl.VerifyAllClean(t)
+}
+
+//-----------------------------------------------------------------------------
+// TestRESTSubReqRetransmission
+//
+// stub stub
+// +-------+ +---------+ +---------+
+// | xapp | | submgr | | e2term |
+// +-------+ +---------+ +---------+
+// | | |
+// | RESTSubReq1 | |
+// |---------------->| |
+// | | |
+// | RESTSubResp | |
+// |<----------------| |
+// | | SubReq1 |
+// | |------------->|
+// | | |
+// | RESTSubReq2 | |
+// | (retrans) | |
+// |---------------->| |
+// | RESTSubResp(201)| |
+// |<----------------| |
+// | | |
+// | | SubResp1 |
+// | |<-------------|
+// | RESTNotif1 | |
+// |<----------------| |
+// | | |
+// | [SUBS DELETE] |
+// | | |
+//
+//-----------------------------------------------------------------------------
+
+func TestRESTSubReqRetransmission(t *testing.T) {
+
+ mainCtrl.CounterValuesToBeVeriefied(t, CountersToBeAdded{
+ Counter{cRestSubReqFromXapp, 2},
+ Counter{cRestSubRespToXapp, 2},
+ Counter{cSubReqToE2, 1},
+ Counter{cSubRespFromE2, 1},
+ Counter{cRestSubNotifToXapp, 1},
+ Counter{cRestSubDelReqFromXapp, 1},
+ Counter{cSubDelReqToE2, 1},
+ Counter{cSubDelRespFromE2, 1},
+ Counter{cRestSubDelRespToXapp, 1},
+ })
+ // Retry/duplicate will get the same way as the first request.
+ // Contianed duplicate messages from same xapp will not be merged. Here we use xappConn2 to simulate sending
+ // second request from same xapp as doing it from xappConn1 would not work as notification would not be received
+
+ // Subs Create
+ const subReqCount int = 1
+
+ params := xappConn1.GetRESTSubsReqReportParams(subReqCount)
+ restSubId := xappConn1.SendRESTSubsReq(t, params)
+
+ xappConn1.SendRESTSubsReq(t, params)
+ <-time.After(time.Second * 1)
+
+ xappConn1.WaitListedRestNotifications(t, []string{restSubId})
+
+ // Depending one goroutine scheduling order, we cannot say for sure which xapp reaches e2term first. Thus
+ // the order is not significant here.
+ crereq, cremsg := e2termConn1.RecvSubsReq(t)
+ e2termConn1.SendSubsResp(t, crereq, cremsg)
+
+ e2SubsId := <-xappConn1.ListedRESTNotifications
+
+ xapp.Logger.Debug("TEST: XAPP notification received e2SubsId=%v", e2SubsId)
+
+ // Del1
+ xappConn1.SendRESTSubsDelReq(t, &restSubId)
+ delreq1, delmsg1 := e2termConn1.RecvSubsDelReq(t)
+ e2termConn1.SendSubsDelResp(t, delreq1, delmsg1)
+
+ mainCtrl.wait_multi_subs_clean(t, []uint32{e2SubsId.E2SubsId}, 10)
+
+ mainCtrl.VerifyCounterValues(t)
+ mainCtrl.VerifyAllClean(t)
+}
+
+//-----------------------------------------------------------------------------
+// stub stub stub
+// +-------+ +---------+ +---------+ +---------+
+// | xapp | | submgr | | e2term | | rtmgr |
+// +-------+ +---------+ +---------+ +---------+
+// | | | |
+// | RESTSubReq | | |
+// |---------------->| | |
+// | RESTSubResp | | |
+// |<----------------| | |
+// | | RouteCreate | |
+// | |--------------------------->|
+// | | RouteResponse| |
+// | |<---------------------------| // The order of these events may vary
+// | | SubReq | |
+// | |------------->| | // The order of these events may vary
+// | | SubResp | |
+// | |<-------------| |
+// | RESTNotif1 | | |
+// |<----------------| | |
+// | RESTSubReq | | |
+// | [RETRANS1] | | |
+// |---------------->| | |
+// | RESTNotif1 | | |
+// |<----------------| | |
+// | RESTSubReq | | |
+// | [RETRANS2] | | |
+// |---------------->| | |
+// | RESTNotif1 | | |
+// |<----------------| | |
+// | RESTSubDelReq | | |
+// |---------------->| | |
+// | | SubDelReq | |
+// | |------------->| |
+// | RESTSubDelResp| | |
+// |<----------------| | |
+// | | SubDelResp | |
+// | |<-------------| |
+// | | | |
+//
+//-----------------------------------------------------------------------------
+
+func TestRESTSubReqRetransmissionV2(t *testing.T) {
+
+ mainCtrl.CounterValuesToBeVeriefied(t, CountersToBeAdded{
+ Counter{cRestSubReqFromXapp, 3},
+ Counter{cDuplicateE2SubReq, 2},
+ Counter{cRestSubRespToXapp, 3},
+ Counter{cSubReqToE2, 1},
+ Counter{cSubRespFromE2, 1},
+ Counter{cRestSubNotifToXapp, 3},
+ Counter{cRestSubDelReqFromXapp, 1},
+ Counter{cSubDelReqToE2, 1},
+ Counter{cSubDelRespFromE2, 1},
+ Counter{cRestSubDelRespToXapp, 1},
+ })
+
+ params := xappConn1.GetRESTSubsReqReportParams(subReqCount)
+
+ restSubId, e2SubsId := createSubscription(t, xappConn1, e2termConn1, params)
+
+ queryXappSubscription(t, int64(e2SubsId), "RAN_NAME_1", []string{"localhost:13560"})
+
+ mainCtrl.WaitOngoingRequestMapEmpty()
+
+ //1.st resend
+ restSubId_resend := xappConn1.SendRESTSubsReq(t, params)
+
+ assert.Equal(t, restSubId_resend, restSubId)
+
+ mainCtrl.WaitOngoingRequestMapEmpty()
+
+ //2.nd resend
+ restSubId_resend2 := xappConn1.SendRESTSubsReq(t, params)
+
+ assert.Equal(t, restSubId_resend2, restSubId)
+
+ mainCtrl.WaitOngoingRequestMapEmpty()
+
+ deleteSubscription(t, xappConn1, e2termConn1, &restSubId)
+
+ waitSubsCleanup(t, e2SubsId, 10)
+ mainCtrl.VerifyCounterValues(t)
+ mainCtrl.VerifyAllClean(t)
+}
+
+//-----------------------------------------------------------------------------
+// stub stub stub
+// +-------+ +---------+ +---------+ +---------+
+// | xapp | | submgr | | e2term | | rtmgr |
+// +-------+ +---------+ +---------+ +---------+
+// | | | |
+// | RESTSubReq | | |
+// |---------------->| | |
+// | RESTSubResp | | |
+// |<----------------| | |
+// | | RouteCreate | |
+// | |--------------------------->|
+// | | RouteResponse| |
+// | |<---------------------------| // The order of these events may vary
+// | | SubReq | |
+// | |------------->| | // The order of these events may vary
+// | | SubResp | |
+// | |<-------------| |
+// | RESTNotif1 | | |
+// |<----------------| | |
+// | RESTSubReq | | |
+// | [RETRANS, with RESTsubsId] | |
+// |---------------->| | |
+// | RESTNotif1 | | |
+// |<----------------| | |
+// | RESTSubReq | | |
+// | [RETRANS, without RESTsubsId] | |
+// |---------------->| | |
+// | RESTNotif1 | | |
+// |<----------------| | |
+// | RESTSubDelReq | | |
+// |---------------->| | |
+// | | SubDelReq | |
+// | |------------->| |
+// | RESTSubDelResp| | |
+// |<----------------| | |
+// | | SubDelResp | |
+// | |<-------------| |
+// | | | |
+//
+//-----------------------------------------------------------------------------
+func TestRESTSubReqRetransmissionV3(t *testing.T) {
+
+ mainCtrl.CounterValuesToBeVeriefied(t, CountersToBeAdded{
+ Counter{cRestSubReqFromXapp, 3},
+ Counter{cDuplicateE2SubReq, 2},
+ Counter{cRestSubRespToXapp, 3},
+ Counter{cSubReqToE2, 1},
+ Counter{cSubRespFromE2, 1},
+ Counter{cRestSubNotifToXapp, 3},
+ Counter{cRestSubDelReqFromXapp, 1},
+ Counter{cSubDelReqToE2, 1},