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).
20 package rmrmsghandlers
23 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
24 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
25 "github.com/pkg/errors"
26 "github.com/stretchr/testify/assert"
27 "github.com/stretchr/testify/mock"
39 const RanName = "test"
42 func initRanConnectedNotificationHandlerTest(t *testing.T, requestName string) (ResourceStatusInitiateNotificationHandler, *mocks.RnibReaderMock, *mocks.ResourceStatusServiceMock, *mocks.RsmWriterMock, *mocks.RsmReaderMock) {
43 log, err := logger.InitLogger(logger.DebugLevel)
45 t.Errorf("#... - failed to initialize logger, error: %s", err)
48 config, err := configuration.ParseConfiguration()
50 t.Errorf("#... - failed to parse configuration error: %s", err)
53 resourceStatusServiceMock := &mocks.ResourceStatusServiceMock{}
54 rnibReaderMock := &mocks.RnibReaderMock{}
55 rsmReaderMock := &mocks.RsmReaderMock{}
56 rsmWriterMock := &mocks.RsmWriterMock{}
58 rnibDataService := services.NewRnibDataService(log, config, rnibReaderMock, rsmReaderMock, rsmWriterMock)
60 h := NewResourceStatusInitiateNotificationHandler(log, rnibDataService, resourceStatusServiceMock, requestName)
61 return h, rnibReaderMock, resourceStatusServiceMock, rsmWriterMock, rsmReaderMock
64 func TestHandlerInit(t *testing.T) {
65 h, _, _, _, _ := initRanConnectedNotificationHandlerTest(t, "RanConnected")
69 func TestJsonUnmarshalError(t *testing.T) {
70 h, rnibReaderMock, resourceStatusServiceMock, _, _ := initRanConnectedNotificationHandlerTest(t, "RanConnected")
72 payloadStr := "blabla"
73 payload := []byte(payloadStr)
74 rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
76 rnibReaderMock.On("GetNodeb", RanName).Return(mock.AnythingOfType("*entities.NodebInfo"))
77 resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
79 rnibReaderMock.AssertNumberOfCalls(t, "GetNodeb", 0)
80 resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
83 func TestUnknownJsonValue(t *testing.T) {
84 h, rnibReaderMock, resourceStatusServiceMock, _, _ := initRanConnectedNotificationHandlerTest(t, "RanConnected")
86 payloadStr := "{\"whatever\":3}"
87 payload := []byte(payloadStr)
88 rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
90 rnibReaderMock.On("GetNodeb", RanName).Return(mock.AnythingOfType("*entities.NodebInfo"))
91 resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
93 rnibReaderMock.AssertNumberOfCalls(t, "GetNodeb", 0)
94 resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
97 func TestHandleGnbNode(t *testing.T) {
98 h, rnibReaderMock, resourceStatusServiceMock, _, _ := initRanConnectedNotificationHandlerTest(t, "RanConnected")
100 payloadStr := "{\"nodeType\":2, \"messageDirection\":1}"
101 payload := []byte(payloadStr)
102 rmrReq := &models.RmrRequest{RanName: "RAN1", Payload: payload, Len: len(payload), StartTime: time.Now()}
103 rnibReaderMock.On("GetNodeb", RanName).Return(mock.AnythingOfType("*entities.NodebInfo"))
104 resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
106 rnibReaderMock.AssertNumberOfCalls(t, "GetNodeb", 0)
107 resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
110 func TestGetRsmGeneralConfigurationFailure(t *testing.T) {
111 h, _, resourceStatusServiceMock, _, rsmReaderMock := initRanConnectedNotificationHandlerTest(t, "RanConnected")
112 var rgc models.RsmGeneralConfiguration
113 rsmReaderMock.On("GetRsmGeneralConfiguration").Return(&rgc, common.NewInternalError(errors.New("Error")))
114 payloadStr := "{\"nodeType\":1, \"messageDirection\":1}"
115 payload := []byte(payloadStr)
116 rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
117 resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
119 rsmReaderMock.AssertCalled(t, "GetRsmGeneralConfiguration")
120 resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
123 func TestEnableResourceStatusFalse(t *testing.T) {
124 h, _, resourceStatusServiceMock, rsmWriterMock, rsmReaderMock := initRanConnectedNotificationHandlerTest(t, "RanConnected")
126 rsmReaderMock.On("GetRsmGeneralConfiguration").Return(tests.GetRsmGeneralConfiguration(false), err)
127 rsmRanInfo := models.RsmRanInfo{RanName, 0, 0, enums.Stop, true}
128 rsmWriterMock.On("SaveRsmRanInfo", &rsmRanInfo).Return(err)
130 payloadStr := "{\"nodeType\":1, \"messageDirection\":1}"
131 payload := []byte(payloadStr)
132 rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
133 resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
135 rsmReaderMock.AssertCalled(t, "GetRsmGeneralConfiguration")
136 rsmWriterMock.AssertNumberOfCalls(t, "SaveRsmRanInfo", 1)
137 resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
140 func TestEnableResourceStatusFalseSaveRsmRanInfoFailure(t *testing.T) {
141 h, _, resourceStatusServiceMock, rsmWriterMock, rsmReaderMock := initRanConnectedNotificationHandlerTest(t, "RanConnected")
143 rsmReaderMock.On("GetRsmGeneralConfiguration").Return(tests.GetRsmGeneralConfiguration(false), err)
144 rsmRanInfo := models.RsmRanInfo{RanName, 0, 0, enums.Stop, true}
145 rsmWriterMock.On("SaveRsmRanInfo", &rsmRanInfo).Return(common.NewInternalError(errors.New("Error")))
147 payloadStr := "{\"nodeType\":1, \"messageDirection\":1}"
148 payload := []byte(payloadStr)
149 rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
150 resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
152 rsmReaderMock.AssertCalled(t, "GetRsmGeneralConfiguration")
153 rsmWriterMock.AssertNumberOfCalls(t, "SaveRsmRanInfo", 1)
154 resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
157 func TestGetNodebFailure(t *testing.T) {
158 h, rnibReaderMock, resourceStatusServiceMock, _, rsmReaderMock := initRanConnectedNotificationHandlerTest(t, "RanConnected")
160 payloadStr := "{\"nodeType\":1, \"messageDirection\":1}"
161 payload := []byte(payloadStr)
162 rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
165 rsmReaderMock.On("GetRsmGeneralConfiguration").Return(tests.GetRsmGeneralConfiguration(true), err)
167 var nodebInfo *entities.NodebInfo
168 rnibReaderMock.On("GetNodeb", RanName).Return(nodebInfo, common.NewInternalError(errors.New("Error")))
169 resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
171 rsmReaderMock.AssertCalled(t, "GetRsmGeneralConfiguration")
172 rnibReaderMock.AssertCalled(t, "GetNodeb", RanName)
173 resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
176 func TestInvalidConnectionStatus(t *testing.T) {
177 h, rnibReaderMock, resourceStatusServiceMock, rsmWriterMock, rsmReaderMock := initRanConnectedNotificationHandlerTest(t, "RanConnected")
179 rsmReaderMock.On("GetRsmGeneralConfiguration").Return(tests.GetRsmGeneralConfiguration(true), err)
180 rnibReaderMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED}, err)
181 rsmRanInfo := models.RsmRanInfo{RanName, 0, 0, enums.Stop, true}
182 rsmWriterMock.On("SaveRsmRanInfo", &rsmRanInfo).Return(err)
184 payloadStr := "{\"nodeType\":1, \"messageDirection\":1}"
185 payload := []byte(payloadStr)
186 rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
187 resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
189 rsmReaderMock.AssertCalled(t, "GetRsmGeneralConfiguration")
190 rnibReaderMock.AssertCalled(t, "GetNodeb", RanName)
191 rsmWriterMock.AssertNumberOfCalls(t, "SaveRsmRanInfo", 1)
192 resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
195 func TestEnableResourceStatusTrueSaveRsmRanInfoFailure(t *testing.T) {
196 h, rnibReaderMock, resourceStatusServiceMock, rsmWriterMock, rsmReaderMock := initRanConnectedNotificationHandlerTest(t, "RanConnected")
198 payloadStr := "{\"nodeType\":1, \"messageDirection\":1}"
199 payload := []byte(payloadStr)
200 rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
203 rsmReaderMock.On("GetRsmGeneralConfiguration").Return(tests.GetRsmGeneralConfiguration(true), err)
204 rnibReaderMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}, err)
205 rsmRanInfo := models.RsmRanInfo{RanName, enums.Enb1MeasurementId, 0, enums.Start, false}
206 rsmWriterMock.On("SaveRsmRanInfo", &rsmRanInfo).Return(common.NewInternalError(errors.New("Error")))
207 resourceStatusServiceMock.On("BuildAndSendInitiateRequest", mock.AnythingOfType("*entities.NodebInfo"), mock.AnythingOfType("*models.RsmGeneralConfiguration"), enums.Enb1MeasurementId).Return(nil)
209 rsmReaderMock.AssertCalled(t, "GetRsmGeneralConfiguration")
210 rnibReaderMock.AssertCalled(t, "GetNodeb", RanName)
211 rsmWriterMock.AssertNumberOfCalls(t, "SaveRsmRanInfo", 1)
212 resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 0)
215 func TestBuildAndSendSuccess(t *testing.T) {
216 h, rnibReaderMock, resourceStatusServiceMock, rsmWriterMock, rsmReaderMock := initRanConnectedNotificationHandlerTest(t, "RanConnected")
218 payloadStr := "{\"nodeType\":1, \"messageDirection\":1}"
219 payload := []byte(payloadStr)
220 rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
223 rgc := tests.GetRsmGeneralConfiguration(true)
224 rsmReaderMock.On("GetRsmGeneralConfiguration").Return(rgc, err)
225 nodebInfo := &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}
226 rnibReaderMock.On("GetNodeb", RanName).Return(nodebInfo, err)
227 rsmRanInfo := models.RsmRanInfo{RanName, enums.Enb1MeasurementId, 0, enums.Start, false}
228 rsmWriterMock.On("SaveRsmRanInfo", &rsmRanInfo).Return(err)
230 resourceStatusServiceMock.On("BuildAndSendInitiateRequest", nodebInfo, rgc, enums.Enb1MeasurementId).Return(nil)
232 rnibReaderMock.AssertCalled(t, "GetNodeb", RanName)
233 rsmReaderMock.AssertCalled(t, "GetRsmGeneralConfiguration")
234 rsmWriterMock.AssertNumberOfCalls(t, "SaveRsmRanInfo", 1)
235 resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 1)
238 func TestBuildAndSendError(t *testing.T) {
239 h, rnibReaderMock, resourceStatusServiceMock, rsmWriterMock, rsmReaderMock := initRanConnectedNotificationHandlerTest(t, "RanConnected")
241 nodebInfo := &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}
242 rgc := tests.GetRsmGeneralConfiguration(true)
243 rsmReaderMock.On("GetRsmGeneralConfiguration").Return(rgc, err)
244 rnibReaderMock.On("GetNodeb", RanName).Return(nodebInfo, err)
245 rsmRanInfoStart := models.RsmRanInfo{RanName, enums.Enb1MeasurementId, 0, enums.Start, false}
246 rsmWriterMock.On("SaveRsmRanInfo", &rsmRanInfoStart).Return(err)
247 rsmRanInfoStop := models.RsmRanInfo{RanName, 0, 0, enums.Stop, true}
248 rsmWriterMock.On("SaveRsmRanInfo", &rsmRanInfoStop).Return(err)
249 payloadStr := "{\"nodeType\":1, \"messageDirection\":1}"
250 payload := []byte(payloadStr)
251 rmrReq := &models.RmrRequest{RanName: RanName, Payload: payload, Len: len(payload), StartTime: time.Now()}
252 resourceStatusServiceMock.On("BuildAndSendInitiateRequest", nodebInfo, rgc, enums.Enb1MeasurementId).Return(common.NewInternalError(errors.New("Error")))
254 rsmReaderMock.AssertCalled(t, "GetRsmGeneralConfiguration")
255 rnibReaderMock.AssertCalled(t, "GetNodeb", RanName)
256 resourceStatusServiceMock.AssertNumberOfCalls(t, "BuildAndSendInitiateRequest", 1)
257 rsmWriterMock.AssertNumberOfCalls(t, "SaveRsmRanInfo", 2)