[RICPLT-2157] Restructure handlers and converters.......
[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         logger := initLog(t)
25
26         rmrMessengerMock := &mocks.RmrMessengerMock{}
27         rmrService := getRmrService(rmrMessengerMock, logger)
28
29         readerMock := &mocks.RnibReaderMock{}
30         rnibReaderProvider := func() reader.RNibReader {
31                 return readerMock
32         }
33         writerMock := &mocks.RnibWriterMock{}
34         rnibWriterProvider := func() rNibWriter.RNibWriter {
35                 return writerMock
36         }
37
38         ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, rmrService)
39         return logger, readerMock, writerMock, rmrMessengerMock, ranReconnectionManager
40 }
41
42 func TestE2TerminInitHandlerSuccessOneRan(t *testing.T) {
43         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
44         var rnibErr error
45
46         readerProvider := func() reader.RNibReader {
47                 return readerMock
48         }
49
50         ids := []*entities.NbIdentity{{InventoryName: "test1"}}
51         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
52
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)
55
56         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
57         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
58
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)
62
63         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
64
65         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
66         handler.Handle(log, nil, nil, nil)
67
68         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
69         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
70 }
71
72 func TestE2TerminInitHandlerSuccessTwoRans(t *testing.T) {
73         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
74         var rnibErr error
75
76         readerProvider := func() reader.RNibReader {
77                 return readerMock
78         }
79
80         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}}
81         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
82
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)
87
88         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
89         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
90
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)
94
95         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
96
97         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
98         handler.Handle(log, nil, nil, nil)
99
100         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
101         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
102 }
103
104 func TestE2TerminInitHandlerSuccessThreeRansFirstRmrFailure(t *testing.T) {
105         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
106         var rnibErr error
107
108         readerProvider := func() reader.RNibReader {
109                 return readerMock
110         }
111
112         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
113         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
114
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)
121
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)
126
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)
130
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)
135
136         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, fmt.Errorf("RMR Error"))
137
138         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
139         handler.Handle(log, nil, nil, nil)
140
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)
145 }
146
147 func TestE2TerminInitHandlerSuccessThreeRansSecondNotFoundFailure(t *testing.T) {
148         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
149         var rnibErr error
150
151         readerProvider := func() reader.RNibReader {
152                 return readerMock
153         }
154
155         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
156         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
157
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)
164
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)
169
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)
174
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)
178
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)
183
184         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, nil)
185
186         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
187         handler.Handle(log, nil, nil, nil)
188
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)
194 }
195
196 func TestE2TerminInitHandlerSuccessThreeRansSecondRnibInternalErrorFailure(t *testing.T) {
197         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
198         var rnibErr error
199
200         readerProvider := func() reader.RNibReader {
201                 return readerMock
202         }
203
204         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
205         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
206
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)
213
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)
218
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)
223
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)
227
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)
232
233         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, nil)
234
235         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
236         handler.Handle(log, nil, nil, nil)
237
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)
243 }
244
245 func TestE2TerminInitHandlerSuccessZeroRans(t *testing.T) {
246         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
247         var rnibErr error
248
249         readerProvider := func() reader.RNibReader {
250                 return readerMock
251         }
252
253         readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, rnibErr)
254
255         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
256         handler.Handle(log, nil, nil, nil)
257
258         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
259         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
260 }
261
262 func TestE2TerminInitHandlerFailureGetListNodebIds(t *testing.T) {
263         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
264
265         readerProvider := func() reader.RNibReader {
266                 return readerMock
267         }
268
269         readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, common.NewInternalError(fmt.Errorf("internal error")))
270
271         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
272         handler.Handle(log, nil, nil, nil)
273
274         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
275         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
276 }
277
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)
284 }
285
286 // TODO: extract to test_utils
287 func initLog(t *testing.T) *logger.Logger {
288         log, err := logger.InitLogger(logger.InfoLevel)
289         if err != nil {
290                 t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err)
291         }
292         return log
293 }