16 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
17 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
18 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
19 "github.com/stretchr/testify/mock"
23 func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *managers.RanReconnectionManager) {
27 rmrMessengerMock := &mocks.RmrMessengerMock{}
28 rmrService := getRmrService(rmrMessengerMock, logger)
30 readerMock := &mocks.RnibReaderMock{}
31 rnibReaderProvider := func() reader.RNibReader {
34 writerMock := &mocks.RnibWriterMock{}
35 rnibWriterProvider := func() rNibWriter.RNibWriter {
38 ranSetupManager := managers.NewRanSetupManager(logger,rmrService, rnibWriterProvider)
39 ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager)
40 return logger, readerMock, writerMock, rmrMessengerMock, ranReconnectionManager
43 func TestE2TerminInitHandlerSuccessOneRan(t *testing.T) {
44 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
47 readerProvider := func() reader.RNibReader {
51 ids := []*entities.NbIdentity{{InventoryName: "test1"}}
52 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
54 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
55 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb, rnibErr)
57 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
58 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
60 payload := e2pdus.PackedX2setupRequest
61 xaction := []byte(ids[0].InventoryName)
62 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
64 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
66 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
67 handler.Handle(log, nil, nil, nil)
69 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
70 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
73 func TestE2TerminInitHandlerSuccessTwoRans(t *testing.T) {
74 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
77 readerProvider := func() reader.RNibReader {
81 ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}}
82 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
84 var initialNodeb0 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
85 var initialNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
86 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
87 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, rnibErr)
89 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
90 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
92 payload := e2pdus.PackedX2setupRequest
93 xaction := []byte(ids[0].InventoryName)
94 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
96 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
98 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
99 handler.Handle(log, nil, nil, nil)
101 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
102 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
105 func TestE2TerminInitHandlerSuccessThreeRansFirstRmrFailure(t *testing.T) {
106 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
109 readerProvider := func() reader.RNibReader {
113 ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
114 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
116 var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
117 var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
118 var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
119 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
120 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, rnibErr)
121 readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
123 var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
124 var argNodeb0Fail = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
125 writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
126 writerMock.On("UpdateNodebInfo", argNodeb0Fail).Return(rnibErr)
128 payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
129 xaction := []byte(ids[0].InventoryName)
130 msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
132 // Cannot use Mock because request MBuf contains pointers
133 //payload =models.NewE2RequestMessage(ids[1].InventoryName /*tid*/, "", 0,ids[1].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
134 //xaction = []byte(ids[1].InventoryName)
135 //msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[1].InventoryName, &payload, &xaction)
137 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, fmt.Errorf("RMR Error"))
139 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
140 handler.Handle(log, nil, nil, nil)
142 //test1 (before send +1, after failure +1), test2 (0) test3 (0)
143 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
144 //test1 failure (+1), test2 (0). test3 (0)
145 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
148 func TestE2TerminInitHandlerSuccessThreeRansSecondNotFoundFailure(t *testing.T) {
149 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
152 readerProvider := func() reader.RNibReader {
156 ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
157 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
159 var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
160 var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
161 var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
162 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
163 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, common.NewResourceNotFoundError("not found"))
164 readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
166 var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
167 var argNodeb0Success = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
168 writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
169 writerMock.On("UpdateNodebInfo", argNodeb0Success).Return(rnibErr)
171 var argNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
172 var argNodeb2Success = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
173 writerMock.On("UpdateNodebInfo", argNodeb2).Return(rnibErr)
174 writerMock.On("UpdateNodebInfo", argNodeb2Success).Return(rnibErr)
176 payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
177 xaction := []byte(ids[0].InventoryName)
178 msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
180 // Cannot use Mock because request MBuf contains pointers
181 //payload =models.NewE2RequestMessage(ids[1].InventoryName /*tid*/, "", 0,ids[1].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
182 //xaction = []byte(ids[1].InventoryName)
183 //msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[1].InventoryName, &payload, &xaction)
185 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, nil)
187 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
188 handler.Handle(log, nil, nil, nil)
190 readerMock.AssertNumberOfCalls(t, "GetNodeb", 3)
191 //test1 (+1), test2 failure (0) test3 (+1)
192 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
193 //test1 success (+1), test2 (0). test3 (+1)
194 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
197 func TestE2TerminInitHandlerSuccessThreeRansSecondRnibInternalErrorFailure(t *testing.T) {
198 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
201 readerProvider := func() reader.RNibReader {
205 ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
206 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
208 var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
209 var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
210 var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
211 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
212 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, common.NewInternalError(fmt.Errorf("internal error")))
213 readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
215 var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
216 var argNodeb0Success = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
217 writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
218 writerMock.On("UpdateNodebInfo", argNodeb0Success).Return(rnibErr)
220 var argNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
221 var argNodeb2Success = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
222 writerMock.On("UpdateNodebInfo", argNodeb2).Return(rnibErr)
223 writerMock.On("UpdateNodebInfo", argNodeb2Success).Return(rnibErr)
225 payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
226 xaction := []byte(ids[0].InventoryName)
227 msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
229 // Cannot use Mock because request MBuf contains pointers
230 //payload =models.NewE2RequestMessage(ids[1].InventoryName /*tid*/, "", 0,ids[1].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
231 //xaction = []byte(ids[1].InventoryName)
232 //msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[1].InventoryName, &payload, &xaction)
234 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, nil)
236 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
237 handler.Handle(log, nil, nil, nil)
239 readerMock.AssertNumberOfCalls(t, "GetNodeb", 2)
240 //test1 (+1), test2 failure (0) test3 (0)
241 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
242 //test1 success (+1), test2 (0). test3 (+1)
243 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
246 func TestE2TerminInitHandlerSuccessZeroRans(t *testing.T) {
247 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
250 readerProvider := func() reader.RNibReader {
254 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, rnibErr)
256 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
257 handler.Handle(log, nil, nil, nil)
259 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
260 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
263 func TestE2TerminInitHandlerFailureGetListNodebIds(t *testing.T) {
264 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
266 readerProvider := func() reader.RNibReader {
270 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, common.NewInternalError(fmt.Errorf("internal error")))
272 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
273 handler.Handle(log, nil, nil, nil)
275 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
276 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
279 // TODO: extract to test_utils
280 func getRmrService(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *services.RmrService {
281 rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
282 messageChannel := make(chan *models.NotificationResponse)
283 rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger)
284 return services.NewRmrService(services.NewRmrConfig(tests.Port, tests.MaxMsgSize, tests.Flags, log), rmrMessenger, make(sessions.E2Sessions), messageChannel)
287 // TODO: extract to test_utils
288 func initLog(t *testing.T) *logger.Logger {
289 log, err := logger.InitLogger(logger.InfoLevel)
291 t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err)