[RICPLT-2527] Implementation of DissociateRan + UTs
[ric-plt/e2mgr.git] / E2Manager / managers / e2t_association_manager_test.go
1 //
2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
4 //
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
8 //
9 //      http://www.apache.org/licenses/LICENSE-2.0
10 //
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.
16
17 //  This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 //  platform project (RICP).
19
20 package managers
21
22 import (
23         "bytes"
24         "e2mgr/clients"
25         "e2mgr/configuration"
26         "e2mgr/e2managererrors"
27         "e2mgr/mocks"
28         "e2mgr/models"
29         "e2mgr/services"
30         "encoding/json"
31         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
32         "github.com/pkg/errors"
33         "github.com/stretchr/testify/assert"
34         "io/ioutil"
35         "net/http"
36         "testing"
37 )
38
39 const RanName = "test"
40
41 func initE2TAssociationManagerTest(t *testing.T) (*E2TAssociationManager, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.HttpClientMock) {
42         log := initLog(t)
43         config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
44
45         readerMock := &mocks.RnibReaderMock{}
46         writerMock := &mocks.RnibWriterMock{}
47         rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
48
49         e2tInstancesManager := NewE2TInstancesManager(rnibDataService, log)
50         httpClientMock := &mocks.HttpClientMock{}
51         rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock)
52         manager := NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient)
53
54         return manager, readerMock, writerMock, httpClientMock
55 }
56
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
63         if isSuccessful {
64                 respStatusCode = http.StatusCreated
65         } else {
66                 respStatusCode = http.StatusBadRequest
67         }
68         httpClientMock.On("Post", apiSuffix, "application/json", body).Return(&http.Response{StatusCode: respStatusCode, Body: respBody}, nil)
69 }
70
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)
76         updatedNb := *nb
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)
85
86         err := manager.AssociateRan(E2TAddress, RanName)
87
88         assert.Nil(t, err)
89         readerMock.AssertExpectations(t)
90         writerMock.AssertExpectations(t)
91         httpClientMock.AssertExpectations(t)
92 }
93
94 func TestAssociateRanRoutingManagerError(t *testing.T) {
95         manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
96         mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, false)
97
98         err := manager.AssociateRan(E2TAddress, RanName)
99
100         assert.NotNil(t, err)
101         assert.IsType(t, &e2managererrors.RoutingManagerError{}, err)
102         readerMock.AssertExpectations(t)
103         writerMock.AssertExpectations(t)
104         httpClientMock.AssertExpectations(t)
105 }
106
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())
112
113         err := manager.AssociateRan(E2TAddress, RanName)
114
115         assert.NotNil(t, err)
116         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
117         readerMock.AssertExpectations(t)
118         writerMock.AssertExpectations(t)
119         httpClientMock.AssertExpectations(t)
120 }
121
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)
127         updatedNb := *nb
128         updatedNb.ConnectionAttempts = 0
129         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
130         writerMock.On("UpdateNodebInfo", &updatedNb).Return(e2managererrors.NewRnibDbError())
131
132         err := manager.AssociateRan(E2TAddress, RanName)
133
134         assert.NotNil(t, err)
135         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
136         readerMock.AssertExpectations(t)
137         writerMock.AssertExpectations(t)
138         httpClientMock.AssertExpectations(t)
139 }
140
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)
146         updatedNb := *nb
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"))
152
153         err := manager.AssociateRan(E2TAddress, RanName)
154
155         assert.NotNil(t, err)
156         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
157         readerMock.AssertExpectations(t)
158         writerMock.AssertExpectations(t)
159         httpClientMock.AssertExpectations(t)
160 }
161
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)
167         updatedNb := *nb
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"))
176
177         err := manager.AssociateRan(E2TAddress, RanName)
178
179         assert.NotNil(t, err)
180         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
181         readerMock.AssertExpectations(t)
182         writerMock.AssertExpectations(t)
183         httpClientMock.AssertExpectations(t)
184 }
185
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)
191         updatedNb := *nb
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)
200
201         err := manager.DissociateRan(E2TAddress, RanName)
202
203         assert.Nil(t, err)
204         readerMock.AssertExpectations(t)
205         writerMock.AssertExpectations(t)
206         httpClientMock.AssertExpectations(t)
207 }
208
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())
213
214         err := manager.DissociateRan(E2TAddress, RanName)
215
216         assert.NotNil(t, err)
217         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
218         readerMock.AssertExpectations(t)
219         writerMock.AssertExpectations(t)
220         httpClientMock.AssertExpectations(t)
221 }
222
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)
227         updatedNb := *nb
228         updatedNb.AssociatedE2TInstanceAddress = ""
229         writerMock.On("UpdateNodebInfo", &updatedNb).Return(e2managererrors.NewRnibDbError())
230
231         err := manager.DissociateRan(E2TAddress, RanName)
232
233         assert.NotNil(t, err)
234         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
235         readerMock.AssertExpectations(t)
236         writerMock.AssertExpectations(t)
237         httpClientMock.AssertExpectations(t)
238 }
239
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)
244         updatedNb := *nb
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"))
249
250         err := manager.DissociateRan(E2TAddress, RanName)
251
252         assert.NotNil(t, err)
253         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
254         readerMock.AssertExpectations(t)
255         writerMock.AssertExpectations(t)
256         httpClientMock.AssertExpectations(t)
257 }
258
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)
263         updatedNb := *nb
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"))
272
273         err := manager.DissociateRan(E2TAddress, RanName)
274
275         assert.NotNil(t, err)
276         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
277         readerMock.AssertExpectations(t)
278         writerMock.AssertExpectations(t)
279         httpClientMock.AssertExpectations(t)
280 }
281
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)
287         updatedNb := *nb
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)
296
297         err := manager.DissociateRan(E2TAddress, RanName)
298
299         assert.Nil(t, err)
300         readerMock.AssertExpectations(t)
301         writerMock.AssertExpectations(t)
302         httpClientMock.AssertExpectations(t)
303 }