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 prefix = "10.0.2.15:9999|"
44 e2tInstanceFullAddress = "10.0.2.15:9999"
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>"
55 func readXmlFile(t *testing.T, xmlPath string) []byte {
56 path, err := filepath.Abs(xmlPath)
60 xmlAsBytes, err := ioutil.ReadFile(path)
68 func TestParseGnbSetupRequest_Success(t *testing.T) {
69 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
70 handler, _, _, _, _, _ := initMocks(t)
71 prefBytes := []byte(prefix)
72 request, _, err := handler.parseSetupRequest(append(prefBytes, xmlGnb...))
73 assert.Equal(t, "02F829", request.GetPlmnId())
74 assert.Equal(t, "001100000011000000110000", request.GetNbId())
78 func TestParseEnGnbSetupRequest_Success(t *testing.T) {
79 enGnbXml := readXmlFile(t, EnGnbSetupRequestXmlPath)
80 handler, _, _, _, _, _ := initMocks(t)
81 prefBytes := []byte(prefix)
82 request, _, err := handler.parseSetupRequest(append(prefBytes, enGnbXml...))
83 assert.Equal(t, "131014", request.GetPlmnId())
84 assert.Equal(t, "11000101110001101100011111111000", request.GetNbId())
88 func TestParseNgEnbSetupRequest_Success(t *testing.T) {
89 ngEnbXml := readXmlFile(t, NgEnbSetupRequestXmlPath)
90 handler, _, _, _, _, _ := initMocks(t)
91 prefBytes := []byte(prefix)
92 request, _, err := handler.parseSetupRequest(append(prefBytes, ngEnbXml...))
93 assert.Equal(t, "131014", request.GetPlmnId())
94 assert.Equal(t, "101010101010101010", request.GetNbId())
98 func TestParseEnbSetupRequest_Success(t *testing.T) {
99 enbXml := readXmlFile(t, EnbSetupRequestXmlPath)
100 handler, _, _, _, _, _ := initMocks(t)
101 prefBytes := []byte(prefix)
102 request, _, err := handler.parseSetupRequest(append(prefBytes, enbXml...))
103 assert.Equal(t, "6359AB", request.GetPlmnId())
104 assert.Equal(t, "101010101010101010", request.GetNbId())
108 func TestParseSetupRequest_PipFailure(t *testing.T) {
109 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
110 handler, _, _, _, _, _ := initMocks(t)
111 prefBytes := []byte("10.0.2.15:9999")
112 request, _, err := handler.parseSetupRequest(append(prefBytes, xmlGnb...))
113 assert.Nil(t, request)
114 assert.NotNil(t, err)
115 assert.EqualError(t, err, "#E2SetupRequestNotificationHandler.parseSetupRequest - Error parsing E2 Setup Request failed extract Payload: no | separator found")
118 func TestParseSetupRequest_UnmarshalFailure(t *testing.T) {
119 handler, _, _, _, _, _ := initMocks(t)
120 prefBytes := []byte(prefix)
121 request, _, err := handler.parseSetupRequest(append(prefBytes, 1, 2, 3))
122 assert.Nil(t, request)
123 assert.NotNil(t, err)
124 assert.EqualError(t, err, "#E2SetupRequestNotificationHandler.parseSetupRequest - Error unmarshalling E2 Setup Request payload: 31302e302e322e31353a393939397c010203")
127 func TestE2SetupRequestNotificationHandler_GetGeneralConfigurationFailure(t *testing.T) {
128 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
129 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
130 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{}, common.NewInternalError(errors.New("some error")))
131 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
132 handler.Handle(notificationRequest)
133 rmrMessengerMock.AssertNotCalled(t, "SendMsg")
134 e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
135 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance")
136 readerMock.AssertNotCalled(t, "GetNodeb")
137 writerMock.AssertNotCalled(t, "SaveNodeb")
140 func getMbuf(msgType int, payloadStr string, request *models.NotificationRequest) *rmrCgo.MBuf {
141 payload := []byte(payloadStr)
142 mbuf := rmrCgo.NewMBuf(msgType, len(payload), nodebRanName, &payload, &request.TransactionId, request.GetMsgSrc())
146 func TestE2SetupRequestNotificationHandler_EnableRicFalse(t *testing.T) {
147 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
148 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
149 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: false}, nil)
150 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
151 mbuf := getMbuf(rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithMiscCause, notificationRequest)
152 rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, nil)
153 handler.Handle(notificationRequest)
154 rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
155 e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
156 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance")
157 readerMock.AssertNotCalled(t, "GetNodeb")
158 writerMock.AssertNotCalled(t, "SaveNodeb")
161 func TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess(t *testing.T) {
162 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
163 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
164 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
165 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
166 var gnb *entities.NodebInfo
167 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
168 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
169 nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload)
170 nbIdentity := &entities.NbIdentity{InventoryName: nodebRanName, GlobalNbId: &entities.GlobalNbId{PlmnId: "02F829", NbId: "001100000011000000110000"}}
171 writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil)
172 updatedNodebInfo := *nodebInfo
173 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
174 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, "RAN_CONNECTION_STATUS_CHANGE", nodebRanName+"_CONNECTED").Return(nil)
175 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
176 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
177 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
178 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, nil)
179 handler.Handle(notificationRequest)
180 assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
183 func TestE2SetupRequestNotificationHandler_HandleNewGnbWithoutFunctionsSuccess(t *testing.T) {
184 xmlGnb := readXmlFile(t, GnbWithoutFunctionsSetupRequestXmlPath)
185 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
186 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
187 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
188 var gnb *entities.NodebInfo
189 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
190 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
191 nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload)
192 writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil)
193 updatedNodebInfo := *nodebInfo
194 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
195 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, "RAN_CONNECTION_STATUS_CHANGE", nodebRanName+"_CONNECTED").Return(nil)
196 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
197 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
198 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
200 rmrMessage := &rmrCgo.MBuf{}
201 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
202 handler.Handle(notificationRequest)
203 assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
206 func TestE2SetupRequestNotificationHandler_HandleNewEnGnbSuccess(t *testing.T) {
207 xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath)
208 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
209 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
210 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
211 var gnb *entities.NodebInfo
212 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
213 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlEnGnb...)}
214 nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload)
215 writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil)
216 updatedNodebInfo := *nodebInfo
217 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
218 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, "RAN_CONNECTION_STATUS_CHANGE", nodebRanName+"_CONNECTED").Return(nil)
220 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
221 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
222 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
224 rmrMessage := &rmrCgo.MBuf{}
225 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
226 handler.Handle(notificationRequest)
227 assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
230 func TestE2SetupRequestNotificationHandler_HandleNewNgEnbSuccess(t *testing.T) {
231 xmlNgEnb := readXmlFile(t, NgEnbSetupRequestXmlPath)
232 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
233 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
234 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
235 var gnb *entities.NodebInfo
236 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
237 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlNgEnb...)}
238 nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload)
239 writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil)
240 updatedNodebInfo := *nodebInfo
241 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
242 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, "RAN_CONNECTION_STATUS_CHANGE", nodebRanName+"_CONNECTED").Return(nil)
244 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
245 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
246 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
248 rmrMessage := &rmrCgo.MBuf{}
249 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
250 handler.Handle(notificationRequest)
251 assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
254 func TestE2SetupRequestNotificationHandler_HandleExistingGnbSuccess(t *testing.T) {
255 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
257 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
258 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
259 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
260 var gnb = &entities.NodebInfo{
261 RanName: nodebRanName,
262 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
263 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
264 NodeType: entities.Node_GNB,
265 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
267 readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
268 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
270 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
271 gnbToUpdate := getExpectedNodebWithFunctionsForExistingRan(*gnb, notificationRequest.Payload)
272 writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
273 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
275 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty)
276 handler.Handle(notificationRequest)
277 writerMock.AssertCalled(t, "UpdateNodebInfo", gnbToUpdate)
278 assertExistingNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
281 func TestE2SetupRequestNotificationHandler_HandleExistingGnbWithFunctionsSuccess(t *testing.T) {
282 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
284 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
285 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
286 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
287 var gnb = &entities.NodebInfo{
288 RanName: nodebRanName,
289 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
290 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
291 NodeType: entities.Node_GNB,
292 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{RanFunctions: []*entities.RanFunction{
295 RanFunctionRevision: 2,
299 readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
300 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
302 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
303 gnbToUpdate := getExpectedNodebWithFunctionsForExistingRan(*gnb, notificationRequest.Payload)
305 writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
306 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
308 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty)
309 handler.Handle(notificationRequest)
310 writerMock.AssertCalled(t, "UpdateNodebInfo", gnbToUpdate)
311 assertExistingNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
314 func getExpectedNodebWithFunctionsForExistingRan(nodeb entities.NodebInfo, payload []byte) *entities.NodebInfo {
315 pipInd := bytes.IndexByte(payload, '|')
316 setupRequest := &models.E2SetupRequestMessage{}
317 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
318 nodeb.GetGnb().RanFunctions = setupRequest.ExtractRanFunctionsList()
322 func getExpectedNodebWithFunctionsForNewRan(payload []byte) *entities.NodebInfo {
323 pipInd := bytes.IndexByte(payload, '|')
324 setupRequest := &models.E2SetupRequestMessage{}
325 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
327 nodeb := &entities.NodebInfo{
328 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
329 RanName: nodebRanName,
330 NodeType: entities.Node_GNB,
331 Configuration: &entities.NodebInfo_Gnb{
333 RanFunctions: setupRequest.ExtractRanFunctionsList(),
336 GlobalNbId: &entities.GlobalNbId{
337 PlmnId: setupRequest.GetPlmnId(),
338 NbId: setupRequest.GetNbId(),
345 func TestE2SetupRequestNotificationHandler_HandleParseError(t *testing.T) {
346 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
347 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
348 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
349 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte("invalid_prefix"), xmlGnb...)}
350 handler.Handle(notificationRequest)
351 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
352 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
353 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
354 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
355 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
356 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
359 func TestE2SetupRequestNotificationHandler_HandleUnmarshalError(t *testing.T) {
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(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_HandleGetE2TInstanceError(t *testing.T) {
373 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
374 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
375 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
376 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, common.NewResourceNotFoundError("Not found"))
377 prefBytes := []byte(prefix)
378 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
379 handler.Handle(notificationRequest)
380 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
381 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
382 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
383 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
384 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
385 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
386 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
389 func TestE2SetupRequestNotificationHandler_HandleGetNodebError(t *testing.T) {
390 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
391 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
392 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
393 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
394 var gnb *entities.NodebInfo
395 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewInternalError(errors.New("some error")))
396 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
397 handler.Handle(notificationRequest)
398 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
399 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
400 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
401 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
402 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
403 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
404 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
407 func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) {
408 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
410 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
411 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
412 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
413 var gnb *entities.NodebInfo
414 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
415 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
416 nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload)
417 writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil)
418 updatedNodebInfo := *nodebInfo
419 updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
420 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, "RAN_CONNECTION_STATUS_CHANGE", nodebRanName+"_CONNECTED").Return(nil)
421 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
422 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
423 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error"))
424 updatedNodebInfo2 := *nodebInfo
425 updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
426 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo2, "RAN_CONNECTION_STATUS_CHANGE", nodebRanName+"_DISCONNECTED").Return(nil)
428 mbuf := getMbuf(rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithTransportCause, notificationRequest)
429 rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, errEmpty)
430 handler.Handle(notificationRequest)
431 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
432 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
433 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
434 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
435 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
436 rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
439 func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing.T) {
440 xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath)
441 logger := tests.InitLog(t)
442 config := &configuration.Configuration{
443 RnibRetryIntervalMs: 10,
444 MaxRnibConnectionAttempts: 3,
445 StateChangeMessageChannel: "RAN_CONNECTION_STATUS_CHANGE",
446 GlobalRicId: struct {
450 }{Mcc: "327", Mnc: "94", RicId: "10011001101010101011"}}
451 rmrMessengerMock := &mocks.RmrMessengerMock{}
452 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
453 readerMock := &mocks.RnibReaderMock{}
454 writerMock := &mocks.RnibWriterMock{}
455 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
456 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
457 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
458 ranListManager := managers.NewRanListManager(logger)
459 ranAlarmService := services.NewRanAlarmService(logger, config)
460 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
462 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
463 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager)
464 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
465 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
466 var gnb *entities.NodebInfo
467 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
468 writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
469 writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, "RAN_CONNECTION_STATUS_CHANGE", mock.Anything).Return(nil)
470 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
471 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
472 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
474 rmrMessage := &rmrCgo.MBuf{}
475 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
476 prefBytes := []byte(prefix)
477 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlEnGnb...)}
478 handler.Handle(notificationRequest)
479 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
480 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
481 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
482 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
483 writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
484 e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
485 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
488 func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidStatusError(t *testing.T) {
489 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
490 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
491 var gnb = &entities.NodebInfo{RanName: nodebRanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
492 readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
493 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
494 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
495 prefBytes := []byte(prefix)
496 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
497 handler.Handle(notificationRequest)
498 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
499 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
500 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
501 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
502 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
503 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
504 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
507 func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
508 logger := tests.InitLog(t)
509 config := &configuration.Configuration{
510 RnibRetryIntervalMs: 10,
511 MaxRnibConnectionAttempts: 3,
512 StateChangeMessageChannel: "RAN_CONNECTION_STATUS_CHANGE",
513 GlobalRicId: struct {
517 }{Mcc: "327", Mnc: "94", RicId: "AACCE"}}
518 rmrMessengerMock := &mocks.RmrMessengerMock{}
519 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
520 readerMock := &mocks.RnibReaderMock{}
521 writerMock := &mocks.RnibWriterMock{}
522 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
523 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
524 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
525 ranListManager := managers.NewRanListManager(logger)
526 ranAlarmService := services.NewRanAlarmService(logger, config)
527 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
528 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
529 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager)
530 return handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock
533 func assertNewNodebSuccessCalls(readerMock *mocks.RnibReaderMock, t *testing.T, e2tInstancesManagerMock *mocks.E2TInstancesManagerMock, writerMock *mocks.RnibWriterMock, routingManagerClientMock *mocks.RoutingManagerClientMock, rmrMessengerMock *mocks.RmrMessengerMock) {
534 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
535 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
536 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
537 writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
538 e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
539 rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, mock.Anything)
542 func assertExistingNodebSuccessCalls(readerMock *mocks.RnibReaderMock, t *testing.T, e2tInstancesManagerMock *mocks.E2TInstancesManagerMock, writerMock *mocks.RnibWriterMock, routingManagerClientMock *mocks.RoutingManagerClientMock, rmrMessengerMock *mocks.RmrMessengerMock) {
543 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
544 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
545 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
546 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
547 writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
548 e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
549 rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, mock.Anything)