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 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
27 "github.com/stretchr/testify/assert"
28 "github.com/stretchr/testify/mock"
38 "rsm/providers/httpmsghandlerprovider"
46 func setupControllerTest(t *testing.T) (*Controller, *mocks.RnibReaderMock, *mocks.RsmReaderMock, *mocks.RsmWriterMock, *mocks.ResourceStatusServiceMock) {
47 log, err := logger.InitLogger(logger.DebugLevel)
49 t.Errorf("#... - failed to initialize logger, error: %s", err)
52 config, err := configuration.ParseConfiguration()
54 t.Errorf("#... - failed to parse configuration error: %s", err)
57 resourceStatusServiceMock := &mocks.ResourceStatusServiceMock{}
58 rnibReaderMock := &mocks.RnibReaderMock{}
59 rsmReaderMock := &mocks.RsmReaderMock{}
60 rsmWriterMock := &mocks.RsmWriterMock{}
62 rnibDataService := services.NewRnibDataService(log, config, rnibReaderMock, rsmReaderMock, rsmWriterMock)
63 handlerProvider := httpmsghandlerprovider.NewRequestHandlerProvider(log, rnibDataService, resourceStatusServiceMock)
64 controller := NewController(log, handlerProvider)
65 return controller, rnibReaderMock, rsmReaderMock, rsmWriterMock, resourceStatusServiceMock
68 func TestResourceStatusInvalidBody(t *testing.T) {
69 controller, _, _, _ , _:= setupControllerTest(t)
71 header := http.Header{}
72 header.Set("Content-Type", "application/json")
73 httpRequest, _ := http.NewRequest("PUT", "http://localhost:4800/v1/general/resourcestatus", strings.NewReader("{}{}"))
74 httpRequest.Header = header
76 writer := httptest.NewRecorder()
77 controller.ResourceStatus(writer, httpRequest)
79 var errorResponse = parseJsonRequest(t, writer.Body)
81 assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
82 assert.Equal(t, rsmerrors.NewInvalidJsonError().Code, errorResponse.Code)
85 func TestResourceStatusSuccess(t *testing.T) {
86 controller, readerMock, rsmReaderMock, rsmWriterMock, resourceStatusServiceMock := setupControllerTest(t)
88 cellId1 := "02f829:0007ab00"
89 cellId2 := "02f829:0007ab50"
90 nodebInfo := &entities.NodebInfo{
91 RanName: tests.RanName,
92 ConnectionStatus: entities.ConnectionStatus_CONNECTED,
93 Configuration: &entities.NodebInfo_Enb{
95 ServedCells: []*entities.ServedCellInfo{{CellId: cellId1}, {CellId: cellId2}},
99 var nbIdentityList []*entities.NbIdentity
100 config := tests.GetRsmGeneralConfiguration(true)
102 rsmWriterMock.On("SaveRsmGeneralConfiguration", config).Return(nil)
103 rsmReaderMock.On("GetRsmGeneralConfiguration").Return(config, nil)
104 readerMock.On("GetListEnbIds").Return(nbIdentityList, nil)
105 readerMock.On("GetNodeb", tests.RanName).Return(nodebInfo)
106 resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
108 header := http.Header{}
109 header.Set("Content-Type", "application/json")
110 httpRequest, _ := http.NewRequest("PUT", "http://localhost:4800/v1/general/resourcestatus", strings.NewReader("{\"enableResourceStatus\":true}"))
111 httpRequest.Header = header
113 writer := httptest.NewRecorder()
114 controller.ResourceStatus(writer, httpRequest)
116 readerMock.AssertNumberOfCalls(t, "GetListEnbIds", 1)
117 resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
119 assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)
122 func TestResourceStatusFail(t *testing.T) {
124 controller, readerMock, rsmReaderMock, _, resourceStatusServiceMock := setupControllerTest(t)
126 rnibErr := &rsmerrors.RnibDbError{}
128 rsmReaderMock.On("GetRsmGeneralConfiguration").Return(tests.GetRsmGeneralConfiguration(true), rnibErr)
130 header := http.Header{}
131 header.Set("Content-Type", "application/json")
132 httpRequest, _ := http.NewRequest("PUT", "http://localhost:4800/v1/general/resourcestatus", strings.NewReader("{\"enableResourceStatus\":true}"))
133 httpRequest.Header = header
135 writer := httptest.NewRecorder()
136 controller.ResourceStatus(writer, httpRequest)
138 readerMock.AssertNumberOfCalls(t, "GetListEnbIds", 0)
139 resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
141 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
144 func TestHeaderValidationFailed(t *testing.T) {
145 controller, _, _ ,_ , _:= setupControllerTest(t)
147 writer := httptest.NewRecorder()
148 header := &http.Header{}
149 controller.handleRequest(writer, header, "", nil, true)
150 var errorResponse = parseJsonRequest(t, writer.Body)
151 err := rsmerrors.NewHeaderValidationError()
153 assert.Equal(t, http.StatusUnsupportedMediaType, writer.Result().StatusCode)
154 assert.Equal(t, errorResponse.Code, err.Code)
155 assert.Equal(t, errorResponse.Message, err.Message)
158 func TestHandleInternalError(t *testing.T) {
159 controller, _, _,_ ,_ := setupControllerTest(t)
161 writer := httptest.NewRecorder()
162 err := rsmerrors.NewInternalError()
164 controller.handleErrorResponse(err, writer)
165 var errorResponse = parseJsonRequest(t, writer.Body)
167 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
168 assert.Equal(t, errorResponse.Code, err.Code)
169 assert.Equal(t, errorResponse.Message, err.Message)
172 func TestValidateHeadersSuccess(t *testing.T) {
173 controller, _, _,_ ,_ := setupControllerTest(t)
175 header := http.Header{}
176 header.Set("Content-Type", "application/json")
177 result := controller.validateRequestHeader(&header)
179 assert.Nil(t, result)
182 func parseJsonRequest(t *testing.T, r io.Reader) models.ErrorResponse {
184 var errorResponse models.ErrorResponse
185 body, err := ioutil.ReadAll(r)
187 t.Errorf("Error cannot deserialize json request")
189 json.Unmarshal(body, &errorResponse)
194 func TestHandleErrorResponse(t *testing.T) {
195 controller, _, _ ,_ , _:= setupControllerTest(t)
197 writer := httptest.NewRecorder()
198 controller.handleErrorResponse(rsmerrors.NewRnibDbError(), writer)
199 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
201 writer = httptest.NewRecorder()
202 controller.handleErrorResponse(rsmerrors.NewHeaderValidationError(), writer)
203 assert.Equal(t, http.StatusUnsupportedMediaType, writer.Result().StatusCode)
205 writer = httptest.NewRecorder()
206 controller.handleErrorResponse(rsmerrors.NewWrongStateError("", ""), writer)
207 assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
209 writer = httptest.NewRecorder()
210 controller.handleErrorResponse(rsmerrors.NewRequestValidationError(), writer)
211 assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
213 writer = httptest.NewRecorder()
214 controller.handleErrorResponse(rsmerrors.NewRmrError(), writer)
215 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
217 writer = httptest.NewRecorder()
218 controller.handleErrorResponse(rsmerrors.NewResourceNotFoundError(), writer)
219 assert.Equal(t, http.StatusNotFound, writer.Result().StatusCode)
221 writer = httptest.NewRecorder()
222 controller.handleErrorResponse(rsmerrors.NewInvalidJsonError(), writer)
223 assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
225 writer = httptest.NewRecorder()
226 controller.handleErrorResponse(fmt.Errorf("ErrorError"), writer)
227 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
229 writer = httptest.NewRecorder()
230 controller.handleErrorResponse(rsmerrors.NewRsmError(2), writer)
231 assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)