41ddccad5f5a540e465c3231534942ea3878a76a
[ric-plt/e2mgr.git] / E2Manager / handlers / rmrmsghandlers / e2_setup_request_notification_handler_test.go
1 //
2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
4 //
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
8 //
9 //      http://www.apache.org/licenses/LICENSE-2.0
10 //
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.
16
17 //  This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 //  platform project (RICP).
19
20 package rmrmsghandlers
21
22 import (
23         "bytes"
24         "e2mgr/configuration"
25         "e2mgr/managers"
26         "e2mgr/mocks"
27         "e2mgr/models"
28         "e2mgr/rmrCgo"
29         "e2mgr/services"
30         "e2mgr/tests"
31         "encoding/xml"
32         "errors"
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"
38         "io/ioutil"
39         "path/filepath"
40         "testing"
41 )
42
43 const (
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>"
54 )
55
56 func readXmlFile(t *testing.T, xmlPath string) []byte {
57         path, err := filepath.Abs(xmlPath)
58         if err != nil {
59                 t.Fatal(err)
60         }
61         xmlAsBytes, err := ioutil.ReadFile(path)
62         if err != nil {
63                 t.Fatal(err)
64         }
65
66         return xmlAsBytes
67 }
68
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())
76         assert.Nil(t, err)
77 }
78
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())
86         assert.Nil(t, err)
87 }
88
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())
96         assert.Nil(t, err)
97 }
98
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())
106         assert.Nil(t, err)
107 }
108
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")
117 }
118
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")
126 }
127
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")
139 }
140
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() )
144         return mbuf
145 }
146
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")
160 }
161
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)
179 }
180
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)
194         var errEmpty error
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)
200 }
201
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)
213         var errEmpty error
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)
220 }
221
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)
233         var errEmpty error
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)
240 }
241
242 func TestE2SetupRequestNotificationHandler_HandleExistingGnbSuccess(t *testing.T) {
243         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
244
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{}},
254         }
255         readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
256         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
257
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)
262         var errEmpty error
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)
267 }
268
269 func TestE2SetupRequestNotificationHandler_HandleExistingGnbWithFunctionsSuccess(t *testing.T) {
270         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
271
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{
281                         {
282                                 RanFunctionId:       &wrappers.UInt32Value{Value: 2},
283                                 RanFunctionRevision: &wrappers.UInt32Value{Value: 2},
284                         },
285                 }}},
286         }
287         readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
288         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
289
290         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
291         gnbToUpdate := getExpectedNodebWithFunctionsForExistingRan(*gnb, notificationRequest.Payload)
292
293         writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
294         e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
295         var errEmpty error
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)
300 }
301
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()
307         return &nodeb
308 }
309
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)
314
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{
321                         Gnb: &entities.Gnb{
322                                 RanFunctions: setupRequest.ExtractRanFunctionsList(),
323                         },
324                 },
325                 GlobalNbId: &entities.GlobalNbId{
326                         PlmnId: setupRequest.GetPlmnId(),
327                         NbId:   setupRequest.GetNbId(),
328                 },
329         }
330
331         return nodeb
332 }
333
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)
346 }
347
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)
359 }
360
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)
376 }
377
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)
394 }
395
396 func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) {
397         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
398
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"))
408         var errEmpty 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)
420 }
421
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 {
426                 RicId string
427                 Mcc   string
428                 Mnc   string
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)
447         var errEmpty error
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)
460 }
461
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)
479 }
480
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 {
484                 RicId string
485                 Mcc   string
486                 Mnc   string
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
498 }
499
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)
508 }
509
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)
518 }