2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
17 // This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 // platform project (RICP).
20 package rmrmsghandlers
33 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
34 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
35 "github.com/stretchr/testify/assert"
36 "github.com/stretchr/testify/mock"
43 e2tInstanceFullAddress = "10.0.2.15:9999"
44 e2SetupMsgPrefix = e2tInstanceFullAddress + "|"
45 gnbNodebRanName = "gnb:310-410-b5c67788"
46 enbNodebRanName = "enB_macro:P310-410-b5c67788"
47 GnbSetupRequestXmlPath = "../../tests/resources/setupRequest_gnb.xml"
48 EnGnbSetupRequestXmlPath = "../../tests/resources/setupRequest_en-gNB.xml"
49 NgEnbSetupRequestXmlPath = "../../tests/resources/setupRequest_ng-eNB.xml"
50 EnbSetupRequestXmlPath = "../../tests/resources/setupRequest_enb.xml"
51 GnbWithoutFunctionsSetupRequestXmlPath = "../../tests/resources/setupRequest_gnb_without_functions.xml"
52 E2SetupFailureResponseWithMiscCause = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>1</id><criticality><ignore/></criticality><value><Cause><misc><om-intervention/></misc></Cause></value></E2setupFailureIEs><E2setupFailureIEs><id>31</id><criticality><ignore/></criticality><value><TimeToWait><v60s/></TimeToWait></value></E2setupFailureIEs></protocolIEs></E2setupFailure></value></unsuccessfulOutcome></E2AP-PDU>"
53 E2SetupFailureResponseWithTransportCause = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>1</id><criticality><ignore/></criticality><value><Cause><transport><transport-resource-unavailable/></transport></Cause></value></E2setupFailureIEs><E2setupFailureIEs><id>31</id><criticality><ignore/></criticality><value><TimeToWait><v60s/></TimeToWait></value></E2setupFailureIEs></protocolIEs></E2setupFailure></value></unsuccessfulOutcome></E2AP-PDU>"
54 E2SetupFailureResponseWithRicCause = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>1</id><criticality><ignore/></criticality><value><Cause><ricRequest><request-id-unknown/></ricRequest></Cause></value></E2setupFailureIEs><E2setupFailureIEs><id>31</id><criticality><ignore/></criticality><value><TimeToWait><v60s/></TimeToWait></value></E2setupFailureIEs></protocolIEs></E2setupFailure></value></unsuccessfulOutcome></E2AP-PDU>"
55 StateChangeMessageChannel = "RAN_CONNECTION_STATUS_CHANGE"
58 func readXmlFile(t *testing.T, xmlPath string) []byte {
59 path, err := filepath.Abs(xmlPath)
63 xmlAsBytes, err := ioutil.ReadFile(path)
71 func TestParseGnbSetupRequest_Success(t *testing.T) {
72 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
73 handler, _, _, _, _, _ := initMocks(t)
74 prefBytes := []byte(e2SetupMsgPrefix)
75 request, _, err := handler.parseSetupRequest(append(prefBytes, xmlGnb...))
76 assert.Equal(t, "02F829", request.GetPlmnId())
77 assert.Equal(t, "001100000011000000110000", request.GetNbId())
81 func TestParseEnGnbSetupRequest_Success(t *testing.T) {
82 enGnbXml := readXmlFile(t, EnGnbSetupRequestXmlPath)
83 handler, _, _, _, _, _ := initMocks(t)
84 prefBytes := []byte(e2SetupMsgPrefix)
85 request, _, err := handler.parseSetupRequest(append(prefBytes, enGnbXml...))
86 assert.Equal(t, "131014", request.GetPlmnId())
87 assert.Equal(t, "11000101110001101100011111111000", request.GetNbId())
91 func TestParseNgEnbSetupRequest_Success(t *testing.T) {
92 ngEnbXml := readXmlFile(t, NgEnbSetupRequestXmlPath)
93 handler, _, _, _, _, _ := initMocks(t)
94 prefBytes := []byte(e2SetupMsgPrefix)
95 request, _, err := handler.parseSetupRequest(append(prefBytes, ngEnbXml...))
96 assert.Equal(t, "131014", request.GetPlmnId())
97 assert.Equal(t, "101010101010101010", request.GetNbId())
101 func TestParseEnbSetupRequest_Success(t *testing.T) {
102 enbXml := readXmlFile(t, EnbSetupRequestXmlPath)
103 handler, _, _, _, _, _ := initMocks(t)
104 prefBytes := []byte(e2SetupMsgPrefix)
105 request, _, err := handler.parseSetupRequest(append(prefBytes, enbXml...))
106 assert.Equal(t, "6359AB", request.GetPlmnId())
107 assert.Equal(t, "101010101010101010", request.GetNbId())
111 func TestParseSetupRequest_PipFailure(t *testing.T) {
112 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
113 handler, _, _, _, _, _ := initMocks(t)
114 prefBytes := []byte("10.0.2.15:9999")
115 request, _, err := handler.parseSetupRequest(append(prefBytes, xmlGnb...))
116 assert.Nil(t, request)
117 assert.NotNil(t, err)
118 assert.EqualError(t, err, "#E2SetupRequestNotificationHandler.parseSetupRequest - Error parsing E2 Setup Request failed extract Payload: no | separator found")
121 func TestParseSetupRequest_UnmarshalFailure(t *testing.T) {
122 handler, _, _, _, _, _ := initMocks(t)
123 prefBytes := []byte(e2SetupMsgPrefix)
124 request, _, err := handler.parseSetupRequest(append(prefBytes, 1, 2, 3))
125 assert.Nil(t, request)
126 assert.NotNil(t, err)
127 assert.EqualError(t, err, "#E2SetupRequestNotificationHandler.parseSetupRequest - Error unmarshalling E2 Setup Request payload: 31302e302e322e31353a393939397c010203")
130 func TestE2SetupRequestNotificationHandler_GetGeneralConfigurationFailure(t *testing.T) {
131 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
132 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
133 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{}, common.NewInternalError(errors.New("some error")))
134 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
135 handler.Handle(notificationRequest)
136 rmrMessengerMock.AssertNotCalled(t, "SendMsg")
137 e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
138 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance")
139 readerMock.AssertNotCalled(t, "GetNodeb")
140 writerMock.AssertNotCalled(t, "SaveNodeb")
143 func getMbuf(ranName string, msgType int, payloadStr string, request *models.NotificationRequest) *rmrCgo.MBuf {
144 payload := []byte(payloadStr)
145 mbuf := rmrCgo.NewMBuf(msgType, len(payload), ranName, &payload, &request.TransactionId, request.GetMsgSrc())
149 func TestE2SetupRequestNotificationHandler_EnableRicFalse(t *testing.T) {
150 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
151 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
152 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: false}, nil)
153 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
154 mbuf := getMbuf(gnbNodebRanName, rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithMiscCause, notificationRequest)
155 rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, nil)
156 handler.Handle(notificationRequest)
157 rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
158 e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
159 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance")
160 readerMock.AssertNotCalled(t, "GetNodeb")
161 writerMock.AssertNotCalled(t, "SaveNodeb")
164 func TestE2SetupRequestNotificationHandler_HandleNewRanSaveNodebFailure(t *testing.T) {
165 xml := readXmlFile(t, GnbSetupRequestXmlPath)
166 handler, readerMock, writerMock, _, e2tInstancesManagerMock, _ := initMocks(t)
167 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
168 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
169 var gnb *entities.NodebInfo
170 readerMock.On("GetNodeb", gnbNodebRanName).Return(gnb, common.NewResourceNotFoundError("Not found"))
171 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
172 nodebInfo := getExpectedGnbNodebForNewRan(notificationRequest.Payload)
173 writerMock.On("SaveNodeb", nodebInfo).Return(common.NewInternalError(errors.New("error")))
174 handler.Handle(notificationRequest)
176 readerMock.AssertExpectations(t)
177 writerMock.AssertExpectations(t)
178 e2tInstancesManagerMock.AssertExpectations(t)
181 func TestE2SetupRequestNotificationHandler_HandleNewRan_invalidRanName(t *testing.T) {
182 xml := readXmlFile(t, EnbSetupRequestXmlPath)
183 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initMocks(t)
184 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
185 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
186 var enb *entities.NodebInfo
187 invalidEnbRanName := "enB-macro:P310-410-b5c67788"
188 readerMock.On("GetNodeb", invalidEnbRanName).Return(enb, common.NewResourceNotFoundError("Not found"))
189 notificationRequest := &models.NotificationRequest{RanName: invalidEnbRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
190 mbuf := getMbuf(invalidEnbRanName, rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithRicCause, notificationRequest)
191 rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, nil)
192 handler.Handle(notificationRequest)
194 readerMock.AssertExpectations(t)
195 writerMock.AssertExpectations(t)
196 rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
197 e2tInstancesManagerMock.AssertExpectations(t)
200 func TestE2SetupRequestNotificationHandler_HandleNewRanAddNbIdentityFailure(t *testing.T) {
201 xml := readXmlFile(t, GnbSetupRequestXmlPath)
202 handler, readerMock, writerMock, _, e2tInstancesManagerMock, _ := initMocks(t)
203 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
204 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
205 var gnb *entities.NodebInfo
206 readerMock.On("GetNodeb", gnbNodebRanName).Return(gnb, common.NewResourceNotFoundError("Not found"))
207 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
208 nodebInfo := getExpectedGnbNodebForNewRan(notificationRequest.Payload)
209 writerMock.On("SaveNodeb", nodebInfo).Return(nil)
210 nbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, GlobalNbId: nodebInfo.GlobalNbId}
211 writerMock.On("AddNbIdentity", entities.Node_GNB, nbIdentity).Return(common.NewInternalError(errors.New("error")))
212 handler.Handle(notificationRequest)
213 readerMock.AssertExpectations(t)
214 writerMock.AssertExpectations(t)
215 e2tInstancesManagerMock.AssertExpectations(t)
218 func testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t *testing.T, xmlPath string, nodeType entities.Node_Type) {
219 xml := readXmlFile(t, xmlPath)
221 if nodeType == entities.Node_GNB {
222 ranName = gnbNodebRanName
224 ranName = enbNodebRanName
226 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
227 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
228 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
229 var gnb *entities.NodebInfo
230 readerMock.On("GetNodeb", ranName).Return(gnb, common.NewResourceNotFoundError("Not found"))
231 notificationRequest := &models.NotificationRequest{RanName: ranName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
232 var expectedNodebInfo *entities.NodebInfo
233 if nodeType == entities.Node_GNB {
234 expectedNodebInfo = getExpectedGnbNodebForNewRan(notificationRequest.Payload)
236 expectedNodebInfo = getExpectedEnbNodebForNewRan(notificationRequest.Payload)
238 writerMock.On("SaveNodeb", expectedNodebInfo).Return(nil)
239 nbIdentity := &entities.NbIdentity{InventoryName: ranName, GlobalNbId: expectedNodebInfo.GlobalNbId}
240 writerMock.On("AddNbIdentity", nodeType, nbIdentity).Return(nil)
241 updatedNodebInfo := *expectedNodebInfo
242 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
243 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, ranName+"_CONNECTED").Return(nil)
244 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
245 updatedNodebInfo2 := *expectedNodebInfo
246 updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
247 updatedNodebInfo2.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
248 writerMock.On("UpdateNodebInfo", &updatedNodebInfo2).Return(nil)
249 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{ranName}).Return(nil)
250 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, nil)
252 handler.Handle(notificationRequest)
254 readerMock.AssertExpectations(t)
255 writerMock.AssertExpectations(t)
256 e2tInstancesManagerMock.AssertExpectations(t)
259 func TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess(t *testing.T) {
260 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, GnbSetupRequestXmlPath, entities.Node_GNB)
263 func TestE2SetupRequestNotificationHandler_HandleNewGnbWithoutFunctionsSuccess(t *testing.T) {
264 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, GnbWithoutFunctionsSetupRequestXmlPath, entities.Node_GNB)
267 func TestE2SetupRequestNotificationHandler_HandleNewEnGnbSuccess(t *testing.T) {
268 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, EnGnbSetupRequestXmlPath, entities.Node_GNB)
271 func TestE2SetupRequestNotificationHandler_HandleNewNgEnbSuccess(t *testing.T) {
272 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, NgEnbSetupRequestXmlPath, entities.Node_ENB)
275 func TestExtractionOfNodeTypeFromRanName(t *testing.T) {
276 handler, _, _, _, _, _ := initMocks(t)
277 validRanNames := []string{"gnb_P310_410_b5c67788", "en_gnb_P310_410_b5c67788", "ng_enB_macro_P310_410_b5c67788", "ng_enB_shortmacro_P310_410_b5c67788", "ng_enB_longmacro_P310_410_b5c67788", "enB_macro_P310_410_b5c67788", "enB_home_P310_410_b5c67788", "enB_shortmacro_P310_410_b5c67788", "enB_longmacro_P310_410_b5c67788"}
278 for _, v := range validRanNames {
279 nodeb := &entities.NodebInfo{RanName: v}
280 err := handler.setNodeTypeAndConfiguration(nodeb)
283 inValidRanNames := []string{"P310_410_b5c67788", "blabla_P310_410_b5c67788", "ng_enB-macro_P310_410_b5c67788", "ng_enb_shortmacro_P310_410_b5c67788", "ng_enB-longmacro_P310_410_b5c67788", "enB_new_macro_P310_410_b5c67788"}
284 for _, v := range inValidRanNames {
285 nodeb := &entities.NodebInfo{RanName: v}
286 err := handler.setNodeTypeAndConfiguration(nodeb)
287 assert.NotNil(t, err, v)
291 func testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t *testing.T, withFunctions bool) {
295 xmlGnb = readXmlFile(t, GnbSetupRequestXmlPath)
298 xmlGnb = readXmlFile(t, GnbWithoutFunctionsSetupRequestXmlPath)
300 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
301 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
302 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
303 var nodebInfo = &entities.NodebInfo{
304 RanName: gnbNodebRanName,
305 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
306 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
307 NodeType: entities.Node_GNB,
308 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
312 gnb := nodebInfo.GetGnb()
313 gnb.RanFunctions = []*entities.RanFunction{{RanFunctionId: 2, RanFunctionRevision: 2}}
316 readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil)
317 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
319 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
320 gnbToUpdate := getExpectedNodebForExistingRan(*nodebInfo, notificationRequest.Payload)
322 writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
324 writerMock.On("UpdateNodebInfoAndPublish", gnbToUpdate).Return(nil)
326 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{gnbNodebRanName}).Return(nil)
328 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(&rmrCgo.MBuf{}, errEmpty)
329 handler.Handle(notificationRequest)
330 readerMock.AssertExpectations(t)
331 writerMock.AssertExpectations(t)
332 e2tInstancesManagerMock.AssertExpectations(t)
333 rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, true)
336 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithoutFunctionsSuccess(t *testing.T) {
337 testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, false)
340 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithFunctionsSuccess(t *testing.T) {
341 testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, true)
344 func TestE2SetupRequestNotificationHandler_HandleExistingDisconnectedGnbSuccess(t *testing.T) {
345 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
346 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
347 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
348 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
349 var nodebInfo = &entities.NodebInfo{
350 RanName: gnbNodebRanName,
351 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
352 ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,
353 NodeType: entities.Node_GNB,
354 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
357 readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil)
358 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
360 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
361 gnbToUpdate := getExpectedNodebForExistingRan(*nodebInfo, notificationRequest.Payload)
362 gnbToUpdate2 := *gnbToUpdate
363 gnbToUpdate2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
364 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &gnbToUpdate2, gnbNodebRanName+"_CONNECTED").Return(nil)
365 gnbToUpdate3 := *gnbToUpdate
366 gnbToUpdate3.ConnectionStatus = entities.ConnectionStatus_CONNECTED
367 gnbToUpdate3.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
368 writerMock.On("UpdateNodebInfo", &gnbToUpdate3).Return(nil)
369 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{gnbNodebRanName}).Return(nil)
371 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty)
372 handler.Handle(notificationRequest)
373 readerMock.AssertExpectations(t)
374 writerMock.AssertExpectations(t)
375 e2tInstancesManagerMock.AssertExpectations(t)
378 func getExpectedNodebForExistingRan(nodeb entities.NodebInfo, payload []byte) *entities.NodebInfo {
379 pipInd := bytes.IndexByte(payload, '|')
380 setupRequest := &models.E2SetupRequestMessage{}
381 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
382 if ranFuncs := setupRequest.ExtractRanFunctionsList(); ranFuncs != nil {
383 nodeb.GetGnb().RanFunctions = ranFuncs
388 func getExpectedGnbNodebForNewRan(payload []byte) *entities.NodebInfo {
389 pipInd := bytes.IndexByte(payload, '|')
390 setupRequest := &models.E2SetupRequestMessage{}
391 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
393 nodeb := &entities.NodebInfo{
394 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
395 RanName: gnbNodebRanName,
396 SetupFromNetwork: true,
397 NodeType: entities.Node_GNB,
398 Configuration: &entities.NodebInfo_Gnb{
400 GnbType: entities.GnbType_GNB,
401 RanFunctions: setupRequest.ExtractRanFunctionsList(),
404 GlobalNbId: &entities.GlobalNbId{
405 PlmnId: setupRequest.GetPlmnId(),
406 NbId: setupRequest.GetNbId(),
413 func getExpectedEnbNodebForNewRan(payload []byte) *entities.NodebInfo {
414 pipInd := bytes.IndexByte(payload, '|')
415 setupRequest := &models.E2SetupRequestMessage{}
416 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
418 nodeb := &entities.NodebInfo{
419 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
420 RanName: enbNodebRanName,
421 SetupFromNetwork: true,
422 NodeType: entities.Node_ENB,
423 Configuration: &entities.NodebInfo_Enb{
425 EnbType: entities.EnbType_MACRO_ENB,
428 GlobalNbId: &entities.GlobalNbId{
429 PlmnId: setupRequest.GetPlmnId(),
430 NbId: setupRequest.GetNbId(),
437 func TestE2SetupRequestNotificationHandler_HandleParseError(t *testing.T) {
438 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
439 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
440 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
441 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte("invalid_prefix"), xmlGnb...)}
442 handler.Handle(notificationRequest)
443 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
444 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
445 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
446 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
447 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
448 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
451 func TestE2SetupRequestNotificationHandler_HandleUnmarshalError(t *testing.T) {
452 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
453 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
454 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), "xmlGnb"...)}
455 handler.Handle(notificationRequest)
456 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
457 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
458 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
459 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
460 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
461 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
464 func TestE2SetupRequestNotificationHandler_HandleGetE2TInstanceError(t *testing.T) {
465 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
466 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
467 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
468 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, common.NewResourceNotFoundError("Not found"))
469 prefBytes := []byte(e2SetupMsgPrefix)
470 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append(prefBytes, xmlGnb...)}
471 handler.Handle(notificationRequest)
472 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
473 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
474 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
475 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
476 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
477 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
478 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
481 func TestE2SetupRequestNotificationHandler_HandleGetNodebError(t *testing.T) {
482 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
483 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
484 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
485 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
486 var gnb *entities.NodebInfo
487 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewInternalError(errors.New("some error")))
488 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
489 handler.Handle(notificationRequest)
490 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
491 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
492 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
493 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
494 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
495 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
496 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
499 func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) {
500 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
502 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
503 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
504 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
505 var gnb *entities.NodebInfo
506 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
507 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
508 nodebInfo := getExpectedGnbNodebForNewRan(notificationRequest.Payload)
509 writerMock.On("SaveNodeb", nodebInfo).Return(nil)
510 nbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, GlobalNbId: nodebInfo.GlobalNbId}
511 writerMock.On("AddNbIdentity", entities.Node_GNB, nbIdentity).Return(nil)
512 updatedNodebInfo := *nodebInfo
513 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
514 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, gnbNodebRanName+"_CONNECTED").Return(nil)
515 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
516 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
517 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error"))
518 updatedNodebInfo2 := *nodebInfo
519 updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
520 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo2, gnbNodebRanName+"_DISCONNECTED").Return(nil)
522 mbuf := getMbuf(gnbNodebRanName, rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithTransportCause, notificationRequest)
523 rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, errEmpty)
524 handler.Handle(notificationRequest)
525 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
526 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
527 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
528 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
529 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
530 rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
533 func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing.T) {
534 xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath)
535 logger := tests.InitLog(t)
536 config := &configuration.Configuration{
537 RnibRetryIntervalMs: 10,
538 MaxRnibConnectionAttempts: 3,
539 RnibWriter: configuration.RnibWriterConfig{
540 StateChangeMessageChannel: StateChangeMessageChannel,
542 GlobalRicId: struct {
546 }{Mcc: "327", Mnc: "94", RicId: "10011001101010101011"}}
547 rmrMessengerMock := &mocks.RmrMessengerMock{}
548 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
549 readerMock := &mocks.RnibReaderMock{}
550 writerMock := &mocks.RnibWriterMock{}
551 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
552 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
553 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
554 ranListManager := managers.NewRanListManager(logger, rnibDataService)
555 ranAlarmService := services.NewRanAlarmService(logger, config)
556 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
558 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
559 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager, ranListManager)
560 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
561 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
562 var gnb *entities.NodebInfo
563 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
564 writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
565 writerMock.On("AddNbIdentity", entities.Node_GNB, mock.Anything).Return(nil)
566 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, mock.Anything).Return(nil)
567 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
568 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
569 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
571 rmrMessage := &rmrCgo.MBuf{}
572 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
573 prefBytes := []byte(e2SetupMsgPrefix)
574 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append(prefBytes, xmlEnGnb...)}
575 handler.Handle(notificationRequest)
576 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
577 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
578 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
579 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
580 writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
581 e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
582 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
585 func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidStatusError(t *testing.T) {
586 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
587 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
588 var gnb = &entities.NodebInfo{RanName: gnbNodebRanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
589 readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
590 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
591 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
592 prefBytes := []byte(e2SetupMsgPrefix)
593 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append(prefBytes, xmlGnb...)}
594 handler.Handle(notificationRequest)
595 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
596 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
597 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
598 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
599 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
600 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
601 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
604 func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
605 logger := tests.InitLog(t)
606 config := &configuration.Configuration{
607 RnibRetryIntervalMs: 10,
608 MaxRnibConnectionAttempts: 3,
609 RnibWriter: configuration.RnibWriterConfig{
610 StateChangeMessageChannel: StateChangeMessageChannel,
612 GlobalRicId: struct {
616 }{Mcc: "327", Mnc: "94", RicId: "AACCE"}}
617 rmrMessengerMock := &mocks.RmrMessengerMock{}
618 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
619 readerMock := &mocks.RnibReaderMock{}
620 writerMock := &mocks.RnibWriterMock{}
621 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
622 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
623 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
624 ranListManager := managers.NewRanListManager(logger, rnibDataService)
625 ranAlarmService := services.NewRanAlarmService(logger, config)
626 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
627 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
628 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager, ranListManager)
629 return handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock