[RICPLT-1852] Supports E2T Initialize - Enable handler + UT
[ric-plt/e2mgr.git] / E2Manager / handlers / e2_term_init_notification_handler_test.go
1 package handlers
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         "fmt"
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"
17         "testing"
18 )
19
20 func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *managers.RanReconnectionManager) {
21         logger := initLog(t)
22
23         rmrMessengerMock := &mocks.RmrMessengerMock{}
24         rmrService := getRmrService(rmrMessengerMock, logger)
25
26         readerMock := &mocks.RnibReaderMock{}
27         rnibReaderProvider := func() reader.RNibReader {
28                 return readerMock
29         }
30         writerMock := &mocks.RnibWriterMock{}
31         rnibWriterProvider := func() rNibWriter.RNibWriter {
32                 return writerMock
33         }
34
35         ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, rmrService)
36         return logger, readerMock, writerMock, rmrMessengerMock, ranReconnectionManager
37 }
38
39 func TestE2TerminInitHandlerSuccessOneRan(t *testing.T) {
40         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
41         var rnibErr common.IRNibError
42
43         readerProvider := func() reader.RNibReader {
44                 return readerMock
45         }
46
47         ids := []*entities.NbIdentity {{InventoryName:"test1"}}
48         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
49
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)
52
53         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
54         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
55
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)
59
60         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
61
62         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
63         handler.Handle(log, nil, nil, nil)
64
65         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
66         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
67 }
68
69 func TestE2TerminInitHandlerSuccessTwoRans(t *testing.T) {
70         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
71         var rnibErr common.IRNibError
72
73         readerProvider := func() reader.RNibReader {
74                 return readerMock
75         }
76
77         ids := []*entities.NbIdentity {{InventoryName:"test1"}, {InventoryName:"test2"} }
78         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
79
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)
84
85         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
86         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
87
88
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)
92
93         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
94
95         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
96         handler.Handle(log, nil, nil, nil)
97
98         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
99         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
100 }
101
102 func TestE2TerminInitHandlerSuccessThreeRansFirstRmrFailure(t *testing.T) {
103         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
104         var rnibErr common.IRNibError
105
106         readerProvider := func() reader.RNibReader {
107                 return readerMock
108         }
109
110         ids := []*entities.NbIdentity {{InventoryName:"test1"}, {InventoryName:"test2"},{InventoryName:"test3"} }
111         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
112
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)
119
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)
124
125
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)
129
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)
134
135         rmrMessengerMock.On("SendMsg",  mock.Anything, mock.Anything).Return(msg0, fmt.Errorf("RMR Error"))
136
137         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
138         handler.Handle(log, nil, nil, nil)
139
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)
144 }
145
146 func TestE2TerminInitHandlerSuccessThreeRansSecondNotFoundFailure(t *testing.T) {
147         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
148         var rnibErr common.IRNibError
149
150         readerProvider := func() reader.RNibReader {
151                 return readerMock
152         }
153
154         ids := []*entities.NbIdentity {{InventoryName:"test1"}, {InventoryName:"test2"},{InventoryName:"test3"} }
155         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
156
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)
163
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)
168
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)
173
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
197 func TestE2TerminInitHandlerSuccessThreeRansSecondRnibInternalErrorFailure(t *testing.T) {
198         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
199         var rnibErr common.IRNibError
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
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)
229
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)
234
235         rmrMessengerMock.On("SendMsg",  mock.Anything, mock.Anything).Return(msg0, nil)
236
237         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
238         handler.Handle(log, nil, nil, nil)
239
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)
245 }
246
247 func TestE2TerminInitHandlerSuccessZeroRans(t *testing.T) {
248         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
249         var rnibErr common.IRNibError
250
251         readerProvider := func() reader.RNibReader {
252                 return readerMock
253         }
254
255         readerMock.On("GetListNodebIds").Return( []*entities.NbIdentity{} , rnibErr)
256
257         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
258         handler.Handle(log, nil, nil, nil)
259
260         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
261         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
262 }
263
264 func TestE2TerminInitHandlerFailureGetListNodebIds(t *testing.T) {
265         log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
266
267         readerProvider := func() reader.RNibReader {
268                 return readerMock
269         }
270
271         readerMock.On("GetListNodebIds").Return( []*entities.NbIdentity{} , common.NewInternalError(fmt.Errorf("internal error")))
272
273         handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
274         handler.Handle(log, nil, nil, nil)
275
276         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
277         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
278 }