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 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
32 "github.com/pkg/errors"
33 "github.com/stretchr/testify/assert"
39 const RanName = "test"
41 func initE2TAssociationManagerTest(t *testing.T) (*E2TAssociationManager, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.HttpClientMock) {
43 config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
45 readerMock := &mocks.RnibReaderMock{}
46 writerMock := &mocks.RnibWriterMock{}
47 rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
49 e2tInstancesManager := NewE2TInstancesManager(rnibDataService, log)
50 httpClientMock := &mocks.HttpClientMock{}
51 rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock)
52 manager := NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient)
54 return manager, readerMock, writerMock, httpClientMock
57 func mockHttpClient(httpClientMock *mocks.HttpClientMock, apiSuffix string, isSuccessful bool) {
58 data := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress, RanName)}
59 marshaled, _ := json.Marshal(data)
60 body := bytes.NewBuffer(marshaled)
61 respBody := ioutil.NopCloser(bytes.NewBufferString(""))
62 var respStatusCode int
64 respStatusCode = http.StatusCreated
66 respStatusCode = http.StatusBadRequest
68 httpClientMock.On("Post", apiSuffix, "application/json", body).Return(&http.Response{StatusCode: respStatusCode, Body: respBody}, nil)
71 func TestAssociateRanSuccess(t *testing.T) {
72 manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
73 mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true)
74 nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1}
75 readerMock.On("GetNodeb", RanName).Return(nb, nil)
77 updatedNb.ConnectionAttempts = 0
78 updatedNb.AssociatedE2TInstanceAddress = E2TAddress
79 writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
80 e2tInstance := &entities.E2TInstance{Address: E2TAddress}
81 readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil)
82 updatedE2tInstance := *e2tInstance
83 updatedE2tInstance.AssociatedRanList = append(updatedE2tInstance.AssociatedRanList, RanName)
84 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
86 err := manager.AssociateRan(E2TAddress, RanName)
89 readerMock.AssertExpectations(t)
90 writerMock.AssertExpectations(t)
91 httpClientMock.AssertExpectations(t)
94 func TestAssociateRanRoutingManagerError(t *testing.T) {
95 manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
96 mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, false)
98 err := manager.AssociateRan(E2TAddress, RanName)
100 assert.NotNil(t, err)
101 assert.IsType(t, &e2managererrors.RoutingManagerError{}, err)
102 readerMock.AssertExpectations(t)
103 writerMock.AssertExpectations(t)
104 httpClientMock.AssertExpectations(t)
107 func TestAssociateRanGetNodebError(t *testing.T) {
108 manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
109 mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true)
110 var nb *entities.NodebInfo
111 readerMock.On("GetNodeb", RanName).Return(nb, e2managererrors.NewRnibDbError())
113 err := manager.AssociateRan(E2TAddress, RanName)
115 assert.NotNil(t, err)
116 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
117 readerMock.AssertExpectations(t)
118 writerMock.AssertExpectations(t)
119 httpClientMock.AssertExpectations(t)
122 func TestAssociateRanUpdateNodebError(t *testing.T) {
123 manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
124 mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true)
125 nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1}
126 readerMock.On("GetNodeb", RanName).Return(nb, nil)
128 updatedNb.ConnectionAttempts = 0
129 updatedNb.AssociatedE2TInstanceAddress = E2TAddress
130 writerMock.On("UpdateNodebInfo", &updatedNb).Return(e2managererrors.NewRnibDbError())
132 err := manager.AssociateRan(E2TAddress, RanName)
134 assert.NotNil(t, err)
135 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
136 readerMock.AssertExpectations(t)
137 writerMock.AssertExpectations(t)
138 httpClientMock.AssertExpectations(t)
141 func TestAssociateRanGetE2tInstanceError(t *testing.T) {
142 manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
143 mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true)
144 nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1}
145 readerMock.On("GetNodeb", RanName).Return(nb, nil)
147 updatedNb.ConnectionAttempts = 0
148 updatedNb.AssociatedE2TInstanceAddress = E2TAddress
149 writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
150 var e2tInstance *entities.E2TInstance
151 readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, errors.New("test"))
153 err := manager.AssociateRan(E2TAddress, RanName)
155 assert.NotNil(t, err)
156 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
157 readerMock.AssertExpectations(t)
158 writerMock.AssertExpectations(t)
159 httpClientMock.AssertExpectations(t)
162 func TestAssociateRanSaveE2tInstanceError(t *testing.T) {
163 manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
164 mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true)
165 nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1}
166 readerMock.On("GetNodeb", RanName).Return(nb, nil)
168 updatedNb.ConnectionAttempts = 0
169 updatedNb.AssociatedE2TInstanceAddress = E2TAddress
170 writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
171 e2tInstance := &entities.E2TInstance{Address: E2TAddress}
172 readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil)
173 updatedE2tInstance := *e2tInstance
174 updatedE2tInstance.AssociatedRanList = append(updatedE2tInstance.AssociatedRanList, RanName)
175 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(errors.New("test"))
177 err := manager.AssociateRan(E2TAddress, RanName)
179 assert.NotNil(t, err)
180 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
181 readerMock.AssertExpectations(t)
182 writerMock.AssertExpectations(t)
183 httpClientMock.AssertExpectations(t)
186 func TestDissociateRanSuccess(t *testing.T) {
187 manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
188 mockHttpClient(httpClientMock, clients.DissociateRanE2TInstanceApiSuffix, true)
189 nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionAttempts: 1}
190 readerMock.On("GetNodeb", RanName).Return(nb, nil)
192 updatedNb.AssociatedE2TInstanceAddress = ""
193 writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
194 e2tInstance := &entities.E2TInstance{Address: E2TAddress}
195 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
196 readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil)
197 updatedE2tInstance := *e2tInstance
198 updatedE2tInstance.AssociatedRanList = []string{}
199 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
201 err := manager.DissociateRan(E2TAddress, RanName)
204 readerMock.AssertExpectations(t)
205 writerMock.AssertExpectations(t)
206 httpClientMock.AssertExpectations(t)
209 func TestDissociateRanGetNodebError(t *testing.T) {
210 manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
211 var nb *entities.NodebInfo
212 readerMock.On("GetNodeb", RanName).Return(nb, e2managererrors.NewRnibDbError())
214 err := manager.DissociateRan(E2TAddress, RanName)
216 assert.NotNil(t, err)
217 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
218 readerMock.AssertExpectations(t)
219 writerMock.AssertExpectations(t)
220 httpClientMock.AssertExpectations(t)
223 func TestDissociateRanUpdateNodebError(t *testing.T) {
224 manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
225 nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionAttempts: 1}
226 readerMock.On("GetNodeb", RanName).Return(nb, nil)
228 updatedNb.AssociatedE2TInstanceAddress = ""
229 writerMock.On("UpdateNodebInfo", &updatedNb).Return(e2managererrors.NewRnibDbError())
231 err := manager.DissociateRan(E2TAddress, RanName)
233 assert.NotNil(t, err)
234 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
235 readerMock.AssertExpectations(t)
236 writerMock.AssertExpectations(t)
237 httpClientMock.AssertExpectations(t)
240 func TestDissociateRanGetE2tInstanceError(t *testing.T) {
241 manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
242 nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionAttempts: 1}
243 readerMock.On("GetNodeb", RanName).Return(nb, nil)
245 updatedNb.AssociatedE2TInstanceAddress = ""
246 writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
247 var e2tInstance *entities.E2TInstance
248 readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, errors.New("test"))
250 err := manager.DissociateRan(E2TAddress, RanName)
252 assert.NotNil(t, err)
253 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
254 readerMock.AssertExpectations(t)
255 writerMock.AssertExpectations(t)
256 httpClientMock.AssertExpectations(t)
259 func TestDissociateRanSaveE2tInstanceError(t *testing.T) {
260 manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
261 nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionAttempts: 1}
262 readerMock.On("GetNodeb", RanName).Return(nb, nil)
264 updatedNb.AssociatedE2TInstanceAddress = ""
265 writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
266 e2tInstance := &entities.E2TInstance{Address: E2TAddress}
267 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
268 readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil)
269 updatedE2tInstance := *e2tInstance
270 updatedE2tInstance.AssociatedRanList = []string{}
271 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(errors.New("test"))
273 err := manager.DissociateRan(E2TAddress, RanName)
275 assert.NotNil(t, err)
276 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
277 readerMock.AssertExpectations(t)
278 writerMock.AssertExpectations(t)
279 httpClientMock.AssertExpectations(t)
282 func TestDissociateRanRoutingManagerError(t *testing.T) {
283 manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
284 mockHttpClient(httpClientMock, clients.DissociateRanE2TInstanceApiSuffix, false)
285 nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionAttempts: 1}
286 readerMock.On("GetNodeb", RanName).Return(nb, nil)
288 updatedNb.AssociatedE2TInstanceAddress = ""
289 writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
290 e2tInstance := &entities.E2TInstance{Address: E2TAddress}
291 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
292 readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil)
293 updatedE2tInstance := *e2tInstance
294 updatedE2tInstance.AssociatedRanList = []string{}
295 writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
297 err := manager.DissociateRan(E2TAddress, RanName)
300 readerMock.AssertExpectations(t)
301 writerMock.AssertExpectations(t)
302 httpClientMock.AssertExpectations(t)