2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
4 // Copyright (c) 2022 Samsung Electronics Co., Ltd. All Rights Reserved.
5 // Copyright 2023 Capgemini
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 // This source code is part of the near-RT RIC (RAN Intelligent Controller)
20 // platform project (RICP).
22 package rmrmsghandlers
38 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
39 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
40 "github.com/stretchr/testify/assert"
41 "github.com/stretchr/testify/mock"
45 e2tInstanceFullAddress = "10.0.2.15:9999"
46 e2SetupMsgPrefix = e2tInstanceFullAddress + "|"
47 gnbNodebRanName = "gnb:310-410-b5c67788"
48 enbNodebRanName = "enB_macro:P310-410-b5c67788"
49 GnbSetupRequestXmlPath = "../../tests/resources/setupRequest/setupRequest_gnb.xml"
50 GnbWithZeroFunctionsSetupRequestXmlPath = "../../tests/resources/setupRequest/setupRequest_gnb_with_zero_functions.xml"
51 EnGnbSetupRequestXmlPath = "../../tests/resources/setupRequest/setupRequest_en-gNB.xml"
52 NgEnbSetupRequestXmlPath = "../../tests/resources/setupRequest/setupRequest_ng-eNB.xml"
53 EnbSetupRequestXmlPath = "../../tests/resources/setupRequest/setupRequest_enb.xml"
54 GnbWithoutFunctionsSetupRequestXmlPath = "../../tests/resources/setupRequest/setupRequest_gnb_without_functions.xml"
55 E2SetupFailureResponseWithMiscCause = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>49</id><criticality><ignore/></criticality><value><TransactionID>1</TransactionID></value></E2setupFailureIEs><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>"
56 E2SetupFailureResponseWithTransportCause = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>49</id><criticality><ignore/></criticality><value><TransactionID>1</TransactionID></value></E2setupFailureIEs><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>"
57 E2SetupFailureResponseWithRicCause = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>49</id><criticality><ignore/></criticality><value><TransactionID>1</TransactionID></value></E2setupFailureIEs><E2setupFailureIEs><id>1</id><criticality><ignore/></criticality><value><Cause><ricRequest><request-id-unknown/></ricRequest></Cause></value></E2setupFailureIEs><E2setupFailureIEs><id>31</id><criticality><ignore/></criticality><value><TimeToWait><v60s/></TimeToWait></value></E2setupFailureIEs></protocolIEs></E2setupFailure></value></unsuccessfulOutcome></E2AP-PDU>"
58 StateChangeMessageChannel = "RAN_CONNECTION_STATUS_CHANGE"
61 func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock, managers.RanListManager) {
62 logger := tests.InitLog(t)
63 config := &configuration.Configuration{
64 RnibRetryIntervalMs: 10,
65 MaxRnibConnectionAttempts: 3,
66 RnibWriter: configuration.RnibWriterConfig{
67 StateChangeMessageChannel: StateChangeMessageChannel,
73 }{Mcc: "327", Mnc: "94", RicId: "AACCE"}}
74 rmrMessengerMock := &mocks.RmrMessengerMock{}
75 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
76 readerMock := &mocks.RnibReaderMock{}
77 writerMock := &mocks.RnibWriterMock{}
78 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
79 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
80 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
81 ranListManager := managers.NewRanListManager(logger, rnibDataService)
82 ranAlarmService := services.NewRanAlarmService(logger, config)
83 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
84 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
85 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager, ranListManager)
86 return handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, ranListManager
89 func getMbuf(ranName string, msgType int, payloadStr string, request *models.NotificationRequest) *rmrCgo.MBuf {
90 payload := []byte(payloadStr)
91 mbuf := rmrCgo.NewMBuf(msgType, len(payload), ranName, &payload, &request.TransactionId, request.GetMsgSrc())
95 func TestParseGnbSetupRequest_Success(t *testing.T) {
96 xmlGnb := utils.ReadXmlFile(t, GnbSetupRequestXmlPath)
97 handler, _, _, _, _, _, _ := initMocks(t)
98 prefBytes := []byte(e2SetupMsgPrefix)
99 request, _, err := handler.parseSetupRequest(append(prefBytes, xmlGnb...))
100 assert.Equal(t, "02F829", request.GetPlmnId())
101 assert.Equal(t, "001100000011000000110000", request.GetNbId())
105 func TestParseEnGnbSetupRequest_Success(t *testing.T) {
106 enGnbXml := utils.ReadXmlFile(t, EnGnbSetupRequestXmlPath)
107 handler, _, _, _, _, _, _ := initMocks(t)
108 prefBytes := []byte(e2SetupMsgPrefix)
109 request, _, err := handler.parseSetupRequest(append(prefBytes, enGnbXml...))
110 assert.Equal(t, "131014", request.GetPlmnId())
111 assert.Equal(t, "11000101110001101100011111111000", request.GetNbId())
115 func TestParseNgEnbSetupRequest_Success(t *testing.T) {
116 ngEnbXml := utils.ReadXmlFile(t, NgEnbSetupRequestXmlPath)
117 handler, _, _, _, _, _, _ := initMocks(t)
118 prefBytes := []byte(e2SetupMsgPrefix)
119 request, _, err := handler.parseSetupRequest(append(prefBytes, ngEnbXml...))
120 assert.Equal(t, "131014", request.GetPlmnId())
121 assert.Equal(t, "101010101010101010", request.GetNbId())
125 func TestParseEnbSetupRequest_Success(t *testing.T) {
126 enbXml := utils.ReadXmlFile(t, EnbSetupRequestXmlPath)
127 handler, _, _, _, _, _, _ := initMocks(t)
128 prefBytes := []byte(e2SetupMsgPrefix)
129 request, _, err := handler.parseSetupRequest(append(prefBytes, enbXml...))
130 assert.Equal(t, "6359AB", request.GetPlmnId())
131 assert.Equal(t, "101010101010101010", request.GetNbId())
135 func TestParseSetupRequest_PipFailure(t *testing.T) {
136 xmlGnb := utils.ReadXmlFile(t, GnbSetupRequestXmlPath)
137 handler, _, _, _, _, _, _ := initMocks(t)
138 prefBytes := []byte("10.0.2.15:9999")
139 request, _, err := handler.parseSetupRequest(append(prefBytes, xmlGnb...))
140 assert.Nil(t, request)
141 assert.NotNil(t, err)
142 assert.EqualError(t, err, "#E2SetupRequestNotificationHandler.parseSetupRequest - Error parsing E2 Setup Request failed extract Payload: no | separator found")
145 func TestParseSetupRequest_UnmarshalFailure(t *testing.T) {
146 handler, _, _, _, _, _, _ := initMocks(t)
147 prefBytes := []byte(e2SetupMsgPrefix)
148 request, _, err := handler.parseSetupRequest(append(prefBytes, 1, 2, 3))
149 assert.Nil(t, request)
150 assert.NotNil(t, err)
151 assert.EqualError(t, err, "#E2SetupRequestNotificationHandler.parseSetupRequest - Error unmarshalling E2 Setup Request payload: 31302e302e322e31353a393939397c010203")
154 func TestE2SetupRequestNotificationHandler_HandleParseError(t *testing.T) {
155 xmlGnb := utils.ReadXmlFile(t, GnbSetupRequestXmlPath)
156 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, _ := initMocks(t)
157 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
158 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte("invalid_prefix"), xmlGnb...)}
159 handler.Handle(notificationRequest)
160 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
161 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
162 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
163 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
164 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
165 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
168 func TestE2SetupRequestNotificationHandler_HandleUnmarshalError(t *testing.T) {
169 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, _ := initMocks(t)
170 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
171 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), "xmlGnb"...)}
172 handler.Handle(notificationRequest)
173 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
174 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
175 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
176 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
177 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
178 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
181 func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing.T) {
182 xmlEnGnb := utils.ReadXmlFile(t, EnGnbSetupRequestXmlPath)
183 logger := tests.InitLog(t)
184 config := &configuration.Configuration{
185 RnibRetryIntervalMs: 10,
186 MaxRnibConnectionAttempts: 3,
187 RnibWriter: configuration.RnibWriterConfig{
188 StateChangeMessageChannel: StateChangeMessageChannel,
190 GlobalRicId: struct {
194 }{Mcc: "327", Mnc: "94", RicId: "10011001101010101011"}}
195 rmrMessengerMock := &mocks.RmrMessengerMock{}
196 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
197 readerMock := &mocks.RnibReaderMock{}
198 writerMock := &mocks.RnibWriterMock{}
199 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
200 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
201 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
202 ranListManager := managers.NewRanListManager(logger, rnibDataService)
203 ranAlarmService := services.NewRanAlarmService(logger, config)
204 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
206 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
207 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager, ranListManager)
208 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
209 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
210 var gnb *entities.NodebInfo
211 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
212 writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
213 writerMock.On("AddNbIdentity", entities.Node_GNB, mock.Anything).Return(nil)
214 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, mock.Anything).Return(nil)
215 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
216 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
217 writerMock.On("UpdateNbIdentities", mock.Anything, mock.Anything, mock.Anything).Return(nil)
218 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
220 rmrMessage := &rmrCgo.MBuf{}
221 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
222 prefBytes := []byte(e2SetupMsgPrefix)
223 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append(prefBytes, xmlEnGnb...)}
224 handler.Handle(notificationRequest)
225 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
226 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
227 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
228 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
229 writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
230 e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
231 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
234 func TestExtractionOfNodeTypeFromRanName(t *testing.T) {
235 handler, _, _, _, _, _, _ := initMocks(t)
236 validRanNames := []string{"gnb_P310_410_b5c67788", "en_gnb_P310_410_b5c67788", "ng_enB_macro_P310_410_b5c67788", "ng_enB_shortmacro_P310_410_b5c67788", "ng_enB_longmacro_P310_410_b5c67788", "enB_macro_P310_410_b5c67788", "enB_home_P310_410_b5c67788", "enB_shortmacro_P310_410_b5c67788", "enB_longmacro_P310_410_b5c67788"}
237 for _, v := range validRanNames {
238 nodeb := &entities.NodebInfo{RanName: v}
239 err := handler.setNodeTypeAndConfiguration(nodeb)
242 inValidRanNames := []string{"P310_410_b5c67788", "blabla_P310_410_b5c67788", "ng_enB-macro_P310_410_b5c67788", "ng_enb_shortmacro_P310_410_b5c67788", "ng_enB-longmacro_P310_410_b5c67788", "enB_new_macro_P310_410_b5c67788"}
243 for _, v := range inValidRanNames {
244 nodeb := &entities.NodebInfo{RanName: v}
245 err := handler.setNodeTypeAndConfiguration(nodeb)
246 assert.NotNil(t, err, v)
250 func TestE2SetupRequestNotificationHandler_GetGeneralConfigurationFailure(t *testing.T) {
251 xmlGnb := utils.ReadXmlFile(t, GnbSetupRequestXmlPath)
252 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, _ := initMocks(t)
253 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{}, common.NewInternalError(errors.New("some error")))
254 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
255 handler.Handle(notificationRequest)
256 rmrMessengerMock.AssertNotCalled(t, "SendMsg")
257 e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
258 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance")
259 readerMock.AssertNotCalled(t, "GetNodeb")
260 writerMock.AssertNotCalled(t, "SaveNodeb")
263 func TestE2SetupRequestNotificationHandler_EnableRicFalse(t *testing.T) {
264 xmlGnb := utils.ReadXmlFile(t, GnbSetupRequestXmlPath)
265 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, _ := initMocks(t)
266 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: false}, nil)
267 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
268 mbuf := getMbuf(gnbNodebRanName, rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithMiscCause, notificationRequest)
269 rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, nil)
270 handler.Handle(notificationRequest)
271 rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
272 e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
273 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance")
274 readerMock.AssertNotCalled(t, "GetNodeb")
275 writerMock.AssertNotCalled(t, "SaveNodeb")
278 func TestE2SetupRequestNotificationHandler_HandleGetE2TInstanceError(t *testing.T) {
279 xmlGnb := utils.ReadXmlFile(t, GnbSetupRequestXmlPath)
280 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, _ := initMocks(t)
281 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
282 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, common.NewResourceNotFoundError("Not found"))
283 prefBytes := []byte(e2SetupMsgPrefix)
284 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append(prefBytes, xmlGnb...)}
285 handler.Handle(notificationRequest)
286 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
287 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
288 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
289 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
290 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
291 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
292 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
295 func TestE2SetupRequestNotificationHandler_HandleGetNodebError(t *testing.T) {
296 xmlGnb := utils.ReadXmlFile(t, GnbSetupRequestXmlPath)
297 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock, _ := initMocks(t)
298 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
299 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
300 var gnb *entities.NodebInfo
301 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewInternalError(errors.New("some error")))
302 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
303 handler.Handle(notificationRequest)
304 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
305 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
306 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
307 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
308 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
309 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
310 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
313 /* New Ran UTs - BEGIN */
315 func TestE2SetupRequestNotificationHandler_HandleNewRanSaveNodebFailure(t *testing.T) {
316 xml := utils.ReadXmlFile(t, GnbSetupRequestXmlPath)
317 handler, readerMock, writerMock, _, e2tInstancesManagerMock, _, _ := initMocks(t)
318 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
319 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
320 var gnb *entities.NodebInfo
321 readerMock.On("GetNodeb", gnbNodebRanName).Return(gnb, common.NewResourceNotFoundError("Not found"))
322 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
323 nodebInfo := getExpectedGnbNodebForNewRan(notificationRequest.Payload)
324 writerMock.On("SaveNodeb", nodebInfo).Return(common.NewInternalError(errors.New("error")))
325 handler.Handle(notificationRequest)
327 readerMock.AssertExpectations(t)
328 writerMock.AssertExpectations(t)
329 e2tInstancesManagerMock.AssertExpectations(t)
332 func TestE2SetupRequestNotificationHandler_HandleNewRan_invalidRanName(t *testing.T) {
333 xml := utils.ReadXmlFile(t, EnbSetupRequestXmlPath)
334 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _, _ := initMocks(t)
335 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
336 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
337 var enb *entities.NodebInfo
338 invalidEnbRanName := "enB-macro:P310-410-b5c67788"
339 readerMock.On("GetNodeb", invalidEnbRanName).Return(enb, common.NewResourceNotFoundError("Not found"))
340 notificationRequest := &models.NotificationRequest{RanName: invalidEnbRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
341 mbuf := getMbuf(invalidEnbRanName, rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithRicCause, notificationRequest)
342 rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, nil)
343 handler.Handle(notificationRequest)
345 readerMock.AssertExpectations(t)
346 writerMock.AssertExpectations(t)
347 rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
348 e2tInstancesManagerMock.AssertExpectations(t)
351 func TestE2SetupRequestNotificationHandler_HandleNewRanAddNbIdentityFailure(t *testing.T) {
352 xml := utils.ReadXmlFile(t, GnbSetupRequestXmlPath)
353 handler, readerMock, writerMock, _, e2tInstancesManagerMock, _, _ := initMocks(t)
354 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
355 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
356 var gnb *entities.NodebInfo
357 readerMock.On("GetNodeb", gnbNodebRanName).Return(gnb, common.NewResourceNotFoundError("Not found"))
358 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
359 nodebInfo := getExpectedGnbNodebForNewRan(notificationRequest.Payload)
360 writerMock.On("SaveNodeb", nodebInfo).Return(nil)
361 nbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, GlobalNbId: nodebInfo.GlobalNbId}
362 writerMock.On("AddNbIdentity", entities.Node_GNB, nbIdentity).Return(common.NewInternalError(errors.New("error")))
363 handler.Handle(notificationRequest)
364 readerMock.AssertExpectations(t)
365 writerMock.AssertExpectations(t)
366 e2tInstancesManagerMock.AssertExpectations(t)
369 func TestE2SetupRequestNotificationHandler_HandleNewRanRoutingManagerError(t *testing.T) {
370 xmlGnb := utils.ReadXmlFile(t, GnbSetupRequestXmlPath)
372 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, _ := initMocks(t)
373 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
374 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
375 readerMock.On("GetNodeb", gnbNodebRanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError("Not found"))
376 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
377 nodebInfo := getExpectedGnbNodebForNewRan(notificationRequest.Payload)
378 writerMock.On("SaveNodeb", nodebInfo).Return(nil)
379 nbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, GlobalNbId: nodebInfo.GlobalNbId}
380 writerMock.On("AddNbIdentity", entities.Node_GNB, nbIdentity).Return(nil)
381 updatedNodebInfo := *nodebInfo
382 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error"))
383 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
384 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
385 writerMock.On("UpdateNbIdentities", mock.Anything, mock.Anything, mock.Anything).Return(nil)
387 mbuf := getMbuf(gnbNodebRanName, rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithTransportCause, notificationRequest)
388 rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, errEmpty)
389 handler.Handle(notificationRequest)
390 readerMock.AssertExpectations(t)
391 e2tInstancesManagerMock.AssertExpectations(t)
392 writerMock.AssertExpectations(t)
393 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
394 e2tInstancesManagerMock.AssertExpectations(t)
395 rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
398 func testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t *testing.T, xmlPath string, nodeType entities.Node_Type) {
399 xml := utils.ReadXmlFile(t, xmlPath)
401 if nodeType == entities.Node_GNB {
402 ranName = gnbNodebRanName
404 ranName = enbNodebRanName
406 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, _ := initMocks(t)
407 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
408 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
409 var gnb *entities.NodebInfo
410 readerMock.On("GetNodeb", ranName).Return(gnb, common.NewResourceNotFoundError("Not found"))
411 notificationRequest := &models.NotificationRequest{RanName: ranName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
412 var expectedNodebInfo *entities.NodebInfo
413 if nodeType == entities.Node_GNB {
414 expectedNodebInfo = getExpectedGnbNodebForNewRan(notificationRequest.Payload)
416 expectedNodebInfo = getExpectedEnbNodebForNewRan(notificationRequest.Payload)
418 writerMock.On("SaveNodeb", expectedNodebInfo).Return(nil)
419 nbIdentity := &entities.NbIdentity{InventoryName: ranName, GlobalNbId: expectedNodebInfo.GlobalNbId}
420 writerMock.On("AddNbIdentity", nodeType, nbIdentity).Return(nil)
421 updatedNodebInfo := *expectedNodebInfo
422 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
423 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, ranName+"_CONNECTED").Return(nil)
424 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
425 updatedNodebInfo2 := *expectedNodebInfo
426 updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
427 updatedNodebInfo2.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
428 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
430 newNbIdentity := &entities.NbIdentity{InventoryName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: expectedNodebInfo.GlobalNbId}
431 writerMock.On("UpdateNbIdentities", updatedNodebInfo2.GetNodeType(), []*entities.NbIdentity{nbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
433 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{ranName}).Return(nil)
434 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, nil)
436 handler.Handle(notificationRequest)
438 readerMock.AssertExpectations(t)
439 writerMock.AssertExpectations(t)
440 e2tInstancesManagerMock.AssertExpectations(t)
443 func TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess(t *testing.T) {
444 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, GnbSetupRequestXmlPath, entities.Node_GNB)
447 func TestE2SetupRequestNotificationHandler_HandleNewGnbWithoutFunctionsSuccess(t *testing.T) {
448 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, GnbWithoutFunctionsSetupRequestXmlPath, entities.Node_GNB)
451 func TestE2SetupRequestNotificationHandler_HandleNewEnGnbSuccess(t *testing.T) {
452 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, EnGnbSetupRequestXmlPath, entities.Node_GNB)
455 func TestE2SetupRequestNotificationHandler_HandleNewNgEnbSuccess(t *testing.T) {
456 testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, NgEnbSetupRequestXmlPath, entities.Node_ENB)
459 func getExpectedGnbNodebForNewRan(payload []byte) *entities.NodebInfo {
460 pipInd := bytes.IndexByte(payload, '|')
461 setupRequest := &models.E2SetupRequestMessage{}
462 _ = xml.Unmarshal(utils.NormalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
463 gnbNodetype := "gNB_CU_UP"
464 if setupRequest.GetCuupId() != "" && setupRequest.GetCuupId() != "0" && setupRequest.GetDuId() != "" && setupRequest.GetDuId() != "0" {
465 gnbNodetype = "gNB_CU_UP"
466 } else if setupRequest.GetCuupId() != "" && setupRequest.GetCuupId() != "0" {
467 gnbNodetype = "gNB_CU_UP"
468 } else if setupRequest.GetDuId() != "" && setupRequest.GetDuId() != "0" {
469 gnbNodetype = "gNB_DU"
472 nodeb := &entities.NodebInfo{
473 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
474 RanName: gnbNodebRanName,
475 SetupFromNetwork: true,
476 NodeType: entities.Node_GNB,
477 GnbNodeType: gnbNodetype,
478 Configuration: &entities.NodebInfo_Gnb{
480 GnbType: entities.GnbType_GNB,
481 RanFunctions: setupRequest.ExtractRanFunctionsList(),
482 NodeConfigs: setupRequest.ExtractE2NodeConfigList(),
485 GlobalNbId: &entities.GlobalNbId{
486 PlmnId: setupRequest.GetPlmnId(),
487 NbId: setupRequest.GetNbId(),
489 CuUpId: setupRequest.GetCuupId(),
490 DuId: setupRequest.GetDuId(),
496 func getExpectedEnbNodebForNewRan(payload []byte) *entities.NodebInfo {
497 pipInd := bytes.IndexByte(payload, '|')
498 setupRequest := &models.E2SetupRequestMessage{}
499 _ = xml.Unmarshal(utils.NormalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
501 nodeb := &entities.NodebInfo{
502 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
503 RanName: enbNodebRanName,
504 SetupFromNetwork: true,
505 NodeType: entities.Node_ENB,
506 Configuration: &entities.NodebInfo_Enb{
508 EnbType: entities.EnbType_MACRO_ENB,
509 NodeConfigs: setupRequest.ExtractE2NodeConfigList(),
512 GlobalNbId: &entities.GlobalNbId{
513 PlmnId: setupRequest.GetPlmnId(),
514 NbId: setupRequest.GetNbId(),
521 /* New Ran UTs - END */
523 /* Existing Ran UTs - BEGIN */
525 func getExpectedNodebForExistingRan(nodeb *entities.NodebInfo, payload []byte) *entities.NodebInfo {
526 pipInd := bytes.IndexByte(payload, '|')
527 setupRequest := &models.E2SetupRequestMessage{}
528 _ = xml.Unmarshal(utils.NormalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
532 if nodeb.NodeType == entities.Node_ENB {
533 if e2NodeConfig := setupRequest.ExtractE2NodeConfigList(); e2NodeConfig != nil {
534 updatedEnb := *nodeb.GetEnb()
535 updatedEnb.NodeConfigs = e2NodeConfig
536 nb.Configuration = &entities.NodebInfo_Enb{Enb: &updatedEnb}
542 if ranFuncs := setupRequest.ExtractRanFunctionsList(); ranFuncs != nil {
543 updatedGnb := *nodeb.GetGnb()
544 updatedGnb.RanFunctions = ranFuncs
545 nb.Configuration = &entities.NodebInfo_Gnb{Gnb: &updatedGnb}
548 if e2NodeConfig := setupRequest.ExtractE2NodeConfigList(); e2NodeConfig != nil {
549 updatedGnb := *nodeb.GetGnb()
550 updatedGnb.RanFunctions = nb.GetGnb().RanFunctions
551 updatedGnb.NodeConfigs = e2NodeConfig
552 nb.Configuration = &entities.NodebInfo_Gnb{Gnb: &updatedGnb}
558 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedEnbSuccess(t *testing.T) {
559 xmlEnb := utils.ReadXmlFile(t, EnbSetupRequestXmlPath)
560 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, ranListManager := initMocks(t)
562 oldNbIdentity := &entities.NbIdentity{InventoryName: enbNodebRanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
563 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
565 err := ranListManager.InitNbIdentityMap()
567 t.Errorf("Error cannot init identity")
569 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
570 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
571 var nodebInfo = &entities.NodebInfo{
572 RanName: enbNodebRanName,
573 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
574 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
575 NodeType: entities.Node_ENB,
576 Configuration: &entities.NodebInfo_Enb{Enb: &entities.Enb{}},
579 readerMock.On("GetNodeb", enbNodebRanName).Return(nodebInfo, nil)
580 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
582 notificationRequest := &models.NotificationRequest{RanName: enbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlEnb...)}
583 enbToUpdate := getExpectedNodebForExistingRan(nodebInfo, notificationRequest.Payload)
584 enbToUpdate.SetupFromNetwork = true
585 newNbIdentity := &entities.NbIdentity{InventoryName: enbNodebRanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
586 writerMock.On("UpdateNbIdentities", enbToUpdate.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
587 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
588 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{enbNodebRanName}).Return(nil)
590 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(&rmrCgo.MBuf{}, errEmpty)
591 handler.Handle(notificationRequest)
592 readerMock.AssertExpectations(t)
593 writerMock.AssertExpectations(t)
594 e2tInstancesManagerMock.AssertExpectations(t)
595 rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, true)
598 func TestE2SetupRequestNotificationHandler_HandleExistingDisconnectedEnbSuccess(t *testing.T) {
599 xmlEnb := utils.ReadXmlFile(t, EnbSetupRequestXmlPath)
600 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, ranListManager := initMocks(t)
602 oldNbIdentity := &entities.NbIdentity{InventoryName: enbNodebRanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
603 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
604 err := ranListManager.InitNbIdentityMap()
606 t.Errorf("Error cannot init identity")
609 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
610 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
611 var nodebInfo = &entities.NodebInfo{
612 RanName: enbNodebRanName,
613 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
614 ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,
615 NodeType: entities.Node_ENB,
616 Configuration: &entities.NodebInfo_Enb{Enb: &entities.Enb{}},
619 readerMock.On("GetNodeb", enbNodebRanName).Return(nodebInfo, nil)
620 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
622 notificationRequest := &models.NotificationRequest{RanName: enbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlEnb...)}
623 enbToUpdate := getExpectedNodebForExistingRan(nodebInfo, notificationRequest.Payload)
625 enbToUpdate2 := *enbToUpdate
626 enbToUpdate2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
627 enbToUpdate2.SetupFromNetwork = true
628 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, enbNodebRanName+"_CONNECTED").Return(nil)
630 newNbIdentity := &entities.NbIdentity{InventoryName: enbNodebRanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
631 writerMock.On("UpdateNbIdentities", enbToUpdate.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
633 enbToUpdate3 := *enbToUpdate
634 enbToUpdate3.ConnectionStatus = entities.ConnectionStatus_CONNECTED
635 enbToUpdate3.SetupFromNetwork = true
636 enbToUpdate3.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
637 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
638 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{enbNodebRanName}).Return(nil)
640 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(&rmrCgo.MBuf{}, errEmpty)
641 handler.Handle(notificationRequest)
642 readerMock.AssertExpectations(t)
643 writerMock.AssertExpectations(t)
644 e2tInstancesManagerMock.AssertExpectations(t)
645 rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, true)
648 func testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t *testing.T, withFunctions bool, xmlToRead string) {
649 xmlGnb := utils.ReadXmlFile(t, xmlToRead)
650 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, ranListManager := initMocks(t)
652 oldNbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
653 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
654 err := ranListManager.InitNbIdentityMap()
656 t.Errorf("Error cannot init identity")
659 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
660 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
661 var nodebInfo = &entities.NodebInfo{
662 RanName: gnbNodebRanName,
663 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
664 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
665 NodeType: entities.Node_GNB,
666 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
670 gnb := nodebInfo.GetGnb()
671 gnb.RanFunctions = []*entities.RanFunction{{RanFunctionId: 2, RanFunctionRevision: 2}}
674 readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil)
675 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
677 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
678 gnbToUpdate := getExpectedNodebForExistingRan(nodebInfo, notificationRequest.Payload)
679 gnbToUpdate.SetupFromNetwork = true
680 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
682 writerMock.On("UpdateNodebInfoAndPublish", mock.Anything).Return(nil)
684 newNbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
685 writerMock.On("UpdateNbIdentities", gnbToUpdate.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
687 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{gnbNodebRanName}).Return(nil)
689 rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(&rmrCgo.MBuf{}, errEmpty)
690 handler.Handle(notificationRequest)
691 readerMock.AssertExpectations(t)
692 writerMock.AssertExpectations(t)
693 e2tInstancesManagerMock.AssertExpectations(t)
694 rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, true)
697 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbRoutingManagerError(t *testing.T) {
698 xmlGnb := utils.ReadXmlFile(t, GnbSetupRequestXmlPath)
699 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, ranListManager := initMocks(t)
700 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
701 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
702 var nodebInfo = &entities.NodebInfo{
703 RanName: gnbNodebRanName,
704 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
705 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
706 NodeType: entities.Node_GNB,
707 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
709 oldNbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
710 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
711 err := ranListManager.InitNbIdentityMap()
713 t.Errorf("Error cannot init identity")
716 gnb := nodebInfo.GetGnb()
717 gnb.RanFunctions = []*entities.RanFunction{{RanFunctionId: 2, RanFunctionRevision: 2}}
718 gnb.NodeConfigs = []*entities.E2NodeComponentConfig{{
719 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeNG{
720 E2NodeComponentInterfaceTypeNG: &entities.E2NodeComponentInterfaceNG{
724 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_ng,
725 E2NodeComponentRequestPart: []byte("72 65 73 70 61 72 74"),
726 E2NodeComponentResponsePart: []byte("72 65 73 70 61 72 74"),
729 readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil)
730 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error"))
732 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
733 gnbToUpdate := getExpectedNodebForExistingRan(nodebInfo, notificationRequest.Payload)
735 gnbToUpdate2 := *gnbToUpdate
736 gnbToUpdate2.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
737 gnbToUpdate2.SetupFromNetwork = true
738 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, gnbNodebRanName+"_DISCONNECTED").Return(nil)
740 newNbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
741 writerMock.On("UpdateNbIdentities", gnbToUpdate2.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
743 rmrMessengerMock.On("WhSendMsg", mock.Anything, true).Return(&rmrCgo.MBuf{}, errEmpty)
744 handler.Handle(notificationRequest)
745 readerMock.AssertExpectations(t)
746 writerMock.AssertExpectations(t)
747 e2tInstancesManagerMock.AssertExpectations(t)
748 rmrMessengerMock.AssertCalled(t, "WhSendMsg", mock.Anything, true)
751 func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidConnectionStatusError(t *testing.T) {
752 xmlGnb := utils.ReadXmlFile(t, GnbSetupRequestXmlPath)
753 handler, readerMock, writerMock, _, e2tInstancesManagerMock, rmrMessengerMock, _ := initMocks(t)
754 var gnb = &entities.NodebInfo{RanName: gnbNodebRanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
755 readerMock.On("GetNodeb", gnbNodebRanName).Return(gnb, nil)
756 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
757 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
758 prefBytes := []byte(e2SetupMsgPrefix)
759 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append(prefBytes, xmlGnb...)}
760 handler.Handle(notificationRequest)
761 readerMock.AssertExpectations(t)
762 writerMock.AssertExpectations(t)
763 e2tInstancesManagerMock.AssertExpectations(t)
764 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
767 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithoutFunctionsSuccess(t *testing.T) {
768 testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, false, GnbWithoutFunctionsSetupRequestXmlPath)
771 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithFunctionsSuccess(t *testing.T) {
772 testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, true, GnbSetupRequestXmlPath)
775 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithZeroFunctionsSuccess(t *testing.T) {
776 testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, true, GnbWithZeroFunctionsSetupRequestXmlPath)
779 func TestE2SetupRequestNotificationHandler_HandleExistingDisconnectedGnbSuccess(t *testing.T) {
780 xmlGnb := utils.ReadXmlFile(t, GnbSetupRequestXmlPath)
781 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, ranListManager := initMocks(t)
782 oldNbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
783 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil)
784 err := ranListManager.InitNbIdentityMap()
786 t.Errorf("Error cannot init identity")
789 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
790 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
791 var nodebInfo = &entities.NodebInfo{
792 RanName: gnbNodebRanName,
793 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
794 ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,
795 NodeType: entities.Node_GNB,
796 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
799 readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil)
800 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
802 notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
803 gnbToUpdate := getExpectedNodebForExistingRan(nodebInfo, notificationRequest.Payload)
804 gnbToUpdate2 := *gnbToUpdate
805 gnbToUpdate2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
806 gnbToUpdate2.SetupFromNetwork = true
807 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, gnbNodebRanName+"_CONNECTED").Return(nil)
808 gnbToUpdate3 := *gnbToUpdate
809 gnbToUpdate3.ConnectionStatus = entities.ConnectionStatus_CONNECTED
810 gnbToUpdate3.SetupFromNetwork = true
811 gnbToUpdate3.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
812 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
814 newNbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
815 writerMock.On("UpdateNbIdentities", gnbToUpdate3.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil)
817 e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{gnbNodebRanName}).Return(nil)
819 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty)
820 handler.Handle(notificationRequest)
821 readerMock.AssertExpectations(t)
822 writerMock.AssertExpectations(t)
823 e2tInstancesManagerMock.AssertExpectations(t)
826 /* Existing Ran UTs - END */