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.
22 "e2mgr/e2managererrors"
29 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
30 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
31 "github.com/stretchr/testify/assert"
32 "github.com/stretchr/testify/mock"
36 func initRanSetupManagerTest(t *testing.T) (*mocks.RmrMessengerMock, *mocks.RnibWriterMock, *RanSetupManager) {
37 logger, err := logger.InitLogger(logger.DebugLevel)
39 t.Errorf("#... - failed to initialize logger, error: %s", err)
41 config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
43 rmrMessengerMock := &mocks.RmrMessengerMock{}
44 rmrSender := initRmrSender(rmrMessengerMock, logger)
46 readerMock := &mocks.RnibReaderMock{}
48 writerMock := &mocks.RnibWriterMock{}
50 rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
51 ranSetupManager := NewRanSetupManager(logger, rmrSender, rnibDataService)
52 return rmrMessengerMock, writerMock, ranSetupManager
55 func TestExecuteSetupConnectingX2Setup(t *testing.T) {
56 rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t)
60 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
61 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
63 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
65 payload := e2pdus.PackedX2setupRequest
66 xaction := []byte(ranName)
67 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
68 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
70 if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err != nil {
71 t.Errorf("want: success, got: error: %s", err)
74 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
75 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
78 func TestExecuteSetupConnectingEndcX2Setup(t *testing.T) {
79 rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t)
83 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
84 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
86 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
88 payload := e2pdus.PackedEndcX2setupRequest
89 xaction := []byte(ranName)
90 msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
91 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
93 if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err != nil {
94 t.Errorf("want: success, got: error: %s", err)
97 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
98 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
101 func TestExecuteSetupDisconnected(t *testing.T) {
102 rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t)
106 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
107 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
108 var argNodebDisconnected = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
110 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
111 writerMock.On("UpdateNodebInfo", argNodebDisconnected).Return(rnibErr)
114 xaction := []byte(ranName)
115 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
116 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, fmt.Errorf("send failure"))
118 if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil {
119 t.Errorf("want: failure, got: success")
122 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
123 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
126 func TestExecuteSetupConnectingRnibError(t *testing.T) {
127 rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t)
131 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
132 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
133 var argNodebDisconnected = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
134 var rnibErr = common.NewInternalError(fmt.Errorf("DB error"))
135 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
136 writerMock.On("UpdateNodebInfo", argNodebDisconnected).Return(rnibErr)
139 xaction := []byte(ranName)
140 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
141 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, fmt.Errorf("send failure"))
143 if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil {
144 t.Errorf("want: failure, got: success")
146 assert.IsType(t, e2managererrors.NewRnibDbError(), err)
149 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
150 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
153 func TestExecuteSetupDisconnectedRnibError(t *testing.T) {
154 rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t)
158 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
159 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
160 var argNodebDisconnected = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
162 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
163 writerMock.On("UpdateNodebInfo", argNodebDisconnected).Return(common.NewInternalError(fmt.Errorf("DB error")))
166 xaction := []byte(ranName)
167 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
168 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, fmt.Errorf("send failure"))
170 if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil {
171 t.Errorf("want: failure, got: success")
173 assert.IsType(t, e2managererrors.NewRnibDbError(), err)
176 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
177 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
180 func TestExecuteSetupUnsupportedProtocol(t *testing.T) {
181 rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t)
185 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_UNKNOWN_E2_APPLICATION_PROTOCOL}
186 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_UNKNOWN_E2_APPLICATION_PROTOCOL, ConnectionAttempts: 1}
188 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
190 payload := e2pdus.PackedX2setupRequest
191 xaction := []byte(ranName)
192 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
193 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
195 if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil {
196 t.Errorf("want: error, got: success")
199 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
200 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
203 func initLog(t *testing.T) *logger.Logger {
204 log, err := logger.InitLogger(logger.InfoLevel)
206 t.Errorf("#initLog test - failed to initialize logger, error: %s", err)