| /* |
| ================================================================================== |
| Copyright (c) 2019 AT&T Intellectual Property. |
| Copyright (c) 2019 Nokia |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| ================================================================================== |
| */ |
| |
| package control |
| |
| import ( |
| "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap" |
| "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap_wrapper" |
| "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/packer" |
| "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" |
| "testing" |
| "time" |
| ) |
| |
| //----------------------------------------------------------------------------- |
| // |
| //----------------------------------------------------------------------------- |
| |
| var e2asnpacker e2ap.E2APPackerIf = e2ap_wrapper.NewAsn1E2Packer() |
| |
| // |
| // |
| // |
| func createSubsReq() *e2ap.E2APSubscriptionRequest { |
| req := &e2ap.E2APSubscriptionRequest{} |
| |
| req.RequestId.Id = 1 |
| req.RequestId.Seq = 0 |
| req.FunctionId = 1 |
| |
| req.EventTriggerDefinition.InterfaceId.GlobalEnbId.Present = true |
| req.EventTriggerDefinition.InterfaceId.GlobalEnbId.PlmnIdentity.StringPut("310150") |
| req.EventTriggerDefinition.InterfaceId.GlobalEnbId.NodeId.Id = 123 |
| req.EventTriggerDefinition.InterfaceId.GlobalEnbId.NodeId.Bits = e2ap.E2AP_ENBIDHomeBits28 |
| |
| // gnb -> enb outgoing |
| // enb -> gnb incoming |
| // X2 36423-f40.doc |
| req.EventTriggerDefinition.InterfaceDirection = e2ap.E2AP_InterfaceDirectionIncoming |
| req.EventTriggerDefinition.ProcedureCode = 5 //28 35 |
| req.EventTriggerDefinition.TypeOfMessage = e2ap.E2AP_InitiatingMessage |
| |
| req.ActionSetups = make([]e2ap.ActionToBeSetupItem, 1) |
| req.ActionSetups[0].ActionId = 0 |
| req.ActionSetups[0].ActionType = e2ap.E2AP_ActionTypeReport |
| req.ActionSetups[0].ActionDefinition.Present = false |
| //req.ActionSetups[index].ActionDefinition.StyleId = 255 |
| //req.ActionSetups[index].ActionDefinition.ParamId = 222 |
| req.ActionSetups[0].SubsequentAction.Present = true |
| req.ActionSetups[0].SubsequentAction.Type = e2ap.E2AP_SubSeqActionTypeContinue |
| req.ActionSetups[0].SubsequentAction.TimetoWait = e2ap.E2AP_TimeToWaitZero |
| |
| return req |
| } |
| |
| // |
| // |
| // |
| func createSubsResp(req *e2ap.E2APSubscriptionRequest) *e2ap.E2APSubscriptionResponse { |
| |
| resp := &e2ap.E2APSubscriptionResponse{} |
| |
| resp.RequestId.Id = req.RequestId.Id |
| resp.RequestId.Seq = req.RequestId.Seq |
| resp.FunctionId = req.FunctionId |
| |
| resp.ActionAdmittedList.Items = make([]e2ap.ActionAdmittedItem, len(req.ActionSetups)) |
| for index := int(0); index < len(req.ActionSetups); index++ { |
| resp.ActionAdmittedList.Items[index].ActionId = req.ActionSetups[index].ActionId |
| } |
| |
| for index := uint64(0); index < 1; index++ { |
| item := e2ap.ActionNotAdmittedItem{} |
| item.ActionId = index |
| item.Cause.Content = 1 |
| item.Cause.CauseVal = 1 |
| resp.ActionNotAdmittedList.Items = append(resp.ActionNotAdmittedList.Items, item) |
| } |
| |
| return resp |
| } |
| |
| // |
| // |
| // |
| func createSubsDelReq(e2SubsId uint32) *e2ap.E2APSubscriptionDeleteRequest { |
| req := &e2ap.E2APSubscriptionDeleteRequest{} |
| req.RequestId.Id = 1 |
| req.RequestId.Seq = e2SubsId |
| req.FunctionId = 1 |
| return req |
| } |
| |
| // |
| // |
| // |
| func createSubsDelResp(req *e2ap.E2APSubscriptionDeleteRequest) *e2ap.E2APSubscriptionDeleteResponse { |
| resp := &e2ap.E2APSubscriptionDeleteResponse{} |
| resp.RequestId.Id = req.RequestId.Id |
| resp.RequestId.Seq = req.RequestId.Seq |
| resp.FunctionId = req.FunctionId |
| return resp |
| } |
| |
| //----------------------------------------------------------------------------- |
| // TestSubRequestSubResponseOk |
| // |
| // stub stub |
| // +-------+ +---------+ +---------+ |
| // | xapp | | submgr | | e2term | |
| // +-------+ +---------+ +---------+ |
| // | | | |
| // | SubReq | | |
| // |------------->| | |
| // | | | |
| // | | SubReq | |
| // | |------------->| |
| // | | | |
| // | | SubResp | |
| // | |<-------------| |
| // | | | |
| // | SubResp | | |
| // |<-------------| | |
| // | | | |
| // | | | |
| // | SubDelReq | | |
| // |------------->| | |
| // | | | |
| // | | SubDelReq | |
| // | |------------->| |
| // | | | |
| // | | SubDelResp | |
| // | |<-------------| |
| // | | | |
| // | SubDelResp | | |
| // |<-------------| | |
| // |
| //----------------------------------------------------------------------------- |
| func TestSubReqAndSubDelOk(t *testing.T) { |
| |
| xapp.Logger.Info("TestSubReqAndSubDelOk start") |
| e2SubsReq := e2asnpacker.NewPackerSubscriptionRequest() |
| e2SubsResp := e2asnpacker.NewPackerSubscriptionResponse() |
| e2SubsDelReq := e2asnpacker.NewPackerSubscriptionDeleteRequest() |
| e2SubsDelResp := e2asnpacker.NewPackerSubscriptionDeleteResponse() |
| var e2SubsId int |
| |
| //--------------------------------- |
| // xapp activity: Send Subs Req |
| //--------------------------------- |
| select { |
| case <-time.After(5 * time.Second): |
| xapp.Logger.Info("(xappConn) Send Subs Req") |
| req := createSubsReq() |
| e2SubsReq.Set(req) |
| xapp.Logger.Debug("%s", e2SubsReq.String()) |
| err, packedMsg := e2SubsReq.Pack(nil) |
| if err != nil { |
| testError(t, "(xappConn) pack NOK %s", err.Error()) |
| } |
| |
| params := &xapp.RMRParams{} |
| params.Mtype = xapp.RIC_SUB_REQ |
| params.SubId = -1 |
| params.Payload = packedMsg.Buf |
| params.Meid = &xapp.RMRMeid{RanName: "RAN_NAME_1"} |
| params.Xid = "XID_1" |
| params.Mbuf = nil |
| |
| snderr := xappConn.RmrSend(params) |
| if snderr != nil { |
| testError(t, "(xappConn) RMR SEND FAILED: %s", snderr.Error()) |
| } |
| } |
| |
| //--------------------------------- |
| // e2term activity: Recv Subs Req & Send Subs Resp |
| //--------------------------------- |
| select { |
| case msg := <-e2termConn.rmrConChan: |
| if msg.Mtype != xapp.RICMessageTypes["RIC_SUB_REQ"] { |
| testError(t, "(e2termConn) Received non RIC_SUB_REQ message") |
| } else { |
| xapp.Logger.Info("(e2termConn) Recv Subs Req & Send Subs Resp") |
| packedData := &packer.PackedData{} |
| packedData.Buf = msg.Payload |
| unpackerr := e2SubsReq.UnPack(packedData) |
| if unpackerr != nil { |
| testError(t, "(e2termConn) RIC_SUB_REQ unpack failed err: %s", unpackerr.Error()) |
| } |
| geterr, req := e2SubsReq.Get() |
| if geterr != nil { |
| testError(t, "(e2termConn) RIC_SUB_REQ get failed err: %s", geterr.Error()) |
| } |
| |
| resp := createSubsResp(req) |
| e2SubsResp.Set(resp) |
| xapp.Logger.Debug("%s", e2SubsResp.String()) |
| packerr, packedMsg := e2SubsResp.Pack(nil) |
| if packerr != nil { |
| testError(t, "(e2termConn) pack NOK %s", packerr.Error()) |
| } |
| |
| params := &xapp.RMRParams{} |
| params.Mtype = xapp.RIC_SUB_RESP |
| params.SubId = msg.SubId |
| params.Payload = packedMsg.Buf |
| params.Meid = msg.Meid |
| params.Xid = msg.Xid |
| params.Mbuf = nil |
| |
| snderr := e2termConn.RmrSend(params) |
| if snderr != nil { |
| testError(t, "(e2termConn) RMR SEND FAILED: %s", snderr.Error()) |
| } |
| |
| } |
| case <-time.After(15 * time.Second): |
| testError(t, "(e2termConn) Not Received RIC_SUB_REQ within 15 secs") |
| } |
| |
| //--------------------------------- |
| // xapp activity: Recv Subs Resp |
| //--------------------------------- |
| select { |
| case msg := <-xappConn.rmrConChan: |
| if msg.Mtype != xapp.RICMessageTypes["RIC_SUB_RESP"] { |
| testError(t, "(xappConn) Received non RIC_SUB_RESP message") |
| } else { |
| xapp.Logger.Info("(xappConn) Recv Subs Resp") |
| |
| packedData := &packer.PackedData{} |
| packedData.Buf = msg.Payload |
| e2SubsId = msg.SubId |
| unpackerr := e2SubsResp.UnPack(packedData) |
| |
| if unpackerr != nil { |
| testError(t, "(xappConn) RIC_SUB_RESP unpack failed err: %s", unpackerr.Error()) |
| } |
| geterr, _ := e2SubsResp.Get() |
| if geterr != nil { |
| testError(t, "(xappConn) RIC_SUB_RESP get failed err: %s", geterr.Error()) |
| } |
| |
| } |
| case <-time.After(15 * time.Second): |
| testError(t, "(xappConn) Not Received RIC_SUB_RESP within 15 secs") |
| } |
| |
| //--------------------------------- |
| // xapp activity: Send Subs Del Req |
| //--------------------------------- |
| select { |
| case <-time.After(2 * time.Second): |
| xapp.Logger.Info("(xappConn) Send Subs Del Req") |
| req := createSubsDelReq(uint32(e2SubsId)) |
| e2SubsDelReq.Set(req) |
| xapp.Logger.Debug("%s", e2SubsDelReq.String()) |
| err, packedMsg := e2SubsDelReq.Pack(nil) |
| if err != nil { |
| testError(t, "(xappConn) pack NOK %s", err.Error()) |
| } |
| |
| params := &xapp.RMRParams{} |
| params.Mtype = xapp.RIC_SUB_DEL_REQ |
| params.SubId = e2SubsId |
| params.Payload = packedMsg.Buf |
| params.Meid = &xapp.RMRMeid{RanName: "RAN_NAME_1"} |
| params.Xid = "XID_1" |
| params.Mbuf = nil |
| |
| snderr := xappConn.RmrSend(params) |
| if snderr != nil { |
| testError(t, "(xappConn) RMR SEND FAILED: %s", snderr.Error()) |
| } |
| } |
| |
| //--------------------------------- |
| // e2term activity: Recv Subs Del Req & Send Subs Del Resp |
| //--------------------------------- |
| select { |
| case msg := <-e2termConn.rmrConChan: |
| if msg.Mtype != xapp.RICMessageTypes["RIC_SUB_DEL_REQ"] { |
| testError(t, "(e2termConn) Received non RIC_SUB_DEL_REQ message") |
| } else { |
| xapp.Logger.Info("(e2termConn) Recv Subs Del Req & Send Subs Del Resp") |
| |
| packedData := &packer.PackedData{} |
| packedData.Buf = msg.Payload |
| unpackerr := e2SubsDelReq.UnPack(packedData) |
| if unpackerr != nil { |
| testError(t, "(e2termConn) RIC_SUB_DEL_REQ unpack failed err: %s", unpackerr.Error()) |
| } |
| geterr, req := e2SubsDelReq.Get() |
| if geterr != nil { |
| testError(t, "(e2termConn) RIC_SUB_DEL_REQ get failed err: %s", geterr.Error()) |
| } |
| |
| resp := createSubsDelResp(req) |
| e2SubsDelResp.Set(resp) |
| xapp.Logger.Debug("%s", e2SubsDelResp.String()) |
| packerr, packedMsg := e2SubsDelResp.Pack(nil) |
| if packerr != nil { |
| testError(t, "(e2termConn) pack NOK %s", packerr.Error()) |
| } |
| |
| params := &xapp.RMRParams{} |
| params.Mtype = xapp.RIC_SUB_DEL_RESP |
| params.SubId = msg.SubId |
| params.Payload = packedMsg.Buf |
| params.Meid = msg.Meid |
| params.Xid = msg.Xid |
| params.Mbuf = nil |
| |
| snderr := e2termConn.RmrSend(params) |
| if snderr != nil { |
| testError(t, "(e2termConn) RMR SEND FAILED: %s", snderr.Error()) |
| } |
| |
| } |
| case <-time.After(15 * time.Second): |
| testError(t, "(e2termConn) Not Received RIC_SUB_DEL_REQ within 15 secs") |
| } |
| |
| //--------------------------------- |
| // xapp activity: Recv Subs Del Resp |
| //--------------------------------- |
| select { |
| case msg := <-xappConn.rmrConChan: |
| if msg.Mtype != xapp.RICMessageTypes["RIC_SUB_DEL_RESP"] { |
| testError(t, "(xappConn) Received non RIC_SUB_DEL_RESP message") |
| } else { |
| xapp.Logger.Info("(xappConn) Recv Subs Del Resp") |
| |
| packedData := &packer.PackedData{} |
| packedData.Buf = msg.Payload |
| unpackerr := e2SubsDelResp.UnPack(packedData) |
| if unpackerr != nil { |
| testError(t, "(xappConn) RIC_SUB_DEL_RESP unpack failed err: %s", unpackerr.Error()) |
| } |
| geterr, _ := e2SubsDelResp.Get() |
| if geterr != nil { |
| testError(t, "(xappConn) RIC_SUB_DEL_RESP get failed err: %s", geterr.Error()) |
| } |
| |
| } |
| case <-time.After(15 * time.Second): |
| testError(t, "(xappConn) Not Received RIC_SUB_DEL_RESP within 15 secs") |
| } |
| |
| } |