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) {
26 rmrMessengerMock := &mocks.RmrMessengerMock{}
27 rmrService := getRmrService(rmrMessengerMock, logger)
29 readerMock := &mocks.RnibReaderMock{}
30 rnibReaderProvider := func() reader.RNibReader {
33 writerMock := &mocks.RnibWriterMock{}
34 rnibWriterProvider := func() rNibWriter.RNibWriter {
38 ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, rmrService)
39 return logger, readerMock, writerMock, rmrMessengerMock, ranReconnectionManager
42 func TestE2TerminInitHandlerSuccessOneRan(t *testing.T) {
43 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
46 readerProvider := func() reader.RNibReader {
50 ids := []*entities.NbIdentity{{InventoryName: "test1"}}
51 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
53 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
54 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb, rnibErr)
56 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
57 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
59 payload := e2pdus.PackedX2setupRequest
60 xaction := []byte(ids[0].InventoryName)
61 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
63 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
65 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
66 handler.Handle(log, nil, nil, nil)
68 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
69 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
72 func TestE2TerminInitHandlerSuccessTwoRans(t *testing.T) {
73 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
76 readerProvider := func() reader.RNibReader {
80 ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}}
81 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
83 var initialNodeb0 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
84 var initialNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
85 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
86 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, rnibErr)
88 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
89 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
91 payload := e2pdus.PackedX2setupRequest
92 xaction := []byte(ids[0].InventoryName)
93 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
95 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
97 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
98 handler.Handle(log, nil, nil, nil)
100 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
101 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
104 func TestE2TerminInitHandlerSuccessThreeRansFirstRmrFailure(t *testing.T) {
105 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
108 readerProvider := func() reader.RNibReader {
112 ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
113 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
115 var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
116 var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
117 var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
118 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
119 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, rnibErr)
120 readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
122 var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
123 var argNodeb0Fail = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
124 writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
125 writerMock.On("UpdateNodebInfo", argNodeb0Fail).Return(rnibErr)
127 payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
128 xaction := []byte(ids[0].InventoryName)
129 msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
131 // Cannot use Mock because request MBuf contains pointers
132 //payload =models.NewE2RequestMessage(ids[1].InventoryName /*tid*/, "", 0,ids[1].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
133 //xaction = []byte(ids[1].InventoryName)
134 //msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[1].InventoryName, &payload, &xaction)
136 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, fmt.Errorf("RMR Error"))
138 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
139 handler.Handle(log, nil, nil, nil)
141 //test1 (before send +1, after failure +1), test2 (0) test3 (0)
142 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
143 //test1 failure (+1), test2 (0). test3 (0)
144 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
147 func TestE2TerminInitHandlerSuccessThreeRansSecondNotFoundFailure(t *testing.T) {
148 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
151 readerProvider := func() reader.RNibReader {
155 ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
156 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
158 var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
159 var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
160 var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
161 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
162 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, common.NewResourceNotFoundError("not found"))
163 readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
165 var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
166 var argNodeb0Success = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
167 writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
168 writerMock.On("UpdateNodebInfo", argNodeb0Success).Return(rnibErr)
170 var argNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
171 var argNodeb2Success = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
172 writerMock.On("UpdateNodebInfo", argNodeb2).Return(rnibErr)
173 writerMock.On("UpdateNodebInfo", argNodeb2Success).Return(rnibErr)
175 payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
176 xaction := []byte(ids[0].InventoryName)
177 msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
179 // Cannot use Mock because request MBuf contains pointers
180 //payload =models.NewE2RequestMessage(ids[1].InventoryName /*tid*/, "", 0,ids[1].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
181 //xaction = []byte(ids[1].InventoryName)
182 //msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[1].InventoryName, &payload, &xaction)
184 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, nil)
186 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
187 handler.Handle(log, nil, nil, nil)
189 readerMock.AssertNumberOfCalls(t, "GetNodeb", 3)
190 //test1 (+1), test2 failure (0) test3 (+1)
191 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
192 //test1 success (+1), test2 (0). test3 (+1)
193 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
196 func TestE2TerminInitHandlerSuccessThreeRansSecondRnibInternalErrorFailure(t *testing.T) {
197 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
200 readerProvider := func() reader.RNibReader {
204 ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
205 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
207 var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
208 var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
209 var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
210 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
211 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, common.NewInternalError(fmt.Errorf("internal error")))
212 readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
214 var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
215 var argNodeb0Success = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
216 writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
217 writerMock.On("UpdateNodebInfo", argNodeb0Success).Return(rnibErr)
219 var argNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
220 var argNodeb2Success = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
221 writerMock.On("UpdateNodebInfo", argNodeb2).Return(rnibErr)
222 writerMock.On("UpdateNodebInfo", argNodeb2Success).Return(rnibErr)
224 payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
225 xaction := []byte(ids[0].InventoryName)
226 msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
228 // Cannot use Mock because request MBuf contains pointers
229 //payload =models.NewE2RequestMessage(ids[1].InventoryName /*tid*/, "", 0,ids[1].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
230 //xaction = []byte(ids[1].InventoryName)
231 //msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[1].InventoryName, &payload, &xaction)
233 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, nil)
235 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
236 handler.Handle(log, nil, nil, nil)
238 readerMock.AssertNumberOfCalls(t, "GetNodeb", 2)
239 //test1 (+1), test2 failure (0) test3 (0)
240 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
241 //test1 success (+1), test2 (0). test3 (+1)
242 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
245 func TestE2TerminInitHandlerSuccessZeroRans(t *testing.T) {
246 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
249 readerProvider := func() reader.RNibReader {
253 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, rnibErr)
255 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
256 handler.Handle(log, nil, nil, nil)
258 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
259 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
262 func TestE2TerminInitHandlerFailureGetListNodebIds(t *testing.T) {
263 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
265 readerProvider := func() reader.RNibReader {
269 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, common.NewInternalError(fmt.Errorf("internal error")))
271 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
272 handler.Handle(log, nil, nil, nil)
274 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
275 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
278 // TODO: extract to test_utils
279 func getRmrService(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *services.RmrService {
280 rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
281 messageChannel := make(chan *models.NotificationResponse)
282 rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger)
283 return services.NewRmrService(services.NewRmrConfig(tests.Port, tests.MaxMsgSize, tests.Flags, log), rmrMessenger, make(sessions.E2Sessions), messageChannel)
286 // TODO: extract to test_utils
287 func initLog(t *testing.T) *logger.Logger {
288 log, err := logger.InitLogger(logger.InfoLevel)
290 t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err)