51827f4be9c6dbf014a43116fd1f8eabd1c6cf2f
[ric-plt/e2mgr.git] / E2Manager / handlers / rmrmsghandlers / e2_term_init_notification_handler_test.go
1 package rmrmsghandlers
2
3 import (
4         "e2mgr/configuration"
5         "e2mgr/e2pdus"
6         "e2mgr/logger"
7         "e2mgr/managers"
8         "e2mgr/mocks"
9         "e2mgr/models"
10         "e2mgr/rNibWriter"
11         "e2mgr/rmrCgo"
12         "e2mgr/services"
13         "e2mgr/sessions"
14         "e2mgr/tests"
15         "fmt"
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"
20         "testing"
21 )
22
23 func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *managers.RanReconnectionManager) {
24
25         logger := initLog(t)
26
27         rmrMessengerMock := &mocks.RmrMessengerMock{}
28         rmrService := getRmrService(rmrMessengerMock, logger)
29
30         readerMock := &mocks.RnibReaderMock{}
31         rnibReaderProvider := func() reader.RNibReader {
32                 return readerMock
33         }
34         writerMock := &mocks.RnibWriterMock{}
35         rnibWriterProvider := func() rNibWriter.RNibWriter {
36                 return writerMock
37         }
38         ranSetupManager := managers.NewRanSetupManager(logger,rmrService, rnibWriterProvider)
39         ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager)
40         return logger, readerMock, writerMock, rmrMessengerMock, ranReconnectionManager
41 }
42
43 func TestE2TerminInitHandlerSuccessOneRan(t *testing.T) {
44         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
45         var rnibErr error
46
47         readerProvider := func() reader.RNibReader {
48                 return readerMock
49         }
50
51         ids := []*entities.NbIdentity{{InventoryName: "test1"}}
52         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
53
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)
56
57         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
58         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
59
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)
63
64         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
65
66         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
67         handler.Handle(log, nil, nil, nil)
68
69         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
70         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
71 }
72
73 func TestE2TerminInitHandlerSuccessTwoRans(t *testing.T) {
74         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
75         var rnibErr error
76
77         readerProvider := func() reader.RNibReader {
78                 return readerMock
79         }
80
81         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}}
82         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
83
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)
88
89         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
90         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
91
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)
95
96         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
97
98         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
99         handler.Handle(log, nil, nil, nil)
100
101         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
102         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
103 }
104
105 func TestE2TerminInitHandlerSuccessThreeRansFirstRmrFailure(t *testing.T) {
106         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
107         var rnibErr error
108
109         readerProvider := func() reader.RNibReader {
110                 return readerMock
111         }
112
113         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
114         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
115
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)
122
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)
127
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)
131
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)
136
137         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, fmt.Errorf("RMR Error"))
138
139         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
140         handler.Handle(log, nil, nil, nil)
141
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)
146 }
147
148 func TestE2TerminInitHandlerSuccessThreeRansSecondNotFoundFailure(t *testing.T) {
149         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
150         var rnibErr error
151
152         readerProvider := func() reader.RNibReader {
153                 return readerMock
154         }
155
156         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
157         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
158
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)
165
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)
170
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)
175
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)
179
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)
184
185         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, nil)
186
187         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
188         handler.Handle(log, nil, nil, nil)
189
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)
195 }
196
197 func TestE2TerminInitHandlerSuccessThreeRansSecondRnibInternalErrorFailure(t *testing.T) {
198         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
199         var rnibErr error
200
201         readerProvider := func() reader.RNibReader {
202                 return readerMock
203         }
204
205         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
206         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
207
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)
214
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)
219
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)
224
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)
228
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)
233
234         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, nil)
235
236         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
237         handler.Handle(log, nil, nil, nil)
238
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)
244 }
245
246 func TestE2TerminInitHandlerSuccessZeroRans(t *testing.T) {
247         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
248         var rnibErr error
249
250         readerProvider := func() reader.RNibReader {
251                 return readerMock
252         }
253
254         readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, rnibErr)
255
256         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
257         handler.Handle(log, nil, nil, nil)
258
259         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
260         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
261 }
262
263 func TestE2TerminInitHandlerFailureGetListNodebIds(t *testing.T) {
264         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
265
266         readerProvider := func() reader.RNibReader {
267                 return readerMock
268         }
269
270         readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, common.NewInternalError(fmt.Errorf("internal error")))
271
272         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
273         handler.Handle(log, nil, nil, nil)
274
275         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
276         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
277 }
278
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)
285 }
286
287 // TODO: extract to test_utils
288 func initLog(t *testing.T) *logger.Logger {
289         log, err := logger.InitLogger(logger.InfoLevel)
290         if err != nil {
291                 t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err)
292         }
293         return log
294 }