[RIC-431] REDESIGN - Add RanListManager methods | Add/Update RnibWriter methods
[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/stretchr/testify/assert"
36         "github.com/stretchr/testify/mock"
37         "io/ioutil"
38         "path/filepath"
39         "testing"
40 )
41
42 const (
43         e2tInstanceFullAddress                   = "10.0.2.15:9999"
44         e2SetupMsgPrefix                         = e2tInstanceFullAddress + "|"
45         nodebRanName                             = "gnb:310-410-b5c67788"
46         GnbSetupRequestXmlPath                   = "../../tests/resources/setupRequest_gnb.xml"
47         EnGnbSetupRequestXmlPath                 = "../../tests/resources/setupRequest_en-gNB.xml"
48         NgEnbSetupRequestXmlPath                 = "../../tests/resources/setupRequest_ng-eNB.xml"
49         EnbSetupRequestXmlPath                   = "../../tests/resources/setupRequest_enb.xml"
50         GnbWithoutFunctionsSetupRequestXmlPath   = "../../tests/resources/setupRequest_gnb_without_functions.xml"
51         E2SetupFailureResponseWithMiscCause      = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>1</id><criticality><ignore/></criticality><value><Cause><misc><om-intervention/></misc></Cause></value></E2setupFailureIEs><E2setupFailureIEs><id>31</id><criticality><ignore/></criticality><value><TimeToWait><v60s/></TimeToWait></value></E2setupFailureIEs></protocolIEs></E2setupFailure></value></unsuccessfulOutcome></E2AP-PDU>"
52         E2SetupFailureResponseWithTransportCause = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>1</id><criticality><ignore/></criticality><value><Cause><transport><transport-resource-unavailable/></transport></Cause></value></E2setupFailureIEs><E2setupFailureIEs><id>31</id><criticality><ignore/></criticality><value><TimeToWait><v60s/></TimeToWait></value></E2setupFailureIEs></protocolIEs></E2setupFailure></value></unsuccessfulOutcome></E2AP-PDU>"
53         StateChangeMessageChannel                = "RAN_CONNECTION_STATUS_CHANGE"
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(e2SetupMsgPrefix)
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(e2SetupMsgPrefix)
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(e2SetupMsgPrefix)
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(e2SetupMsgPrefix)
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(e2SetupMsgPrefix)
122         request, _, err := handler.parseSetupRequest(append(prefBytes, 1, 2, 3))
123         assert.Nil(t, request)
124         assert.NotNil(t, err)
125         assert.EqualError(t, err, "#E2SetupRequestNotificationHandler.parseSetupRequest - Error unmarshalling E2 Setup Request payload: 31302e302e322e31353a393939397c010203")
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(e2SetupMsgPrefix), xmlGnb...)}
133         handler.Handle(notificationRequest)
134         rmrMessengerMock.AssertNotCalled(t, "SendMsg")
135         e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
136         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance")
137         readerMock.AssertNotCalled(t, "GetNodeb")
138         writerMock.AssertNotCalled(t, "SaveNodeb")
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(e2SetupMsgPrefix), xmlGnb...)}
152         mbuf := getMbuf(rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithMiscCause, notificationRequest)
153         rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, nil)
154         handler.Handle(notificationRequest)
155         rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
156         e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
157         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance")
158         readerMock.AssertNotCalled(t, "GetNodeb")
159         writerMock.AssertNotCalled(t, "SaveNodeb")
160 }
161
162
163 func TestE2SetupRequestNotificationHandler_HandleNewRanError(t *testing.T) {
164         xml := readXmlFile(t, GnbSetupRequestXmlPath)
165         handler, readerMock, writerMock, _, e2tInstancesManagerMock, _ := initMocks(t)
166         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
167         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
168         var gnb *entities.NodebInfo
169         readerMock.On("GetNodeb", nodebRanName).Return(gnb, common.NewResourceNotFoundError("Not found"))
170         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
171         nodebInfo := getExpectedNodebForNewRan(notificationRequest.Payload)
172         writerMock.On("SaveNodeb", nodebInfo).Return(common.NewInternalError(errors.New("error")))
173         //nbIdentity := &entities.NbIdentity{InventoryName: nodebRanName, GlobalNbId: nodebInfo.GlobalNbId}
174         // TODO: add writerMock.On("AddNbIdentity")
175         handler.Handle(notificationRequest)
176
177         readerMock.AssertExpectations(t)
178         writerMock.AssertExpectations(t)
179         e2tInstancesManagerMock.AssertExpectations(t)
180 }
181
182 func testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t *testing.T, xmlPath string) {
183         xml := readXmlFile(t, xmlPath)
184         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
185         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
186         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
187         var gnb *entities.NodebInfo
188         readerMock.On("GetNodeb", nodebRanName).Return(gnb, common.NewResourceNotFoundError("Not found"))
189         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
190         nodebInfo := getExpectedNodebForNewRan(notificationRequest.Payload)
191         writerMock.On("SaveNodeb", nodebInfo).Return(nil)
192         //nbIdentity := &entities.NbIdentity{InventoryName: nodebRanName, GlobalNbId: nodebInfo.GlobalNbId}
193         // TODO: add writerMock.On("AddNbIdentity")
194         updatedNodebInfo := *nodebInfo
195         updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
196         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, nodebRanName+"_CONNECTED").Return(nil)
197         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
198         updatedNodebInfo2 := *nodebInfo
199         updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
200         updatedNodebInfo2.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
201         writerMock.On("UpdateNodebInfo", &updatedNodebInfo2).Return(nil)
202         e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{nodebRanName}).Return(nil)
203         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, nil)
204
205         handler.Handle(notificationRequest)
206
207         readerMock.AssertExpectations(t)
208         writerMock.AssertExpectations(t)
209         e2tInstancesManagerMock.AssertExpectations(t)
210 }
211
212
213
214 func TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess(t *testing.T) {
215         testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, GnbSetupRequestXmlPath)
216 }
217
218 func TestE2SetupRequestNotificationHandler_HandleNewGnbWithoutFunctionsSuccess(t *testing.T) {
219         testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, GnbWithoutFunctionsSetupRequestXmlPath)
220 }
221
222 func TestE2SetupRequestNotificationHandler_HandleNewEnGnbSuccess(t *testing.T) {
223         testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, EnGnbSetupRequestXmlPath)
224 }
225
226 func TestE2SetupRequestNotificationHandler_HandleNewNgEnbSuccess(t *testing.T) {
227         testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, NgEnbSetupRequestXmlPath)
228 }
229
230 func testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t *testing.T, withFunctions bool) {
231         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
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 nodebInfo = &entities.NodebInfo{
236                 RanName:                      nodebRanName,
237                 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
238                 ConnectionStatus:             entities.ConnectionStatus_CONNECTED,
239                 NodeType:                     entities.Node_GNB,
240                 Configuration:                &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
241         }
242
243         if withFunctions {
244                 gnb := nodebInfo.GetGnb()
245                 gnb.RanFunctions = []*entities.RanFunction{{RanFunctionId: 2, RanFunctionRevision: 2}}
246         }
247
248         readerMock.On("GetNodeb", nodebRanName).Return(nodebInfo, nil)
249         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
250
251         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
252         gnbToUpdate := getExpectedNodebForExistingRan(*nodebInfo, notificationRequest.Payload)
253         writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
254         e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{nodebRanName}).Return(nil)
255         var errEmpty error
256         rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(&rmrCgo.MBuf{}, errEmpty)
257         handler.Handle(notificationRequest)
258         readerMock.AssertExpectations(t)
259         writerMock.AssertExpectations(t)
260         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 3)
261         e2tInstancesManagerMock.AssertExpectations(t)
262         rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, true)
263 }
264
265 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithoutFunctionsSuccess(t *testing.T) {
266         testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, false)
267 }
268
269 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithFunctionsSuccess(t *testing.T) {
270         testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, true)
271 }
272
273 func TestE2SetupRequestNotificationHandler_HandleExistingDisconnectedGnbSuccess(t *testing.T) {
274         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
275         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
276         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
277         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
278         var nodebInfo = &entities.NodebInfo{
279                 RanName:                      nodebRanName,
280                 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
281                 ConnectionStatus:             entities.ConnectionStatus_DISCONNECTED,
282                 NodeType:                     entities.Node_GNB,
283                 Configuration:                &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
284         }
285
286         readerMock.On("GetNodeb", nodebRanName).Return(nodebInfo, nil)
287         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
288
289         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
290         gnbToUpdate := getExpectedNodebForExistingRan(*nodebInfo, notificationRequest.Payload)
291         writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
292         gnbToUpdate2 := *gnbToUpdate
293         gnbToUpdate2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
294         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &gnbToUpdate2, nodebRanName+"_CONNECTED").Return(nil)
295         gnbToUpdate3 := *gnbToUpdate
296         gnbToUpdate3.ConnectionStatus = entities.ConnectionStatus_CONNECTED
297         gnbToUpdate3.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
298         writerMock.On("UpdateNodebInfo", &gnbToUpdate3).Return(nil)
299         e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{nodebRanName}).Return(nil)
300         var errEmpty error
301         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty)
302         handler.Handle(notificationRequest)
303         readerMock.AssertExpectations(t)
304         writerMock.AssertExpectations(t)
305         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
306         e2tInstancesManagerMock.AssertExpectations(t)
307 }
308
309 func getExpectedNodebForExistingRan(nodeb entities.NodebInfo, payload []byte) *entities.NodebInfo {
310         pipInd := bytes.IndexByte(payload, '|')
311         setupRequest := &models.E2SetupRequestMessage{}
312         _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
313         nodeb.GetGnb().RanFunctions = setupRequest.ExtractRanFunctionsList()
314         return &nodeb
315 }
316
317 func getExpectedNodebForNewRan(payload []byte) *entities.NodebInfo {
318         pipInd := bytes.IndexByte(payload, '|')
319         setupRequest := &models.E2SetupRequestMessage{}
320         _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
321
322         nodeb := &entities.NodebInfo{
323                 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
324                 RanName:                      nodebRanName,
325                 NodeType:                     entities.Node_GNB,
326                 Configuration: &entities.NodebInfo_Gnb{
327                         Gnb: &entities.Gnb{
328                                 RanFunctions: setupRequest.ExtractRanFunctionsList(),
329                         },
330                 },
331                 GlobalNbId: &entities.GlobalNbId{
332                         PlmnId: setupRequest.GetPlmnId(),
333                         NbId:   setupRequest.GetNbId(),
334                 },
335         }
336
337         return nodeb
338 }
339
340 func TestE2SetupRequestNotificationHandler_HandleParseError(t *testing.T) {
341         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
342         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
343         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
344         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte("invalid_prefix"), xmlGnb...)}
345         handler.Handle(notificationRequest)
346         readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
347         writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
348         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
349         writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
350         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
351         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
352 }
353
354 func TestE2SetupRequestNotificationHandler_HandleUnmarshalError(t *testing.T) {
355         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
356         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
357         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), "xmlGnb"...)}
358         handler.Handle(notificationRequest)
359         readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
360         writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
361         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
362         writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
363         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
364         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
365 }
366
367 func TestE2SetupRequestNotificationHandler_HandleGetE2TInstanceError(t *testing.T) {
368         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
369         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
370         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
371         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, common.NewResourceNotFoundError("Not found"))
372         prefBytes := []byte(e2SetupMsgPrefix)
373         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
374         handler.Handle(notificationRequest)
375         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
376         readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
377         writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
378         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
379         writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
380         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
381         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
382 }
383
384 func TestE2SetupRequestNotificationHandler_HandleGetNodebError(t *testing.T) {
385         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
386         handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
387         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
388         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
389         var gnb *entities.NodebInfo
390         readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewInternalError(errors.New("some error")))
391         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
392         handler.Handle(notificationRequest)
393         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
394         readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
395         writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
396         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
397         writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
398         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
399         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
400 }
401
402 func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) {
403         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
404
405         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
406         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
407         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
408         var gnb *entities.NodebInfo
409         readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
410         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
411         nodebInfo := getExpectedNodebForNewRan(notificationRequest.Payload)
412         writerMock.On("SaveNodeb", nodebInfo).Return(nil)
413         updatedNodebInfo := *nodebInfo
414         updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
415         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, nodebRanName+"_CONNECTED").Return(nil)
416         writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
417         e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
418         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error"))
419         updatedNodebInfo2 := *nodebInfo
420         updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
421         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo2, nodebRanName+"_DISCONNECTED").Return(nil)
422         var errEmpty error
423         mbuf := getMbuf(rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithTransportCause, notificationRequest)
424         rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, errEmpty)
425         handler.Handle(notificationRequest)
426         readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
427         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
428         writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
429         routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
430         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
431         rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
432 }
433
434 func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing.T) {
435         xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath)
436         logger := tests.InitLog(t)
437         config := &configuration.Configuration{
438                 RnibRetryIntervalMs:       10,
439                 MaxRnibConnectionAttempts: 3,
440                 RnibWriter: configuration.RnibWriterConfig{
441                         StateChangeMessageChannel: StateChangeMessageChannel,
442                 },
443                 GlobalRicId: struct {
444                         RicId string
445                         Mcc   string
446                         Mnc   string
447                 }{Mcc: "327", Mnc: "94", RicId: "10011001101010101011"}}
448         rmrMessengerMock := &mocks.RmrMessengerMock{}
449         rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
450         readerMock := &mocks.RnibReaderMock{}
451         writerMock := &mocks.RnibWriterMock{}
452         routingManagerClientMock := &mocks.RoutingManagerClientMock{}
453         rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
454         e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
455         ranListManager := managers.NewRanListManager(logger, rnibDataService)
456         ranAlarmService := services.NewRanAlarmService(logger, config)
457         ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
458
459         e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
460         handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager)
461         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
462         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
463         var gnb *entities.NodebInfo
464         readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
465         writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
466         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, mock.Anything).Return(nil)
467         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
468         writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
469         e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
470         var errEmpty error
471         rmrMessage := &rmrCgo.MBuf{}
472         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
473         prefBytes := []byte(e2SetupMsgPrefix)
474         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlEnGnb...)}
475         handler.Handle(notificationRequest)
476         readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
477         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
478         writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
479         routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
480         writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
481         e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
482         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
483 }
484
485 func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidStatusError(t *testing.T) {
486         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
487         handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
488         var gnb = &entities.NodebInfo{RanName: nodebRanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
489         readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
490         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
491         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
492         prefBytes := []byte(e2SetupMsgPrefix)
493         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
494         handler.Handle(notificationRequest)
495         readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
496         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
497         writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
498         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
499         writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
500         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
501         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
502 }
503
504 func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
505         logger := tests.InitLog(t)
506         config := &configuration.Configuration{
507                 RnibRetryIntervalMs:       10,
508                 MaxRnibConnectionAttempts: 3,
509                 RnibWriter: configuration.RnibWriterConfig{
510                         StateChangeMessageChannel: StateChangeMessageChannel,
511                 },
512                 GlobalRicId: struct {
513                         RicId string
514                         Mcc   string
515                         Mnc   string
516                 }{Mcc: "327", Mnc: "94", RicId: "AACCE"}}
517         rmrMessengerMock := &mocks.RmrMessengerMock{}
518         rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
519         readerMock := &mocks.RnibReaderMock{}
520         writerMock := &mocks.RnibWriterMock{}
521         routingManagerClientMock := &mocks.RoutingManagerClientMock{}
522         rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
523         e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
524         ranListManager := managers.NewRanListManager(logger, rnibDataService)
525         ranAlarmService := services.NewRanAlarmService(logger, config)
526         ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
527         e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
528         handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager)
529         return handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock
530 }