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/golang/protobuf/ptypes/wrappers"
36 "github.com/stretchr/testify/assert"
37 "github.com/stretchr/testify/mock"
44 prefix = "10.0.2.15:9999|"
45 e2tInstanceFullAddress = "10.0.2.15:9999"
46 nodebRanName = "gnb:310-410-b5c67788"
47 GnbSetupRequestXmlPath = "../../tests/resources/setupRequest_gnb.xml"
48 EnGnbSetupRequestXmlPath = "../../tests/resources/setupRequest_en-gNB.xml"
49 NgEnbSetupRequestXmlPath = "../../tests/resources/setupRequest_ng-eNB.xml"
50 EnbSetupRequestXmlPath = "../../tests/resources/setupRequest_enb.xml"
51 GnbWithoutFunctionsSetupRequestXmlPath = "../../tests/resources/setupRequest_gnb_without_functions.xml"
52 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>"
53 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>"
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(prefix)
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(prefix)
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(prefix)
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(prefix)
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(prefix)
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(prefix), 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(prefix), 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_HandleNewGnbSuccess(t *testing.T) {
163 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
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", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
169 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
170 nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload)
171 writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil)
172 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
173 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
174 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
175 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, nil)
176 handler.Handle(notificationRequest)
177 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo)
178 assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
181 func TestE2SetupRequestNotificationHandler_HandleNewGnbWithoutFunctionsSuccess(t *testing.T) {
182 xmlGnb := readXmlFile(t, GnbWithoutFunctionsSetupRequestXmlPath)
183 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
184 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
185 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
186 var gnb *entities.NodebInfo
187 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
188 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
189 nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload)
190 writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil)
191 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
192 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
193 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
195 rmrMessage := &rmrCgo.MBuf{}
196 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
197 handler.Handle(notificationRequest)
198 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo)
199 assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
202 func TestE2SetupRequestNotificationHandler_HandleNewEnGnbSuccess(t *testing.T) {
203 xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath)
204 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
205 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
206 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
207 var gnb *entities.NodebInfo
208 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
209 writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
210 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
211 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
212 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
214 rmrMessage := &rmrCgo.MBuf{}
215 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
216 prefBytes := []byte(prefix)
217 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlEnGnb...)}
218 handler.Handle(notificationRequest)
219 assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
222 func TestE2SetupRequestNotificationHandler_HandleNewNgEnbSuccess(t *testing.T) {
223 xmlNgEnb := readXmlFile(t, NgEnbSetupRequestXmlPath)
224 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
225 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
226 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
227 var gnb *entities.NodebInfo
228 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
229 writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
230 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
231 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
232 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
234 rmrMessage := &rmrCgo.MBuf{}
235 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
236 prefBytes := []byte(prefix)
237 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlNgEnb...)}
238 handler.Handle(notificationRequest)
239 assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
242 func TestE2SetupRequestNotificationHandler_HandleExistingGnbSuccess(t *testing.T) {
243 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
245 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
246 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
247 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
248 var gnb = &entities.NodebInfo{
249 RanName: nodebRanName,
250 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
251 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
252 NodeType: entities.Node_GNB,
253 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
255 readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
256 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
258 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
259 gnbToUpdate := getExpectedNodebWithFunctionsForExistingRan(*gnb, notificationRequest.Payload)
260 writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
261 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
263 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty)
264 handler.Handle(notificationRequest)
265 writerMock.AssertCalled(t, "UpdateNodebInfo", gnbToUpdate)
266 assertExistingNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
269 func TestE2SetupRequestNotificationHandler_HandleExistingGnbWithFunctionsSuccess(t *testing.T) {
270 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
272 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
273 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
274 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
275 var gnb = &entities.NodebInfo{
276 RanName: nodebRanName,
277 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
278 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
279 NodeType: entities.Node_GNB,
280 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{RanFunctions: []*entities.RanFunction{
282 RanFunctionId: &wrappers.UInt32Value{Value: 2},
283 RanFunctionRevision: &wrappers.UInt32Value{Value: 2},
287 readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
288 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
290 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
291 gnbToUpdate := getExpectedNodebWithFunctionsForExistingRan(*gnb, notificationRequest.Payload)
293 writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
294 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
296 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty)
297 handler.Handle(notificationRequest)
298 writerMock.AssertCalled(t, "UpdateNodebInfo", gnbToUpdate)
299 assertExistingNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
302 func getExpectedNodebWithFunctionsForExistingRan(nodeb entities.NodebInfo, payload []byte) *entities.NodebInfo {
303 pipInd := bytes.IndexByte(payload, '|')
304 setupRequest := &models.E2SetupRequestMessage{}
305 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
306 nodeb.GetGnb().RanFunctions = setupRequest.ExtractRanFunctionsList()
310 func getExpectedNodebWithFunctionsForNewRan(payload []byte) *entities.NodebInfo {
311 pipInd := bytes.IndexByte(payload, '|')
312 setupRequest := &models.E2SetupRequestMessage{}
313 _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
315 nodeb := &entities.NodebInfo{
316 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
317 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
318 RanName: nodebRanName,
319 NodeType: entities.Node_GNB,
320 Configuration: &entities.NodebInfo_Gnb{
322 RanFunctions: setupRequest.ExtractRanFunctionsList(),
325 GlobalNbId: &entities.GlobalNbId{
326 PlmnId: setupRequest.GetPlmnId(),
327 NbId: setupRequest.GetNbId(),
334 func TestE2SetupRequestNotificationHandler_HandleParseError(t *testing.T) {
335 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
336 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
337 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
338 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte("invalid_prefix"), xmlGnb...)}
339 handler.Handle(notificationRequest)
340 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
341 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
342 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
343 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
344 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
345 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
348 func TestE2SetupRequestNotificationHandler_HandleUnmarshalError(t *testing.T) {
349 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
350 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
351 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), "xmlGnb"...)}
352 handler.Handle(notificationRequest)
353 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
354 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
355 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
356 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
357 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
358 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
361 func TestE2SetupRequestNotificationHandler_HandleGetE2TInstanceError(t *testing.T) {
362 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
363 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
364 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
365 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, common.NewResourceNotFoundError("Not found"))
366 prefBytes := []byte(prefix)
367 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
368 handler.Handle(notificationRequest)
369 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
370 readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
371 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
372 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
373 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
374 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
375 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
378 func TestE2SetupRequestNotificationHandler_HandleGetNodebError(t *testing.T) {
379 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
380 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
381 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
382 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
383 var gnb *entities.NodebInfo
384 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewInternalError(errors.New("some error")))
385 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
386 handler.Handle(notificationRequest)
387 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
388 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
389 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
390 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
391 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
392 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
393 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
396 func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) {
397 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
399 handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
400 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
401 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
402 var gnb *entities.NodebInfo
403 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
404 writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
405 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
406 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
407 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error"))
409 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
410 mbuf := getMbuf(rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithTransportCause, notificationRequest)
411 rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, errEmpty)
412 handler.Handle(notificationRequest)
413 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
414 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
415 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
416 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
417 writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
418 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
419 rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
422 func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing.T) {
423 xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath)
424 logger := tests.InitLog(t)
425 config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3, GlobalRicId: struct {
429 }{Mcc: "327", Mnc: "94", RicId: "10011001101010101011"}}
430 rmrMessengerMock := &mocks.RmrMessengerMock{}
431 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
432 readerMock := &mocks.RnibReaderMock{}
433 writerMock := &mocks.RnibWriterMock{}
434 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
435 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
436 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
437 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock)
438 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager)
439 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
440 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
441 var gnb *entities.NodebInfo
442 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
443 writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
444 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
445 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
446 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
448 rmrMessage := &rmrCgo.MBuf{}
449 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
450 prefBytes := []byte(prefix)
451 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlEnGnb...)}
452 handler.Handle(notificationRequest)
453 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
454 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
455 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
456 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
457 writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
458 e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
459 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
462 func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidStatusError(t *testing.T) {
463 xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
464 handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
465 var gnb = &entities.NodebInfo{RanName: nodebRanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
466 readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
467 readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
468 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
469 prefBytes := []byte(prefix)
470 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
471 handler.Handle(notificationRequest)
472 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
473 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
474 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
475 routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
476 writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
477 e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
478 rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
481 func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
482 logger := tests.InitLog(t)
483 config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3, GlobalRicId: struct {
487 }{Mcc: "327", Mnc: "94", RicId: "AACCE"}}
488 rmrMessengerMock := &mocks.RmrMessengerMock{}
489 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
490 readerMock := &mocks.RnibReaderMock{}
491 writerMock := &mocks.RnibWriterMock{}
492 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
493 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
494 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
495 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock)
496 handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager)
497 return handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock
500 func assertNewNodebSuccessCalls(readerMock *mocks.RnibReaderMock, t *testing.T, e2tInstancesManagerMock *mocks.E2TInstancesManagerMock, writerMock *mocks.RnibWriterMock, routingManagerClientMock *mocks.RoutingManagerClientMock, rmrMessengerMock *mocks.RmrMessengerMock) {
501 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
502 writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
503 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
504 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
505 writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
506 e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
507 rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, mock.Anything)
510 func assertExistingNodebSuccessCalls(readerMock *mocks.RnibReaderMock, t *testing.T, e2tInstancesManagerMock *mocks.E2TInstancesManagerMock, writerMock *mocks.RnibWriterMock, routingManagerClientMock *mocks.RoutingManagerClientMock, rmrMessengerMock *mocks.RmrMessengerMock) {
511 readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
512 writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
513 e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
514 routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
515 writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
516 e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
517 rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, mock.Anything)