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