f0af881bf955b137bb0dfda70bf53561dcbdeb97
[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         gnbNodebRanName                          = "gnb:310-410-b5c67788"
46         enbNodebRanName                          = "enB_macro:P310-410-b5c67788"
47         GnbSetupRequestXmlPath                   = "../../tests/resources/setupRequest_gnb.xml"
48         EnGnbSetupRequestXmlPath                 = "../../tests/resources/setupRequest_en-gNB.xml"
49         NgEnbSetupRequestXmlPath                 = "../../tests/resources/setupRequest_ng-eNB.xml"
50         EnbSetupRequestXmlPath                   = "../../tests/resources/setupRequest_enb.xml"
51         GnbWithoutFunctionsSetupRequestXmlPath   = "../../tests/resources/setupRequest_gnb_without_functions.xml"
52         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>"
53         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>"
54         E2SetupFailureResponseWithRicCause      = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>1</id><criticality><ignore/></criticality><value><Cause><ricRequest><request-id-unknown/></ricRequest></Cause></value></E2setupFailureIEs><E2setupFailureIEs><id>31</id><criticality><ignore/></criticality><value><TimeToWait><v60s/></TimeToWait></value></E2setupFailureIEs></protocolIEs></E2setupFailure></value></unsuccessfulOutcome></E2AP-PDU>"
55         StateChangeMessageChannel                = "RAN_CONNECTION_STATUS_CHANGE"
56 )
57
58 func readXmlFile(t *testing.T, xmlPath string) []byte {
59         path, err := filepath.Abs(xmlPath)
60         if err != nil {
61                 t.Fatal(err)
62         }
63         xmlAsBytes, err := ioutil.ReadFile(path)
64         if err != nil {
65                 t.Fatal(err)
66         }
67
68         return xmlAsBytes
69 }
70
71 func TestParseGnbSetupRequest_Success(t *testing.T) {
72         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
73         handler, _, _, _, _, _ := initMocks(t)
74         prefBytes := []byte(e2SetupMsgPrefix)
75         request, _, err := handler.parseSetupRequest(append(prefBytes, xmlGnb...))
76         assert.Equal(t, "02F829", request.GetPlmnId())
77         assert.Equal(t, "001100000011000000110000", request.GetNbId())
78         assert.Nil(t, err)
79 }
80
81 func TestParseEnGnbSetupRequest_Success(t *testing.T) {
82         enGnbXml := readXmlFile(t, EnGnbSetupRequestXmlPath)
83         handler, _, _, _, _, _ := initMocks(t)
84         prefBytes := []byte(e2SetupMsgPrefix)
85         request, _, err := handler.parseSetupRequest(append(prefBytes, enGnbXml...))
86         assert.Equal(t, "131014", request.GetPlmnId())
87         assert.Equal(t, "11000101110001101100011111111000", request.GetNbId())
88         assert.Nil(t, err)
89 }
90
91 func TestParseNgEnbSetupRequest_Success(t *testing.T) {
92         ngEnbXml := readXmlFile(t, NgEnbSetupRequestXmlPath)
93         handler, _, _, _, _, _ := initMocks(t)
94         prefBytes := []byte(e2SetupMsgPrefix)
95         request, _, err := handler.parseSetupRequest(append(prefBytes, ngEnbXml...))
96         assert.Equal(t, "131014", request.GetPlmnId())
97         assert.Equal(t, "101010101010101010", request.GetNbId())
98         assert.Nil(t, err)
99 }
100
101 func TestParseEnbSetupRequest_Success(t *testing.T) {
102         enbXml := readXmlFile(t, EnbSetupRequestXmlPath)
103         handler, _, _, _, _, _ := initMocks(t)
104         prefBytes := []byte(e2SetupMsgPrefix)
105         request, _, err := handler.parseSetupRequest(append(prefBytes, enbXml...))
106         assert.Equal(t, "6359AB", request.GetPlmnId())
107         assert.Equal(t, "101010101010101010", request.GetNbId())
108         assert.Nil(t, err)
109 }
110
111 func TestParseSetupRequest_PipFailure(t *testing.T) {
112         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
113         handler, _, _, _, _, _ := initMocks(t)
114         prefBytes := []byte("10.0.2.15:9999")
115         request, _, err := handler.parseSetupRequest(append(prefBytes, xmlGnb...))
116         assert.Nil(t, request)
117         assert.NotNil(t, err)
118         assert.EqualError(t, err, "#E2SetupRequestNotificationHandler.parseSetupRequest - Error parsing E2 Setup Request failed extract Payload: no | separator found")
119 }
120
121 func TestParseSetupRequest_UnmarshalFailure(t *testing.T) {
122         handler, _, _, _, _, _ := initMocks(t)
123         prefBytes := []byte(e2SetupMsgPrefix)
124         request, _, err := handler.parseSetupRequest(append(prefBytes, 1, 2, 3))
125         assert.Nil(t, request)
126         assert.NotNil(t, err)
127         assert.EqualError(t, err, "#E2SetupRequestNotificationHandler.parseSetupRequest - Error unmarshalling E2 Setup Request payload: 31302e302e322e31353a393939397c010203")
128 }
129
130 func TestE2SetupRequestNotificationHandler_GetGeneralConfigurationFailure(t *testing.T) {
131         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
132         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
133         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{}, common.NewInternalError(errors.New("some error")))
134         notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
135         handler.Handle(notificationRequest)
136         rmrMessengerMock.AssertNotCalled(t, "SendMsg")
137         e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
138         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance")
139         readerMock.AssertNotCalled(t, "GetNodeb")
140         writerMock.AssertNotCalled(t, "SaveNodeb")
141 }
142
143 func getMbuf(ranName string, msgType int, payloadStr string, request *models.NotificationRequest) *rmrCgo.MBuf {
144         payload := []byte(payloadStr)
145         mbuf := rmrCgo.NewMBuf(msgType, len(payload), ranName, &payload, &request.TransactionId, request.GetMsgSrc())
146         return mbuf
147 }
148
149 func TestE2SetupRequestNotificationHandler_EnableRicFalse(t *testing.T) {
150         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
151         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
152         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: false}, nil)
153         notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
154         mbuf := getMbuf(gnbNodebRanName, rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithMiscCause, notificationRequest)
155         rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, nil)
156         handler.Handle(notificationRequest)
157         rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
158         e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
159         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance")
160         readerMock.AssertNotCalled(t, "GetNodeb")
161         writerMock.AssertNotCalled(t, "SaveNodeb")
162 }
163
164 func TestE2SetupRequestNotificationHandler_HandleNewRanSaveNodebFailure(t *testing.T) {
165         xml := readXmlFile(t, GnbSetupRequestXmlPath)
166         handler, readerMock, writerMock, _, e2tInstancesManagerMock, _ := initMocks(t)
167         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
168         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
169         var gnb *entities.NodebInfo
170         readerMock.On("GetNodeb", gnbNodebRanName).Return(gnb, common.NewResourceNotFoundError("Not found"))
171         notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
172         nodebInfo := getExpectedGnbNodebForNewRan(notificationRequest.Payload)
173         writerMock.On("SaveNodeb", nodebInfo).Return(common.NewInternalError(errors.New("error")))
174         handler.Handle(notificationRequest)
175
176         readerMock.AssertExpectations(t)
177         writerMock.AssertExpectations(t)
178         e2tInstancesManagerMock.AssertExpectations(t)
179 }
180
181 func TestE2SetupRequestNotificationHandler_HandleNewRan_invalidRanName(t *testing.T) {
182         xml := readXmlFile(t, EnbSetupRequestXmlPath)
183         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initMocks(t)
184         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
185         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
186         var enb *entities.NodebInfo
187         invalidEnbRanName := "enB-macro:P310-410-b5c67788"
188         readerMock.On("GetNodeb", invalidEnbRanName).Return(enb, common.NewResourceNotFoundError("Not found"))
189         notificationRequest := &models.NotificationRequest{RanName: invalidEnbRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
190         mbuf := getMbuf(invalidEnbRanName, rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithRicCause, notificationRequest)
191         rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, nil)
192         handler.Handle(notificationRequest)
193
194         readerMock.AssertExpectations(t)
195         writerMock.AssertExpectations(t)
196         rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
197         e2tInstancesManagerMock.AssertExpectations(t)
198 }
199
200 func TestE2SetupRequestNotificationHandler_HandleNewRanAddNbIdentityFailure(t *testing.T) {
201         xml := readXmlFile(t, GnbSetupRequestXmlPath)
202         handler, readerMock, writerMock, _, e2tInstancesManagerMock, _ := initMocks(t)
203         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
204         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
205         var gnb *entities.NodebInfo
206         readerMock.On("GetNodeb", gnbNodebRanName).Return(gnb, common.NewResourceNotFoundError("Not found"))
207         notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
208         nodebInfo := getExpectedGnbNodebForNewRan(notificationRequest.Payload)
209         writerMock.On("SaveNodeb", nodebInfo).Return(nil)
210         nbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, GlobalNbId: nodebInfo.GlobalNbId}
211         writerMock.On("AddNbIdentity", entities.Node_GNB, nbIdentity).Return(common.NewInternalError(errors.New("error")))
212         handler.Handle(notificationRequest)
213         readerMock.AssertExpectations(t)
214         writerMock.AssertExpectations(t)
215         e2tInstancesManagerMock.AssertExpectations(t)
216 }
217
218 func testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t *testing.T, xmlPath string, nodeType entities.Node_Type) {
219         xml := readXmlFile(t, xmlPath)
220         var ranName string
221         if nodeType == entities.Node_GNB {
222                 ranName = gnbNodebRanName
223         } else {
224                 ranName = enbNodebRanName
225         }
226         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
227         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
228         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
229         var gnb *entities.NodebInfo
230         readerMock.On("GetNodeb", ranName).Return(gnb, common.NewResourceNotFoundError("Not found"))
231         notificationRequest := &models.NotificationRequest{RanName: ranName, Payload: append([]byte(e2SetupMsgPrefix), xml...)}
232         var expectedNodebInfo *entities.NodebInfo
233         if nodeType == entities.Node_GNB {
234                 expectedNodebInfo = getExpectedGnbNodebForNewRan(notificationRequest.Payload)
235         } else {
236                 expectedNodebInfo = getExpectedEnbNodebForNewRan(notificationRequest.Payload)
237         }
238         writerMock.On("SaveNodeb", expectedNodebInfo).Return(nil)
239         nbIdentity := &entities.NbIdentity{InventoryName: ranName, GlobalNbId: expectedNodebInfo.GlobalNbId}
240         writerMock.On("AddNbIdentity", nodeType, nbIdentity).Return(nil)
241         updatedNodebInfo := *expectedNodebInfo
242         updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
243         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, ranName+"_CONNECTED").Return(nil)
244         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
245         updatedNodebInfo2 := *expectedNodebInfo
246         updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
247         updatedNodebInfo2.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
248         writerMock.On("UpdateNodebInfo", &updatedNodebInfo2).Return(nil)
249         e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{ranName}).Return(nil)
250         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, nil)
251
252         handler.Handle(notificationRequest)
253
254         readerMock.AssertExpectations(t)
255         writerMock.AssertExpectations(t)
256         e2tInstancesManagerMock.AssertExpectations(t)
257 }
258
259 func TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess(t *testing.T) {
260         testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, GnbSetupRequestXmlPath, entities.Node_GNB)
261 }
262
263 func TestE2SetupRequestNotificationHandler_HandleNewGnbWithoutFunctionsSuccess(t *testing.T) {
264         testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, GnbWithoutFunctionsSetupRequestXmlPath, entities.Node_GNB)
265 }
266
267 func TestE2SetupRequestNotificationHandler_HandleNewEnGnbSuccess(t *testing.T) {
268         testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, EnGnbSetupRequestXmlPath, entities.Node_GNB)
269 }
270
271 func TestE2SetupRequestNotificationHandler_HandleNewNgEnbSuccess(t *testing.T) {
272         testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t, NgEnbSetupRequestXmlPath, entities.Node_ENB)
273 }
274
275 func TestExtractionOfNodeTypeFromRanName(t *testing.T) {
276         handler, _, _, _, _, _ := initMocks(t)
277         validRanNames := []string {"gnb_P310_410_b5c67788","en_gnb_P310_410_b5c67788","ng_enB_macro_P310_410_b5c67788","ng_enB_shortmacro_P310_410_b5c67788","ng_enB_longmacro_P310_410_b5c67788","enB_macro_P310_410_b5c67788","enB_home_P310_410_b5c67788","enB_shortmacro_P310_410_b5c67788","enB_longmacro_P310_410_b5c67788"}
278         for _,v := range validRanNames {
279                 nodeb := &entities.NodebInfo{RanName: v}
280                 err := handler.setNodeTypeAndConfiguration(nodeb)
281                 assert.Nil(t, err)
282         }
283         inValidRanNames := []string {"P310_410_b5c67788","blabla_P310_410_b5c67788","ng_enB-macro_P310_410_b5c67788","ng_enb_shortmacro_P310_410_b5c67788","ng_enB-longmacro_P310_410_b5c67788","enB_new_macro_P310_410_b5c67788"}
284         for _,v := range inValidRanNames {
285                 nodeb := &entities.NodebInfo{RanName: v}
286                 err := handler.setNodeTypeAndConfiguration(nodeb)
287                 assert.NotNil(t, err, v)
288         }
289 }
290
291 func testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t *testing.T, withFunctions bool) {
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:                      gnbNodebRanName,
298                 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
299                 ConnectionStatus:             entities.ConnectionStatus_CONNECTED,
300                 NodeType:                     entities.Node_GNB,
301                 Configuration:                &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
302         }
303
304         if withFunctions {
305                 gnb := nodebInfo.GetGnb()
306                 gnb.RanFunctions = []*entities.RanFunction{{RanFunctionId: 2, RanFunctionRevision: 2}}
307         }
308
309         readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil)
310         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
311
312         notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
313         gnbToUpdate := getExpectedNodebForExistingRan(*nodebInfo, notificationRequest.Payload)
314         writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
315         e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{gnbNodebRanName}).Return(nil)
316         var errEmpty error
317         rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(&rmrCgo.MBuf{}, errEmpty)
318         handler.Handle(notificationRequest)
319         readerMock.AssertExpectations(t)
320         writerMock.AssertExpectations(t)
321         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 3)
322         e2tInstancesManagerMock.AssertExpectations(t)
323         rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, true)
324 }
325
326 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithoutFunctionsSuccess(t *testing.T) {
327         testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, false)
328 }
329
330 func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithFunctionsSuccess(t *testing.T) {
331         testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t, true)
332 }
333
334 func TestE2SetupRequestNotificationHandler_HandleExistingDisconnectedGnbSuccess(t *testing.T) {
335         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
336         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
337         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
338         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
339         var nodebInfo = &entities.NodebInfo{
340                 RanName:                      gnbNodebRanName,
341                 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
342                 ConnectionStatus:             entities.ConnectionStatus_DISCONNECTED,
343                 NodeType:                     entities.Node_GNB,
344                 Configuration:                &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
345         }
346
347         readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil)
348         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
349
350         notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
351         gnbToUpdate := getExpectedNodebForExistingRan(*nodebInfo, notificationRequest.Payload)
352         writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
353         gnbToUpdate2 := *gnbToUpdate
354         gnbToUpdate2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
355         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &gnbToUpdate2, gnbNodebRanName+"_CONNECTED").Return(nil)
356         gnbToUpdate3 := *gnbToUpdate
357         gnbToUpdate3.ConnectionStatus = entities.ConnectionStatus_CONNECTED
358         gnbToUpdate3.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
359         writerMock.On("UpdateNodebInfo", &gnbToUpdate3).Return(nil)
360         e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{gnbNodebRanName}).Return(nil)
361         var errEmpty error
362         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty)
363         handler.Handle(notificationRequest)
364         readerMock.AssertExpectations(t)
365         writerMock.AssertExpectations(t)
366         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
367         e2tInstancesManagerMock.AssertExpectations(t)
368 }
369
370 func getExpectedNodebForExistingRan(nodeb entities.NodebInfo, payload []byte) *entities.NodebInfo {
371         pipInd := bytes.IndexByte(payload, '|')
372         setupRequest := &models.E2SetupRequestMessage{}
373         _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
374         nodeb.GetGnb().RanFunctions = setupRequest.ExtractRanFunctionsList()
375         return &nodeb
376 }
377
378 func getExpectedGnbNodebForNewRan(payload []byte) *entities.NodebInfo {
379         pipInd := bytes.IndexByte(payload, '|')
380         setupRequest := &models.E2SetupRequestMessage{}
381         _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
382
383         nodeb := &entities.NodebInfo{
384                 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
385                 RanName:                      gnbNodebRanName,
386                 SetupFromNetwork:             true,
387                 NodeType:                     entities.Node_GNB,
388                 Configuration: &entities.NodebInfo_Gnb{
389                         Gnb: &entities.Gnb{
390                                 GnbType:      entities.GnbType_GNB,
391                                 RanFunctions: setupRequest.ExtractRanFunctionsList(),
392                         },
393                 },
394                 GlobalNbId: &entities.GlobalNbId{
395                         PlmnId: setupRequest.GetPlmnId(),
396                         NbId:   setupRequest.GetNbId(),
397                 },
398         }
399
400         return nodeb
401 }
402
403 func getExpectedEnbNodebForNewRan(payload []byte) *entities.NodebInfo {
404         pipInd := bytes.IndexByte(payload, '|')
405         setupRequest := &models.E2SetupRequestMessage{}
406         _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
407
408         nodeb := &entities.NodebInfo{
409                 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
410                 RanName:                      enbNodebRanName,
411                 SetupFromNetwork:             true,
412                 NodeType:                     entities.Node_ENB,
413                 Configuration: &entities.NodebInfo_Enb{
414                         Enb: &entities.Enb{
415                                 EnbType:      entities.EnbType_MACRO_ENB,
416                         },
417                 },
418                 GlobalNbId: &entities.GlobalNbId{
419                         PlmnId: setupRequest.GetPlmnId(),
420                         NbId:   setupRequest.GetNbId(),
421                 },
422         }
423
424         return nodeb
425 }
426
427 func TestE2SetupRequestNotificationHandler_HandleParseError(t *testing.T) {
428         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
429         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
430         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
431         notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte("invalid_prefix"), xmlGnb...)}
432         handler.Handle(notificationRequest)
433         readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
434         writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
435         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
436         writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
437         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
438         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
439 }
440
441 func TestE2SetupRequestNotificationHandler_HandleUnmarshalError(t *testing.T) {
442         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
443         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
444         notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), "xmlGnb"...)}
445         handler.Handle(notificationRequest)
446         readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
447         writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
448         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
449         writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
450         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
451         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
452 }
453
454 func TestE2SetupRequestNotificationHandler_HandleGetE2TInstanceError(t *testing.T) {
455         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
456         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
457         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
458         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, common.NewResourceNotFoundError("Not found"))
459         prefBytes := []byte(e2SetupMsgPrefix)
460         notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append(prefBytes, xmlGnb...)}
461         handler.Handle(notificationRequest)
462         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
463         readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
464         writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
465         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
466         writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
467         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
468         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
469 }
470
471 func TestE2SetupRequestNotificationHandler_HandleGetNodebError(t *testing.T) {
472         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
473         handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
474         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
475         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
476         var gnb *entities.NodebInfo
477         readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewInternalError(errors.New("some error")))
478         notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
479         handler.Handle(notificationRequest)
480         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
481         readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
482         writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
483         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
484         writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
485         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
486         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
487 }
488
489 func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) {
490         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
491
492         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
493         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
494         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
495         var gnb *entities.NodebInfo
496         readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
497         notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)}
498         nodebInfo := getExpectedGnbNodebForNewRan(notificationRequest.Payload)
499         writerMock.On("SaveNodeb", nodebInfo).Return(nil)
500         nbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, GlobalNbId: nodebInfo.GlobalNbId}
501         writerMock.On("AddNbIdentity", entities.Node_GNB, nbIdentity).Return(nil)
502         updatedNodebInfo := *nodebInfo
503         updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
504         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, gnbNodebRanName+"_CONNECTED").Return(nil)
505         writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
506         e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
507         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error"))
508         updatedNodebInfo2 := *nodebInfo
509         updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
510         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo2, gnbNodebRanName+"_DISCONNECTED").Return(nil)
511         var errEmpty error
512         mbuf := getMbuf(gnbNodebRanName, rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithTransportCause, notificationRequest)
513         rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, errEmpty)
514         handler.Handle(notificationRequest)
515         readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
516         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
517         writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
518         routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
519         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
520         rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
521 }
522
523 func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing.T) {
524         xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath)
525         logger := tests.InitLog(t)
526         config := &configuration.Configuration{
527                 RnibRetryIntervalMs:       10,
528                 MaxRnibConnectionAttempts: 3,
529                 RnibWriter: configuration.RnibWriterConfig{
530                         StateChangeMessageChannel: StateChangeMessageChannel,
531                 },
532                 GlobalRicId: struct {
533                         RicId string
534                         Mcc   string
535                         Mnc   string
536                 }{Mcc: "327", Mnc: "94", RicId: "10011001101010101011"}}
537         rmrMessengerMock := &mocks.RmrMessengerMock{}
538         rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
539         readerMock := &mocks.RnibReaderMock{}
540         writerMock := &mocks.RnibWriterMock{}
541         routingManagerClientMock := &mocks.RoutingManagerClientMock{}
542         rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
543         e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
544         ranListManager := managers.NewRanListManager(logger, rnibDataService)
545         ranAlarmService := services.NewRanAlarmService(logger, config)
546         ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
547
548         e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
549         handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager, ranListManager)
550         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
551         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
552         var gnb *entities.NodebInfo
553         readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
554         writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
555         writerMock.On("AddNbIdentity", entities.Node_GNB, mock.Anything).Return(nil)
556         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, mock.Anything).Return(nil)
557         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
558         writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
559         e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
560         var errEmpty error
561         rmrMessage := &rmrCgo.MBuf{}
562         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
563         prefBytes := []byte(e2SetupMsgPrefix)
564         notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append(prefBytes, xmlEnGnb...)}
565         handler.Handle(notificationRequest)
566         readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
567         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
568         writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
569         routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
570         writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
571         e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
572         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
573 }
574
575 func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidStatusError(t *testing.T) {
576         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
577         handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
578         var gnb = &entities.NodebInfo{RanName: gnbNodebRanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
579         readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
580         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
581         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
582         prefBytes := []byte(e2SetupMsgPrefix)
583         notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append(prefBytes, xmlGnb...)}
584         handler.Handle(notificationRequest)
585         readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
586         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
587         writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
588         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
589         writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
590         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
591         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
592 }
593
594 func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
595         logger := tests.InitLog(t)
596         config := &configuration.Configuration{
597                 RnibRetryIntervalMs:       10,
598                 MaxRnibConnectionAttempts: 3,
599                 RnibWriter: configuration.RnibWriterConfig{
600                         StateChangeMessageChannel: StateChangeMessageChannel,
601                 },
602                 GlobalRicId: struct {
603                         RicId string
604                         Mcc   string
605                         Mnc   string
606                 }{Mcc: "327", Mnc: "94", RicId: "AACCE"}}
607         rmrMessengerMock := &mocks.RmrMessengerMock{}
608         rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
609         readerMock := &mocks.RnibReaderMock{}
610         writerMock := &mocks.RnibWriterMock{}
611         routingManagerClientMock := &mocks.RoutingManagerClientMock{}
612         rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
613         e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
614         ranListManager := managers.NewRanListManager(logger, rnibDataService)
615         ranAlarmService := services.NewRanAlarmService(logger, config)
616         ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
617         e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
618         handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager, ranListManager)
619         return handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock
620 }