308d970867cc173ef049b7d36c1fd0a312eacb80
[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/tests"
14         "fmt"
15         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
16         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
17         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
18         "github.com/stretchr/testify/mock"
19         "testing"
20 )
21
22 func initRanLostConnectionTest(t *testing.T) (*logger.Logger, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock) {
23
24         logger := initLog(t)
25         config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
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         rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider)
39         ranSetupManager := managers.NewRanSetupManager(logger, rmrService, rnibDataService)
40         ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager)
41         handler := NewE2TermInitNotificationHandler(ranReconnectionManager, rnibDataService)
42         return logger, handler, readerMock, writerMock, rmrMessengerMock
43 }
44
45 func TestE2TerminInitHandlerSuccessOneRan(t *testing.T) {
46         log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
47         var rnibErr error
48
49         ids := []*entities.NbIdentity{{InventoryName: "test1"}}
50         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
51
52         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
53         readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb, rnibErr)
54
55         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
56         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
57
58         payload := e2pdus.PackedX2setupRequest
59         xaction := []byte(ids[0].InventoryName)
60         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
61
62         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
63
64         handler.Handle(log, nil, nil)
65
66         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
67         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
68 }
69
70 func TestE2TerminInitHandlerSuccessTwoRans(t *testing.T) {
71         log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
72         var rnibErr error
73
74         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}}
75         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
76
77         var initialNodeb0 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
78         var initialNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
79         readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
80         readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, rnibErr)
81
82         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
83         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
84
85         payload := e2pdus.PackedX2setupRequest
86         xaction := []byte(ids[0].InventoryName)
87         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
88
89         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
90
91         handler.Handle(log, nil, nil)
92
93         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
94         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
95 }
96
97 func TestE2TerminInitHandlerSuccessThreeRansFirstRmrFailure(t *testing.T) {
98         log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
99         var rnibErr error
100
101         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
102         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
103
104         var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
105         var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
106         var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
107         readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
108         readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, rnibErr)
109         readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
110
111         var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
112         var argNodeb0Fail = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
113         writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
114         writerMock.On("UpdateNodebInfo", argNodeb0Fail).Return(rnibErr)
115
116         payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
117         xaction := []byte(ids[0].InventoryName)
118         msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
119
120         // Cannot use Mock because request MBuf contains pointers
121         //payload =models.NewE2RequestMessage(ids[1].InventoryName /*tid*/, "", 0,ids[1].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
122         //xaction = []byte(ids[1].InventoryName)
123         //msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[1].InventoryName, &payload, &xaction)
124
125         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, fmt.Errorf("RMR Error"))
126
127         handler.Handle(log, nil, nil)
128
129         //test1 (before send +1, after failure +1), test2 (0) test3 (0)
130         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
131         //test1 failure (+1), test2  (0). test3 (0)
132         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
133 }
134
135 func TestE2TerminInitHandlerSuccessThreeRansSecondNotFoundFailure(t *testing.T) {
136         log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
137         var rnibErr error
138
139         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
140         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
141
142         var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
143         var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
144         var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
145         readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
146         readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, common.NewResourceNotFoundError("not found"))
147         readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
148
149         var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
150         var argNodeb0Success = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
151         writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
152         writerMock.On("UpdateNodebInfo", argNodeb0Success).Return(rnibErr)
153
154         var argNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
155         var argNodeb2Success = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
156         writerMock.On("UpdateNodebInfo", argNodeb2).Return(rnibErr)
157         writerMock.On("UpdateNodebInfo", argNodeb2Success).Return(rnibErr)
158
159         payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
160         xaction := []byte(ids[0].InventoryName)
161         msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
162
163         // Cannot use Mock because request MBuf contains pointers
164         //payload =models.NewE2RequestMessage(ids[1].InventoryName /*tid*/, "", 0,ids[1].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
165         //xaction = []byte(ids[1].InventoryName)
166         //msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[1].InventoryName, &payload, &xaction)
167
168         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, nil)
169
170         handler.Handle(log, nil, nil)
171
172         readerMock.AssertNumberOfCalls(t, "GetNodeb", 3)
173         //test1 (+1), test2 failure (0) test3 (+1)
174         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
175         //test1 success (+1), test2  (0). test3 (+1)
176         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2)
177 }
178
179 func TestE2TerminInitHandlerSuccessThreeRansSecondRnibInternalErrorFailure(t *testing.T) {
180         log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
181         var rnibErr error
182
183         ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
184         readerMock.On("GetListNodebIds").Return(ids, rnibErr)
185
186         var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
187         var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
188         var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
189         readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr)
190         readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, common.NewInternalError(fmt.Errorf("internal error")))
191         readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr)
192
193         var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
194         var argNodeb0Success = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
195         writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr)
196         writerMock.On("UpdateNodebInfo", argNodeb0Success).Return(rnibErr)
197
198         var argNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
199         var argNodeb2Success = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
200         writerMock.On("UpdateNodebInfo", argNodeb2).Return(rnibErr)
201         writerMock.On("UpdateNodebInfo", argNodeb2Success).Return(rnibErr)
202
203         payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
204         xaction := []byte(ids[0].InventoryName)
205         msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction)
206
207         // Cannot use Mock because request MBuf contains pointers
208         //payload =models.NewE2RequestMessage(ids[1].InventoryName /*tid*/, "", 0,ids[1].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log)
209         //xaction = []byte(ids[1].InventoryName)
210         //msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[1].InventoryName, &payload, &xaction)
211
212         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, nil)
213
214         handler.Handle(log, nil, nil)
215
216         readerMock.AssertNumberOfCalls(t, "GetNodeb", 2)
217         //test1 (+1), test2 failure (0) test3 (0)
218         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
219         //test1 success (+1), test2  (0). test3 (+1)
220         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
221 }
222
223 func TestE2TerminInitHandlerSuccessZeroRans(t *testing.T) {
224         log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
225         var rnibErr error
226
227         readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, rnibErr)
228
229         handler.Handle(log, nil, nil)
230
231         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
232         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
233 }
234
235 func TestE2TerminInitHandlerFailureGetListNodebIds(t *testing.T) {
236         log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
237
238         readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, common.NewInternalError(fmt.Errorf("internal error")))
239
240         handler.Handle(log, nil, nil)
241
242         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
243         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
244 }
245
246 // TODO: extract to test_utils
247 func getRmrService(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *services.RmrService {
248         rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
249         messageChannel := make(chan *models.NotificationResponse)
250         rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger)
251         return services.NewRmrService(services.NewRmrConfig(tests.Port, tests.MaxMsgSize, tests.Flags, log), rmrMessenger, messageChannel)
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 }