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