13 "e2mgr/services/rmrsender"
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, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock) {
26 config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
28 rmrMessengerMock := &mocks.RmrMessengerMock{}
29 rmrSender := initRmrSender(rmrMessengerMock, logger)
31 readerMock := &mocks.RnibReaderMock{}
32 rnibReaderProvider := func() reader.RNibReader {
35 writerMock := &mocks.RnibWriterMock{}
36 rnibWriterProvider := func() rNibWriter.RNibWriter {
39 rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider)
40 ranSetupManager := managers.NewRanSetupManager(logger, rmrSender, rnibDataService)
41 ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager)
42 handler := NewE2TermInitNotificationHandler(logger, ranReconnectionManager, rnibDataService)
43 return logger, handler, readerMock, writerMock, rmrMessengerMock
46 func TestE2TerminInitHandlerSuccessOneRan(t *testing.T) {
47 _, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
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).Return(msg, nil)
67 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
68 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
71 func TestE2TerminInitHandlerSuccessTwoRans(t *testing.T) {
72 _, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
75 ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}}
76 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
78 var initialNodeb0 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
79 var initialNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
80 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
81 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, rnibErr)
83 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
84 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
86 payload := e2pdus.PackedX2setupRequest
87 xaction := []byte(ids[0].InventoryName)
88 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
90 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
94 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
95 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
98 func TestE2TerminInitHandlerSuccessThreeRansFirstRmrFailure(t *testing.T) {
99 log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
102 ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
103 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
105 var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
106 var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
107 var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
108 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
109 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, rnibErr)
110 readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
112 var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
113 var argNodeb0Fail = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
114 writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
115 writerMock.On("UpdateNodebInfo", argNodeb0Fail).Return(rnibErr)
117 payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
118 xaction := []byte(ids[0].InventoryName)
119 msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
121 // Cannot use Mock because request MBuf contains pointers
122 //payload =models.NewE2RequestMessage(ids[1].InventoryName /*tid*/, "", 0,ids[1].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
123 //xaction = []byte(ids[1].InventoryName)
124 //msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[1].InventoryName, &payload, &xaction)
126 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg0, fmt.Errorf("RMR Error"))
130 //test1 (before send +1, after failure +1), test2 (0) test3 (0)
131 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
132 //test1 failure (+1), test2 (0). test3 (0)
133 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
136 func TestE2TerminInitHandlerSuccessThreeRansSecondNotFoundFailure(t *testing.T) {
137 log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
140 ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
141 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
143 var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
144 var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
145 var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
146 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
147 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, common.NewResourceNotFoundError("not found"))
148 readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
150 var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
151 var argNodeb0Success = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
152 writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
153 writerMock.On("UpdateNodebInfo", argNodeb0Success).Return(rnibErr)
155 var argNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
156 var argNodeb2Success = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
157 writerMock.On("UpdateNodebInfo", argNodeb2).Return(rnibErr)
158 writerMock.On("UpdateNodebInfo", argNodeb2Success).Return(rnibErr)
160 payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
161 xaction := []byte(ids[0].InventoryName)
162 msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
164 // Cannot use Mock because request MBuf contains pointers
165 //payload =models.NewE2RequestMessage(ids[1].InventoryName /*tid*/, "", 0,ids[1].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
166 //xaction = []byte(ids[1].InventoryName)
167 //msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[1].InventoryName, &payload, &xaction)
169 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg0, nil)
173 readerMock.AssertNumberOfCalls(t, "GetNodeb", 3)
174 //test1 (+1), test2 failure (0) test3 (+1)
175 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
176 //test1 success (+1), test2 (0). test3 (+1)
177 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
180 func TestE2TerminInitHandlerSuccessThreeRansSecondRnibInternalErrorFailure(t *testing.T) {
181 log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
184 ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
185 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
187 var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
188 var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
189 var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
190 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
191 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, common.NewInternalError(fmt.Errorf("internal error")))
192 readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
194 var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
195 var argNodeb0Success = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
196 writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
197 writerMock.On("UpdateNodebInfo", argNodeb0Success).Return(rnibErr)
199 var argNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
200 var argNodeb2Success = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
201 writerMock.On("UpdateNodebInfo", argNodeb2).Return(rnibErr)
202 writerMock.On("UpdateNodebInfo", argNodeb2Success).Return(rnibErr)
204 payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
205 xaction := []byte(ids[0].InventoryName)
206 msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
208 // Cannot use Mock because request MBuf contains pointers
209 //payload =models.NewE2RequestMessage(ids[1].InventoryName /*tid*/, "", 0,ids[1].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
210 //xaction = []byte(ids[1].InventoryName)
211 //msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[1].InventoryName, &payload, &xaction)
213 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg0, nil)
217 readerMock.AssertNumberOfCalls(t, "GetNodeb", 2)
218 //test1 (+1), test2 failure (0) test3 (0)
219 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
220 //test1 success (+1), test2 (0). test3 (+1)
221 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
224 func TestE2TerminInitHandlerSuccessZeroRans(t *testing.T) {
225 _, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
228 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, rnibErr)
232 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
233 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
236 func TestE2TerminInitHandlerFailureGetListNodebIds(t *testing.T) {
237 _, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
239 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, common.NewInternalError(fmt.Errorf("internal error")))
243 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
244 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
247 // TODO: extract to test_utils
248 func initRmrSender(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *rmrsender.RmrSender {
249 rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
250 rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger)
251 return rmrsender.NewRmrSender(log, &rmrMessenger)
254 // TODO: extract to test_utils
255 func initLog(t *testing.T) *logger.Logger {
256 log, err := logger.InitLogger(logger.InfoLevel)
258 t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err)