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 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)
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)
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("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, StateChangeMessageChannel, mock.Anything).Return(nil)
485 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
486 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
487 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
489 rmrMessage := &rmrCgo.MBuf{}
490 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
491 prefBytes := []byte(e2SetupMsgPrefix)
492 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlEnGnb...)}
493 handler.Handle(notificationRequest)
494 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
495 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
496 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
497 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
498 writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
499 e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
500 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
503 func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidStatusError(t *testing.T) {
504 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
505 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
506 var gnb = &entities.NodebInfo{RanName: nodebRanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
507 readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
508 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
509 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
510 prefBytes := []byte(e2SetupMsgPrefix)
511 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
512 handler.Handle(notificationRequest)
513 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
514 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
515 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
516 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
517 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
518 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
519 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
522 func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
523 logger := tests.InitLog(t)
524 config := &configuration.Configuration{
525 RnibRetryIntervalMs: 10,
526 MaxRnibConnectionAttempts: 3,
527 RnibWriter: configuration.RnibWriterConfig{
528 StateChangeMessageChannel: StateChangeMessageChannel,
530 GlobalRicId: struct {
534 }{Mcc: "327", Mnc: "94", RicId: "AACCE"}}
535 rmrMessengerMock := &mocks.RmrMessengerMock{}
536 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
537 readerMock := &mocks.RnibReaderMock{}
538 writerMock := &mocks.RnibWriterMock{}
539 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
540 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
541 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
542 ranListManager := managers.NewRanListManager(logger)
543 ranAlarmService := services.NewRanAlarmService(logger, config)
544 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
545 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
546 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager)
547 return handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock