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"
30 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
31 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
32 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
33 "github.com/stretchr/testify/assert"
34 "github.com/stretchr/testify/mock"
39 func TestSetupHandleNewRanSave_Error(t *testing.T) {
40 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
43 rnibErr := &common.ResourceNotFoundError{}
44 sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
46 nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
47 readerMock.On("GetNodeb", ranName).Return(nb, rnibErr)
49 vErr := &common.ValidationError{}
50 updatedNb, _ := rnibBuilders.CreateInitialNodeInfo(&sr, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
51 writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(vErr)
53 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}
54 writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
56 payload := e2pdus.PackedEndcX2setupRequest
57 xaction := []byte(ranName)
58 msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
60 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
62 actual := handler.Handle(sr)
63 expected := &e2managererrors.RnibDbError{}
65 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
66 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
69 writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1)
70 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
71 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
74 func TestSetupHandleNewRan_Success(t *testing.T) {
75 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
78 rnibErr := &common.ResourceNotFoundError{}
79 sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
81 nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
82 readerMock.On("GetNodeb", ranName).Return(nb, rnibErr)
84 updatedNb, _ := rnibBuilders.CreateInitialNodeInfo(&sr, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
85 writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(nil)
87 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}
88 writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
90 payload := e2pdus.PackedEndcX2setupRequest
91 xaction := []byte(ranName)
92 msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
94 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
96 actual := handler.Handle(sr)
100 writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1)
101 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
102 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
105 func TestEndcSetupHandleRmr_Error(t *testing.T) {
106 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
109 nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
110 readerMock.On("GetNodeb", ranName).Return(nb, nil)
112 var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
113 writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
115 var nbDisconnected = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 0}
116 writerMock.On("UpdateNodebInfo", nbDisconnected).Return(nil)
118 payload := e2pdus.PackedEndcX2setupRequest
119 xaction := []byte(ranName)
120 msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
122 rmrErr := &e2managererrors.RmrError{}
123 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, rmrErr)
125 sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
126 actual := handler.Handle(sr)
128 if reflect.TypeOf(actual) != reflect.TypeOf(rmrErr) {
129 t.Errorf("Error actual = %v, and Expected = %v.", actual, rmrErr)
132 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
133 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
136 func TestEndcSetupHandleExistingDisconnectedRan_Success(t *testing.T) {
137 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
140 nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
141 readerMock.On("GetNodeb", ranName).Return(nb, nil)
143 var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
144 writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
146 payload := e2pdus.PackedEndcX2setupRequest
147 xaction := []byte(ranName)
148 msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
150 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
152 sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
153 actual := handler.Handle(sr)
155 assert.Nil(t, actual)
157 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
158 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
161 func TestX2SetupHandleExistingConnectedRan_Success(t *testing.T) {
162 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
165 nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
166 readerMock.On("GetNodeb", ranName).Return(nb, nil)
168 var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
169 writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
171 payload := e2pdus.PackedX2setupRequest
172 xaction := []byte(ranName)
173 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
175 rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
177 sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
178 actual := handler.Handle(sr)
180 assert.Nil(t, actual)
182 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
183 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
186 func TestX2SetupHandleRnibGet_Error(t *testing.T) {
187 readerMock, _, handler,rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
189 rnibErr := &common.ValidationError{}
190 nb := &entities.NodebInfo{RanName: "RanName", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
191 readerMock.On("GetNodeb", "RanName").Return(nb, rnibErr)
193 sr := models.SetupRequest{"127.0.0.1", 8080, "RanName",}
194 actual := handler.Handle(sr)
196 expected := &e2managererrors.RnibDbError{}
197 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
198 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
200 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
203 func TestX2SetupHandleShuttingDownRan_Error(t *testing.T) {
204 readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
206 nb := &entities.NodebInfo{RanName: "RanName", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
207 readerMock.On("GetNodeb", "RanName").Return(nb, nil)
209 sr := models.SetupRequest{"127.0.0.1", 8080, "RanName",}
210 actual := handler.Handle(sr)
212 expected := &e2managererrors.WrongStateError{}
213 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
214 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
216 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
217 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
220 func TestX2SetupHandleNoPort_Error(t *testing.T) {
221 _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
223 sr := models.SetupRequest{"127.0.0.1", 0, "RanName",}
224 actual := handler.Handle(sr)
226 expected := &e2managererrors.RequestValidationError{}
227 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
228 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
230 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
231 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
234 func TestX2SetupHandleNoRanName_Error(t *testing.T) {
235 _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
237 sr := models.SetupRequest{}
239 sr.RanIp = "127.0.0.1"
241 actual := handler.Handle(sr)
243 expected := &e2managererrors.RequestValidationError{}
244 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
245 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
247 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
248 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
251 func TestX2SetupHandleNoIP_Error(t *testing.T) {
252 _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
254 sr := models.SetupRequest{}
256 sr.RanName = "RanName"
258 actual := handler.Handle(sr)
260 expected := &e2managererrors.RequestValidationError{}
261 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
262 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
264 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
265 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
268 func TestX2SetupHandleInvalidIp_Error(t *testing.T) {
269 _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
271 sr := models.SetupRequest{}
273 sr.RanName = "RanName"
274 sr.RanIp = "invalid ip"
276 actual := handler.Handle(sr)
278 expected := &e2managererrors.RequestValidationError{}
279 if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
280 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
282 writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
283 rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
286 func initSetupRequestTest(t *testing.T, protocol entities.E2ApplicationProtocol)(*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.RmrMessengerMock) {
288 config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
290 readerMock := &mocks.RnibReaderMock{}
291 readerProvider := func() reader.RNibReader {
294 writerMock := &mocks.RnibWriterMock{}
295 writerProvider := func() rNibWriter.RNibWriter {
299 rmrMessengerMock := &mocks.RmrMessengerMock{}
300 rmrService := getRmrService(rmrMessengerMock, log)
302 rnibDataService := services.NewRnibDataService(log, config, readerProvider, writerProvider)
304 ranSetupManager := managers.NewRanSetupManager(log, rmrService, rnibDataService)
305 handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManager, protocol)
307 return readerMock, writerMock, handler, rmrMessengerMock