sync from Azure to LF
[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/services/rmrsender"
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, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock) {
24
25         logger := initLog(t)
26         config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
27
28         rmrMessengerMock := &mocks.RmrMessengerMock{}
29         rmrSender := initRmrSender(rmrMessengerMock, logger)
30
31         readerMock := &mocks.RnibReaderMock{}
32         rnibReaderProvider := func() reader.RNibReader {
33                 return readerMock
34         }
35         writerMock := &mocks.RnibWriterMock{}
36         rnibWriterProvider := func() rNibWriter.RNibWriter {
37                 return writerMock
38         }
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
44 }
45
46 func TestE2TerminInitHandlerSuccessOneRan(t *testing.T) {
47         _, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
48         var rnibErr error
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).Return(msg, nil)
64
65         handler.Handle(nil)
66
67         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
68         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
69 }
70
71 func TestE2TerminInitHandlerSuccessTwoRans(t *testing.T) {
72         _, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
73         var rnibErr error
74
75         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}}
76         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
77
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)
82
83         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
84         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
85
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)
89
90         rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
91
92         handler.Handle(nil)
93
94         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
95         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
96 }
97
98 func TestE2TerminInitHandlerSuccessThreeRansFirstRmrFailure(t *testing.T) {
99         log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
100         var rnibErr error
101
102         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
103         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
104
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)
111
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)
116
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)
120
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)
125
126         rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg0, fmt.Errorf("RMR Error"))
127
128         handler.Handle(nil)
129
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)
134 }
135
136 func TestE2TerminInitHandlerSuccessThreeRansSecondNotFoundFailure(t *testing.T) {
137         log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
138         var rnibErr error
139
140         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
141         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
142
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)
149
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)
154
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)
159
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)
163
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)
168
169         rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg0, nil)
170
171         handler.Handle(nil)
172
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)
178 }
179
180 func TestE2TerminInitHandlerSuccessThreeRansSecondRnibInternalErrorFailure(t *testing.T) {
181         log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
182         var rnibErr error
183
184         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
185         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
186
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)
193
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)
198
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)
203
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)
207
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)
212
213         rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg0, nil)
214
215         handler.Handle(nil)
216
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)
222 }
223
224 func TestE2TerminInitHandlerSuccessZeroRans(t *testing.T) {
225         _, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
226         var rnibErr error
227
228         readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, rnibErr)
229
230         handler.Handle(nil)
231
232         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
233         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
234 }
235
236 func TestE2TerminInitHandlerFailureGetListNodebIds(t *testing.T) {
237         _, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
238
239         readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, common.NewInternalError(fmt.Errorf("internal error")))
240
241         handler.Handle(nil)
242
243         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
244         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
245 }
246
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)
252 }
253
254 // TODO: extract to test_utils
255 func initLog(t *testing.T) *logger.Logger {
256         log, err := logger.InitLogger(logger.InfoLevel)
257         if err != nil {
258                 t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err)
259         }
260         return log
261 }