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).
26 "e2mgr/e2managererrors"
31 "e2mgr/providers/httpmsghandlerprovider"
34 "e2mgr/services/rmrsender"
38 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
39 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
40 "github.com/golang/protobuf/jsonpb"
41 "github.com/gorilla/mux"
42 "github.com/pkg/errors"
43 "github.com/stretchr/testify/assert"
44 "github.com/stretchr/testify/mock"
56 AssociatedE2TInstanceAddress = "10.0.2.15:38000"
57 CorruptedJson = "{\"errorCode\":401,\"errorMessage\":\"corrupted json\"}"
58 ValidationFailureJson = "{\"errorCode\":402,\"errorMessage\":\"Validation error\"}"
59 ResourceNotFoundJson = "{\"errorCode\":404,\"errorMessage\":\"Resource not found\"}"
60 NodebExistsJson = "{\"errorCode\":406,\"errorMessage\":\"Nodeb already exists\"}"
61 RnibErrorJson = "{\"errorCode\":500,\"errorMessage\":\"RNIB error\"}"
62 InternalErrorJson = "{\"errorCode\":501,\"errorMessage\":\"Internal Server Error. Please try again later\"}"
63 AddEnbUrl = "/nodeb/enb"
67 ServedNrCellInformationRequiredFields = []string{"cellId", "choiceNrMode", "nrMode", "servedPlmns"}
68 NrNeighbourInformationRequiredFields = []string{"nrCgi", "choiceNrMode", "nrMode"}
69 AddEnbRequestRequiredFields = []string{"ranName", "enb", "globalNbId"}
70 UpdateEnbRequestRequiredFields = []string{"enb"}
71 GlobalIdRequiredFields = []string{"plmnId", "nbId"}
72 EnbRequiredFields = []string{"enbType", "servedCells"}
73 ServedCellRequiredFields = []string{"broadcastPlmns", "cellId", "choiceEutraMode", "eutraMode", "tac"}
76 type controllerGetNodebTestContext struct {
78 nodebInfo *entities.NodebInfo
80 expectedStatusCode int
81 expectedJsonResponse string
84 type controllerGetNodebIdListTestContext struct {
85 nodebIdList []*entities.NbIdentity
87 expectedStatusCode int
88 expectedJsonResponse string
91 type getNodebInfoResult struct {
92 nodebInfo *entities.NodebInfo
96 type updateGnbCellsParams struct {
100 type updateEnbCellsParams struct {
104 type saveNodebParams struct {
108 type addNbIdentityParams struct {
112 type removeServedCellsParams struct {
113 servedCellInfo []*entities.ServedCellInfo
117 type removeServedNrCellsParams struct {
118 servedNrCells []*entities.ServedNRCell
122 type controllerUpdateEnbTestContext struct {
123 getNodebInfoResult *getNodebInfoResult
124 removeServedCellsParams *removeServedCellsParams
125 updateEnbCellsParams *updateEnbCellsParams
126 requestBody map[string]interface{}
127 expectedStatusCode int
128 expectedJsonResponse string
131 type controllerUpdateGnbTestContext struct {
132 getNodebInfoResult *getNodebInfoResult
133 removeServedNrCellsParams *removeServedNrCellsParams
134 updateGnbCellsParams *updateGnbCellsParams
135 requestBody map[string]interface{}
136 expectedStatusCode int
137 expectedJsonResponse string
140 type controllerAddEnbTestContext struct {
141 getNodebInfoResult *getNodebInfoResult
142 saveNodebParams *saveNodebParams
143 addNbIdentityParams *addNbIdentityParams
144 requestBody map[string]interface{}
145 expectedStatusCode int
146 expectedJsonResponse string
149 type controllerDeleteEnbTestContext struct {
150 getNodebInfoResult *getNodebInfoResult
151 expectedStatusCode int
152 expectedJsonResponse string
155 func generateServedNrCells(cellIds ...string) []*entities.ServedNRCell {
157 servedNrCells := []*entities.ServedNRCell{}
159 for _, v := range cellIds {
160 servedNrCells = append(servedNrCells, &entities.ServedNRCell{ServedNrCellInformation: &entities.ServedNRCellInformation{
162 ChoiceNrMode: &entities.ServedNRCellInformation_ChoiceNRMode{
163 Fdd: &entities.ServedNRCellInformation_ChoiceNRMode_FddInfo{
167 NrMode: entities.Nr_FDD,
169 ServedPlmns: []string{"whatever"},
176 func generateServedCells(cellIds ...string) []*entities.ServedCellInfo {
178 var servedCells []*entities.ServedCellInfo
180 for i, v := range cellIds {
181 servedCells = append(servedCells, &entities.ServedCellInfo{
183 ChoiceEutraMode: &entities.ChoiceEUTRAMode{
184 Fdd: &entities.FddInfo{},
187 BroadcastPlmns: []string{"whatever"},
194 func buildNrNeighbourInformation(propToOmit string) map[string]interface{} {
195 ret := map[string]interface{}{
197 "choiceNrMode": map[string]interface{}{
198 "tdd": map[string]interface{}{},
204 if len(propToOmit) != 0 {
205 delete(ret, propToOmit)
211 func buildServedNrCellInformation(propToOmit string) map[string]interface{} {
212 ret := map[string]interface{}{
213 "cellId": "whatever",
214 "choiceNrMode": map[string]interface{}{
215 "fdd": map[string]interface{}{},
219 "servedPlmns": []interface{}{
224 if len(propToOmit) != 0 {
225 delete(ret, propToOmit)
231 func buildServedCell(propToOmit string) map[string]interface{} {
232 ret := map[string]interface{}{
233 "cellId": "whatever",
234 "choiceEutraMode": map[string]interface{}{
235 "fdd": map[string]interface{}{},
240 "broadcastPlmns": []interface{}{
245 if len(propToOmit) != 0 {
246 delete(ret, propToOmit)
252 func getUpdateEnbRequest(propToOmit string) map[string]interface{} {
253 ret := map[string]interface{}{
254 "enb": buildEnb(propToOmit),
257 if len(propToOmit) != 0 {
258 delete(ret, propToOmit)
264 func getAddEnbRequest(propToOmit string) map[string]interface{} {
265 ret := map[string]interface{}{
267 "globalNbId": buildGlobalNbId(""),
271 if len(propToOmit) != 0 {
272 delete(ret, propToOmit)
278 func buildEnb(propToOmit string) map[string]interface{} {
279 ret := map[string]interface{}{
281 "servedCells": []interface{}{
285 if len(propToOmit) != 0 {
286 delete(ret, propToOmit)
292 func buildGlobalNbId(propToOmit string) map[string]interface{} {
293 ret := map[string]interface{}{
294 "plmnId": "whatever",
298 if len(propToOmit) != 0 {
299 delete(ret, propToOmit)
305 func setupControllerTest(t *testing.T) (*NodebController, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock) {
307 config := configuration.ParseConfiguration()
309 rmrMessengerMock := &mocks.RmrMessengerMock{}
310 readerMock := &mocks.RnibReaderMock{}
312 writerMock := &mocks.RnibWriterMock{}
314 rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
315 rmrSender := getRmrSender(rmrMessengerMock, log)
316 e2tInstancesManager := &mocks.E2TInstancesManagerMock{}
317 httpClientMock := &mocks.HttpClientMock{}
318 rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock)
319 ranListManager := managers.NewRanListManager(log, rnibDataService)
320 ranAlarmService := &mocks.RanAlarmServiceMock{}
321 ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(log, rnibDataService, ranListManager, ranAlarmService)
322 nodebValidator := managers.NewNodebValidator()
323 updateEnbManager := managers.NewUpdateEnbManager(log, rnibDataService, nodebValidator)
325 handlerProvider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(log, rmrSender, config, rnibDataService, e2tInstancesManager, rmClient, ranConnectStatusChangeManager, nodebValidator, updateEnbManager, ranListManager)
326 controller := NewNodebController(log, handlerProvider)
327 return controller, readerMock, writerMock, rmrMessengerMock, e2tInstancesManager
330 func TestShutdownHandlerRnibError(t *testing.T) {
331 controller, _, _, _, e2tInstancesManagerMock := setupControllerTest(t)
332 e2tInstancesManagerMock.On("GetE2TAddresses").Return([]string{}, e2managererrors.NewRnibDbError())
334 writer := httptest.NewRecorder()
336 controller.Shutdown(writer, tests.GetHttpRequest())
338 var errorResponse = parseJsonRequest(t, writer.Body)
340 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
341 assert.Equal(t, errorResponse.Code, e2managererrors.NewRnibDbError().Code)
344 func TestSetGeneralConfigurationHandlerRnibError(t *testing.T) {
345 controller, readerMock, _, _, _ := setupControllerTest(t)
347 configuration := &entities.GeneralConfiguration{}
348 readerMock.On("GetGeneralConfiguration").Return(configuration, e2managererrors.NewRnibDbError())
350 writer := httptest.NewRecorder()
352 httpRequest, _ := http.NewRequest("PUT", "https://localhost:3800/v1/nodeb/parameters", strings.NewReader("{\"enableRic\":false}"))
354 controller.SetGeneralConfiguration(writer, httpRequest)
356 var errorResponse = parseJsonRequest(t, writer.Body)
358 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
359 assert.Equal(t, e2managererrors.NewRnibDbError().Code, errorResponse.Code)
362 func TestSetGeneralConfigurationInvalidJson(t *testing.T) {
363 controller, _, _, _, _ := setupControllerTest(t)
365 writer := httptest.NewRecorder()
367 httpRequest, _ := http.NewRequest("PUT", "https://localhost:3800/v1/nodeb/parameters", strings.NewReader("{\"enableRic\":false, \"someValue\":false}"))
369 controller.SetGeneralConfiguration(writer, httpRequest)
371 var errorResponse = parseJsonRequest(t, writer.Body)
373 assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
374 assert.Equal(t, e2managererrors.NewInvalidJsonError().Code, errorResponse.Code)
377 func controllerGetNodebTestExecuter(t *testing.T, context *controllerGetNodebTestContext) {
378 controller, readerMock, _, _, _ := setupControllerTest(t)
379 writer := httptest.NewRecorder()
380 readerMock.On("GetNodeb", context.ranName).Return(context.nodebInfo, context.rnibError)
381 req, _ := http.NewRequest(http.MethodGet, "/nodeb", nil)
382 req = mux.SetURLVars(req, map[string]string{"ranName": context.ranName})
383 controller.GetNodeb(writer, req)
384 assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode)
385 bodyBytes, _ := ioutil.ReadAll(writer.Body)
386 assert.Equal(t, context.expectedJsonResponse, string(bodyBytes))
389 func controllerGetNodebIdListTestExecuter(t *testing.T, context *controllerGetNodebIdListTestContext) {
390 controller, readerMock, _, _, _ := setupControllerTest(t)
391 writer := httptest.NewRecorder()
392 readerMock.On("GetListNodebIds").Return(context.nodebIdList, context.rnibError)
393 req, _ := http.NewRequest(http.MethodGet, "/nodeb/ids", nil)
394 controller.GetNodebIdList(writer, req)
395 assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode)
396 bodyBytes, _ := ioutil.ReadAll(writer.Body)
397 assert.Equal(t, context.expectedJsonResponse, string(bodyBytes))
400 func activateControllerUpdateEnbMocks(context *controllerUpdateEnbTestContext, readerMock *mocks.RnibReaderMock, writerMock *mocks.RnibWriterMock, updateEnbRequest *models.UpdateEnbRequest) {
401 if context.getNodebInfoResult != nil {
402 readerMock.On("GetNodeb", RanName).Return(context.getNodebInfoResult.nodebInfo, context.getNodebInfoResult.rnibError)
405 if context.removeServedCellsParams != nil {
406 writerMock.On("RemoveServedCells", RanName, context.removeServedCellsParams.servedCellInfo).Return(context.removeServedCellsParams.err)
409 if context.updateEnbCellsParams != nil {
410 updatedNodebInfo := *context.getNodebInfoResult.nodebInfo
411 updatedNodebInfo.Configuration = &entities.NodebInfo_Enb{Enb: updateEnbRequest.Enb}
413 writerMock.On("UpdateEnb", &updatedNodebInfo, updateEnbRequest.Enb.ServedCells).Return(context.updateEnbCellsParams.err)
417 func activateControllerUpdateGnbMocks(context *controllerUpdateGnbTestContext, readerMock *mocks.RnibReaderMock, writerMock *mocks.RnibWriterMock) {
418 if context.getNodebInfoResult != nil {
419 readerMock.On("GetNodeb", RanName).Return(context.getNodebInfoResult.nodebInfo, context.getNodebInfoResult.rnibError)
422 if context.removeServedNrCellsParams != nil {
423 writerMock.On("RemoveServedNrCells", RanName, context.removeServedNrCellsParams.servedNrCells).Return(context.removeServedNrCellsParams.err)
426 if context.updateGnbCellsParams != nil {
427 updatedNodebInfo := *context.getNodebInfoResult.nodebInfo
428 gnb := entities.Gnb{}
429 _ = jsonpb.Unmarshal(getJsonRequestAsBuffer(context.requestBody), &gnb)
430 updatedGnb := *updatedNodebInfo.GetGnb()
431 updatedGnb.ServedNrCells = gnb.ServedNrCells
432 writerMock.On("UpdateGnbCells", &updatedNodebInfo, gnb.ServedNrCells).Return(context.updateGnbCellsParams.err)
436 func assertControllerUpdateGnb(t *testing.T, context *controllerUpdateGnbTestContext, writer *httptest.ResponseRecorder, readerMock *mocks.RnibReaderMock, writerMock *mocks.RnibWriterMock) {
437 assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode)
438 bodyBytes, _ := ioutil.ReadAll(writer.Body)
439 assert.Equal(t, context.expectedJsonResponse, string(bodyBytes))
440 readerMock.AssertExpectations(t)
441 writerMock.AssertExpectations(t)
444 func assertControllerUpdateEnb(t *testing.T, context *controllerUpdateEnbTestContext, writer *httptest.ResponseRecorder, readerMock *mocks.RnibReaderMock, writerMock *mocks.RnibWriterMock) {
445 assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode)
446 bodyBytes, _ := ioutil.ReadAll(writer.Body)
447 assert.Equal(t, context.expectedJsonResponse, string(bodyBytes))
448 readerMock.AssertExpectations(t)
449 writerMock.AssertExpectations(t)
452 func assertControllerAddEnb(t *testing.T, context *controllerAddEnbTestContext, writer *httptest.ResponseRecorder, readerMock *mocks.RnibReaderMock, writerMock *mocks.RnibWriterMock) {
453 assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode)
454 bodyBytes, _ := ioutil.ReadAll(writer.Body)
455 assert.Equal(t, context.expectedJsonResponse, string(bodyBytes))
456 readerMock.AssertExpectations(t)
457 writerMock.AssertExpectations(t)
460 func assertControllerDeleteEnb(t *testing.T, context *controllerDeleteEnbTestContext, writer *httptest.ResponseRecorder, readerMock *mocks.RnibReaderMock, writerMock *mocks.RnibWriterMock) {
461 assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode)
462 bodyBytes, _ := ioutil.ReadAll(writer.Body)
463 assert.Equal(t, context.expectedJsonResponse, string(bodyBytes))
464 readerMock.AssertExpectations(t)
465 writerMock.AssertExpectations(t)
468 func buildUpdateEnbRequest(context *controllerUpdateEnbTestContext) *http.Request {
469 updateEnbUrl := fmt.Sprintf("/nodeb/enb/%s", RanName)
470 requestBody := getJsonRequestAsBuffer(context.requestBody)
471 req, _ := http.NewRequest(http.MethodPut, updateEnbUrl, requestBody)
472 req.Header.Set("Content-Type", "application/json")
473 req = mux.SetURLVars(req, map[string]string{"ranName": RanName})
477 func buildUpdateGnbRequest(context *controllerUpdateGnbTestContext) *http.Request {
478 updateGnbUrl := fmt.Sprintf("/nodeb/%s/update", RanName)
479 requestBody := getJsonRequestAsBuffer(context.requestBody)
480 req, _ := http.NewRequest(http.MethodPut, updateGnbUrl, requestBody)
481 req.Header.Set("Content-Type", "application/json")
482 req = mux.SetURLVars(req, map[string]string{"ranName": RanName})
486 func buildAddEnbRequest(context *controllerAddEnbTestContext) *http.Request {
487 requestBody := getJsonRequestAsBuffer(context.requestBody)
488 req, _ := http.NewRequest(http.MethodPost, AddEnbUrl, requestBody)
489 req.Header.Set("Content-Type", "application/json")
493 func controllerUpdateEnbTestExecuter(t *testing.T, context *controllerUpdateEnbTestContext) {
494 controller, readerMock, writerMock, _, _ := setupControllerTest(t)
495 writer := httptest.NewRecorder()
497 r := buildUpdateEnbRequest(context)
498 body, _ := ioutil.ReadAll(io.LimitReader(r.Body, LimitRequest))
500 updateEnbRequest := models.UpdateEnbRequest{}
501 _ = json.Unmarshal(body, &updateEnbRequest)
503 activateControllerUpdateEnbMocks(context, readerMock, writerMock, &updateEnbRequest)
504 r = buildUpdateEnbRequest(context)
507 controller.UpdateEnb(writer, r)
509 assertControllerUpdateEnb(t, context, writer, readerMock, writerMock)
512 func controllerUpdateGnbTestExecuter(t *testing.T, context *controllerUpdateGnbTestContext) {
513 controller, readerMock, writerMock, _, _ := setupControllerTest(t)
514 writer := httptest.NewRecorder()
516 activateControllerUpdateGnbMocks(context, readerMock, writerMock)
517 req := buildUpdateGnbRequest(context)
518 controller.UpdateGnb(writer, req)
519 assertControllerUpdateGnb(t, context, writer, readerMock, writerMock)
522 func activateControllerAddEnbMocks(context *controllerAddEnbTestContext, readerMock *mocks.RnibReaderMock, writerMock *mocks.RnibWriterMock, addEnbRequest *models.AddEnbRequest) {
523 if context.getNodebInfoResult != nil {
524 readerMock.On("GetNodeb", RanName).Return(context.getNodebInfoResult.nodebInfo, context.getNodebInfoResult.rnibError)
527 if context.saveNodebParams != nil {
528 nodebInfo := entities.NodebInfo{
529 RanName: addEnbRequest.RanName,
530 Ip: addEnbRequest.Ip,
531 Port: addEnbRequest.Port,
532 NodeType: entities.Node_ENB,
533 GlobalNbId: addEnbRequest.GlobalNbId,
534 Configuration: &entities.NodebInfo_Enb{Enb: addEnbRequest.Enb},
535 ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,
538 writerMock.On("SaveNodeb", &nodebInfo).Return(context.saveNodebParams.err)
541 if context.addNbIdentityParams != nil {
542 nbIdentity := entities.NbIdentity{InventoryName: addEnbRequest.RanName, GlobalNbId: addEnbRequest.GlobalNbId, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED}
543 writerMock.On("AddNbIdentity", entities.Node_ENB, &nbIdentity).Return(context.addNbIdentityParams.err)
547 func controllerAddEnbTestExecuter(t *testing.T, context *controllerAddEnbTestContext) {
548 controller, readerMock, writerMock, _, _ := setupControllerTest(t)
549 writer := httptest.NewRecorder()
550 r := buildAddEnbRequest(context)
551 body, _ := ioutil.ReadAll(io.LimitReader(r.Body, LimitRequest))
553 addEnbRequest := models.AddEnbRequest{}
555 _ = json.Unmarshal(body, &addEnbRequest)
556 activateControllerAddEnbMocks(context, readerMock, writerMock, &addEnbRequest)
557 r = buildAddEnbRequest(context)
559 controller.AddEnb(writer, r)
560 assertControllerAddEnb(t, context, writer, readerMock, writerMock)
563 func controllerDeleteEnbTestExecuter(t *testing.T, context *controllerDeleteEnbTestContext) {
564 controller, readerMock, writerMock, _, _ := setupControllerTest(t)
565 readerMock.On("GetNodeb", RanName).Return(context.getNodebInfoResult.nodebInfo, context.getNodebInfoResult.rnibError)
566 if context.getNodebInfoResult.rnibError == nil && context.getNodebInfoResult.nodebInfo.GetNodeType() == entities.Node_ENB {
567 writerMock.On("RemoveEnb", context.getNodebInfoResult.nodebInfo).Return(nil)
569 writer := httptest.NewRecorder()
570 r, _ := http.NewRequest(http.MethodDelete, AddEnbUrl+"/"+RanName, nil)
571 r.Header.Set("Content-Type", "application/json")
572 r = mux.SetURLVars(r, map[string]string{"ranName": RanName})
573 controller.DeleteEnb(writer, r)
574 assertControllerDeleteEnb(t, context, writer, readerMock, writerMock)
577 func TestControllerUpdateGnbEmptyServedNrCells(t *testing.T) {
578 context := controllerUpdateGnbTestContext{
579 getNodebInfoResult: nil,
580 requestBody: map[string]interface{}{
581 "servedNrCells": []interface{}{
584 expectedStatusCode: http.StatusBadRequest,
585 expectedJsonResponse: ValidationFailureJson,
588 controllerUpdateGnbTestExecuter(t, &context)
591 func TestControllerUpdateGnbMissingServedNrCellInformation(t *testing.T) {
592 context := controllerUpdateGnbTestContext{
593 getNodebInfoResult: nil,
594 requestBody: map[string]interface{}{
595 "servedNrCells": []interface{}{
596 map[string]interface{}{
597 "servedNrCellInformation": nil,
601 expectedStatusCode: http.StatusBadRequest,
602 expectedJsonResponse: ValidationFailureJson,
605 controllerUpdateGnbTestExecuter(t, &context)
608 func TestControllerUpdateGnbMissingServedNrCellRequiredProp(t *testing.T) {
610 for _, v := range ServedNrCellInformationRequiredFields {
611 context := controllerUpdateGnbTestContext{
612 getNodebInfoResult: nil,
613 requestBody: map[string]interface{}{
614 "servedNrCells": []interface{}{
615 map[string]interface{}{
616 "servedNrCellInformation": buildServedNrCellInformation(v),
620 expectedStatusCode: http.StatusBadRequest,
621 expectedJsonResponse: ValidationFailureJson,
624 controllerUpdateGnbTestExecuter(t, &context)
628 func TestControllerUpdateGnbMissingServedNrCellFddOrTdd(t *testing.T) {
630 servedNrCellInformation := buildServedNrCellInformation("")
631 servedNrCellInformation["choiceNrMode"] = map[string]interface{}{}
633 context := controllerUpdateGnbTestContext{
634 getNodebInfoResult: nil,
635 requestBody: map[string]interface{}{
636 "servedNrCells": []interface{}{
637 map[string]interface{}{
638 "servedNrCellInformation": servedNrCellInformation,
642 expectedStatusCode: http.StatusBadRequest,
643 expectedJsonResponse: ValidationFailureJson,
646 controllerUpdateGnbTestExecuter(t, &context)
649 func TestControllerUpdateGnbMissingNeighbourInfoFddOrTdd(t *testing.T) {
651 nrNeighbourInfo := buildNrNeighbourInformation("")
652 nrNeighbourInfo["choiceNrMode"] = map[string]interface{}{}
654 context := controllerUpdateGnbTestContext{
655 getNodebInfoResult: nil,
656 requestBody: map[string]interface{}{
657 "servedNrCells": []interface{}{
658 map[string]interface{}{
659 "servedNrCellInformation": buildServedNrCellInformation(""),
660 "nrNeighbourInfos": []interface{}{
666 expectedStatusCode: http.StatusBadRequest,
667 expectedJsonResponse: ValidationFailureJson,
670 controllerUpdateGnbTestExecuter(t, &context)
673 func TestControllerUpdateGnbMissingNrNeighbourInformationRequiredProp(t *testing.T) {
675 for _, v := range NrNeighbourInformationRequiredFields {
676 context := controllerUpdateGnbTestContext{
677 getNodebInfoResult: nil,
678 requestBody: map[string]interface{}{
679 "servedNrCells": []interface{}{
680 map[string]interface{}{
681 "servedNrCellInformation": buildServedNrCellInformation(""),
682 "nrNeighbourInfos": []interface{}{
683 buildNrNeighbourInformation(v),
688 expectedStatusCode: http.StatusBadRequest,
689 expectedJsonResponse: ValidationFailureJson,
692 controllerUpdateGnbTestExecuter(t, &context)
696 func TestControllerUpdateGnbValidServedNrCellInformationGetNodebNotFound(t *testing.T) {
697 context := controllerUpdateGnbTestContext{
698 getNodebInfoResult: &getNodebInfoResult{
700 rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found Error"),
702 requestBody: map[string]interface{}{
703 "servedNrCells": []interface{}{
704 map[string]interface{}{
705 "servedNrCellInformation": buildServedNrCellInformation(""),
709 expectedStatusCode: http.StatusNotFound,
710 expectedJsonResponse: ResourceNotFoundJson,
713 controllerUpdateGnbTestExecuter(t, &context)
716 func TestControllerUpdateGnbValidServedNrCellInformationGetNodebInternalError(t *testing.T) {
717 context := controllerUpdateGnbTestContext{
718 getNodebInfoResult: &getNodebInfoResult{
720 rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")),
722 requestBody: map[string]interface{}{
723 "servedNrCells": []interface{}{
724 map[string]interface{}{
725 "servedNrCellInformation": buildServedNrCellInformation(""),
729 expectedStatusCode: http.StatusInternalServerError,
730 expectedJsonResponse: RnibErrorJson,
733 controllerUpdateGnbTestExecuter(t, &context)
736 func TestControllerUpdateGnbGetNodebSuccessInvalidGnbConfiguration(t *testing.T) {
737 context := controllerUpdateGnbTestContext{
738 getNodebInfoResult: &getNodebInfoResult{
739 nodebInfo: &entities.NodebInfo{
741 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
742 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
746 requestBody: map[string]interface{}{
747 "servedNrCells": []interface{}{
748 map[string]interface{}{
749 "servedNrCellInformation": buildServedNrCellInformation(""),
750 "nrNeighbourInfos": []interface{}{
751 buildNrNeighbourInformation(""),
756 expectedStatusCode: http.StatusInternalServerError,
757 expectedJsonResponse: InternalErrorJson,
760 controllerUpdateGnbTestExecuter(t, &context)
763 func TestControllerUpdateGnbGetNodebSuccessRemoveServedNrCellsFailure(t *testing.T) {
764 oldServedNrCells := generateServedNrCells("whatever1", "whatever2")
765 context := controllerUpdateGnbTestContext{
766 removeServedNrCellsParams: &removeServedNrCellsParams{
767 err: common.NewInternalError(errors.New("#writer.UpdateGnbCells - Internal Error")),
768 servedNrCells: oldServedNrCells,
770 getNodebInfoResult: &getNodebInfoResult{
771 nodebInfo: &entities.NodebInfo{
773 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
774 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
775 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{ServedNrCells: oldServedNrCells}},
779 requestBody: map[string]interface{}{
780 "servedNrCells": []interface{}{
781 map[string]interface{}{
782 "servedNrCellInformation": buildServedNrCellInformation(""),
783 "nrNeighbourInfos": []interface{}{
784 buildNrNeighbourInformation(""),
789 expectedStatusCode: http.StatusInternalServerError,
790 expectedJsonResponse: RnibErrorJson,
793 controllerUpdateGnbTestExecuter(t, &context)
796 func TestControllerUpdateGnbGetNodebSuccessUpdateGnbCellsFailure(t *testing.T) {
797 oldServedNrCells := generateServedNrCells("whatever1", "whatever2")
798 context := controllerUpdateGnbTestContext{
799 removeServedNrCellsParams: &removeServedNrCellsParams{
801 servedNrCells: oldServedNrCells,
803 updateGnbCellsParams: &updateGnbCellsParams{
804 err: common.NewInternalError(errors.New("#writer.UpdateGnbCells - Internal Error")),
806 getNodebInfoResult: &getNodebInfoResult{
807 nodebInfo: &entities.NodebInfo{
809 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
810 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
811 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{ServedNrCells: oldServedNrCells}},
815 requestBody: map[string]interface{}{
816 "servedNrCells": []interface{}{
817 map[string]interface{}{
818 "servedNrCellInformation": buildServedNrCellInformation(""),
819 "nrNeighbourInfos": []interface{}{
820 buildNrNeighbourInformation(""),
825 expectedStatusCode: http.StatusInternalServerError,
826 expectedJsonResponse: RnibErrorJson,
829 controllerUpdateGnbTestExecuter(t, &context)
832 func TestControllerUpdateGnbSuccess(t *testing.T) {
833 context := controllerUpdateGnbTestContext{
834 updateGnbCellsParams: &updateGnbCellsParams{
837 getNodebInfoResult: &getNodebInfoResult{
838 nodebInfo: &entities.NodebInfo{
840 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
841 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
842 Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}},
846 requestBody: map[string]interface{}{
847 "servedNrCells": []interface{}{
848 map[string]interface{}{
849 "servedNrCellInformation": buildServedNrCellInformation(""),
850 "nrNeighbourInfos": []interface{}{
851 buildNrNeighbourInformation(""),
856 expectedStatusCode: http.StatusOK,
857 expectedJsonResponse: "{\"ranName\":\"test\",\"connectionStatus\":\"CONNECTED\",\"gnb\":{\"servedNrCells\":[{\"servedNrCellInformation\":{\"nrPci\":1,\"cellId\":\"whatever\",\"servedPlmns\":[\"whatever\"],\"nrMode\":\"FDD\",\"choiceNrMode\":{\"fdd\":{}}},\"nrNeighbourInfos\":[{\"nrPci\":1,\"nrCgi\":\"whatever\",\"nrMode\":\"FDD\",\"choiceNrMode\":{\"tdd\":{}}}]}]},\"associatedE2tInstanceAddress\":\"10.0.2.15:38000\"}",
860 controllerUpdateGnbTestExecuter(t, &context)
863 func TestControllerUpdateEnbInvalidRequest(t *testing.T) {
864 controller, _, _, _, _ := setupControllerTest(t)
866 writer := httptest.NewRecorder()
867 invalidJson := strings.NewReader("{enb:\"whatever\"")
869 updateEnbUrl := fmt.Sprintf("/nodeb/enb/%s", RanName)
870 req, _ := http.NewRequest(http.MethodPut, updateEnbUrl, invalidJson)
871 req.Header.Set("Content-Type", "application/json")
872 req = mux.SetURLVars(req, map[string]string{"ranName": RanName})
874 controller.UpdateEnb(writer, req)
876 assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
877 bodyBytes, _ := ioutil.ReadAll(writer.Body)
878 assert.Equal(t, CorruptedJson, string(bodyBytes))
881 func TestControllerUpdateEnbEmptyEnbType(t *testing.T) {
882 context := controllerUpdateEnbTestContext{
883 getNodebInfoResult: nil,
884 requestBody: getUpdateEnbRequest(EnbRequiredFields[0]),
885 expectedStatusCode: http.StatusBadRequest,
886 expectedJsonResponse: ValidationFailureJson,
889 controllerUpdateEnbTestExecuter(t, &context)
892 func TestControllerUpdateEnbEmptyServedCells(t *testing.T) {
893 context := controllerUpdateEnbTestContext{
894 getNodebInfoResult: nil,
895 requestBody: getUpdateEnbRequest(EnbRequiredFields[1]),
896 expectedStatusCode: http.StatusBadRequest,
897 expectedJsonResponse: ValidationFailureJson,
900 controllerUpdateEnbTestExecuter(t, &context)
903 func TestControllerUpdateEnbMissingEnb(t *testing.T) {
904 context := controllerUpdateEnbTestContext{
905 getNodebInfoResult: nil,
906 requestBody: getUpdateEnbRequest(UpdateEnbRequestRequiredFields[0]),
907 expectedStatusCode: http.StatusBadRequest,
908 expectedJsonResponse: ValidationFailureJson,
911 controllerUpdateEnbTestExecuter(t, &context)
914 func TestControllerUpdateEnbValidServedCellsGetNodebNotFound(t *testing.T) {
915 context := controllerUpdateEnbTestContext{
916 getNodebInfoResult: &getNodebInfoResult{
918 rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found Error"),
920 requestBody: getUpdateEnbRequest(""),
921 expectedStatusCode: http.StatusNotFound,
922 expectedJsonResponse: ResourceNotFoundJson,
925 controllerUpdateEnbTestExecuter(t, &context)
928 func TestControllerUpdateEnbValidServedCellsGetNodebInternalError(t *testing.T) {
929 context := controllerUpdateEnbTestContext{
930 getNodebInfoResult: &getNodebInfoResult{
932 rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")),
934 requestBody: getUpdateEnbRequest(""),
935 expectedStatusCode: http.StatusInternalServerError,
936 expectedJsonResponse: RnibErrorJson,
939 controllerUpdateEnbTestExecuter(t, &context)
942 func TestControllerUpdateEnbGetNodebSuccessGnbTypeFailure(t *testing.T) {
943 oldServedCells := generateServedCells("whatever1", "whatever2")
944 context := controllerUpdateEnbTestContext{
945 getNodebInfoResult: &getNodebInfoResult{
946 nodebInfo: &entities.NodebInfo{
948 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
949 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
950 NodeType: entities.Node_GNB,
951 Configuration: &entities.NodebInfo_Enb{Enb: &entities.Enb{ServedCells: oldServedCells}},
955 requestBody: getUpdateEnbRequest(""),
956 expectedStatusCode: http.StatusBadRequest,
957 expectedJsonResponse: ValidationFailureJson,
960 controllerUpdateEnbTestExecuter(t, &context)
963 func TestControllerUpdateEnbGetNodebSuccessRemoveServedCellsFailure(t *testing.T) {
964 oldServedCells := generateServedCells("whatever1", "whatever2")
965 context := controllerUpdateEnbTestContext{
966 removeServedCellsParams: &removeServedCellsParams{
967 err: common.NewInternalError(errors.New("#writer.RemoveServedCells - Internal Error")),
968 servedCellInfo: oldServedCells,
970 getNodebInfoResult: &getNodebInfoResult{
971 nodebInfo: &entities.NodebInfo{
973 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
974 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
975 NodeType: entities.Node_ENB,
976 Configuration: &entities.NodebInfo_Enb{Enb: &entities.Enb{ServedCells: oldServedCells}},
980 requestBody: getUpdateEnbRequest(""),
981 expectedStatusCode: http.StatusInternalServerError,
982 expectedJsonResponse: RnibErrorJson,
985 controllerUpdateEnbTestExecuter(t, &context)
988 func TestControllerUpdateEnbGetNodebSuccessUpdateEnbFailure(t *testing.T) {
989 oldServedCells := generateServedCells("whatever1", "whatever2")
990 context := controllerUpdateEnbTestContext{
991 removeServedCellsParams: &removeServedCellsParams{
993 servedCellInfo: oldServedCells,
995 updateEnbCellsParams: &updateEnbCellsParams{
996 err: common.NewInternalError(errors.New("#writer.UpdateEnb - Internal Error")),
998 getNodebInfoResult: &getNodebInfoResult{
999 nodebInfo: &entities.NodebInfo{
1001 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
1002 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
1003 NodeType: entities.Node_ENB,
1004 Configuration: &entities.NodebInfo_Enb{Enb: &entities.Enb{ServedCells: oldServedCells, EnbType: entities.EnbType_MACRO_ENB}},
1008 requestBody: getUpdateEnbRequest(""),
1009 expectedStatusCode: http.StatusInternalServerError,
1010 expectedJsonResponse: RnibErrorJson,
1013 controllerUpdateEnbTestExecuter(t, &context)
1016 func TestControllerUpdateEnbSuccess(t *testing.T) {
1017 oldServedCells := generateServedCells("whatever1", "whatever2")
1018 context := controllerUpdateEnbTestContext{
1019 removeServedCellsParams: &removeServedCellsParams{
1021 servedCellInfo: oldServedCells,
1023 updateEnbCellsParams: &updateEnbCellsParams{
1026 getNodebInfoResult: &getNodebInfoResult{
1027 nodebInfo: &entities.NodebInfo{
1029 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
1030 AssociatedE2TInstanceAddress: AssociatedE2TInstanceAddress,
1031 NodeType: entities.Node_ENB,
1032 Configuration: &entities.NodebInfo_Enb{Enb: &entities.Enb{ServedCells: oldServedCells, EnbType: entities.EnbType_MACRO_ENB}},
1036 requestBody: getUpdateEnbRequest(""),
1037 expectedStatusCode: http.StatusOK,
1038 expectedJsonResponse: "{\"ranName\":\"test\",\"connectionStatus\":\"CONNECTED\",\"nodeType\":\"ENB\",\"enb\":{\"enbType\":\"MACRO_ENB\",\"servedCells\":[{\"pci\":1,\"cellId\":\"whatever\",\"tac\":\"whatever3\",\"broadcastPlmns\":[\"whatever\"],\"choiceEutraMode\":{\"fdd\":{}},\"eutraMode\":\"FDD\"}]},\"associatedE2tInstanceAddress\":\"10.0.2.15:38000\"}",
1041 controllerUpdateEnbTestExecuter(t, &context)
1044 func TestControllerAddEnbGetNodebInternalError(t *testing.T) {
1045 context := controllerAddEnbTestContext{
1046 getNodebInfoResult: &getNodebInfoResult{
1048 rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")),
1050 requestBody: getAddEnbRequest(""),
1051 expectedStatusCode: http.StatusInternalServerError,
1052 expectedJsonResponse: RnibErrorJson,
1055 controllerAddEnbTestExecuter(t, &context)
1058 func TestControllerAddEnbNodebExistsFailure(t *testing.T) {
1059 context := controllerAddEnbTestContext{
1060 getNodebInfoResult: &getNodebInfoResult{
1061 nodebInfo: &entities.NodebInfo{},
1064 requestBody: getAddEnbRequest(""),
1065 expectedStatusCode: http.StatusBadRequest,
1066 expectedJsonResponse: NodebExistsJson,
1069 controllerAddEnbTestExecuter(t, &context)
1072 func TestControllerAddEnbSaveNodebFailure(t *testing.T) {
1073 context := controllerAddEnbTestContext{
1074 saveNodebParams: &saveNodebParams{
1075 err: common.NewInternalError(errors.New("#reader.SaveeNodeb - Internal Error")),
1077 getNodebInfoResult: &getNodebInfoResult{
1079 rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found Error"),
1081 requestBody: getAddEnbRequest(""),
1082 expectedStatusCode: http.StatusInternalServerError,
1083 expectedJsonResponse: RnibErrorJson,
1086 controllerAddEnbTestExecuter(t, &context)
1089 func TestControllerAddEnbAddNbIdentityFailure(t *testing.T) {
1090 context := controllerAddEnbTestContext{
1091 saveNodebParams: &saveNodebParams{
1094 addNbIdentityParams: &addNbIdentityParams{
1095 err: common.NewInternalError(errors.New("#writer.addNbIdentity - Internal Error")),
1097 getNodebInfoResult: &getNodebInfoResult{
1099 rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found Error"),
1101 requestBody: getAddEnbRequest(""),
1102 expectedStatusCode: http.StatusInternalServerError,
1103 expectedJsonResponse: RnibErrorJson,
1106 controllerAddEnbTestExecuter(t, &context)
1109 func TestControllerAddEnbMissingRequiredRequestProps(t *testing.T) {
1111 for _, v := range AddEnbRequestRequiredFields {
1112 context := controllerAddEnbTestContext{
1113 requestBody: getAddEnbRequest(v),
1114 expectedStatusCode: http.StatusBadRequest,
1115 expectedJsonResponse: ValidationFailureJson,
1118 controllerAddEnbTestExecuter(t, &context)
1122 func TestControllerAddEnbInvalidRequest(t *testing.T) {
1123 controller, _, _, _, _ := setupControllerTest(t)
1124 writer := httptest.NewRecorder()
1126 // Invalid json: attribute name without quotes (should be "cause":).
1127 invalidJson := strings.NewReader("{ranName:\"whatever\"")
1128 req, _ := http.NewRequest(http.MethodPost, AddEnbUrl, invalidJson)
1130 controller.AddEnb(writer, req)
1131 assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
1132 bodyBytes, _ := ioutil.ReadAll(writer.Body)
1133 assert.Equal(t, CorruptedJson, string(bodyBytes))
1137 func TestControllerAddEnbMissingRequiredGlobalNbIdProps(t *testing.T) {
1139 r := getAddEnbRequest("")
1141 for _, v := range GlobalIdRequiredFields {
1142 r["globalNbId"] = buildGlobalNbId(v)
1144 context := controllerAddEnbTestContext{
1146 expectedStatusCode: http.StatusBadRequest,
1147 expectedJsonResponse: ValidationFailureJson,
1150 controllerAddEnbTestExecuter(t, &context)
1154 func TestControllerAddEnbMissingRequiredEnbProps(t *testing.T) {
1156 r := getAddEnbRequest("")
1158 for _, v := range EnbRequiredFields {
1159 r["enb"] = buildEnb(v)
1161 context := controllerAddEnbTestContext{
1163 expectedStatusCode: http.StatusBadRequest,
1164 expectedJsonResponse: ValidationFailureJson,
1167 controllerAddEnbTestExecuter(t, &context)
1171 func TestControllerUpdateEnbMissingRequiredServedCellProps(t *testing.T) {
1173 r := getUpdateEnbRequest("")
1175 for _, v := range ServedCellRequiredFields {
1178 enbMap, _ := enb.(map[string]interface{})
1180 enbMap["servedCells"] = []interface{}{
1184 context := controllerUpdateEnbTestContext{
1186 expectedStatusCode: http.StatusBadRequest,
1187 expectedJsonResponse: ValidationFailureJson,
1190 controllerUpdateEnbTestExecuter(t, &context)
1194 func TestControllerAddEnbMissingRequiredServedCellProps(t *testing.T) {
1196 r := getAddEnbRequest("")
1198 for _, v := range ServedCellRequiredFields {
1201 enbMap, _ := enb.(map[string]interface{})
1203 enbMap["servedCells"] = []interface{}{
1207 context := controllerAddEnbTestContext{
1209 expectedStatusCode: http.StatusBadRequest,
1210 expectedJsonResponse: ValidationFailureJson,
1213 controllerAddEnbTestExecuter(t, &context)
1217 func TestControllerAddEnbSuccess(t *testing.T) {
1218 context := controllerAddEnbTestContext{
1219 saveNodebParams: &saveNodebParams{
1222 addNbIdentityParams: &addNbIdentityParams{
1225 getNodebInfoResult: &getNodebInfoResult{
1227 rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found Error"),
1229 requestBody: getAddEnbRequest(""),
1230 expectedStatusCode: http.StatusCreated,
1231 expectedJsonResponse: "{\"ranName\":\"test\",\"connectionStatus\":\"DISCONNECTED\",\"globalNbId\":{\"plmnId\":\"whatever\",\"nbId\":\"whatever2\"},\"nodeType\":\"ENB\",\"enb\":{\"enbType\":\"MACRO_ENB\",\"servedCells\":[{\"pci\":1,\"cellId\":\"whatever\",\"tac\":\"whatever3\",\"broadcastPlmns\":[\"whatever\"],\"choiceEutraMode\":{\"fdd\":{}},\"eutraMode\":\"FDD\"}]}}",
1234 controllerAddEnbTestExecuter(t, &context)
1237 func TestControllerDeleteEnbGetNodebInternalError(t *testing.T) {
1238 context := controllerDeleteEnbTestContext{
1239 getNodebInfoResult: &getNodebInfoResult{
1241 rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")),
1243 expectedStatusCode: http.StatusInternalServerError,
1244 expectedJsonResponse: RnibErrorJson,
1247 controllerDeleteEnbTestExecuter(t, &context)
1250 func TestControllerDeleteEnbNodebNotExistsFailure(t *testing.T) {
1251 context := controllerDeleteEnbTestContext{
1252 getNodebInfoResult: &getNodebInfoResult{
1254 rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found"),
1256 expectedStatusCode: http.StatusNotFound,
1257 expectedJsonResponse: ResourceNotFoundJson,
1260 controllerDeleteEnbTestExecuter(t, &context)
1263 func TestControllerDeleteEnbNodebNotEnb(t *testing.T) {
1264 context := controllerDeleteEnbTestContext{
1265 getNodebInfoResult: &getNodebInfoResult{
1266 nodebInfo: &entities.NodebInfo{RanName: "ran1", NodeType: entities.Node_GNB, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED},
1269 expectedStatusCode: http.StatusBadRequest,
1270 expectedJsonResponse: ValidationFailureJson,
1273 controllerDeleteEnbTestExecuter(t, &context)
1276 func TestControllerDeleteEnbSuccess(t *testing.T) {
1277 context := controllerDeleteEnbTestContext{
1278 getNodebInfoResult: &getNodebInfoResult{
1279 nodebInfo: &entities.NodebInfo{RanName: "ran1", NodeType: entities.Node_ENB, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED},
1282 expectedStatusCode: http.StatusNoContent,
1283 expectedJsonResponse: "",
1285 controllerDeleteEnbTestExecuter(t, &context)
1288 func getJsonRequestAsBuffer(requestJson map[string]interface{}) *bytes.Buffer {
1289 b := new(bytes.Buffer)
1290 _ = json.NewEncoder(b).Encode(requestJson)
1294 func TestControllerGetNodebSuccess(t *testing.T) {
1297 context := controllerGetNodebTestContext{
1299 nodebInfo: &entities.NodebInfo{RanName: ranName, Ip: "10.0.2.15", Port: 1234},
1300 rnibError: rnibError,
1301 expectedStatusCode: http.StatusOK,
1302 expectedJsonResponse: fmt.Sprintf("{\"ranName\":\"%s\",\"ip\":\"10.0.2.15\",\"port\":1234}", ranName),
1305 controllerGetNodebTestExecuter(t, &context)
1308 func TestControllerGetNodebNotFound(t *testing.T) {
1311 var nodebInfo *entities.NodebInfo
1312 context := controllerGetNodebTestContext{
1314 nodebInfo: nodebInfo,
1315 rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found Error"),
1316 expectedStatusCode: http.StatusNotFound,
1317 expectedJsonResponse: ResourceNotFoundJson,
1320 controllerGetNodebTestExecuter(t, &context)
1323 func TestControllerGetNodebInternal(t *testing.T) {
1325 var nodebInfo *entities.NodebInfo
1326 context := controllerGetNodebTestContext{
1328 nodebInfo: nodebInfo,
1329 rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")),
1330 expectedStatusCode: http.StatusInternalServerError,
1331 expectedJsonResponse: RnibErrorJson,
1334 controllerGetNodebTestExecuter(t, &context)
1337 func TestControllerGetNodebIdListSuccess(t *testing.T) {
1339 nodebIdList := []*entities.NbIdentity{
1340 {InventoryName: "test1", GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}},
1341 {InventoryName: "test2", GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}},
1344 context := controllerGetNodebIdListTestContext{
1345 nodebIdList: nodebIdList,
1346 rnibError: rnibError,
1347 expectedStatusCode: http.StatusOK,
1348 expectedJsonResponse: "[{\"inventoryName\":\"test1\",\"globalNbId\":{\"plmnId\":\"plmnId1\",\"nbId\":\"nbId1\"}},{\"inventoryName\":\"test2\",\"globalNbId\":{\"plmnId\":\"plmnId2\",\"nbId\":\"nbId2\"}}]",
1351 controllerGetNodebIdListTestExecuter(t, &context)
1354 func TestControllerGetNodebIdListEmptySuccess(t *testing.T) {
1356 var nodebIdList []*entities.NbIdentity
1358 context := controllerGetNodebIdListTestContext{
1359 nodebIdList: nodebIdList,
1360 rnibError: rnibError,
1361 expectedStatusCode: http.StatusOK,
1362 expectedJsonResponse: "[]",
1365 controllerGetNodebIdListTestExecuter(t, &context)
1368 func TestControllerGetNodebIdListInternal(t *testing.T) {
1369 var nodebIdList []*entities.NbIdentity
1370 context := controllerGetNodebIdListTestContext{
1371 nodebIdList: nodebIdList,
1372 rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")),
1373 expectedStatusCode: http.StatusInternalServerError,
1374 expectedJsonResponse: RnibErrorJson,
1377 controllerGetNodebIdListTestExecuter(t, &context)
1380 func TestHeaderValidationFailed(t *testing.T) {
1381 controller, _, _, _, _ := setupControllerTest(t)
1383 writer := httptest.NewRecorder()
1385 header := &http.Header{}
1387 controller.handleRequest(writer, header, httpmsghandlerprovider.ShutdownRequest, nil, true, 0)
1389 var errorResponse = parseJsonRequest(t, writer.Body)
1390 err := e2managererrors.NewHeaderValidationError()
1392 assert.Equal(t, http.StatusUnsupportedMediaType, writer.Result().StatusCode)
1393 assert.Equal(t, errorResponse.Code, err.Code)
1394 assert.Equal(t, errorResponse.Message, err.Message)
1397 func TestShutdownStatusNoContent(t *testing.T) {
1398 controller, readerMock, _, _, e2tInstancesManagerMock := setupControllerTest(t)
1399 e2tInstancesManagerMock.On("GetE2TAddresses").Return([]string{}, nil)
1400 readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, nil)
1402 writer := httptest.NewRecorder()
1403 controller.Shutdown(writer, tests.GetHttpRequest())
1405 assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)
1408 func TestHandleInternalError(t *testing.T) {
1409 controller, _, _, _, _ := setupControllerTest(t)
1411 writer := httptest.NewRecorder()
1412 err := e2managererrors.NewInternalError()
1414 controller.handleErrorResponse(err, writer)
1415 var errorResponse = parseJsonRequest(t, writer.Body)
1417 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
1418 assert.Equal(t, errorResponse.Code, err.Code)
1419 assert.Equal(t, errorResponse.Message, err.Message)
1422 func TestHandleCommandAlreadyInProgressError(t *testing.T) {
1423 controller, _, _, _, _ := setupControllerTest(t)
1424 writer := httptest.NewRecorder()
1425 err := e2managererrors.NewCommandAlreadyInProgressError()
1427 controller.handleErrorResponse(err, writer)
1428 var errorResponse = parseJsonRequest(t, writer.Body)
1430 assert.Equal(t, http.StatusMethodNotAllowed, writer.Result().StatusCode)
1431 assert.Equal(t, errorResponse.Code, err.Code)
1432 assert.Equal(t, errorResponse.Message, err.Message)
1435 func TestHandleRoutingManagerError(t *testing.T) {
1436 controller, _, _, _, _ := setupControllerTest(t)
1437 writer := httptest.NewRecorder()
1438 err := e2managererrors.NewRoutingManagerError()
1440 controller.handleErrorResponse(err, writer)
1441 var errorResponse = parseJsonRequest(t, writer.Body)
1443 assert.Equal(t, http.StatusServiceUnavailable, writer.Result().StatusCode)
1444 assert.Equal(t, errorResponse.Code, err.Code)
1445 assert.Equal(t, errorResponse.Message, err.Message)
1448 func TestHandleE2TInstanceAbsenceError(t *testing.T) {
1449 controller, _, _, _, _ := setupControllerTest(t)
1451 writer := httptest.NewRecorder()
1452 err := e2managererrors.NewE2TInstanceAbsenceError()
1454 controller.handleErrorResponse(err, writer)
1455 var errorResponse = parseJsonRequest(t, writer.Body)
1457 assert.Equal(t, http.StatusServiceUnavailable, writer.Result().StatusCode)
1458 assert.Equal(t, errorResponse.Code, err.Code)
1459 assert.Equal(t, errorResponse.Message, err.Message)
1462 func TestValidateHeaders(t *testing.T) {
1463 controller, _, _, _, _ := setupControllerTest(t)
1465 header := http.Header{}
1466 header.Set("Content-Type", "application/json")
1467 result := controller.validateRequestHeader(&header)
1469 assert.Nil(t, result)
1472 func parseJsonRequest(t *testing.T, r io.Reader) models.ErrorResponse {
1474 var errorResponse models.ErrorResponse
1475 body, err := ioutil.ReadAll(r)
1477 t.Errorf("Error cannot deserialize json request")
1479 _ = json.Unmarshal(body, &errorResponse)
1481 return errorResponse
1484 func initLog(t *testing.T) *logger.Logger {
1485 log, err := logger.InitLogger(logger.InfoLevel)
1487 t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err)
1492 func TestX2ResetHandleSuccessfulRequestedCause(t *testing.T) {
1493 controller, readerMock, _, rmrMessengerMock, _ := setupControllerTest(t)
1496 payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x40}
1498 var msgSrc unsafe.Pointer
1499 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction, msgSrc)
1500 rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(msg, nil)
1502 writer := httptest.NewRecorder()
1504 var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}
1505 readerMock.On("GetNodeb", ranName).Return(nodeb, nil)
1507 data4Req := map[string]interface{}{"cause": "protocol:transfer-syntax-error"}
1508 b := new(bytes.Buffer)
1509 _ = json.NewEncoder(b).Encode(data4Req)
1510 req, _ := http.NewRequest("PUT", "https://localhost:3800/nodeb-reset", b)
1511 req = mux.SetURLVars(req, map[string]string{"ranName": ranName})
1513 controller.X2Reset(writer, req)
1514 assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)
1518 func TestX2ResetHandleSuccessfulRequestedDefault(t *testing.T) {
1519 controller, readerMock, _, rmrMessengerMock, _ := setupControllerTest(t)
1523 payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x64}
1525 var msgSrc unsafe.Pointer
1526 msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction, msgSrc)
1527 rmrMessengerMock.On("SendMsg", msg, true).Return(msg, nil)
1529 writer := httptest.NewRecorder()
1531 var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}
1532 readerMock.On("GetNodeb", ranName).Return(nodeb, nil)
1535 b := new(bytes.Buffer)
1536 data4Req := map[string]interface{}{}
1537 _ = json.NewEncoder(b).Encode(data4Req)
1538 req, _ := http.NewRequest("PUT", "https://localhost:3800/nodeb-reset", b)
1539 req = mux.SetURLVars(req, map[string]string{"ranName": ranName})
1541 controller.X2Reset(writer, req)
1542 assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)
1545 func TestX2ResetHandleFailureInvalidBody(t *testing.T) {
1546 controller, _, _, _, _ := setupControllerTest(t)
1550 writer := httptest.NewRecorder()
1552 // Invalid json: attribute name without quotes (should be "cause":).
1553 b := strings.NewReader("{cause:\"protocol:transfer-syntax-error\"")
1554 req, _ := http.NewRequest("PUT", "https://localhost:3800/nodeb-reset", b)
1555 req = mux.SetURLVars(req, map[string]string{"ranName": ranName})
1557 controller.X2Reset(writer, req)
1558 assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
1562 func TestHandleErrorResponse(t *testing.T) {
1563 controller, _, _, _, _ := setupControllerTest(t)
1565 writer := httptest.NewRecorder()
1566 controller.handleErrorResponse(e2managererrors.NewRnibDbError(), writer)
1567 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
1569 writer = httptest.NewRecorder()
1570 controller.handleErrorResponse(e2managererrors.NewCommandAlreadyInProgressError(), writer)
1571 assert.Equal(t, http.StatusMethodNotAllowed, writer.Result().StatusCode)
1573 writer = httptest.NewRecorder()
1574 controller.handleErrorResponse(e2managererrors.NewHeaderValidationError(), writer)
1575 assert.Equal(t, http.StatusUnsupportedMediaType, writer.Result().StatusCode)
1577 writer = httptest.NewRecorder()
1578 controller.handleErrorResponse(e2managererrors.NewWrongStateError("", ""), writer)
1579 assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
1581 writer = httptest.NewRecorder()
1582 controller.handleErrorResponse(e2managererrors.NewRequestValidationError(), writer)
1583 assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
1585 writer = httptest.NewRecorder()
1586 controller.handleErrorResponse(e2managererrors.NewRmrError(), writer)
1587 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
1589 writer = httptest.NewRecorder()
1590 controller.handleErrorResponse(e2managererrors.NewResourceNotFoundError(), writer)
1591 assert.Equal(t, http.StatusNotFound, writer.Result().StatusCode)
1593 writer = httptest.NewRecorder()
1594 controller.handleErrorResponse(fmt.Errorf("ErrorError"), writer)
1595 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
1598 func getRmrSender(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *rmrsender.RmrSender {
1599 rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
1600 rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger)
1601 return rmrsender.NewRmrSender(log, rmrMessenger)