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.
17 // This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 // platform project (RICP).
20 package httpmsghandlers
25 "e2mgr/e2managererrors"
33 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
34 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
35 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
36 "github.com/stretchr/testify/assert"
37 "github.com/stretchr/testify/mock"
42 func TestSetupHandleNewRanSave_Error(t *testing.T) {
43 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
46 rnibErr := &common.ResourceNotFoundError{}
47 sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
49 nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
50 readerMock.On("GetNodeb", ranName).Return(nb, rnibErr)
52 vErr := &common.ValidationError{}
53 updatedNb, _ := rnibBuilders.CreateInitialNodeInfo(&sr, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
54 writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(vErr)
56 var nbUpdated = &entities.NodebInfo{RanName: ranName, Ip: sr.RanIp, Port: uint32(sr.RanPort), ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
57 writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
59 payload := e2pdus.PackedEndcX2setupRequest
60 xaction := []byte(ranName)
61 msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
63 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
65 _, actual := handler.Handle(sr)
66 expected := &e2managererrors.RnibDbError{}
68 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
69 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
72 writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1)
73 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
74 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
77 func TestSetupHandleNewRan_Success(t *testing.T) {
78 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
81 rnibErr := &common.ResourceNotFoundError{}
82 sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
84 nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
85 readerMock.On("GetNodeb", ranName).Return(nb, rnibErr)
87 updatedNb, _ := rnibBuilders.CreateInitialNodeInfo(&sr, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
88 writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(nil)
90 var nbUpdated = &entities.NodebInfo{RanName: ranName, Ip: sr.RanIp, Port: uint32(sr.RanPort), ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
91 writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
93 payload := e2pdus.PackedEndcX2setupRequest
94 xaction := []byte(ranName)
95 msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
97 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
99 _, actual := handler.Handle(sr)
101 assert.Nil(t, actual)
103 writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1)
104 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
105 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
108 func TestEndcSetupHandleRmr_Error(t *testing.T) {
109 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
112 nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
113 readerMock.On("GetNodeb", ranName).Return(nb, nil)
115 var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
116 writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
118 var nbDisconnected = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 0}
119 writerMock.On("UpdateNodebInfo", nbDisconnected).Return(nil)
121 payload := e2pdus.PackedEndcX2setupRequest
122 xaction := []byte(ranName)
123 msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
125 rmrErr := &e2managererrors.RmrError{}
126 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, rmrErr)
128 sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
129 _, actual := handler.Handle(sr)
131 if reflect.TypeOf(actual) != reflect.TypeOf(rmrErr) {
132 t.Errorf("Error actual = %v, and Expected = %v.", actual, rmrErr)
135 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
136 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
139 func TestEndcSetupHandleExistingDisconnectedRan_Success(t *testing.T) {
140 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
143 nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
144 readerMock.On("GetNodeb", ranName).Return(nb, nil)
146 var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
147 writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
149 payload := e2pdus.PackedEndcX2setupRequest
150 xaction := []byte(ranName)
151 msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
153 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
155 sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
156 _, actual := handler.Handle(sr)
158 assert.Nil(t, actual)
160 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
161 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
164 func TestX2SetupHandleExistingConnectedRan_Success(t *testing.T) {
165 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
168 nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
169 readerMock.On("GetNodeb", ranName).Return(nb, nil)
171 var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
172 writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
174 payload := e2pdus.PackedX2setupRequest
175 xaction := []byte(ranName)
176 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
178 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
180 sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
181 _, actual := handler.Handle(sr)
183 assert.Nil(t, actual)
185 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
186 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
189 func TestX2SetupHandleRnibGet_Error(t *testing.T) {
190 readerMock, _, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
192 rnibErr := &common.ValidationError{}
193 nb := &entities.NodebInfo{RanName: "RanName", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
194 readerMock.On("GetNodeb", "RanName").Return(nb, rnibErr)
196 sr := models.SetupRequest{"127.0.0.1", 8080, "RanName",}
197 _, actual := handler.Handle(sr)
199 expected := &e2managererrors.RnibDbError{}
200 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
201 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
203 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
206 func TestX2SetupHandleShuttingDownRan_Error(t *testing.T) {
207 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
209 nb := &entities.NodebInfo{RanName: "RanName", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
210 readerMock.On("GetNodeb", "RanName").Return(nb, nil)
212 sr := models.SetupRequest{"127.0.0.1", 8080, "RanName",}
213 _, actual := handler.Handle(sr)
215 expected := &e2managererrors.WrongStateError{}
216 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
217 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
219 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
220 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
223 func TestX2SetupHandleNoPort_Error(t *testing.T) {
224 _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
226 sr := models.SetupRequest{"127.0.0.1", 0, "RanName",}
227 _, actual := handler.Handle(sr)
229 expected := &e2managererrors.RequestValidationError{}
230 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
231 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
233 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
234 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
237 func TestX2SetupHandleNoRanName_Error(t *testing.T) {
238 _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
240 sr := models.SetupRequest{}
242 sr.RanIp = "127.0.0.1"
244 _, actual := handler.Handle(sr)
246 expected := &e2managererrors.RequestValidationError{}
247 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
248 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
250 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
251 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
254 func TestX2SetupHandleNoIP_Error(t *testing.T) {
255 _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
257 sr := models.SetupRequest{}
259 sr.RanName = "RanName"
261 _, actual := handler.Handle(sr)
263 expected := &e2managererrors.RequestValidationError{}
264 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
265 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
267 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
268 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
271 func TestX2SetupHandleInvalidIp_Error(t *testing.T) {
272 _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
274 sr := models.SetupRequest{}
276 sr.RanName = "RanName"
277 sr.RanIp = "invalid ip"
279 _, actual := handler.Handle(sr)
281 expected := &e2managererrors.RequestValidationError{}
282 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
283 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
285 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
286 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
289 func initSetupRequestTest(t *testing.T, protocol entities.E2ApplicationProtocol) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.RmrMessengerMock) {
291 config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
293 readerMock := &mocks.RnibReaderMock{}
294 readerProvider := func() reader.RNibReader {
297 writerMock := &mocks.RnibWriterMock{}
298 writerProvider := func() rNibWriter.RNibWriter {
302 rmrMessengerMock := &mocks.RmrMessengerMock{}
303 rmrSender := getRmrSender(rmrMessengerMock, log)
305 rnibDataService := services.NewRnibDataService(log, config, readerProvider, writerProvider)
307 ranSetupManager := managers.NewRanSetupManager(log, rmrSender, rnibDataService)
308 handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManager, protocol)
310 return readerMock, writerMock, handler, rmrMessengerMock