[RIC-431] Add Enb | Configuration changes | Some refactoring | K8S yamls
[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                 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)
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)
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("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, StateChangeMessageChannel, mock.Anything).Return(nil)
485         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
486         writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
487         e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
488         var errEmpty error
489         rmrMessage := &rmrCgo.MBuf{}
490         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
491         prefBytes := []byte(e2SetupMsgPrefix)
492         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlEnGnb...)}
493         handler.Handle(notificationRequest)
494         readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
495         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
496         writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
497         routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
498         writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
499         e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
500         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
501 }
502
503 func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidStatusError(t *testing.T) {
504         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
505         handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
506         var gnb = &entities.NodebInfo{RanName: nodebRanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
507         readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
508         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
509         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
510         prefBytes := []byte(e2SetupMsgPrefix)
511         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
512         handler.Handle(notificationRequest)
513         readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
514         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
515         writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
516         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
517         writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
518         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
519         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
520 }
521
522 func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
523         logger := tests.InitLog(t)
524         config := &configuration.Configuration{
525                 RnibRetryIntervalMs:       10,
526                 MaxRnibConnectionAttempts: 3,
527                 RnibWriter: configuration.RnibWriterConfig{
528                         StateChangeMessageChannel: StateChangeMessageChannel,
529                 },
530                 GlobalRicId: struct {
531                         RicId string
532                         Mcc   string
533                         Mnc   string
534                 }{Mcc: "327", Mnc: "94", RicId: "AACCE"}}
535         rmrMessengerMock := &mocks.RmrMessengerMock{}
536         rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
537         readerMock := &mocks.RnibReaderMock{}
538         writerMock := &mocks.RnibWriterMock{}
539         routingManagerClientMock := &mocks.RoutingManagerClientMock{}
540         rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
541         e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
542         ranListManager := managers.NewRanListManager(logger)
543         ranAlarmService := services.NewRanAlarmService(logger, config)
544         ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
545         e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
546         handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager)
547         return handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock
548 }