2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
18 package rmrmsghandlers
23 "e2mgr/e2managererrors"
32 "e2mgr/services/rmrsender"
35 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
36 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
37 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
38 "github.com/pkg/errors"
39 "github.com/stretchr/testify/assert"
40 "github.com/stretchr/testify/mock"
46 X2SetupResponsePackedPdu = "2006002a000002001500080002f82900007a8000140017000000630002f8290007ab50102002f829000001000133"
47 EndcSetupResponsePackedPdu = "202400808e00000100f600808640000200fc00090002f829504a952a0a00fd007200010c0005001e3f271f2e3d4ff03d44d34e4f003e4e5e4400010000150400000a000211e148033e4e5e4c0005001e3f271f2e3d4ff03d44d34e4f003e4e5e4400010000150400000a00021a0044033e4e5e000000002c001e3f271f2e3d4ff0031e3f274400010000150400000a00020000"
48 X2SetupFailureResponsePackedPdu = "4006001a0000030005400200000016400100001140087821a00000008040"
49 EndcSetupFailureResponsePackedPdu = "4024001a0000030005400200000016400100001140087821a00000008040"
52 type setupSuccessResponseTestCase struct {
54 setupResponseManager managers.ISetupResponseManager
56 saveNodebMockError error
58 statusChangeMbuf *rmrCgo.MBuf
61 type setupFailureResponseTestCase struct {
63 setupResponseManager managers.ISetupResponseManager
65 saveNodebMockError error
68 type setupResponseTestContext struct {
70 readerMock *mocks.RnibReaderMock
71 writerMock *mocks.RnibWriterMock
72 rnibDataService services.RNibDataService
73 setupResponseManager managers.ISetupResponseManager
74 ranStatusChangeManager managers.IRanStatusChangeManager
75 rmrSender *rmrsender.RmrSender
76 rmrMessengerMock *mocks.RmrMessengerMock
79 func NewSetupResponseTestContext(manager managers.ISetupResponseManager) *setupResponseTestContext {
80 logger, _ := logger.InitLogger(logger.InfoLevel)
81 config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
82 readerMock := &mocks.RnibReaderMock{}
83 writerMock := &mocks.RnibWriterMock{}
84 rnibReaderProvider := func() reader.RNibReader {
87 rnibWriterProvider := func() rNibWriter.RNibWriter {
90 rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider)
92 rmrMessengerMock := &mocks.RmrMessengerMock{}
93 rmrSender := initRmrSender(rmrMessengerMock, logger)
95 ranStatusChangeManager := managers.NewRanStatusChangeManager(logger, rmrSender)
97 return &setupResponseTestContext{
99 readerMock: readerMock,
100 writerMock: writerMock,
101 rnibDataService: rnibDataService,
102 setupResponseManager: manager,
103 ranStatusChangeManager: ranStatusChangeManager,
104 rmrMessengerMock: rmrMessengerMock,
105 rmrSender: rmrSender,
109 func TestSetupResponseGetNodebFailure(t *testing.T) {
110 notificationRequest := models.NotificationRequest{RanName: RanName}
111 testContext := NewSetupResponseTestContext(nil)
112 handler := NewSetupResponseNotificationHandler(testContext.logger, testContext.rnibDataService, &managers.X2SetupResponseManager{}, testContext.ranStatusChangeManager, rmrCgo.RIC_X2_SETUP_RESP)
113 testContext.readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewInternalError(errors.New("Error")))
114 handler.Handle(¬ificationRequest)
115 testContext.readerMock.AssertCalled(t, "GetNodeb", RanName)
116 testContext.writerMock.AssertNotCalled(t, "SaveNodeb")
117 testContext.rmrMessengerMock.AssertNotCalled(t, "SendMsg")
120 func TestSetupResponseInvalidConnectionStatus(t *testing.T) {
122 notificationRequest := models.NotificationRequest{RanName: ranName}
123 testContext := NewSetupResponseTestContext(nil)
124 handler := NewSetupResponseNotificationHandler(testContext.logger, testContext.rnibDataService, &managers.X2SetupResponseManager{}, testContext.ranStatusChangeManager, rmrCgo.RIC_X2_SETUP_RESP)
126 testContext.readerMock.On("GetNodeb", ranName).Return(&entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}, rnibErr)
127 handler.Handle(¬ificationRequest)
128 testContext.readerMock.AssertCalled(t, "GetNodeb", ranName)
129 testContext.writerMock.AssertNotCalled(t, "SaveNodeb")
130 testContext.rmrMessengerMock.AssertNotCalled(t, "SendMsg")
133 func executeHandleSetupSuccessResponse(t *testing.T, tc setupSuccessResponseTestCase) (*setupResponseTestContext, *entities.NodebInfo) {
135 _, err := fmt.Sscanf(tc.packedPdu, "%x", &payload)
137 t.Fatalf("Failed converting packed pdu. Error: %v\n", err)
140 notificationRequest := models.NotificationRequest{RanName: RanName, Payload: payload}
141 testContext := NewSetupResponseTestContext(tc.setupResponseManager)
143 handler := NewSetupResponseNotificationHandler(testContext.logger, testContext.rnibDataService, testContext.setupResponseManager, testContext.ranStatusChangeManager, tc.msgType)
147 nodebInfo := &entities.NodebInfo{
148 ConnectionStatus: entities.ConnectionStatus_CONNECTING,
149 ConnectionAttempts: 1,
155 testContext.readerMock.On("GetNodeb", RanName).Return(nodebInfo, rnibErr)
156 testContext.writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(tc.saveNodebMockError)
157 testContext.rmrMessengerMock.On("SendMsg", tc.statusChangeMbuf).Return(&rmrCgo.MBuf{}, tc.sendMsgError)
158 handler.Handle(¬ificationRequest)
160 return testContext, nodebInfo
163 func getRanConnectedMbuf(nodeType entities.Node_Type) *rmrCgo.MBuf {
164 xaction := []byte(RanName)
165 resourceStatusPayload := models.NewResourceStatusPayload(nodeType, enums.RIC_TO_RAN)
166 resourceStatusJson, _ := json.Marshal(resourceStatusPayload)
167 return rmrCgo.NewMBuf(rmrCgo.RAN_CONNECTED, len(resourceStatusJson), RanName, &resourceStatusJson, &xaction)
170 func executeHandleSetupFailureResponse(t *testing.T, tc setupFailureResponseTestCase) (*setupResponseTestContext, *entities.NodebInfo) {
172 _, err := fmt.Sscanf(tc.packedPdu, "%x", &payload)
174 t.Fatalf("Failed converting packed pdu. Error: %v\n", err)
177 notificationRequest := models.NotificationRequest{RanName: RanName, Payload: payload}
178 testContext := NewSetupResponseTestContext(tc.setupResponseManager)
180 handler := NewSetupResponseNotificationHandler(testContext.logger, testContext.rnibDataService, testContext.setupResponseManager, testContext.ranStatusChangeManager, tc.msgType)
184 nodebInfo := &entities.NodebInfo{
185 ConnectionStatus: entities.ConnectionStatus_CONNECTING,
186 ConnectionAttempts: 1,
192 testContext.readerMock.On("GetNodeb", RanName).Return(nodebInfo, rnibErr)
193 testContext.writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(tc.saveNodebMockError)
194 handler.Handle(¬ificationRequest)
196 return testContext, nodebInfo
199 func TestX2SetupResponse(t *testing.T) {
201 var saveNodebMockError error
202 var sendMsgError error
203 tc := setupSuccessResponseTestCase{
204 X2SetupResponsePackedPdu,
205 managers.NewX2SetupResponseManager(converters.NewX2SetupResponseConverter(logger)),
206 rmrCgo.RIC_X2_SETUP_RESP,
209 getRanConnectedMbuf(entities.Node_ENB),
212 testContext, nodebInfo := executeHandleSetupSuccessResponse(t, tc)
213 testContext.readerMock.AssertCalled(t, "GetNodeb", RanName)
214 testContext.writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo)
215 assert.EqualValues(t, entities.ConnectionStatus_CONNECTED, nodebInfo.ConnectionStatus)
216 assert.EqualValues(t, 0, nodebInfo.ConnectionAttempts)
217 assert.EqualValues(t, entities.Node_ENB, nodebInfo.NodeType)
219 assert.IsType(t, &entities.NodebInfo_Enb{}, nodebInfo.Configuration)
220 i, _ := nodebInfo.Configuration.(*entities.NodebInfo_Enb)
221 assert.NotNil(t, i.Enb)
222 testContext.rmrMessengerMock.AssertCalled(t, "SendMsg", tc.statusChangeMbuf)
225 func TestX2SetupFailureResponse(t *testing.T) {
227 var saveNodebMockError error
228 tc := setupFailureResponseTestCase{
229 X2SetupFailureResponsePackedPdu,
230 managers.NewX2SetupFailureResponseManager(converters.NewX2SetupFailureResponseConverter(logger)),
231 rmrCgo.RIC_X2_SETUP_FAILURE,
235 testContext, nodebInfo := executeHandleSetupFailureResponse(t, tc)
236 testContext.readerMock.AssertCalled(t, "GetNodeb", RanName)
237 testContext.writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo)
238 assert.EqualValues(t, entities.ConnectionStatus_CONNECTED_SETUP_FAILED, nodebInfo.ConnectionStatus)
239 assert.EqualValues(t, 0, nodebInfo.ConnectionAttempts)
240 assert.EqualValues(t, entities.Failure_X2_SETUP_FAILURE, nodebInfo.FailureType)
241 assert.NotNil(t, nodebInfo.SetupFailure)
242 testContext.rmrMessengerMock.AssertNotCalled(t, "SendMsg")
245 func TestEndcSetupResponse(t *testing.T) {
246 var saveNodebMockError error
247 var sendMsgError error
248 tc := setupSuccessResponseTestCase{
249 EndcSetupResponsePackedPdu,
250 &managers.EndcSetupResponseManager{},
251 rmrCgo.RIC_ENDC_X2_SETUP_RESP,
254 getRanConnectedMbuf(entities.Node_GNB),
257 testContext, nodebInfo := executeHandleSetupSuccessResponse(t, tc)
258 testContext.readerMock.AssertCalled(t, "GetNodeb", RanName)
259 testContext.writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo)
260 assert.EqualValues(t, entities.ConnectionStatus_CONNECTED, nodebInfo.ConnectionStatus)
261 assert.EqualValues(t, 0, nodebInfo.ConnectionAttempts)
262 assert.EqualValues(t, entities.Node_GNB, nodebInfo.NodeType)
263 assert.IsType(t, &entities.NodebInfo_Gnb{}, nodebInfo.Configuration)
265 i, _ := nodebInfo.Configuration.(*entities.NodebInfo_Gnb)
266 assert.NotNil(t, i.Gnb)
267 testContext.rmrMessengerMock.AssertCalled(t, "SendMsg", tc.statusChangeMbuf)
270 func TestEndcSetupFailureResponse(t *testing.T) {
272 var saveNodebMockError error
273 tc := setupFailureResponseTestCase{
274 EndcSetupFailureResponsePackedPdu,
275 &managers.EndcSetupFailureResponseManager{},
276 rmrCgo.RIC_ENDC_X2_SETUP_FAILURE,
280 testContext, nodebInfo := executeHandleSetupFailureResponse(t, tc)
281 testContext.readerMock.AssertCalled(t, "GetNodeb", RanName)
282 testContext.writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo)
283 assert.EqualValues(t, entities.ConnectionStatus_CONNECTED_SETUP_FAILED, nodebInfo.ConnectionStatus)
284 assert.EqualValues(t, 0, nodebInfo.ConnectionAttempts)
285 assert.EqualValues(t, entities.Failure_ENDC_X2_SETUP_FAILURE, nodebInfo.FailureType)
286 assert.NotNil(t, nodebInfo.SetupFailure)
287 testContext.rmrMessengerMock.AssertNotCalled(t, "SendMsg")
290 func TestSetupResponseInvalidPayload(t *testing.T) {
293 notificationRequest := models.NotificationRequest{RanName: ranName, Payload: []byte("123")}
294 testContext := NewSetupResponseTestContext(nil)
295 handler := NewSetupResponseNotificationHandler(testContext.logger, testContext.rnibDataService, managers.NewX2SetupResponseManager(converters.NewX2SetupResponseConverter(logger)), testContext.ranStatusChangeManager, rmrCgo.RIC_X2_SETUP_RESP)
297 testContext.readerMock.On("GetNodeb", ranName).Return(&entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, ConnectionAttempts: 1}, rnibErr)
298 handler.Handle(¬ificationRequest)
299 testContext.readerMock.AssertCalled(t, "GetNodeb", ranName)
300 testContext.writerMock.AssertNotCalled(t, "SaveNodeb")
301 testContext.rmrMessengerMock.AssertNotCalled(t, "SendMsg")
304 func TestSetupResponseSaveNodebFailure(t *testing.T) {
306 saveNodebMockError := common.NewInternalError(errors.New("Error"))
307 var sendMsgError error
308 tc := setupSuccessResponseTestCase{
309 X2SetupResponsePackedPdu,
310 managers.NewX2SetupResponseManager(converters.NewX2SetupResponseConverter(logger)),
311 rmrCgo.RIC_X2_SETUP_RESP,
314 getRanConnectedMbuf(entities.Node_ENB),
317 testContext, nodebInfo := executeHandleSetupSuccessResponse(t, tc)
318 testContext.readerMock.AssertCalled(t, "GetNodeb", RanName)
319 testContext.writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo)
320 testContext.rmrMessengerMock.AssertNotCalled(t, "SendMsg")
323 func TestSetupResponseStatusChangeSendFailure(t *testing.T) {
325 var saveNodebMockError error
326 sendMsgError := e2managererrors.NewRmrError()
327 tc := setupSuccessResponseTestCase{
328 X2SetupResponsePackedPdu,
329 managers.NewX2SetupResponseManager(converters.NewX2SetupResponseConverter(logger)),
330 rmrCgo.RIC_X2_SETUP_RESP,
333 getRanConnectedMbuf(entities.Node_ENB),
336 testContext, nodebInfo := executeHandleSetupSuccessResponse(t, tc)
337 testContext.readerMock.AssertCalled(t, "GetNodeb", RanName)
338 testContext.writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo)
339 assert.EqualValues(t, entities.ConnectionStatus_CONNECTED, nodebInfo.ConnectionStatus)
340 assert.EqualValues(t, 0, nodebInfo.ConnectionAttempts)
341 assert.EqualValues(t, entities.Node_ENB, nodebInfo.NodeType)
343 assert.IsType(t, &entities.NodebInfo_Enb{}, nodebInfo.Configuration)
344 i, _ := nodebInfo.Configuration.(*entities.NodebInfo_Enb)
345 assert.NotNil(t, i.Enb)
346 testContext.rmrMessengerMock.AssertCalled(t, "SendMsg", tc.statusChangeMbuf)