// // Copyright 2019 AT&T Intellectual Property // Copyright 2019 Nokia // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // package handlers import ( "e2mgr/logger" "e2mgr/mocks" "e2mgr/models" "e2mgr/rNibWriter" "e2mgr/rmrCgo" "e2mgr/sessions" "e2mgr/tests" "fmt" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader" "github.com/stretchr/testify/mock" "testing" "time" ) /* * Test an error response while in an x2 setup request session */ func TestHandleInSession(t *testing.T){ log, err := logger.InitLogger(logger.InfoLevel) if err!=nil{ t.Errorf("#sctp_errors_notification_handler_test.TestHandleInSession - failed to initialize logger, error: %s", err) } readerMock :=&mocks.RnibReaderMock{} rnibReaderProvider := func() reader.RNibReader { return readerMock } writerMock := &mocks.RnibWriterMock{} rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) e2Sessions := make(sessions.E2Sessions) xaction := []byte(fmt.Sprintf("%32s", "1234")) e2Sessions[string(xaction)] = sessions.E2SessionDetails{SessionStart: time.Now()} payload := []byte("Error") mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), TransactionId: string(xaction)} var messageChannel chan<- *models.NotificationResponse nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_CONNECTED,} var rnibErr common.IRNibError readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) if _, ok := e2Sessions[string(xaction)]; ok { t.Errorf("want: no session entry, got: session entry for: %s", string(xaction) ) } } /* * Test an error response triggered by the E2 Term */ func TestHandleNoSession(t *testing.T){ log, err := logger.InitLogger(logger.InfoLevel) if err!=nil{ t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) } readerMock :=&mocks.RnibReaderMock{} rnibReaderProvider := func() reader.RNibReader { return readerMock } writerMock := &mocks.RnibWriterMock{} rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) e2Sessions := make(sessions.E2Sessions) transactionId := "1234" xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} payload := []byte("Error") mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), TransactionId: string(xaction)} var messageChannel chan<- *models.NotificationResponse nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_CONNECTED,} var rnibErr common.IRNibError readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) if _, ok := e2Sessions[transactionId]; !ok { t.Errorf("want: session entry for %s, got: no session entry", transactionId ) } } /* * Test an error response triggered by the E2 Term */ func TestHandleUnsolicitedDisconnectionConnectedSuccess(t *testing.T){ log, err := logger.InitLogger(logger.DebugLevel) if err!=nil{ t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) } readerMock :=&mocks.RnibReaderMock{} rnibReaderProvider := func() reader.RNibReader { return readerMock } writerMock := &mocks.RnibWriterMock{} rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) e2Sessions := make(sessions.E2Sessions) transactionId := "1234" xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} payload := []byte("Error") mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), TransactionId: string(xaction)} var messageChannel chan<- *models.NotificationResponse nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_CONNECTED,} var rnibErr common.IRNibError readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) } func TestHandleUnsolicitedDisconnectionNotConnectedSuccess(t *testing.T){ log, err := logger.InitLogger(logger.DebugLevel) if err!=nil{ t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) } readerMock :=&mocks.RnibReaderMock{} rnibReaderProvider := func() reader.RNibReader { return readerMock } writerMock := &mocks.RnibWriterMock{} rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) e2Sessions := make(sessions.E2Sessions) transactionId := "1234" xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} payload := []byte("Error") mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), TransactionId: string(xaction)} var messageChannel chan<- *models.NotificationResponse nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} var rnibErr common.IRNibError readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) } func TestHandleUnsolicitedDisconnectionShuttingDownSuccess(t *testing.T){ log, err := logger.InitLogger(logger.DebugLevel) if err!=nil{ t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) } readerMock :=&mocks.RnibReaderMock{} rnibReaderProvider := func() reader.RNibReader { return readerMock } writerMock := &mocks.RnibWriterMock{} rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) e2Sessions := make(sessions.E2Sessions) transactionId := "1234" xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} payload := []byte("Error") mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), TransactionId: string(xaction)} var messageChannel chan<- *models.NotificationResponse nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} var rnibErr common.IRNibError readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) } func TestHandleUnsolicitedDisconnectionShutDownSuccess(t *testing.T){ log, err := logger.InitLogger(logger.DebugLevel) if err!=nil{ t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) } readerMock :=&mocks.RnibReaderMock{} rnibReaderProvider := func() reader.RNibReader { return readerMock } writerMock := &mocks.RnibWriterMock{} rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) e2Sessions := make(sessions.E2Sessions) transactionId := "1234" xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} payload := []byte("Error") mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), TransactionId: string(xaction)} var messageChannel chan<- *models.NotificationResponse nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} var rnibErr common.IRNibError readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) } func TestHandleUnsolicitedDisconnectionReaderFailure(t *testing.T){ log, err := logger.InitLogger(logger.DebugLevel) if err!=nil{ t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) } readerMock :=&mocks.RnibReaderMock{} rnibReaderProvider := func() reader.RNibReader { return readerMock } writerMock := &mocks.RnibWriterMock{} rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) e2Sessions := make(sessions.E2Sessions) transactionId := "1234" xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} payload := []byte("Error") mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), TransactionId: string(xaction)} var messageChannel chan<- *models.NotificationResponse var nb *entities.NodebInfo rnibErr := common.RNibError{} readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) } func TestHandleUnsolicitedDisconnectionWriterFailure(t *testing.T){ log, err := logger.InitLogger(logger.DebugLevel) if err!=nil{ t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) } readerMock :=&mocks.RnibReaderMock{} rnibReaderProvider := func() reader.RNibReader { return readerMock } writerMock := &mocks.RnibWriterMock{} rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) e2Sessions := make(sessions.E2Sessions) transactionId := "1234" xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} payload := []byte("Error") mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), TransactionId: string(xaction)} var messageChannel chan<- *models.NotificationResponse nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_CONNECTED,} var rnibErr common.IRNibError readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(common.RNibError{}) h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) }