2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
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
9 // http://www.apache.org/licenses/LICENSE-2.0
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.
17 // This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 // platform project (RICP).
20 package rmrmsghandlers
32 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
33 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
34 "github.com/stretchr/testify/assert"
35 "github.com/stretchr/testify/mock"
44 prefix = "10.0.2.15:9999|"
45 logFilePath = "./loggerTest.txt"
46 e2tInstanceAddress = "10.0.2.15"
47 nodebRanName = "gnb:310-410-b5c67788"
50 func TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess(t *testing.T) {
51 path, err :=filepath.Abs("../../tests/resources/setupRequest_gnb.xml")
55 xmlGnb, err := ioutil.ReadFile(path)
60 logFile, err := os.Create(logFilePath)
62 t.Errorf("e2_setup_request_notification_handler_test.TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess - failed to create file, error: %s", err)
64 oldStdout := os.Stdout
65 defer changeStdout(oldStdout)
66 defer removeLogFile(t)
69 handler := stubMockSuccessFlowNewNodeb(t)
70 prefBytes := []byte(prefix)
71 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
72 handler.Handle(notificationRequest)
73 assertSuccessFlowNewNodebLogs(t)
76 func TestE2SetupRequestNotificationHandler_HandleNewEnGnbSuccess(t *testing.T) {
77 path, err :=filepath.Abs("../../tests/resources/setupRequest_en-gNB.xml")
81 xmlEnGnb, err := ioutil.ReadFile(path)
85 logFile, err := os.Create(logFilePath)
87 t.Errorf("e2_setup_request_notification_handler_test.TestE2SetupRequestNotificationHandler_HandleNewEnGnbSuccess - failed to create file, error: %s", err)
89 oldStdout := os.Stdout
90 defer changeStdout(oldStdout)
91 defer removeLogFile(t)
94 handler := stubMockSuccessFlowNewNodeb(t)
95 prefBytes := []byte(prefix)
96 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlEnGnb...)}
97 handler.Handle(notificationRequest)
98 assertSuccessFlowNewNodebLogs(t)
101 func TestE2SetupRequestNotificationHandler_HandleNewNgEnbSuccess(t *testing.T) {
102 path, err :=filepath.Abs("../../tests/resources/setupRequest_ng-eNB.xml")
106 xmlEnGnb, err := ioutil.ReadFile(path)
110 logFile, err := os.Create(logFilePath)
112 t.Errorf("e2_setup_request_notification_handler_test.TestE2SetupRequestNotificationHandler_HandleNewNgEnbSuccess - failed to create file, error: %s", err)
114 oldStdout := os.Stdout
115 defer changeStdout(oldStdout)
116 defer removeLogFile(t)
119 handler := stubMockSuccessFlowNewNodeb(t)
120 prefBytes := []byte(prefix)
121 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlEnGnb...)}
122 handler.Handle(notificationRequest)
123 assertSuccessFlowNewNodebLogs(t)
126 func TestE2SetupRequestNotificationHandler_HandleExistingGnbSuccess(t *testing.T) {
127 path, err :=filepath.Abs("../../tests/resources/setupRequest_gnb.xml")
131 xmlGnb, err := ioutil.ReadFile(path)
136 logFile, err := os.Create(logFilePath)
138 t.Errorf("e2_setup_request_notification_handler_test.TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess - failed to create file, error: %s", err)
140 oldStdout := os.Stdout
141 defer changeStdout(oldStdout)
142 defer removeLogFile(t)
145 handler := stubMockSuccessFlowExistingNodeb(t)
146 prefBytes := []byte(prefix)
147 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
148 handler.Handle(notificationRequest)
149 assertSuccessFlowExistingNodebLogs(t)
152 func TestE2SetupRequestNotificationHandler_HandleParseError(t *testing.T) {
153 path, err :=filepath.Abs("../../tests/resources/setupRequest_gnb.xml")
157 xmlGnb, err := ioutil.ReadFile(path)
162 logFile, err := os.Create(logFilePath)
164 t.Errorf("e2_setup_request_notification_handler_test.TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess - failed to create file, error: %s", err)
166 oldStdout := os.Stdout
167 defer changeStdout(oldStdout)
168 defer removeLogFile(t)
171 _, handler, _, _, _, _, _ := initMocks(t)
172 prefBytes := []byte("invalid_prefix")
173 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
174 handler.Handle(notificationRequest)
175 assertParseErrorFlowLogs(t)
178 func TestE2SetupRequestNotificationHandler_HandleUnmarshalError(t *testing.T) {
179 logFile, err := os.Create(logFilePath)
181 t.Errorf("e2_setup_request_notification_handler_test.TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess - failed to create file, error: %s", err)
183 oldStdout := os.Stdout
184 defer changeStdout(oldStdout)
185 defer removeLogFile(t)
188 _, handler, _, _, _, _, _ := initMocks(t)
189 prefBytes := []byte(prefix)
190 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, "xmlGnb"...)}
191 handler.Handle(notificationRequest)
192 assertUnmarshalErrorFlowLogs(t)
195 func TestE2SetupRequestNotificationHandler_HandleGetE2TInstanceError(t *testing.T) {
196 path, err :=filepath.Abs("../../tests/resources/setupRequest_gnb.xml")
200 xmlGnb, err := ioutil.ReadFile(path)
205 logFile, err := os.Create(logFilePath)
207 t.Errorf("e2_setup_request_notification_handler_test.TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess - failed to create file, error: %s", err)
209 oldStdout := os.Stdout
210 defer changeStdout(oldStdout)
211 defer removeLogFile(t)
214 _, handler, _, _, _, e2tInstancesManagerMock, _ := initMocks(t)
215 var e2tInstance * entities.E2TInstance
216 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewResourceNotFoundError("Not found"))
217 prefBytes := []byte(prefix)
218 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
219 handler.Handle(notificationRequest)
220 assertGetE2TInstanceErrorLogs(t)
223 func TestE2SetupRequestNotificationHandler_HandleGetNodebError(t *testing.T) {
224 path, err :=filepath.Abs("../../tests/resources/setupRequest_gnb.xml")
228 xmlGnb, err := ioutil.ReadFile(path)
233 logFile, err := os.Create(logFilePath)
235 t.Errorf("e2_setup_request_notification_handler_test.TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess - failed to create file, error: %s", err)
237 oldStdout := os.Stdout
238 defer changeStdout(oldStdout)
239 defer removeLogFile(t)
241 _, handler, readerMock, _, _, e2tInstancesManagerMock, _ := initMocks(t)
242 var e2tInstance = &entities.E2TInstance{}
243 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
244 var gnb *entities.NodebInfo
245 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewInternalError(errors.New("Some error")))
246 prefBytes := []byte(prefix)
247 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
248 handler.Handle(notificationRequest)
249 assertGetNodebErrorLogs(t)
252 func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) {
253 path, err :=filepath.Abs("../../tests/resources/setupRequest_gnb.xml")
257 xmlGnb, err := ioutil.ReadFile(path)
262 logFile, err := os.Create(logFilePath)
264 t.Errorf("e2_setup_request_notification_handler_test.TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess - failed to create file, error: %s", err)
266 oldStdout := os.Stdout
267 defer changeStdout(oldStdout)
268 defer removeLogFile(t)
271 _, handler, readerMock, writerMock, _, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
272 var e2tInstance = &entities.E2TInstance{}
273 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
274 var gnb *entities.NodebInfo
275 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
276 writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
277 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceAddress, mock.Anything).Return(errors.New("association error"))
279 prefBytes := []byte(prefix)
280 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
281 handler.Handle(notificationRequest)
282 assertAssociationErrorLogs(t)
285 func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidStatusError(t *testing.T) {
286 path, err :=filepath.Abs("../../tests/resources/setupRequest_gnb.xml")
290 xmlGnb, err := ioutil.ReadFile(path)
295 logFile, err := os.Create(logFilePath)
297 t.Errorf("e2_setup_request_notification_handler_test.TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess - failed to create file, error: %s", err)
299 oldStdout := os.Stdout
300 defer changeStdout(oldStdout)
301 defer removeLogFile(t)
304 handler := stubMockInvalidStatusFlowExistingNodeb(t)
305 prefBytes := []byte(prefix)
306 notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
307 handler.Handle(notificationRequest)
308 assertInvalidNodebStatusLogs(t)
311 func assertInvalidNodebStatusLogs(t *testing.T){
312 buf := getLogFileBuffer(t)
313 assertReceivedAndParsedLog(buf, t)
314 assertInvalidNodebStatusLog(buf, t)
315 assertNoMoreRecordsLog(buf, t)
318 func assertInvalidNodebStatusLog(buf *bytes.Buffer, t *testing.T) {
319 record, _ := buf.ReadString('\n')
320 assert.Contains(t, record, "#RnibDataService.GetNodeb")
321 assert.Contains(t, record, "connection status: SHUTTING_DOWN")
322 record, _ = buf.ReadString('\n')
323 assert.Contains(t, record, "#E2SetupRequestNotificationHandler.Handle")
324 assert.Contains(t, record, "connection status: SHUTTING_DOWN - nodeB entity in incorrect state")
325 record, _ = buf.ReadString('\n')
326 assert.Contains(t, record, "#E2SetupRequestNotificationHandler.Handle")
327 assert.Contains(t, record, "Summary: elapsed time for receiving and handling setup request message from E2 terminator")
330 func assertAssociationErrorLogs(t *testing.T){
331 buf := getLogFileBuffer(t)
332 assertReceivedAndParsedLog(buf, t)
333 assertNewNodebSavedLog(buf, t)
334 assertAssociationErrorLog(buf, t)
335 assertNoMoreRecordsLog(buf, t)
338 func assertAssociationErrorLog(buf *bytes.Buffer, t *testing.T) {
339 record, _ := buf.ReadString('\n')
340 assert.Contains(t, record, "#E2TAssociationManager.AssociateRan - Associating RAN")
341 record, _ = buf.ReadString('\n')
342 assert.Contains(t, record, "#E2TAssociationManager.AssociateRan - RoutingManager failure: Failed to associate RAN")
343 record, _ = buf.ReadString('\n')
344 assert.Contains(t, record, "#E2SetupRequestNotificationHandler.Handle - RAN name:")
345 assert.Contains(t, record, "failed to associate E2T to nodeB entity")
348 func assertGetNodebErrorLogs(t *testing.T) {
349 buf := getLogFileBuffer(t)
350 assertReceivedAndParsedLog(buf, t)
351 assertGetNodebErrorLog(buf, t)
352 assertNoMoreRecordsLog(buf, t)
355 func assertGetNodebErrorLog(buf *bytes.Buffer, t *testing.T) {
356 record, _ := buf.ReadString('\n')
357 assert.Contains(t, record, "failed to retrieve nodebInfo entity")
360 func assertGetE2TInstanceErrorLogs(t *testing.T) {
361 buf := getLogFileBuffer(t)
362 assertReceivedAndParsedLog(buf, t)
363 assertGetE2TInstanceErrorLog(buf, t)
364 assertNoMoreRecordsLog(buf, t)
367 func assertGetE2TInstanceErrorLog(buf *bytes.Buffer, t *testing.T) {
368 record, _ := buf.ReadString('\n')
369 assert.Contains(t, record, "Failed retrieving E2TInstance")
372 func removeLogFile(t *testing.T) {
373 err := os.Remove(logFilePath)
375 t.Errorf("e2_setup_request_notification_handler_test.TestE2SetupRequestNotificationHandler_HandleGnbSuccess - failed to remove file, error: %s", err)
379 func assertParseErrorFlowLogs(t *testing.T) {
380 buf := getLogFileBuffer(t)
381 assertReceivedAndFailedParseLog(buf, t)
382 assertNoMoreRecordsLog(buf, t)
385 func assertUnmarshalErrorFlowLogs(t *testing.T) {
386 buf := getLogFileBuffer(t)
387 assertReceivedAndFailedUnmarshalLog(buf, t)
388 assertNoMoreRecordsLog(buf, t)
391 func assertSuccessFlowNewNodebLogs(t *testing.T){
392 buf := getLogFileBuffer(t)
393 assertReceivedAndParsedLog(buf, t)
394 assertNewNodebSavedLog(buf, t)
395 assertAssociatedLog(buf, t)
396 assertRequestBuiltLog(buf, t)
397 assertNoMoreRecordsLog(buf, t)
400 func assertSuccessFlowExistingNodebLogs(t *testing.T){
401 buf := getLogFileBuffer(t)
402 assertReceivedAndParsedLog(buf, t)
403 assertExistingNodebRetrievedLog(buf, t)
404 assertAssociatedLog(buf, t)
405 assertRequestBuiltLog(buf, t)
406 assertNoMoreRecordsLog(buf, t)
409 func assertReceivedAndParsedLog(buf *bytes.Buffer, t *testing.T) {
410 record, _ := buf.ReadString('\n')
411 assert.Contains(t, record, "received E2 Setup Request")
412 record, _ = buf.ReadString('\n')
413 assert.Contains(t, record, "handling E2_SETUP_REQUEST")
416 func assertReceivedAndFailedParseLog(buf *bytes.Buffer, t *testing.T) {
417 record, _ := buf.ReadString('\n')
418 assert.Contains(t, record, "received E2 Setup Request")
419 record, _ = buf.ReadString('\n')
420 assert.Contains(t, record, "Error parsing E2 Setup Request")
423 func assertReceivedAndFailedUnmarshalLog(buf *bytes.Buffer, t *testing.T) {
424 record, _ := buf.ReadString('\n')
425 assert.Contains(t, record, "received E2 Setup Request")
426 record, _ = buf.ReadString('\n')
427 assert.Contains(t, record, "Error unmarshalling E2 Setup Request")
430 func assertNewNodebSavedLog(buf *bytes.Buffer, t *testing.T) {
431 record, _ := buf.ReadString('\n')
432 assert.Contains(t, record, "#RnibDataService.SaveNodeb - nbIdentity:")
435 func assertExistingNodebRetrievedLog(buf *bytes.Buffer, t *testing.T) {
436 record, _ := buf.ReadString('\n')
437 assert.Contains(t, record, "#RnibDataService.GetNodeb - RAN name:")
440 func assertAssociatedLog(buf *bytes.Buffer, t *testing.T){
441 record, _ := buf.ReadString('\n')
442 assert.Contains(t, record, "#E2TAssociationManager.AssociateRan - Associating RAN")
443 record, _ = buf.ReadString('\n')
444 assert.Contains(t, record, "#RnibDataService.UpdateNodebInfo")
445 record, _ = buf.ReadString('\n')
446 assert.Contains(t, record, "#E2TAssociationManager.AssociateRan - successfully associated RAN")
449 func assertRequestBuiltLog(buf *bytes.Buffer, t *testing.T) {
450 record, _ := buf.ReadString('\n')
451 assert.Contains(t, record, "E2 Setup Request has been built")
454 func assertNoMoreRecordsLog(buf *bytes.Buffer, t *testing.T) {
455 record, _ := buf.ReadString('\n')
456 assert.Empty(t, record)
459 func stubMockSuccessFlowNewNodeb(t *testing.T) E2SetupRequestNotificationHandler{
460 _, handler, readerMock, writerMock, _, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
461 var e2tInstance = &entities.E2TInstance{}
462 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
463 var gnb *entities.NodebInfo
464 readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
465 writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
466 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceAddress, mock.Anything).Return(nil)
467 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
468 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
472 func stubMockSuccessFlowExistingNodeb(t *testing.T) E2SetupRequestNotificationHandler{
473 _, handler, readerMock, writerMock, _, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
474 var e2tInstance = &entities.E2TInstance{}
475 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
476 var gnb = &entities.NodebInfo{RanName: nodebRanName}
477 readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
478 routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceAddress, mock.Anything).Return(nil)
479 writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
480 e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
484 func stubMockInvalidStatusFlowExistingNodeb(t *testing.T) E2SetupRequestNotificationHandler{
485 _, handler, readerMock, _, _, e2tInstancesManagerMock, _ := initMocks(t)
486 var e2tInstance = &entities.E2TInstance{}
487 e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil)
488 var gnb = &entities.NodebInfo{RanName: nodebRanName, ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN}
489 readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil)
493 func initMocks(t *testing.T) (*logger.Logger, E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
494 logger := tests.InitLog(t)
495 config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
496 rmrMessengerMock := &mocks.RmrMessengerMock{}
497 rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
498 readerMock := &mocks.RnibReaderMock{}
499 writerMock := &mocks.RnibWriterMock{}
500 routingManagerClientMock := &mocks.RoutingManagerClientMock{}
501 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
502 e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
503 e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock)
504 handler := NewE2SetupRequestNotificationHandler(logger, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager)
505 return logger, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock
508 func changeStdout(old *os.File) {
512 func getLogFileBuffer(t *testing.T) *bytes.Buffer {
513 logFile, err := os.Open(logFilePath)
515 t.Errorf("e2_setup_request_notification_handler_test.assertSuccessFlowNewNodebLogRecords - failed to open file, error: %s", err)
518 _, err = io.Copy(&buf, logFile)
520 t.Errorf("e2_setup_request_notification_handler_test.assertSuccessFlowNewNodebLogRecords - failed to copy bytes, error: %s", err)