blob: 5a137c46b5a7706c0d8166c40f31ae34eecff5aa [file] [log] [blame]
//
// Copyright 2019 AT&T Intellectual Property
// Copyright 2019 Nokia
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
package controllers
import (
"e2mgr/configuration"
"e2mgr/managers"
"e2mgr/mocks"
"e2mgr/models"
"e2mgr/providers/httpmsghandlerprovider"
"e2mgr/services"
"encoding/json"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
"github.com/magiconair/properties/assert"
"github.com/pkg/errors"
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"
)
const E2TAddress string = "10.0.2.15:38000"
const E2TAddress2 string = "10.0.2.16:38001"
type controllerE2TInstancesTestContext struct {
e2tAddresses []string
e2tInstances []*entities.E2TInstance
error error
expectedStatusCode int
expectedJsonResponse string
}
func setupE2TControllerTest(t *testing.T) (*E2TController, *mocks.RnibReaderMock) {
log := initLog(t)
config := configuration.ParseConfiguration()
readerMock := &mocks.RnibReaderMock{}
rnibDataService := services.NewRnibDataService(log, config, readerMock, nil)
e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, log)
ranListManager := managers.NewRanListManager(log, rnibDataService)
ranAlarmService := services.NewRanAlarmService(log, config)
ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(log, rnibDataService, ranListManager, ranAlarmService)
nodebValidator := managers.NewNodebValidator()
updateEnbManager := managers.NewUpdateEnbManager(log, rnibDataService, nodebValidator)
updateGnbManager := managers.NewUpdateGnbManager(log, rnibDataService, nodebValidator)
handlerProvider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(log, nil, config, rnibDataService, e2tInstancesManager, nil, ranConnectStatusChangeManager, nodebValidator, updateEnbManager, updateGnbManager, ranListManager)
controller := NewE2TController(log, handlerProvider)
return controller, readerMock
}
func controllerGetE2TInstancesTestExecuter(t *testing.T, context *controllerE2TInstancesTestContext) {
controller, readerMock := setupE2TControllerTest(t)
writer := httptest.NewRecorder()
readerMock.On("GetE2TAddresses").Return(context.e2tAddresses, context.error)
if context.e2tInstances != nil {
readerMock.On("GetE2TInstances", context.e2tAddresses).Return(context.e2tInstances, context.error)
}
req, _ := http.NewRequest("GET", "/e2t/list", nil)
controller.GetE2TInstances(writer, req)
assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode)
bodyBytes, _ := ioutil.ReadAll(writer.Body)
assert.Equal(t, context.expectedJsonResponse, string(bodyBytes))
readerMock.AssertExpectations(t)
}
func TestControllerGetE2TInstancesSuccess(t *testing.T) {
ranNames1 := []string{"test1", "test2", "test3"}
e2tInstanceResponseModel1 := models.NewE2TInstanceResponseModel(E2TAddress, ranNames1)
e2tInstanceResponseModel2 := models.NewE2TInstanceResponseModel(E2TAddress2, []string{})
e2tInstancesResponse := models.E2TInstancesResponse{e2tInstanceResponseModel1, e2tInstanceResponseModel2}
bytes, _ := json.Marshal(e2tInstancesResponse)
context := controllerE2TInstancesTestContext{
e2tAddresses: []string{E2TAddress, E2TAddress2},
e2tInstances: []*entities.E2TInstance{{Address: E2TAddress, AssociatedRanList: ranNames1}, {Address: E2TAddress2, AssociatedRanList: []string{}}},
error: nil,
expectedStatusCode: http.StatusOK,
expectedJsonResponse: string(bytes),
}
controllerGetE2TInstancesTestExecuter(t, &context)
}
func TestControllerGetE2TInstancesEmptySuccess(t *testing.T) {
e2tInstancesResponse := models.E2TInstancesResponse{}
bytes, _ := json.Marshal(e2tInstancesResponse)
context := controllerE2TInstancesTestContext{
e2tAddresses: []string{},
e2tInstances: nil,
error: nil,
expectedStatusCode: http.StatusOK,
expectedJsonResponse: string(bytes),
}
controllerGetE2TInstancesTestExecuter(t, &context)
}
func TestControllerGetE2TInstancesInternal(t *testing.T) {
context := controllerE2TInstancesTestContext{
e2tAddresses: nil,
e2tInstances: nil,
error: common.NewInternalError(errors.New("error")),
expectedStatusCode: http.StatusInternalServerError,
expectedJsonResponse: "{\"errorCode\":500,\"errorMessage\":\"RNIB error\"}",
}
controllerGetE2TInstancesTestExecuter(t, &context)
}
func TestInvalidRequestName(t *testing.T) {
controller, _ := setupE2TControllerTest(t)
writer := httptest.NewRecorder()
header := &http.Header{}
controller.handleRequest(writer, header, "", nil, true)
var errorResponse = parseJsonRequest(t, writer.Body)
assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
assert.Equal(t, errorResponse.Code, 501)
}