[RIC-475] [RIC-507] Inject RanStatusChangeManager | Enhance E2 Setup flow | Remove...
[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         prefix                                   = "10.0.2.15:9999|"
44         e2tInstanceFullAddress                   = "10.0.2.15:9999"
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 )
54
55 func readXmlFile(t *testing.T, xmlPath string) []byte {
56         path, err := filepath.Abs(xmlPath)
57         if err != nil {
58                 t.Fatal(err)
59         }
60         xmlAsBytes, err := ioutil.ReadFile(path)
61         if err != nil {
62                 t.Fatal(err)
63         }
64
65         return xmlAsBytes
66 }
67
68 func TestParseGnbSetupRequest_Success(t *testing.T) {
69         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
70         handler, _, _, _, _, _ := initMocks(t)
71         prefBytes := []byte(prefix)
72         request, _, err := handler.parseSetupRequest(append(prefBytes, xmlGnb...))
73         assert.Equal(t, "02F829", request.GetPlmnId())
74         assert.Equal(t, "001100000011000000110000", request.GetNbId())
75         assert.Nil(t, err)
76 }
77
78 func TestParseEnGnbSetupRequest_Success(t *testing.T) {
79         enGnbXml := readXmlFile(t, EnGnbSetupRequestXmlPath)
80         handler, _, _, _, _, _ := initMocks(t)
81         prefBytes := []byte(prefix)
82         request, _, err := handler.parseSetupRequest(append(prefBytes, enGnbXml...))
83         assert.Equal(t, "131014", request.GetPlmnId())
84         assert.Equal(t, "11000101110001101100011111111000", request.GetNbId())
85         assert.Nil(t, err)
86 }
87
88 func TestParseNgEnbSetupRequest_Success(t *testing.T) {
89         ngEnbXml := readXmlFile(t, NgEnbSetupRequestXmlPath)
90         handler, _, _, _, _, _ := initMocks(t)
91         prefBytes := []byte(prefix)
92         request, _, err := handler.parseSetupRequest(append(prefBytes, ngEnbXml...))
93         assert.Equal(t, "131014", request.GetPlmnId())
94         assert.Equal(t, "101010101010101010", request.GetNbId())
95         assert.Nil(t, err)
96 }
97
98 func TestParseEnbSetupRequest_Success(t *testing.T) {
99         enbXml := readXmlFile(t, EnbSetupRequestXmlPath)
100         handler, _, _, _, _, _ := initMocks(t)
101         prefBytes := []byte(prefix)
102         request, _, err := handler.parseSetupRequest(append(prefBytes, enbXml...))
103         assert.Equal(t, "6359AB", request.GetPlmnId())
104         assert.Equal(t, "101010101010101010", request.GetNbId())
105         assert.Nil(t, err)
106 }
107
108 func TestParseSetupRequest_PipFailure(t *testing.T) {
109         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
110         handler, _, _, _, _, _ := initMocks(t)
111         prefBytes := []byte("10.0.2.15:9999")
112         request, _, err := handler.parseSetupRequest(append(prefBytes, xmlGnb...))
113         assert.Nil(t, request)
114         assert.NotNil(t, err)
115         assert.EqualError(t, err, "#E2SetupRequestNotificationHandler.parseSetupRequest - Error parsing E2 Setup Request failed extract Payload: no | separator found")
116 }
117
118 func TestParseSetupRequest_UnmarshalFailure(t *testing.T) {
119         handler, _, _, _, _, _ := initMocks(t)
120         prefBytes := []byte(prefix)
121         request, _, err := handler.parseSetupRequest(append(prefBytes, 1, 2, 3))
122         assert.Nil(t, request)
123         assert.NotNil(t, err)
124         assert.EqualError(t, err, "#E2SetupRequestNotificationHandler.parseSetupRequest - Error unmarshalling E2 Setup Request payload: 31302e302e322e31353a393939397c010203")
125 }
126
127 func TestE2SetupRequestNotificationHandler_GetGeneralConfigurationFailure(t *testing.T) {
128         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
129         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
130         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{}, common.NewInternalError(errors.New("some error")))
131         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
132         handler.Handle(notificationRequest)
133         rmrMessengerMock.AssertNotCalled(t, "SendMsg")
134         e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
135         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance")
136         readerMock.AssertNotCalled(t, "GetNodeb")
137         writerMock.AssertNotCalled(t, "SaveNodeb")
138 }
139
140 func getMbuf(msgType int, payloadStr string, request *models.NotificationRequest) *rmrCgo.MBuf {
141         payload := []byte(payloadStr)
142         mbuf := rmrCgo.NewMBuf(msgType, len(payload), nodebRanName, &payload, &request.TransactionId, request.GetMsgSrc())
143         return mbuf
144 }
145
146 func TestE2SetupRequestNotificationHandler_EnableRicFalse(t *testing.T) {
147         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
148         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
149         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: false}, nil)
150         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
151         mbuf := getMbuf(rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithMiscCause, notificationRequest)
152         rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, nil)
153         handler.Handle(notificationRequest)
154         rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
155         e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance")
156         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance")
157         readerMock.AssertNotCalled(t, "GetNodeb")
158         writerMock.AssertNotCalled(t, "SaveNodeb")
159 }
160
161 func TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess(t *testing.T) {
162         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
163         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
164         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
165         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
166         var gnb *entities.NodebInfo
167         readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
168         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
169         nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload)
170         nbIdentity := &entities.NbIdentity{InventoryName: nodebRanName, GlobalNbId: &entities.GlobalNbId{PlmnId: "02F829", NbId: "001100000011000000110000"}}
171         writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil)
172         updatedNodebInfo := *nodebInfo
173         updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
174         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, "RAN_CONNECTION_STATUS_CHANGE", nodebRanName+"_CONNECTED").Return(nil)
175         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
176         writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
177         e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
178         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, nil)
179         handler.Handle(notificationRequest)
180         assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
181 }
182
183 func TestE2SetupRequestNotificationHandler_HandleNewGnbWithoutFunctionsSuccess(t *testing.T) {
184         xmlGnb := readXmlFile(t, GnbWithoutFunctionsSetupRequestXmlPath)
185         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
186         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
187         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
188         var gnb *entities.NodebInfo
189         readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
190         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
191         nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload)
192         writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil)
193         updatedNodebInfo := *nodebInfo
194         updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
195         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, "RAN_CONNECTION_STATUS_CHANGE", nodebRanName+"_CONNECTED").Return(nil)
196         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
197         writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
198         e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
199         var errEmpty error
200         rmrMessage := &rmrCgo.MBuf{}
201         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
202         handler.Handle(notificationRequest)
203         assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
204 }
205
206 func TestE2SetupRequestNotificationHandler_HandleNewEnGnbSuccess(t *testing.T) {
207         xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath)
208         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
209         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
210         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
211         var gnb *entities.NodebInfo
212         readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
213         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlEnGnb...)}
214         nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload)
215         writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil)
216         updatedNodebInfo := *nodebInfo
217         updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
218         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, "RAN_CONNECTION_STATUS_CHANGE", nodebRanName+"_CONNECTED").Return(nil)
219
220         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
221         writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
222         e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
223         var errEmpty error
224         rmrMessage := &rmrCgo.MBuf{}
225         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
226         handler.Handle(notificationRequest)
227         assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
228 }
229
230 func TestE2SetupRequestNotificationHandler_HandleNewNgEnbSuccess(t *testing.T) {
231         xmlNgEnb := readXmlFile(t, NgEnbSetupRequestXmlPath)
232         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
233         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
234         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
235         var gnb *entities.NodebInfo
236         readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
237         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlNgEnb...)}
238         nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload)
239         writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil)
240         updatedNodebInfo := *nodebInfo
241         updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
242         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, "RAN_CONNECTION_STATUS_CHANGE", nodebRanName+"_CONNECTED").Return(nil)
243
244         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
245         writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
246         e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
247         var errEmpty error
248         rmrMessage := &rmrCgo.MBuf{}
249         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
250         handler.Handle(notificationRequest)
251         assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
252 }
253
254 func TestE2SetupRequestNotificationHandler_HandleExistingGnbSuccess(t *testing.T) {
255         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
256
257         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
258         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
259         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
260         var gnb = &entities.NodebInfo{
261                 RanName:                      nodebRanName,
262                 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
263                 ConnectionStatus:             entities.ConnectionStatus_CONNECTED,
264                 NodeType:                     entities.Node_GNB,
265                 Configuration:                &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
266         }
267         readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
268         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
269
270         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
271         gnbToUpdate := getExpectedNodebWithFunctionsForExistingRan(*gnb, notificationRequest.Payload)
272         writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
273         e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
274         var errEmpty error
275         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty)
276         handler.Handle(notificationRequest)
277         writerMock.AssertCalled(t, "UpdateNodebInfo", gnbToUpdate)
278         assertExistingNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
279 }
280
281 func TestE2SetupRequestNotificationHandler_HandleExistingGnbWithFunctionsSuccess(t *testing.T) {
282         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
283
284         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
285         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
286         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
287         var gnb = &entities.NodebInfo{
288                 RanName:                      nodebRanName,
289                 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
290                 ConnectionStatus:             entities.ConnectionStatus_CONNECTED,
291                 NodeType:                     entities.Node_GNB,
292                 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{RanFunctions: []*entities.RanFunction{
293                         {
294                                 RanFunctionId:       2,
295                                 RanFunctionRevision: 2,
296                         },
297                 }}},
298         }
299         readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
300         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
301
302         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
303         gnbToUpdate := getExpectedNodebWithFunctionsForExistingRan(*gnb, notificationRequest.Payload)
304
305         writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
306         e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
307         var errEmpty error
308         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty)
309         handler.Handle(notificationRequest)
310         writerMock.AssertCalled(t, "UpdateNodebInfo", gnbToUpdate)
311         assertExistingNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
312 }
313
314 func getExpectedNodebWithFunctionsForExistingRan(nodeb entities.NodebInfo, payload []byte) *entities.NodebInfo {
315         pipInd := bytes.IndexByte(payload, '|')
316         setupRequest := &models.E2SetupRequestMessage{}
317         _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
318         nodeb.GetGnb().RanFunctions = setupRequest.ExtractRanFunctionsList()
319         return &nodeb
320 }
321
322 func getExpectedNodebWithFunctionsForNewRan(payload []byte) *entities.NodebInfo {
323         pipInd := bytes.IndexByte(payload, '|')
324         setupRequest := &models.E2SetupRequestMessage{}
325         _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU)
326
327         nodeb := &entities.NodebInfo{
328                 AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
329                 RanName:                      nodebRanName,
330                 NodeType:                     entities.Node_GNB,
331                 Configuration: &entities.NodebInfo_Gnb{
332                         Gnb: &entities.Gnb{
333                                 RanFunctions: setupRequest.ExtractRanFunctionsList(),
334                         },
335                 },
336                 GlobalNbId: &entities.GlobalNbId{
337                         PlmnId: setupRequest.GetPlmnId(),
338                         NbId:   setupRequest.GetNbId(),
339                 },
340         }
341
342         return nodeb
343 }
344
345 func TestE2SetupRequestNotificationHandler_HandleParseError(t *testing.T) {
346         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
347         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
348         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
349         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte("invalid_prefix"), xmlGnb...)}
350         handler.Handle(notificationRequest)
351         readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
352         writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
353         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
354         writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
355         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
356         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
357 }
358
359 func TestE2SetupRequestNotificationHandler_HandleUnmarshalError(t *testing.T) {
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(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_HandleGetE2TInstanceError(t *testing.T) {
373         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
374         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
375         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
376         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, common.NewResourceNotFoundError("Not found"))
377         prefBytes := []byte(prefix)
378         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
379         handler.Handle(notificationRequest)
380         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
381         readerMock.AssertNotCalled(t, "GetNodeb", mock.Anything)
382         writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
383         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
384         writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
385         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
386         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
387 }
388
389 func TestE2SetupRequestNotificationHandler_HandleGetNodebError(t *testing.T) {
390         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
391         handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
392         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
393         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
394         var gnb *entities.NodebInfo
395         readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewInternalError(errors.New("some error")))
396         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
397         handler.Handle(notificationRequest)
398         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
399         readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
400         writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
401         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
402         writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
403         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
404         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
405 }
406
407 func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) {
408         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
409
410         handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
411         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
412         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
413         var gnb *entities.NodebInfo
414         readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
415         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)}
416         nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload)
417         writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil)
418         updatedNodebInfo := *nodebInfo
419         updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
420         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, "RAN_CONNECTION_STATUS_CHANGE", nodebRanName+"_CONNECTED").Return(nil)
421         writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
422         e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
423         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error"))
424         updatedNodebInfo2 := *nodebInfo
425         updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
426         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo2, "RAN_CONNECTION_STATUS_CHANGE", nodebRanName+"_DISCONNECTED").Return(nil)
427         var errEmpty error
428         mbuf := getMbuf(rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithTransportCause, notificationRequest)
429         rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, errEmpty)
430         handler.Handle(notificationRequest)
431         readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
432         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
433         writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
434         routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
435         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
436         rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true)
437 }
438
439 func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing.T) {
440         xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath)
441         logger := tests.InitLog(t)
442         config := &configuration.Configuration{
443                 RnibRetryIntervalMs:       10,
444                 MaxRnibConnectionAttempts: 3,
445                 StateChangeMessageChannel: "RAN_CONNECTION_STATUS_CHANGE",
446                 GlobalRicId: struct {
447                         RicId string
448                         Mcc   string
449                         Mnc   string
450                 }{Mcc: "327", Mnc: "94", RicId: "10011001101010101011"}}
451         rmrMessengerMock := &mocks.RmrMessengerMock{}
452         rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
453         readerMock := &mocks.RnibReaderMock{}
454         writerMock := &mocks.RnibWriterMock{}
455         routingManagerClientMock := &mocks.RoutingManagerClientMock{}
456         rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
457         e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
458         ranListManager := managers.NewRanListManager(logger)
459         ranAlarmService := services.NewRanAlarmService(logger, config)
460         ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
461
462         e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
463         handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager)
464         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
465         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
466         var gnb *entities.NodebInfo
467         readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
468         writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
469         writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, "RAN_CONNECTION_STATUS_CHANGE", mock.Anything).Return(nil)
470         routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
471         writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
472         e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
473         var errEmpty error
474         rmrMessage := &rmrCgo.MBuf{}
475         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
476         prefBytes := []byte(prefix)
477         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlEnGnb...)}
478         handler.Handle(notificationRequest)
479         readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
480         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
481         writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
482         routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
483         writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
484         e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
485         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
486 }
487
488 func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidStatusError(t *testing.T) {
489         xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath)
490         handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t)
491         var gnb = &entities.NodebInfo{RanName: nodebRanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
492         readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
493         readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil)
494         e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil)
495         prefBytes := []byte(prefix)
496         notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
497         handler.Handle(notificationRequest)
498         readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
499         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
500         writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
501         routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
502         writerMock.AssertNotCalled(t, "UpdateNodebInfo", mock.Anything)
503         e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
504         rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything)
505 }
506
507 func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
508         logger := tests.InitLog(t)
509         config := &configuration.Configuration{
510                 RnibRetryIntervalMs:       10,
511                 MaxRnibConnectionAttempts: 3,
512                 StateChangeMessageChannel: "RAN_CONNECTION_STATUS_CHANGE",
513                 GlobalRicId: struct {
514                         RicId string
515                         Mcc   string
516                         Mnc   string
517                 }{Mcc: "327", Mnc: "94", RicId: "AACCE"}}
518         rmrMessengerMock := &mocks.RmrMessengerMock{}
519         rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
520         readerMock := &mocks.RnibReaderMock{}
521         writerMock := &mocks.RnibWriterMock{}
522         routingManagerClientMock := &mocks.RoutingManagerClientMock{}
523         rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
524         e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
525         ranListManager := managers.NewRanListManager(logger)
526         ranAlarmService := services.NewRanAlarmService(logger, config)
527         ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)
528         e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager)
529         handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager)
530         return handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock
531 }
532
533 func assertNewNodebSuccessCalls(readerMock *mocks.RnibReaderMock, t *testing.T, e2tInstancesManagerMock *mocks.E2TInstancesManagerMock, writerMock *mocks.RnibWriterMock, routingManagerClientMock *mocks.RoutingManagerClientMock, rmrMessengerMock *mocks.RmrMessengerMock) {
534         readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
535         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
536         routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
537         writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
538         e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
539         rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, mock.Anything)
540 }
541
542 func assertExistingNodebSuccessCalls(readerMock *mocks.RnibReaderMock, t *testing.T, e2tInstancesManagerMock *mocks.E2TInstancesManagerMock, writerMock *mocks.RnibWriterMock, routingManagerClientMock *mocks.RoutingManagerClientMock, rmrMessengerMock *mocks.RmrMessengerMock) {
543         readerMock.AssertCalled(t, "GetNodeb", mock.Anything)
544         writerMock.AssertNotCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
545         e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress)
546         routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
547         writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
548         e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
549         rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, mock.Anything)
550 }