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_HandleNewRanError(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 nbIdentity := &entities.NbIdentity{InventoryName: nodebRanName, GlobalNbId: nodebInfo.GlobalNbId}
173 writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(common.NewInternalError(errors.New("error")))
175 handler.Handle(notificationRequest)
177 readerMock.AssertExpectations(t)
178 writerMock.AssertExpectations(t)
179 e2tInstancesManagerMock.AssertExpectations(t)
182 func testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t *testing.T, xmlPath string) {
183 xml := readXmlFile(t, xmlPath)
184 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
185 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
186 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
187 var gnb *entities.NodebInfo
188 readerMock.On("GetNodeb", nodebRanName).Return(gnb, common.NewResourceNotFoundError("Not found"))
189 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
190 nodebInfo := getExpectedNodebForNewRan(notificationRequest.Payload)
191 nbIdentity := &entities.NbIdentity{InventoryName: nodebRanName, GlobalNbId: nodebInfo.GlobalNbId}
192 writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil)
193 updatedNodebInfo := *nodebInfo
194 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
195 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, nodebRanName+"_CONNECTED").Return(nil)
196 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
197 updatedNodebInfo2 := *nodebInfo
198 updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
199 updatedNodebInfo2.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
200 writerMock.On("UpdateNodebInfo", &updatedNodebInfo2).Return(nil)
201 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{nodebRanName}).Return(nil)
202 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, nil)
204 handler.Handle(notificationRequest)
206 readerMock.AssertExpectations(t)
207 writerMock.AssertExpectations(t)
208 e2tInstancesManagerMock.AssertExpectations(t)
213 func TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess(t *testing.T) {
214 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, GnbSetupRequestXmlPath)
217 func TestE2SetupRequestNotificationHandler_HandleNewGnbWithoutFunctionsSuccess(t *testing.T) {
218 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, GnbWithoutFunctionsSetupRequestXmlPath)
221 func TestE2SetupRequestNotificationHandler_HandleNewEnGnbSuccess(t *testing.T) {
222 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, EnGnbSetupRequestXmlPath)
225 func TestE2SetupRequestNotificationHandler_HandleNewNgEnbSuccess(t *testing.T) {
226 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, NgEnbSetupRequestXmlPath)
229 func testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t *testing.T, withFunctions bool) {
230 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
231 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
232 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
233 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
234 var nodebInfo = &entities.NodebInfo{
235 RanName: nodebRanName,
236 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
237 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
238 NodeType: entities.Node_GNB,
239 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
243 gnb := nodebInfo.GetGnb()
244 gnb.RanFunctions = []*entities.RanFunction{{RanFunctionId: 2, RanFunctionRevision: 2}}
247 readerMock.On("GetNodeb", nodebRanName).Return(nodebInfo, nil)
248 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
250 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
251 gnbToUpdate := getExpectedNodebForExistingRan(*nodebInfo, notificationRequest.Payload)
252 writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
253 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{nodebRanName}).Return(nil)
255 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(&rmrCgo.MBuf{}, errEmpty)
256 handler.Handle(notificationRequest)
257 readerMock.AssertExpectations(t)
258 writerMock.AssertExpectations(t)
259 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 3)
260 e2tInstancesManagerMock.AssertExpectations(t)
261 rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, true)
264 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithoutFunctionsSuccess(t *testing.T) {
265 testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, false)
268 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithFunctionsSuccess(t *testing.T) {
269 testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, true)
272 func TestE2SetupRequestNotificationHandler_HandleExistingDisconnectedGnbSuccess(t *testing.T) {
273 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
274 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
275 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
276 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
277 var nodebInfo = &entities.NodebInfo{
278 RanName: nodebRanName,
279 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
280 ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,
281 NodeType: entities.Node_GNB,
282 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
285 readerMock.On("GetNodeb", nodebRanName).Return(nodebInfo, nil)
286 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
288 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
289 gnbToUpdate := getExpectedNodebForExistingRan(*nodebInfo, notificationRequest.Payload)
290 writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
291 gnbToUpdate2 := *gnbToUpdate
292 gnbToUpdate2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
293 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &gnbToUpdate2, nodebRanName+"_CONNECTED").Return(nil)
294 gnbToUpdate3 := *gnbToUpdate
295 gnbToUpdate3.ConnectionStatus = entities.ConnectionStatus_CONNECTED
296 gnbToUpdate3.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
297 writerMock.On("UpdateNodebInfo", &gnbToUpdate3).Return(nil)
298 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{nodebRanName}).Return(nil)
300 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty)
301 handler.Handle(notificationRequest)
302 readerMock.AssertExpectations(t)
303 writerMock.AssertExpectations(t)
304 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
305 e2tInstancesManagerMock.AssertExpectations(t)
308 func getExpectedNodebForExistingRan(nodeb entities.NodebInfo, payload []byte) *entities.NodebInfo {
309 pipInd := bytes.IndexByte(payload, '|')
310 setupRequest := &models.E2SetupRequestMessage{}
311 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
312 nodeb.GetGnb().RanFunctions = setupRequest.ExtractRanFunctionsList()
316 func getExpectedNodebForNewRan(payload []byte) *entities.NodebInfo {
317 pipInd := bytes.IndexByte(payload, '|')
318 setupRequest := &models.E2SetupRequestMessage{}
319 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
321 nodeb := &entities.NodebInfo{
322 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
323 RanName: nodebRanName,
324 NodeType: entities.Node_GNB,
325 Configuration: &entities.NodebInfo_Gnb{
327 RanFunctions: setupRequest.ExtractRanFunctionsList(),
330 GlobalNbId: &entities.GlobalNbId{
331 PlmnId: setupRequest.GetPlmnId(),
332 NbId: setupRequest.GetNbId(),
339 func TestE2SetupRequestNotificationHandler_HandleParseError(t *testing.T) {
340 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
341 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
342 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
343 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte("invalid_prefix"), xmlGnb...)}
344 handler.Handle(notificationRequest)
345 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
346 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
347 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
348 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
349 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
350 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
353 func TestE2SetupRequestNotificationHandler_HandleUnmarshalError(t *testing.T) {
354 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
355 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
356 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), "xmlGnb"...)}
357 handler.Handle(notificationRequest)
358 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
359 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
360 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
361 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
362 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
363 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
366 func TestE2SetupRequestNotificationHandler_HandleGetE2TInstanceError(t *testing.T) {
367 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
368 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
369 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
370 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, common.NewResourceNotFoundError("Not found"))
371 prefBytes := []byte(e2SetupMsgPrefix)
372 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
373 handler.Handle(notificationRequest)
374 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
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_HandleGetNodebError(t *testing.T) {
384 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
385 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
386 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
387 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
388 var gnb *entities.NodebInfo
389 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewInternalError(errors.New("some error")))
390 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
391 handler.Handle(notificationRequest)
392 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
393 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
394 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
395 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
396 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
397 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
398 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
401 func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) {
402 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
404 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
405 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
406 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
407 var gnb *entities.NodebInfo
408 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
409 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
410 nodebInfo := getExpectedNodebForNewRan(notificationRequest.Payload)
411 writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil)
412 updatedNodebInfo := *nodebInfo
413 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
414 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, nodebRanName+"_CONNECTED").Return(nil)
415 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
416 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
417 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error"))
418 updatedNodebInfo2 := *nodebInfo
419 updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
420 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo2, nodebRanName+"_DISCONNECTED").Return(nil)
422 mbuf := getMbuf(rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithTransportCause, notificationRequest)
423 rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, errEmpty)
424 handler.Handle(notificationRequest)
425 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
426 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
427 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
428 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
429 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
430 rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
433 func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing.T) {
434 xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath)
435 logger := tests.InitLog(t)
436 config := &configuration.Configuration{
437 RnibRetryIntervalMs: 10,
438 MaxRnibConnectionAttempts: 3,
439 RnibWriter: configuration.RnibWriterConfig{
440 StateChangeMessageChannel: StateChangeMessageChannel,
442 GlobalRicId: struct {
446 }{Mcc: "327", Mnc: "94", RicId: "10011001101010101011"}}
447 rmrMessengerMock := &mocks.RmrMessengerMock{}
448 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
449 readerMock := &mocks.RnibReaderMock{}
450 writerMock := &mocks.RnibWriterMock{}
451 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
452 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
453 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
454 ranListManager := managers.NewRanListManager(logger)
455 ranAlarmService := services.NewRanAlarmService(logger, config)
456 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
458 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
459 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager)
460 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
461 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
462 var gnb *entities.NodebInfo
463 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
464 writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
465 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, mock.Anything).Return(nil)
466 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
467 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
468 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
470 rmrMessage := &rmrCgo.MBuf{}
471 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
472 prefBytes := []byte(e2SetupMsgPrefix)
473 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlEnGnb...)}
474 handler.Handle(notificationRequest)
475 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
476 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
477 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
478 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
479 writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
480 e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
481 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
484 func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidStatusError(t *testing.T) {
485 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
486 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
487 var gnb = &entities.NodebInfo{RanName: nodebRanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
488 readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
489 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
490 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
491 prefBytes := []byte(e2SetupMsgPrefix)
492 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
493 handler.Handle(notificationRequest)
494 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
495 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
496 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
497 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
498 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
499 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
500 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
503 func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
504 logger := tests.InitLog(t)
505 config := &configuration.Configuration{
506 RnibRetryIntervalMs: 10,
507 MaxRnibConnectionAttempts: 3,
508 RnibWriter: configuration.RnibWriterConfig{
509 StateChangeMessageChannel: StateChangeMessageChannel,
511 GlobalRicId: struct {
515 }{Mcc: "327", Mnc: "94", RicId: "AACCE"}}
516 rmrMessengerMock := &mocks.RmrMessengerMock{}
517 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
518 readerMock := &mocks.RnibReaderMock{}
519 writerMock := &mocks.RnibWriterMock{}
520 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
521 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
522 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
523 ranListManager := managers.NewRanListManager(logger)
524 ranAlarmService := services.NewRanAlarmService(logger, config)
525 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
526 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
527 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager)
528 return handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock