13 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
14 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
15 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
16 "github.com/stretchr/testify/mock"
20 func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *managers.RanReconnectionManager) {
23 rmrMessengerMock := &mocks.RmrMessengerMock{}
24 rmrService := getRmrService(rmrMessengerMock, logger)
26 readerMock := &mocks.RnibReaderMock{}
27 rnibReaderProvider := func() reader.RNibReader {
30 writerMock := &mocks.RnibWriterMock{}
31 rnibWriterProvider := func() rNibWriter.RNibWriter {
35 ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, rmrService)
36 return logger, readerMock, writerMock, rmrMessengerMock, ranReconnectionManager
39 func TestE2TerminInitHandlerSuccessOneRan(t *testing.T) {
40 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
41 var rnibErr common.IRNibError
43 readerProvider := func() reader.RNibReader {
47 ids := []*entities.NbIdentity {{InventoryName:"test1"}}
48 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
50 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
51 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb, rnibErr)
53 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
54 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
56 payload := e2pdus.PackedX2setupRequest
57 xaction := []byte(ids[0].InventoryName)
58 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
60 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
62 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
63 handler.Handle(log, nil, nil, nil)
65 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
66 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
69 func TestE2TerminInitHandlerSuccessTwoRans(t *testing.T) {
70 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
71 var rnibErr common.IRNibError
73 readerProvider := func() reader.RNibReader {
77 ids := []*entities.NbIdentity {{InventoryName:"test1"}, {InventoryName:"test2"} }
78 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
80 var initialNodeb0 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
81 var initialNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
82 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
83 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, rnibErr)
85 var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
86 writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
89 payload := e2pdus.PackedX2setupRequest
90 xaction := []byte(ids[0].InventoryName)
91 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
93 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
95 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
96 handler.Handle(log, nil, nil, nil)
98 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
99 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
102 func TestE2TerminInitHandlerSuccessThreeRansFirstRmrFailure(t *testing.T) {
103 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
104 var rnibErr common.IRNibError
106 readerProvider := func() reader.RNibReader {
110 ids := []*entities.NbIdentity {{InventoryName:"test1"}, {InventoryName:"test2"},{InventoryName:"test3"} }
111 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
113 var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
114 var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
115 var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
116 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
117 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, rnibErr)
118 readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
120 var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName,ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
121 var argNodeb0Fail = &entities.NodebInfo{RanName: ids[0].InventoryName,ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
122 writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
123 writerMock.On("UpdateNodebInfo", argNodeb0Fail).Return(rnibErr)
126 payload :=models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0,ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
127 xaction := []byte(ids[0].InventoryName)
128 msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
130 // Cannot use Mock because request MBuf contains pointers
131 //payload =models.NewE2RequestMessage(ids[1].InventoryName /*tid*/, "", 0,ids[1].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
132 //xaction = []byte(ids[1].InventoryName)
133 //msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[1].InventoryName, &payload, &xaction)
135 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, fmt.Errorf("RMR Error"))
137 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
138 handler.Handle(log, nil, nil, nil)
140 //test1 (before send +1, after failure +1), test2 (0) test3 (0)
141 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
142 //test1 failure (+1), test2 (0). test3 (0)
143 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
146 func TestE2TerminInitHandlerSuccessThreeRansSecondNotFoundFailure(t *testing.T) {
147 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
148 var rnibErr common.IRNibError
150 readerProvider := func() reader.RNibReader {
154 ids := []*entities.NbIdentity {{InventoryName:"test1"}, {InventoryName:"test2"},{InventoryName:"test3"} }
155 readerMock.On("GetListNodebIds").Return(ids, rnibErr)
157 var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
158 var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
159 var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
160 readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
161 readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, common.NewResourceNotFoundError(fmt.Errorf("not found")))
162 readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
164 var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName,ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
165 var argNodeb0Success = &entities.NodebInfo{RanName: ids[0].InventoryName,ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
166 writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
167 writerMock.On("UpdateNodebInfo", argNodeb0Success).Return(rnibErr)
169 var argNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName,ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
170 var argNodeb2Success = &entities.NodebInfo{RanName: ids[2].InventoryName,ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
171 writerMock.On("UpdateNodebInfo", argNodeb2).Return(rnibErr)
172 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)
197 func TestE2TerminInitHandlerSuccessThreeRansSecondRnibInternalErrorFailure(t *testing.T) {
198 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
199 var rnibErr common.IRNibError
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)
226 payload :=models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0,ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
227 xaction := []byte(ids[0].InventoryName)
228 msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
230 // Cannot use Mock because request MBuf contains pointers
231 //payload =models.NewE2RequestMessage(ids[1].InventoryName /*tid*/, "", 0,ids[1].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
232 //xaction = []byte(ids[1].InventoryName)
233 //msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[1].InventoryName, &payload, &xaction)
235 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, nil)
237 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
238 handler.Handle(log, nil, nil, nil)
240 readerMock.AssertNumberOfCalls(t, "GetNodeb", 2)
241 //test1 (+1), test2 failure (0) test3 (0)
242 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
243 //test1 success (+1), test2 (0). test3 (+1)
244 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
247 func TestE2TerminInitHandlerSuccessZeroRans(t *testing.T) {
248 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
249 var rnibErr common.IRNibError
251 readerProvider := func() reader.RNibReader {
255 readerMock.On("GetListNodebIds").Return( []*entities.NbIdentity{} , rnibErr)
257 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
258 handler.Handle(log, nil, nil, nil)
260 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
261 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
264 func TestE2TerminInitHandlerFailureGetListNodebIds(t *testing.T) {
265 log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
267 readerProvider := func() reader.RNibReader {
271 readerMock.On("GetListNodebIds").Return( []*entities.NbIdentity{} , common.NewInternalError(fmt.Errorf("internal error")))
273 handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
274 handler.Handle(log, nil, nil, nil)
276 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
277 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)