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