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 package httpmsghandlers
21 "e2mgr/e2managererrors"
29 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
30 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
31 "github.com/stretchr/testify/assert"
32 "github.com/stretchr/testify/mock"
37 func TestSetupHandleNewRanSave_Error(t *testing.T) {
38 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
41 rnibErr := &common.ResourceNotFoundError{}
42 sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
44 nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
45 readerMock.On("GetNodeb", ranName).Return(nb, rnibErr)
47 vErr := &common.ValidationError{}
48 updatedNb, _ := rnibBuilders.CreateInitialNodeInfo(&sr, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
49 writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(vErr)
51 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}
52 writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
54 payload := e2pdus.PackedEndcX2setupRequest
55 xaction := []byte(ranName)
56 msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
58 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
60 _, actual := handler.Handle(sr)
61 expected := &e2managererrors.RnibDbError{}
63 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
64 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
67 writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1)
68 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
69 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
72 func TestSetupHandleNewRan_Success(t *testing.T) {
73 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
76 rnibErr := &common.ResourceNotFoundError{}
77 sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
79 nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
80 readerMock.On("GetNodeb", ranName).Return(nb, rnibErr)
82 updatedNb, _ := rnibBuilders.CreateInitialNodeInfo(&sr, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
83 writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(nil)
85 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}
86 writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
88 payload := e2pdus.PackedEndcX2setupRequest
89 xaction := []byte(ranName)
90 msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
92 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
94 _, actual := handler.Handle(sr)
98 writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1)
99 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
100 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
103 func TestEndcSetupHandleRmr_Error(t *testing.T) {
104 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
107 nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
108 readerMock.On("GetNodeb", ranName).Return(nb, nil)
110 var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
111 writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
113 var nbDisconnected = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 0}
114 writerMock.On("UpdateNodebInfo", nbDisconnected).Return(nil)
116 payload := e2pdus.PackedEndcX2setupRequest
117 xaction := []byte(ranName)
118 msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
120 rmrErr := &e2managererrors.RmrError{}
121 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, rmrErr)
123 sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
124 _, actual := handler.Handle(sr)
126 if reflect.TypeOf(actual) != reflect.TypeOf(rmrErr) {
127 t.Errorf("Error actual = %v, and Expected = %v.", actual, rmrErr)
130 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
131 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
134 func TestEndcSetupHandleExistingDisconnectedRan_Success(t *testing.T) {
135 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
138 nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
139 readerMock.On("GetNodeb", ranName).Return(nb, nil)
141 var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
142 writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
144 payload := e2pdus.PackedEndcX2setupRequest
145 xaction := []byte(ranName)
146 msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
148 rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
150 sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
151 _, actual := handler.Handle(sr)
153 assert.Nil(t, actual)
155 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
156 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
159 func TestX2SetupHandleExistingConnectedRan_Success(t *testing.T) {
160 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
163 nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
164 readerMock.On("GetNodeb", ranName).Return(nb, nil)
166 var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
167 writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
169 payload := e2pdus.PackedX2setupRequest
170 xaction := []byte(ranName)
171 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
173 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
175 sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
176 _, actual := handler.Handle(sr)
178 assert.Nil(t, actual)
180 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
181 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
184 func TestX2SetupHandleRnibGet_Error(t *testing.T) {
185 readerMock, _, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
187 rnibErr := &common.ValidationError{}
188 nb := &entities.NodebInfo{RanName: "RanName", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
189 readerMock.On("GetNodeb", "RanName").Return(nb, rnibErr)
191 sr := models.SetupRequest{"127.0.0.1", 8080, "RanName",}
192 _, actual := handler.Handle(sr)
194 expected := &e2managererrors.RnibDbError{}
195 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
196 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
198 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
201 func TestEndcSetupHandleShuttingDownRan_Error(t *testing.T) {
202 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
204 nb := &entities.NodebInfo{RanName: "RanName", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
205 readerMock.On("GetNodeb", "RanName").Return(nb, nil)
207 sr := models.SetupRequest{"127.0.0.1", 8080, "RanName",}
208 _, actual := handler.Handle(sr)
210 expected := &e2managererrors.WrongStateError{}
211 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
212 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
214 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
215 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
218 func TestX2SetupHandleShuttingDownRan_Error(t *testing.T) {
219 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
221 nb := &entities.NodebInfo{RanName: "RanName", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
222 readerMock.On("GetNodeb", "RanName").Return(nb, nil)
224 sr := models.SetupRequest{"127.0.0.1", 8080, "RanName",}
225 _, actual := handler.Handle(sr)
227 expected := &e2managererrors.WrongStateError{}
228 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
229 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
231 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
232 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
235 func TestX2SetupHandleNoPort_Error(t *testing.T) {
236 _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
238 sr := models.SetupRequest{"127.0.0.1", 0, "RanName",}
239 _, actual := handler.Handle(sr)
241 expected := &e2managererrors.RequestValidationError{}
242 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
243 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
245 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
246 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
249 func TestX2SetupHandleNoRanName_Error(t *testing.T) {
250 _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
252 sr := models.SetupRequest{}
254 sr.RanIp = "127.0.0.1"
256 _, actual := handler.Handle(sr)
258 expected := &e2managererrors.RequestValidationError{}
259 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
260 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
262 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
263 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
266 func TestX2SetupHandleNoIP_Error(t *testing.T) {
267 _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
269 sr := models.SetupRequest{}
271 sr.RanName = "RanName"
273 _, actual := handler.Handle(sr)
275 expected := &e2managererrors.RequestValidationError{}
276 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
277 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
279 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
280 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
283 func TestX2SetupHandleInvalidIp_Error(t *testing.T) {
284 _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
286 sr := models.SetupRequest{}
288 sr.RanName = "RanName"
289 sr.RanIp = "invalid ip"
291 _, actual := handler.Handle(sr)
293 expected := &e2managererrors.RequestValidationError{}
294 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
295 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
297 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
298 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
301 func initSetupRequestTest(t *testing.T, protocol entities.E2ApplicationProtocol) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.RmrMessengerMock) {
303 config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
305 readerMock := &mocks.RnibReaderMock{}
306 writerMock := &mocks.RnibWriterMock{}
308 rmrMessengerMock := &mocks.RmrMessengerMock{}
309 rmrSender := getRmrSender(rmrMessengerMock, log)
311 rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
313 ranSetupManager := managers.NewRanSetupManager(log, rmrSender, rnibDataService)
314 handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManager, protocol)
316 return readerMock, writerMock, handler, rmrMessengerMock