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")
162 func testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t *testing.T, xmlPath string) {
163 xml := readXmlFile(t, xmlPath)
164 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
165 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
166 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
167 var gnb *entities.NodebInfo
168 readerMock.On("GetNodeb", nodebRanName).Return(gnb, common.NewResourceNotFoundError("Not found"))
169 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
170 nodebInfo := getExpectedNodebForNewRan(notificationRequest.Payload)
171 nbIdentity := &entities.NbIdentity{InventoryName: nodebRanName, GlobalNbId: nodebInfo.GlobalNbId}
172 writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil)
173 updatedNodebInfo := *nodebInfo
174 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
175 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, StateChangeMessageChannel, nodebRanName+"_CONNECTED").Return(nil)
176 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
177 updatedNodebInfo2 := *nodebInfo
178 updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
179 updatedNodebInfo2.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
180 writerMock.On("UpdateNodebInfo", &updatedNodebInfo2).Return(nil)
181 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{nodebRanName}).Return(nil)
182 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, nil)
183 handler.Handle(notificationRequest)
184 readerMock.AssertExpectations(t)
185 writerMock.AssertExpectations(t)
186 e2tInstancesManagerMock.AssertExpectations(t)
189 func TestE2SetupRequestNotificationHandler_HandleUpdateNodebInfoOnConnectionStatusInversionFailureForNewGnb(t *testing.T) {
190 xml := readXmlFile(t, GnbSetupRequestXmlPath)
191 handler, readerMock, writerMock, _, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
192 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
193 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
194 var gnb *entities.NodebInfo
195 readerMock.On("GetNodeb", nodebRanName).Return(gnb, common.NewResourceNotFoundError("Not found"))
196 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
197 nodebInfo := getExpectedNodebForNewRan(notificationRequest.Payload)
198 nbIdentity := &entities.NbIdentity{InventoryName: nodebRanName, GlobalNbId: nodebInfo.GlobalNbId}
199 writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil)
200 updatedNodebInfo := *nodebInfo
201 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
202 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, StateChangeMessageChannel, nodebRanName+"_CONNECTED").Return(common.NewInternalError(errors.New("some error")))
203 handler.Handle(notificationRequest)
204 readerMock.AssertExpectations(t)
205 writerMock.AssertExpectations(t)
206 routingManagerClientMock.AssertExpectations(t)
207 e2tInstancesManagerMock.AssertExpectations(t)
210 func TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess(t *testing.T) {
211 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, GnbSetupRequestXmlPath)
214 func TestE2SetupRequestNotificationHandler_HandleNewGnbWithoutFunctionsSuccess(t *testing.T) {
215 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, GnbWithoutFunctionsSetupRequestXmlPath)
218 func TestE2SetupRequestNotificationHandler_HandleNewEnGnbSuccess(t *testing.T) {
219 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, EnGnbSetupRequestXmlPath)
222 func TestE2SetupRequestNotificationHandler_HandleNewNgEnbSuccess(t *testing.T) {
223 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, NgEnbSetupRequestXmlPath)
226 func testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t *testing.T, withFunctions bool) {
227 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
228 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
229 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
230 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
231 var nodebInfo = &entities.NodebInfo{
232 RanName: nodebRanName,
233 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
234 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
235 NodeType: entities.Node_GNB,
236 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
240 gnb := nodebInfo.GetGnb()
241 gnb.RanFunctions = []*entities.RanFunction{{RanFunctionId: 2, RanFunctionRevision: 2}}
244 readerMock.On("GetNodeb", nodebRanName).Return(nodebInfo, nil)
245 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
247 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
248 gnbToUpdate := getExpectedNodebForExistingRan(*nodebInfo, notificationRequest.Payload)
249 writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
250 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{nodebRanName}).Return(nil)
252 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(&rmrCgo.MBuf{}, errEmpty)
253 handler.Handle(notificationRequest)
254 readerMock.AssertExpectations(t)
255 writerMock.AssertExpectations(t)
256 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 3)
257 e2tInstancesManagerMock.AssertExpectations(t)
258 rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, true)
261 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithoutFunctionsSuccess(t *testing.T) {
262 testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, false)
265 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithFunctionsSuccess(t *testing.T) {
266 testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, true)
269 func TestE2SetupRequestNotificationHandler_HandleExistingDisconnectedGnbSuccess(t *testing.T) {
270 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
271 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
272 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
273 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
274 var nodebInfo = &entities.NodebInfo{
275 RanName: nodebRanName,
276 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
277 ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,
278 NodeType: entities.Node_GNB,
279 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
282 readerMock.On("GetNodeb", nodebRanName).Return(nodebInfo, nil)
283 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
285 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
286 gnbToUpdate := getExpectedNodebForExistingRan(*nodebInfo, notificationRequest.Payload)
287 writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
288 gnbToUpdate2 := *gnbToUpdate
289 gnbToUpdate2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
290 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &gnbToUpdate2, StateChangeMessageChannel, nodebRanName+"_CONNECTED").Return(nil)
291 gnbToUpdate3 := *gnbToUpdate
292 gnbToUpdate3.ConnectionStatus = entities.ConnectionStatus_CONNECTED
293 gnbToUpdate3.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
294 writerMock.On("UpdateNodebInfo", &gnbToUpdate3).Return(nil)
295 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{nodebRanName}).Return(nil)
297 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty)
298 handler.Handle(notificationRequest)
299 readerMock.AssertExpectations(t)
300 writerMock.AssertExpectations(t)
301 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
302 e2tInstancesManagerMock.AssertExpectations(t)
305 func getExpectedNodebForExistingRan(nodeb entities.NodebInfo, payload []byte) *entities.NodebInfo {
306 pipInd := bytes.IndexByte(payload, '|')
307 setupRequest := &models.E2SetupRequestMessage{}
308 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
309 nodeb.GetGnb().RanFunctions = setupRequest.ExtractRanFunctionsList()
313 func getExpectedNodebForNewRan(payload []byte) *entities.NodebInfo {
314 pipInd := bytes.IndexByte(payload, '|')
315 setupRequest := &models.E2SetupRequestMessage{}
316 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
318 nodeb := &entities.NodebInfo{
319 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
320 RanName: nodebRanName,
321 NodeType: entities.Node_GNB,
322 Configuration: &entities.NodebInfo_Gnb{
324 RanFunctions: setupRequest.ExtractRanFunctionsList(),
327 GlobalNbId: &entities.GlobalNbId{
328 PlmnId: setupRequest.GetPlmnId(),
329 NbId: setupRequest.GetNbId(),
336 func TestE2SetupRequestNotificationHandler_HandleParseError(t *testing.T) {
337 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
338 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
339 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
340 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte("invalid_prefix"), xmlGnb...)}
341 handler.Handle(notificationRequest)
342 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
343 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
344 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
345 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
346 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
347 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
350 func TestE2SetupRequestNotificationHandler_HandleUnmarshalError(t *testing.T) {
351 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
352 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
353 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), "xmlGnb"...)}
354 handler.Handle(notificationRequest)
355 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
356 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
357 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
358 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
359 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
360 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
363 func TestE2SetupRequestNotificationHandler_HandleGetE2TInstanceError(t *testing.T) {
364 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
365 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
366 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
367 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, common.NewResourceNotFoundError("Not found"))
368 prefBytes := []byte(e2SetupMsgPrefix)
369 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
370 handler.Handle(notificationRequest)
371 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
372 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
373 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
374 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
375 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
376 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
377 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
380 func TestE2SetupRequestNotificationHandler_HandleGetNodebError(t *testing.T) {
381 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
382 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
383 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
384 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
385 var gnb *entities.NodebInfo
386 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewInternalError(errors.New("some error")))
387 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
388 handler.Handle(notificationRequest)
389 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
390 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
391 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
392 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
393 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
394 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
395 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
398 func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) {
399 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
401 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
402 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
403 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
404 var gnb *entities.NodebInfo
405 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
406 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
407 nodebInfo := getExpectedNodebForNewRan(notificationRequest.Payload)
408 writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil)
409 updatedNodebInfo := *nodebInfo
410 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
411 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, StateChangeMessageChannel, nodebRanName+"_CONNECTED").Return(nil)
412 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
413 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
414 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error"))
415 updatedNodebInfo2 := *nodebInfo
416 updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
417 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo2, StateChangeMessageChannel, nodebRanName+"_DISCONNECTED").Return(nil)
419 mbuf := getMbuf(rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithTransportCause, notificationRequest)
420 rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, errEmpty)
421 handler.Handle(notificationRequest)
422 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
423 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
424 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
425 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
426 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
427 rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
430 func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing.T) {
431 xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath)
432 logger := tests.InitLog(t)
433 config := &configuration.Configuration{
434 RnibRetryIntervalMs: 10,
435 MaxRnibConnectionAttempts: 3,
436 StateChangeMessageChannel: StateChangeMessageChannel,
437 GlobalRicId: struct {
441 }{Mcc: "327", Mnc: "94", RicId: "10011001101010101011"}}
442 rmrMessengerMock := &mocks.RmrMessengerMock{}
443 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
444 readerMock := &mocks.RnibReaderMock{}
445 writerMock := &mocks.RnibWriterMock{}
446 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
447 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
448 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
449 ranListManager := managers.NewRanListManager(logger)
450 ranAlarmService := services.NewRanAlarmService(logger, config)
451 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
453 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
454 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager)
455 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
456 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
457 var gnb *entities.NodebInfo
458 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
459 writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
460 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, StateChangeMessageChannel, mock.Anything).Return(nil)
461 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
462 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
463 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
465 rmrMessage := &rmrCgo.MBuf{}
466 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
467 prefBytes := []byte(e2SetupMsgPrefix)
468 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlEnGnb...)}
469 handler.Handle(notificationRequest)
470 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
471 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
472 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
473 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
474 writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
475 e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
476 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
479 func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidStatusError(t *testing.T) {
480 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
481 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
482 var gnb = &entities.NodebInfo{RanName: nodebRanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
483 readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
484 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
485 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
486 prefBytes := []byte(e2SetupMsgPrefix)
487 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
488 handler.Handle(notificationRequest)
489 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
490 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
491 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
492 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
493 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
494 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
495 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
498 func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
499 logger := tests.InitLog(t)
500 config := &configuration.Configuration{
501 RnibRetryIntervalMs: 10,
502 MaxRnibConnectionAttempts: 3,
503 StateChangeMessageChannel: StateChangeMessageChannel,
504 GlobalRicId: struct {
508 }{Mcc: "327", Mnc: "94", RicId: "AACCE"}}
509 rmrMessengerMock := &mocks.RmrMessengerMock{}
510 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
511 readerMock := &mocks.RnibReaderMock{}
512 writerMock := &mocks.RnibWriterMock{}
513 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
514 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
515 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
516 ranListManager := managers.NewRanListManager(logger)
517 ranAlarmService := services.NewRanAlarmService(logger, config)
518 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
519 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
520 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager)
521 return handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock