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) {
292 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
293 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
294 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
295 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
296 var nodebInfo = &entities.NodebInfo{
297 RanName: gnbNodebRanName,
298 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
299 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
300 NodeType: entities.Node_GNB,
301 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
305 gnb := nodebInfo.GetGnb()
306 gnb.RanFunctions = []*entities.RanFunction{{RanFunctionId: 2, RanFunctionRevision: 2}}
309 readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil)
310 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
312 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
313 gnbToUpdate := getExpectedNodebForExistingRan(*nodebInfo, notificationRequest.Payload)
314 writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
315 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{gnbNodebRanName}).Return(nil)
317 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(&rmrCgo.MBuf{}, errEmpty)
318 handler.Handle(notificationRequest)
319 readerMock.AssertExpectations(t)
320 writerMock.AssertExpectations(t)
321 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 3)
322 e2tInstancesManagerMock.AssertExpectations(t)
323 rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, true)
326 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithoutFunctionsSuccess(t *testing.T) {
327 testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, false)
330 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithFunctionsSuccess(t *testing.T) {
331 testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, true)
334 func TestE2SetupRequestNotificationHandler_HandleExistingDisconnectedGnbSuccess(t *testing.T) {
335 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
336 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
337 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
338 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
339 var nodebInfo = &entities.NodebInfo{
340 RanName: gnbNodebRanName,
341 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
342 ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,
343 NodeType: entities.Node_GNB,
344 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
347 readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil)
348 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
350 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
351 gnbToUpdate := getExpectedNodebForExistingRan(*nodebInfo, notificationRequest.Payload)
352 writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
353 gnbToUpdate2 := *gnbToUpdate
354 gnbToUpdate2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
355 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &gnbToUpdate2, gnbNodebRanName+"_CONNECTED").Return(nil)
356 gnbToUpdate3 := *gnbToUpdate
357 gnbToUpdate3.ConnectionStatus = entities.ConnectionStatus_CONNECTED
358 gnbToUpdate3.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
359 writerMock.On("UpdateNodebInfo", &gnbToUpdate3).Return(nil)
360 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{gnbNodebRanName}).Return(nil)
362 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty)
363 handler.Handle(notificationRequest)
364 readerMock.AssertExpectations(t)
365 writerMock.AssertExpectations(t)
366 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
367 e2tInstancesManagerMock.AssertExpectations(t)
370 func getExpectedNodebForExistingRan(nodeb entities.NodebInfo, payload []byte) *entities.NodebInfo {
371 pipInd := bytes.IndexByte(payload, '|')
372 setupRequest := &models.E2SetupRequestMessage{}
373 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
374 nodeb.GetGnb().RanFunctions = setupRequest.ExtractRanFunctionsList()
378 func getExpectedGnbNodebForNewRan(payload []byte) *entities.NodebInfo {
379 pipInd := bytes.IndexByte(payload, '|')
380 setupRequest := &models.E2SetupRequestMessage{}
381 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
383 nodeb := &entities.NodebInfo{
384 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
385 RanName: gnbNodebRanName,
386 SetupFromNetwork: true,
387 NodeType: entities.Node_GNB,
388 Configuration: &entities.NodebInfo_Gnb{
390 GnbType: entities.GnbType_GNB,
391 RanFunctions: setupRequest.ExtractRanFunctionsList(),
394 GlobalNbId: &entities.GlobalNbId{
395 PlmnId: setupRequest.GetPlmnId(),
396 NbId: setupRequest.GetNbId(),
403 func getExpectedEnbNodebForNewRan(payload []byte) *entities.NodebInfo {
404 pipInd := bytes.IndexByte(payload, '|')
405 setupRequest := &models.E2SetupRequestMessage{}
406 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
408 nodeb := &entities.NodebInfo{
409 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
410 RanName: enbNodebRanName,
411 SetupFromNetwork: true,
412 NodeType: entities.Node_ENB,
413 Configuration: &entities.NodebInfo_Enb{
415 EnbType: entities.EnbType_MACRO_ENB,
418 GlobalNbId: &entities.GlobalNbId{
419 PlmnId: setupRequest.GetPlmnId(),
420 NbId: setupRequest.GetNbId(),
427 func TestE2SetupRequestNotificationHandler_HandleParseError(t *testing.T) {
428 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
429 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
430 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
431 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte("invalid_prefix"), xmlGnb...)}
432 handler.Handle(notificationRequest)
433 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
434 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
435 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
436 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
437 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
438 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
441 func TestE2SetupRequestNotificationHandler_HandleUnmarshalError(t *testing.T) {
442 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
443 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
444 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), "xmlGnb"...)}
445 handler.Handle(notificationRequest)
446 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
447 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
448 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
449 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
450 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
451 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
454 func TestE2SetupRequestNotificationHandler_HandleGetE2TInstanceError(t *testing.T) {
455 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
456 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
457 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
458 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, common.NewResourceNotFoundError("Not found"))
459 prefBytes := []byte(e2SetupMsgPrefix)
460 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append(prefBytes, xmlGnb...)}
461 handler.Handle(notificationRequest)
462 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
463 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
464 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
465 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
466 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
467 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
468 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
471 func TestE2SetupRequestNotificationHandler_HandleGetNodebError(t *testing.T) {
472 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
473 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
474 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
475 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
476 var gnb *entities.NodebInfo
477 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewInternalError(errors.New("some error")))
478 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
479 handler.Handle(notificationRequest)
480 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
481 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
482 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
483 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
484 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
485 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
486 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
489 func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) {
490 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
492 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
493 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
494 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
495 var gnb *entities.NodebInfo
496 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
497 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
498 nodebInfo := getExpectedGnbNodebForNewRan(notificationRequest.Payload)
499 writerMock.On("SaveNodeb", nodebInfo).Return(nil)
500 nbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, GlobalNbId: nodebInfo.GlobalNbId}
501 writerMock.On("AddNbIdentity", entities.Node_GNB, nbIdentity).Return(nil)
502 updatedNodebInfo := *nodebInfo
503 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
504 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, gnbNodebRanName+"_CONNECTED").Return(nil)
505 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
506 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
507 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error"))
508 updatedNodebInfo2 := *nodebInfo
509 updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
510 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo2, gnbNodebRanName+"_DISCONNECTED").Return(nil)
512 mbuf := getMbuf(gnbNodebRanName, rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithTransportCause, notificationRequest)
513 rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, errEmpty)
514 handler.Handle(notificationRequest)
515 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
516 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
517 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
518 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
519 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
520 rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
523 func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing.T) {
524 xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath)
525 logger := tests.InitLog(t)
526 config := &configuration.Configuration{
527 RnibRetryIntervalMs: 10,
528 MaxRnibConnectionAttempts: 3,
529 RnibWriter: configuration.RnibWriterConfig{
530 StateChangeMessageChannel: StateChangeMessageChannel,
532 GlobalRicId: struct {
536 }{Mcc: "327", Mnc: "94", RicId: "10011001101010101011"}}
537 rmrMessengerMock := &mocks.RmrMessengerMock{}
538 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
539 readerMock := &mocks.RnibReaderMock{}
540 writerMock := &mocks.RnibWriterMock{}
541 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
542 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
543 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
544 ranListManager := managers.NewRanListManager(logger, rnibDataService)
545 ranAlarmService := services.NewRanAlarmService(logger, config)
546 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
548 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
549 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager, ranListManager)
550 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
551 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
552 var gnb *entities.NodebInfo
553 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
554 writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
555 writerMock.On("AddNbIdentity", entities.Node_GNB, mock.Anything).Return(nil)
556 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, mock.Anything).Return(nil)
557 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
558 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
559 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
561 rmrMessage := &rmrCgo.MBuf{}
562 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
563 prefBytes := []byte(e2SetupMsgPrefix)
564 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append(prefBytes, xmlEnGnb...)}
565 handler.Handle(notificationRequest)
566 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
567 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
568 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
569 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
570 writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
571 e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
572 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
575 func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidStatusError(t *testing.T) {
576 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
577 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
578 var gnb = &entities.NodebInfo{RanName: gnbNodebRanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
579 readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
580 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
581 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
582 prefBytes := []byte(e2SetupMsgPrefix)
583 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append(prefBytes, xmlGnb...)}
584 handler.Handle(notificationRequest)
585 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
586 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
587 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
588 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
589 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
590 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
591 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
594 func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
595 logger := tests.InitLog(t)
596 config := &configuration.Configuration{
597 RnibRetryIntervalMs: 10,
598 MaxRnibConnectionAttempts: 3,
599 RnibWriter: configuration.RnibWriterConfig{
600 StateChangeMessageChannel: StateChangeMessageChannel,
602 GlobalRicId: struct {
606 }{Mcc: "327", Mnc: "94", RicId: "AACCE"}}
607 rmrMessengerMock := &mocks.RmrMessengerMock{}
608 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
609 readerMock := &mocks.RnibReaderMock{}
610 writerMock := &mocks.RnibWriterMock{}
611 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
612 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
613 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
614 ranListManager := managers.NewRanListManager(logger, rnibDataService)
615 ranAlarmService := services.NewRanAlarmService(logger, config)
616 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
617 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
618 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager, ranListManager)
619 return handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock