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