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