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