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, StateChangeMessageChannel, 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)
211 func TestE2SetupRequestNotificationHandler_HandleUpdateNodebInfoOnConnectionStatusInversionFailureForNewGnb(t *testing.T) {
212 xml := readXmlFile(t, GnbSetupRequestXmlPath)
213 handler, readerMock, writerMock, _, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
214 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
215 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
216 var gnb *entities.NodebInfo
217 readerMock.On("GetNodeb", nodebRanName).Return(gnb, common.NewResourceNotFoundError("Not found"))
218 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
219 nodebInfo := getExpectedNodebForNewRan(notificationRequest.Payload)
220 nbIdentity := &entities.NbIdentity{InventoryName: nodebRanName, GlobalNbId: nodebInfo.GlobalNbId}
221 writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil)
222 updatedNodebInfo := *nodebInfo
223 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
224 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, StateChangeMessageChannel, nodebRanName+"_CONNECTED").Return(common.NewInternalError(errors.New("some error")))
225 handler.Handle(notificationRequest)
226 readerMock.AssertExpectations(t)
227 writerMock.AssertExpectations(t)
228 routingManagerClientMock.AssertExpectations(t)
229 e2tInstancesManagerMock.AssertExpectations(t)
232 func TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess(t *testing.T) {
233 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, GnbSetupRequestXmlPath)
236 func TestE2SetupRequestNotificationHandler_HandleNewGnbWithoutFunctionsSuccess(t *testing.T) {
237 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, GnbWithoutFunctionsSetupRequestXmlPath)
240 func TestE2SetupRequestNotificationHandler_HandleNewEnGnbSuccess(t *testing.T) {
241 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, EnGnbSetupRequestXmlPath)
244 func TestE2SetupRequestNotificationHandler_HandleNewNgEnbSuccess(t *testing.T) {
245 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, NgEnbSetupRequestXmlPath)
248 func testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t *testing.T, withFunctions bool) {
249 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
250 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
251 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
252 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
253 var nodebInfo = &entities.NodebInfo{
254 RanName: nodebRanName,
255 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
256 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
257 NodeType: entities.Node_GNB,
258 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
262 gnb := nodebInfo.GetGnb()
263 gnb.RanFunctions = []*entities.RanFunction{{RanFunctionId: 2, RanFunctionRevision: 2}}
266 readerMock.On("GetNodeb", nodebRanName).Return(nodebInfo, nil)
267 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
269 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
270 gnbToUpdate := getExpectedNodebForExistingRan(*nodebInfo, notificationRequest.Payload)
271 writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
272 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{nodebRanName}).Return(nil)
274 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(&rmrCgo.MBuf{}, errEmpty)
275 handler.Handle(notificationRequest)
276 readerMock.AssertExpectations(t)
277 writerMock.AssertExpectations(t)
278 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 3)
279 e2tInstancesManagerMock.AssertExpectations(t)
280 rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, true)
283 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithoutFunctionsSuccess(t *testing.T) {
284 testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, false)
287 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithFunctionsSuccess(t *testing.T) {
288 testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, true)
291 func TestE2SetupRequestNotificationHandler_HandleExistingDisconnectedGnbSuccess(t *testing.T) {
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: nodebRanName,
298 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
299 ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,
300 NodeType: entities.Node_GNB,
301 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
304 readerMock.On("GetNodeb", nodebRanName).Return(nodebInfo, nil)
305 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
307 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
308 gnbToUpdate := getExpectedNodebForExistingRan(*nodebInfo, notificationRequest.Payload)
309 writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
310 gnbToUpdate2 := *gnbToUpdate
311 gnbToUpdate2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
312 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &gnbToUpdate2, StateChangeMessageChannel, nodebRanName+"_CONNECTED").Return(nil)
313 gnbToUpdate3 := *gnbToUpdate
314 gnbToUpdate3.ConnectionStatus = entities.ConnectionStatus_CONNECTED
315 gnbToUpdate3.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
316 writerMock.On("UpdateNodebInfo", &gnbToUpdate3).Return(nil)
317 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{nodebRanName}).Return(nil)
319 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty)
320 handler.Handle(notificationRequest)
321 readerMock.AssertExpectations(t)
322 writerMock.AssertExpectations(t)
323 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
324 e2tInstancesManagerMock.AssertExpectations(t)
327 func getExpectedNodebForExistingRan(nodeb entities.NodebInfo, payload []byte) *entities.NodebInfo {
328 pipInd := bytes.IndexByte(payload, '|')
329 setupRequest := &models.E2SetupRequestMessage{}
330 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
331 nodeb.GetGnb().RanFunctions = setupRequest.ExtractRanFunctionsList()
335 func getExpectedNodebForNewRan(payload []byte) *entities.NodebInfo {
336 pipInd := bytes.IndexByte(payload, '|')
337 setupRequest := &models.E2SetupRequestMessage{}
338 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
340 nodeb := &entities.NodebInfo{
341 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
342 RanName: nodebRanName,
343 NodeType: entities.Node_GNB,
344 Configuration: &entities.NodebInfo_Gnb{
346 RanFunctions: setupRequest.ExtractRanFunctionsList(),
349 GlobalNbId: &entities.GlobalNbId{
350 PlmnId: setupRequest.GetPlmnId(),
351 NbId: setupRequest.GetNbId(),
358 func TestE2SetupRequestNotificationHandler_HandleParseError(t *testing.T) {
359 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
360 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
361 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
362 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte("invalid_prefix"), xmlGnb...)}
363 handler.Handle(notificationRequest)
364 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
365 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
366 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
367 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
368 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
369 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
372 func TestE2SetupRequestNotificationHandler_HandleUnmarshalError(t *testing.T) {
373 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
374 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
375 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), "xmlGnb"...)}
376 handler.Handle(notificationRequest)
377 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
378 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
379 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
380 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
381 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
382 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
385 func TestE2SetupRequestNotificationHandler_HandleGetE2TInstanceError(t *testing.T) {
386 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
387 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
388 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
389 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, common.NewResourceNotFoundError("Not found"))
390 prefBytes := []byte(e2SetupMsgPrefix)
391 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
392 handler.Handle(notificationRequest)
393 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
394 readerMock.AssertNotCalled(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_HandleGetNodebError(t *testing.T) {
403 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
404 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := 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.NewInternalError(errors.New("some error")))
409 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
410 handler.Handle(notificationRequest)
411 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
412 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
413 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
414 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
415 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
416 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
417 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
420 func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) {
421 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
423 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
424 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
425 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
426 var gnb *entities.NodebInfo
427 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
428 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
429 nodebInfo := getExpectedNodebForNewRan(notificationRequest.Payload)
430 writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil)
431 updatedNodebInfo := *nodebInfo
432 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
433 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, StateChangeMessageChannel, 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, StateChangeMessageChannel, 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 StateChangeMessageChannel: StateChangeMessageChannel,
459 GlobalRicId: struct {
463 }{Mcc: "327", Mnc: "94", RicId: "10011001101010101011"}}
464 rmrMessengerMock := &mocks.RmrMessengerMock{}
465 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
466 readerMock := &mocks.RnibReaderMock{}
467 writerMock := &mocks.RnibWriterMock{}
468 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
469 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
470 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
471 ranListManager := managers.NewRanListManager(logger)
472 ranAlarmService := services.NewRanAlarmService(logger, config)
473 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
475 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
476 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager)
477 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
478 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
479 var gnb *entities.NodebInfo
480 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
481 writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
482 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, StateChangeMessageChannel, mock.Anything).Return(nil)
483 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
484 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
485 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
487 rmrMessage := &rmrCgo.MBuf{}
488 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
489 prefBytes := []byte(e2SetupMsgPrefix)
490 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlEnGnb...)}
491 handler.Handle(notificationRequest)
492 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
493 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
494 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
495 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
496 writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
497 e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
498 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
501 func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidStatusError(t *testing.T) {
502 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
503 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
504 var gnb = &entities.NodebInfo{RanName: nodebRanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
505 readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
506 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
507 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
508 prefBytes := []byte(e2SetupMsgPrefix)
509 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
510 handler.Handle(notificationRequest)
511 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
512 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
513 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
514 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
515 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
516 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
517 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
520 func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
521 logger := tests.InitLog(t)
522 config := &configuration.Configuration{
523 RnibRetryIntervalMs: 10,
524 MaxRnibConnectionAttempts: 3,
525 StateChangeMessageChannel: StateChangeMessageChannel,
526 GlobalRicId: struct {
530 }{Mcc: "327", Mnc: "94", RicId: "AACCE"}}
531 rmrMessengerMock := &mocks.RmrMessengerMock{}
532 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
533 readerMock := &mocks.RnibReaderMock{}
534 writerMock := &mocks.RnibWriterMock{}
535 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
536 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
537 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
538 ranListManager := managers.NewRanListManager(logger)
539 ranAlarmService := services.NewRanAlarmService(logger, config)
540 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
541 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
542 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager)
543 return handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock