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 nodebRanName = "gnb:310-410-b5c67788"
46 GnbSetupRequestXmlPath = "../../tests/resources/setupRequest_gnb.xml"
47 EnGnbSetupRequestXmlPath = "../../tests/resources/setupRequest_en-gNB.xml"
48 NgEnbSetupRequestXmlPath = "../../tests/resources/setupRequest_ng-eNB.xml"
49 EnbSetupRequestXmlPath = "../../tests/resources/setupRequest_enb.xml"
50 GnbWithoutFunctionsSetupRequestXmlPath = "../../tests/resources/setupRequest_gnb_without_functions.xml"
51 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>"
52 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>"
53 StateChangeMessageChannel = "RAN_CONNECTION_STATUS_CHANGE"
56 func readXmlFile(t *testing.T, xmlPath string) []byte {
57 path, err := filepath.Abs(xmlPath)
61 xmlAsBytes, err := ioutil.ReadFile(path)
69 func TestParseGnbSetupRequest_Success(t *testing.T) {
70 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
71 handler, _, _, _, _, _ := initMocks(t)
72 prefBytes := []byte(e2SetupMsgPrefix)
73 request, _, err := handler.parseSetupRequest(append(prefBytes, xmlGnb...))
74 assert.Equal(t, "02F829", request.GetPlmnId())
75 assert.Equal(t, "001100000011000000110000", request.GetNbId())
79 func TestParseEnGnbSetupRequest_Success(t *testing.T) {
80 enGnbXml := readXmlFile(t, EnGnbSetupRequestXmlPath)
81 handler, _, _, _, _, _ := initMocks(t)
82 prefBytes := []byte(e2SetupMsgPrefix)
83 request, _, err := handler.parseSetupRequest(append(prefBytes, enGnbXml...))
84 assert.Equal(t, "131014", request.GetPlmnId())
85 assert.Equal(t, "11000101110001101100011111111000", request.GetNbId())
89 func TestParseNgEnbSetupRequest_Success(t *testing.T) {
90 ngEnbXml := readXmlFile(t, NgEnbSetupRequestXmlPath)
91 handler, _, _, _, _, _ := initMocks(t)
92 prefBytes := []byte(e2SetupMsgPrefix)
93 request, _, err := handler.parseSetupRequest(append(prefBytes, ngEnbXml...))
94 assert.Equal(t, "131014", request.GetPlmnId())
95 assert.Equal(t, "101010101010101010", request.GetNbId())
99 func TestParseEnbSetupRequest_Success(t *testing.T) {
100 enbXml := readXmlFile(t, EnbSetupRequestXmlPath)
101 handler, _, _, _, _, _ := initMocks(t)
102 prefBytes := []byte(e2SetupMsgPrefix)
103 request, _, err := handler.parseSetupRequest(append(prefBytes, enbXml...))
104 assert.Equal(t, "6359AB", request.GetPlmnId())
105 assert.Equal(t, "101010101010101010", request.GetNbId())
109 func TestParseSetupRequest_PipFailure(t *testing.T) {
110 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
111 handler, _, _, _, _, _ := initMocks(t)
112 prefBytes := []byte("10.0.2.15:9999")
113 request, _, err := handler.parseSetupRequest(append(prefBytes, xmlGnb...))
114 assert.Nil(t, request)
115 assert.NotNil(t, err)
116 assert.EqualError(t, err, "#E2SetupRequestNotificationHandler.parseSetupRequest - Error parsing E2 Setup Request failed extract Payload: no | separator found")
119 func TestParseSetupRequest_UnmarshalFailure(t *testing.T) {
120 handler, _, _, _, _, _ := initMocks(t)
121 prefBytes := []byte(e2SetupMsgPrefix)
122 request, _, err := handler.parseSetupRequest(append(prefBytes, 1, 2, 3))
123 assert.Nil(t, request)
124 assert.NotNil(t, err)
125 assert.EqualError(t, err, "#E2SetupRequestNotificationHandler.parseSetupRequest - Error unmarshalling E2 Setup Request payload: 31302e302e322e31353a393939397c010203")
128 func TestE2SetupRequestNotificationHandler_GetGeneralConfigurationFailure(t *testing.T) {
129 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
130 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
131 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{}, common.NewInternalError(errors.New("some error")))
132 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
133 handler.Handle(notificationRequest)
134 rmrMessengerMock.AssertNotCalled(t, "SendMsg")
135 e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
136 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance")
137 readerMock.AssertNotCalled(t, "GetNodeb")
138 writerMock.AssertNotCalled(t, "SaveNodeb")
141 func getMbuf(msgType int, payloadStr string, request *models.NotificationRequest) *rmrCgo.MBuf {
142 payload := []byte(payloadStr)
143 mbuf := rmrCgo.NewMBuf(msgType, len(payload), nodebRanName, &payload, &request.TransactionId, request.GetMsgSrc())
147 func TestE2SetupRequestNotificationHandler_EnableRicFalse(t *testing.T) {
148 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
149 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
150 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: false}, nil)
151 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
152 mbuf := getMbuf(rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithMiscCause, notificationRequest)
153 rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, nil)
154 handler.Handle(notificationRequest)
155 rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
156 e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
157 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance")
158 readerMock.AssertNotCalled(t, "GetNodeb")
159 writerMock.AssertNotCalled(t, "SaveNodeb")
163 func TestE2SetupRequestNotificationHandler_HandleNewRanSaveNodebFailure(t *testing.T) {
164 xml := readXmlFile(t, GnbSetupRequestXmlPath)
165 handler, readerMock, writerMock, _, e2tInstancesManagerMock, _ := initMocks(t)
166 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
167 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
168 var gnb *entities.NodebInfo
169 readerMock.On("GetNodeb", nodebRanName).Return(gnb, common.NewResourceNotFoundError("Not found"))
170 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
171 nodebInfo := getExpectedNodebForNewRan(notificationRequest.Payload)
172 writerMock.On("SaveNodeb", nodebInfo).Return(common.NewInternalError(errors.New("error")))
173 handler.Handle(notificationRequest)
175 readerMock.AssertExpectations(t)
176 writerMock.AssertExpectations(t)
177 e2tInstancesManagerMock.AssertExpectations(t)
180 func TestE2SetupRequestNotificationHandler_HandleNewRanAddNbIdentityFailure(t *testing.T) {
181 xml := readXmlFile(t, GnbSetupRequestXmlPath)
182 handler, readerMock, writerMock, _, e2tInstancesManagerMock, _ := initMocks(t)
183 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
184 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
185 var gnb *entities.NodebInfo
186 readerMock.On("GetNodeb", nodebRanName).Return(gnb, common.NewResourceNotFoundError("Not found"))
187 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
188 nodebInfo := getExpectedNodebForNewRan(notificationRequest.Payload)
189 writerMock.On("SaveNodeb", nodebInfo).Return(nil)
190 nbIdentity := &entities.NbIdentity{InventoryName: nodebRanName, GlobalNbId: nodebInfo.GlobalNbId}
191 writerMock.On("AddNbIdentity", entities.Node_GNB, nbIdentity).Return(common.NewInternalError(errors.New("error")))
192 handler.Handle(notificationRequest)
193 readerMock.AssertExpectations(t)
194 writerMock.AssertExpectations(t)
195 e2tInstancesManagerMock.AssertExpectations(t)
198 func testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t *testing.T, xmlPath string) {
199 xml := readXmlFile(t, xmlPath)
200 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
201 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
202 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
203 var gnb *entities.NodebInfo
204 readerMock.On("GetNodeb", nodebRanName).Return(gnb, common.NewResourceNotFoundError("Not found"))
205 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
206 nodebInfo := getExpectedNodebForNewRan(notificationRequest.Payload)
207 writerMock.On("SaveNodeb", nodebInfo).Return(nil)
208 nbIdentity := &entities.NbIdentity{InventoryName: nodebRanName, GlobalNbId: nodebInfo.GlobalNbId}
209 writerMock.On("AddNbIdentity", entities.Node_GNB, nbIdentity).Return(nil)
210 updatedNodebInfo := *nodebInfo
211 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
212 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, nodebRanName+"_CONNECTED").Return(nil)
213 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
214 updatedNodebInfo2 := *nodebInfo
215 updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
216 updatedNodebInfo2.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
217 writerMock.On("UpdateNodebInfo", &updatedNodebInfo2).Return(nil)
218 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{nodebRanName}).Return(nil)
219 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, nil)
221 handler.Handle(notificationRequest)
223 readerMock.AssertExpectations(t)
224 writerMock.AssertExpectations(t)
225 e2tInstancesManagerMock.AssertExpectations(t)
230 func TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess(t *testing.T) {
231 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, GnbSetupRequestXmlPath)
234 func TestE2SetupRequestNotificationHandler_HandleNewGnbWithoutFunctionsSuccess(t *testing.T) {
235 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, GnbWithoutFunctionsSetupRequestXmlPath)
238 func TestE2SetupRequestNotificationHandler_HandleNewEnGnbSuccess(t *testing.T) {
239 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, EnGnbSetupRequestXmlPath)
242 func TestE2SetupRequestNotificationHandler_HandleNewNgEnbSuccess(t *testing.T) {
243 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, NgEnbSetupRequestXmlPath)
246 func testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t *testing.T, withFunctions bool) {
247 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
248 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
249 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
250 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
251 var nodebInfo = &entities.NodebInfo{
252 RanName: nodebRanName,
253 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
254 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
255 NodeType: entities.Node_GNB,
256 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
260 gnb := nodebInfo.GetGnb()
261 gnb.RanFunctions = []*entities.RanFunction{{RanFunctionId: 2, RanFunctionRevision: 2}}
264 readerMock.On("GetNodeb", nodebRanName).Return(nodebInfo, nil)
265 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
267 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
268 gnbToUpdate := getExpectedNodebForExistingRan(*nodebInfo, notificationRequest.Payload)
269 writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
270 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{nodebRanName}).Return(nil)
272 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(&rmrCgo.MBuf{}, errEmpty)
273 handler.Handle(notificationRequest)
274 readerMock.AssertExpectations(t)
275 writerMock.AssertExpectations(t)
276 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 3)
277 e2tInstancesManagerMock.AssertExpectations(t)
278 rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, true)
281 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithoutFunctionsSuccess(t *testing.T) {
282 testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, false)
285 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithFunctionsSuccess(t *testing.T) {
286 testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, true)
289 func TestE2SetupRequestNotificationHandler_HandleExistingDisconnectedGnbSuccess(t *testing.T) {
290 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
291 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
292 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
293 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
294 var nodebInfo = &entities.NodebInfo{
295 RanName: nodebRanName,
296 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
297 ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,
298 NodeType: entities.Node_GNB,
299 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
302 readerMock.On("GetNodeb", nodebRanName).Return(nodebInfo, nil)
303 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
305 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
306 gnbToUpdate := getExpectedNodebForExistingRan(*nodebInfo, notificationRequest.Payload)
307 writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
308 gnbToUpdate2 := *gnbToUpdate
309 gnbToUpdate2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
310 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &gnbToUpdate2, nodebRanName+"_CONNECTED").Return(nil)
311 gnbToUpdate3 := *gnbToUpdate
312 gnbToUpdate3.ConnectionStatus = entities.ConnectionStatus_CONNECTED
313 gnbToUpdate3.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
314 writerMock.On("UpdateNodebInfo", &gnbToUpdate3).Return(nil)
315 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{nodebRanName}).Return(nil)
317 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty)
318 handler.Handle(notificationRequest)
319 readerMock.AssertExpectations(t)
320 writerMock.AssertExpectations(t)
321 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
322 e2tInstancesManagerMock.AssertExpectations(t)
325 func getExpectedNodebForExistingRan(nodeb entities.NodebInfo, payload []byte) *entities.NodebInfo {
326 pipInd := bytes.IndexByte(payload, '|')
327 setupRequest := &models.E2SetupRequestMessage{}
328 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
329 nodeb.GetGnb().RanFunctions = setupRequest.ExtractRanFunctionsList()
333 func getExpectedNodebForNewRan(payload []byte) *entities.NodebInfo {
334 pipInd := bytes.IndexByte(payload, '|')
335 setupRequest := &models.E2SetupRequestMessage{}
336 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
338 nodeb := &entities.NodebInfo{
339 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
340 RanName: nodebRanName,
341 NodeType: entities.Node_GNB,
342 Configuration: &entities.NodebInfo_Gnb{
344 RanFunctions: setupRequest.ExtractRanFunctionsList(),
347 GlobalNbId: &entities.GlobalNbId{
348 PlmnId: setupRequest.GetPlmnId(),
349 NbId: setupRequest.GetNbId(),
356 func TestE2SetupRequestNotificationHandler_HandleParseError(t *testing.T) {
357 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
358 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
359 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
360 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte("invalid_prefix"), xmlGnb...)}
361 handler.Handle(notificationRequest)
362 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
363 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
364 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
365 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
366 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
367 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
370 func TestE2SetupRequestNotificationHandler_HandleUnmarshalError(t *testing.T) {
371 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
372 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
373 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), "xmlGnb"...)}
374 handler.Handle(notificationRequest)
375 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
376 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
377 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
378 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
379 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
380 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
383 func TestE2SetupRequestNotificationHandler_HandleGetE2TInstanceError(t *testing.T) {
384 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
385 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
386 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
387 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, common.NewResourceNotFoundError("Not found"))
388 prefBytes := []byte(e2SetupMsgPrefix)
389 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
390 handler.Handle(notificationRequest)
391 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
392 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
393 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
394 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
395 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
396 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
397 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
400 func TestE2SetupRequestNotificationHandler_HandleGetNodebError(t *testing.T) {
401 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
402 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
403 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
404 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
405 var gnb *entities.NodebInfo
406 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewInternalError(errors.New("some error")))
407 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
408 handler.Handle(notificationRequest)
409 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
410 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
411 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
412 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
413 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
414 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
415 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
418 func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) {
419 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
421 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
422 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
423 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
424 var gnb *entities.NodebInfo
425 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
426 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
427 nodebInfo := getExpectedNodebForNewRan(notificationRequest.Payload)
428 writerMock.On("SaveNodeb", nodebInfo).Return(nil)
429 nbIdentity := &entities.NbIdentity{InventoryName: nodebRanName, GlobalNbId: nodebInfo.GlobalNbId}
430 writerMock.On("AddNbIdentity", entities.Node_GNB, nbIdentity).Return(nil)
431 updatedNodebInfo := *nodebInfo
432 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
433 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, nodebRanName+"_CONNECTED").Return(nil)
434 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
435 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
436 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error"))
437 updatedNodebInfo2 := *nodebInfo
438 updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
439 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo2, nodebRanName+"_DISCONNECTED").Return(nil)
441 mbuf := getMbuf(rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithTransportCause, notificationRequest)
442 rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, errEmpty)
443 handler.Handle(notificationRequest)
444 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
445 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
446 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
447 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
448 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
449 rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
452 func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing.T) {
453 xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath)
454 logger := tests.InitLog(t)
455 config := &configuration.Configuration{
456 RnibRetryIntervalMs: 10,
457 MaxRnibConnectionAttempts: 3,
458 RnibWriter: configuration.RnibWriterConfig{
459 StateChangeMessageChannel: StateChangeMessageChannel,
461 GlobalRicId: struct {
465 }{Mcc: "327", Mnc: "94", RicId: "10011001101010101011"}}
466 rmrMessengerMock := &mocks.RmrMessengerMock{}
467 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
468 readerMock := &mocks.RnibReaderMock{}
469 writerMock := &mocks.RnibWriterMock{}
470 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
471 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
472 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
473 ranListManager := managers.NewRanListManager(logger, rnibDataService)
474 ranAlarmService := services.NewRanAlarmService(logger, config)
475 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
477 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
478 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager, ranListManager)
479 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
480 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
481 var gnb *entities.NodebInfo
482 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
483 writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
484 writerMock.On("AddNbIdentity", entities.Node_GNB, mock.Anything).Return(nil)
485 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, mock.Anything).Return(nil)
486 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
487 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
488 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
490 rmrMessage := &rmrCgo.MBuf{}
491 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
492 prefBytes := []byte(e2SetupMsgPrefix)
493 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlEnGnb...)}
494 handler.Handle(notificationRequest)
495 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
496 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
497 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
498 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
499 writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
500 e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
501 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
504 func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidStatusError(t *testing.T) {
505 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
506 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
507 var gnb = &entities.NodebInfo{RanName: nodebRanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
508 readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
509 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
510 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
511 prefBytes := []byte(e2SetupMsgPrefix)
512 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
513 handler.Handle(notificationRequest)
514 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
515 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
516 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
517 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
518 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
519 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
520 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
523 func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
524 logger := tests.InitLog(t)
525 config := &configuration.Configuration{
526 RnibRetryIntervalMs: 10,
527 MaxRnibConnectionAttempts: 3,
528 RnibWriter: configuration.RnibWriterConfig{
529 StateChangeMessageChannel: StateChangeMessageChannel,
531 GlobalRicId: struct {
535 }{Mcc: "327", Mnc: "94", RicId: "AACCE"}}
536 rmrMessengerMock := &mocks.RmrMessengerMock{}
537 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
538 readerMock := &mocks.RnibReaderMock{}
539 writerMock := &mocks.RnibWriterMock{}
540 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
541 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
542 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
543 ranListManager := managers.NewRanListManager(logger, rnibDataService)
544 ranAlarmService := services.NewRanAlarmService(logger, config)
545 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
546 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
547 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager, ranListManager)
548 return handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock