[RICPLT-2527] Add E2TAssociationManager with AssociateRan method
[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 const BaseRMUrl = "http://10.10.2.15:12020/routingmanager"
41
42 func initE2TAssociationManagerTest(t *testing.T) (*E2TAssociationManager, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.HttpClientMock) {
43         log := initLog(t)
44         config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
45         config.RoutingManager.BaseUrl = BaseRMUrl
46
47         readerMock := &mocks.RnibReaderMock{}
48         writerMock := &mocks.RnibWriterMock{}
49         rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
50
51         e2tInstancesManager := NewE2TInstancesManager(rnibDataService, log)
52         httpClientMock := &mocks.HttpClientMock{}
53         rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock)
54         manager := NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient)
55
56         return manager, readerMock, writerMock, httpClientMock
57 }
58
59 func mockHttpClientAssociateRan(httpClientMock *mocks.HttpClientMock, isSuccessful bool) {
60         data := models.NewRoutingManagerE2TData(E2TAddress, RanName)
61         marshaled, _ := json.Marshal(data)
62         body := bytes.NewBuffer(marshaled)
63         url := BaseRMUrl + clients.AssociateRanToE2TInstanceApiSuffix
64         respBody := ioutil.NopCloser(bytes.NewBufferString(""))
65         var respStatusCode int
66         if isSuccessful {
67                 respStatusCode = http.StatusCreated
68         } else {
69                 respStatusCode = http.StatusBadRequest
70         }
71         httpClientMock.On("Post", url, "application/json", body).Return(&http.Response{StatusCode: respStatusCode, Body: respBody}, nil)
72 }
73
74 func TestAssociateRanSuccess(t *testing.T) {
75         manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
76         mockHttpClientAssociateRan(httpClientMock, true)
77         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1}
78         readerMock.On("GetNodeb", RanName).Return(nb, nil)
79         updatedNb := *nb
80         updatedNb.ConnectionAttempts = 0
81         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
82         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
83         e2tInstance := &entities.E2TInstance{Address: E2TAddress}
84         readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil)
85         updatedE2tInstance := *e2tInstance
86         updatedE2tInstance.AssociatedRanList = append(updatedE2tInstance.AssociatedRanList, RanName)
87         writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
88
89         err := manager.AssociateRan(E2TAddress, RanName)
90
91         assert.Nil(t, err)
92         readerMock.AssertExpectations(t)
93         writerMock.AssertExpectations(t)
94         httpClientMock.AssertExpectations(t)
95 }
96
97 func TestAssociateRanRoutingManagerError(t *testing.T) {
98         manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
99         mockHttpClientAssociateRan(httpClientMock, false)
100
101         err := manager.AssociateRan(E2TAddress, RanName)
102
103         assert.NotNil(t, err)
104         assert.IsType(t, &e2managererrors.RoutingManagerError{}, err)
105         readerMock.AssertExpectations(t)
106         writerMock.AssertExpectations(t)
107         httpClientMock.AssertExpectations(t)
108 }
109
110 func TestAssociateRanGetNodebError(t *testing.T) {
111         manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
112         mockHttpClientAssociateRan(httpClientMock, true)
113         var nb *entities.NodebInfo
114         readerMock.On("GetNodeb", RanName).Return(nb, e2managererrors.NewRnibDbError())
115
116         err := manager.AssociateRan(E2TAddress, RanName)
117
118         assert.NotNil(t, err)
119         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
120         readerMock.AssertExpectations(t)
121         writerMock.AssertExpectations(t)
122         httpClientMock.AssertExpectations(t)
123 }
124
125 func TestAssociateRanUpdateNodebError(t *testing.T) {
126         manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
127         mockHttpClientAssociateRan(httpClientMock, true)
128         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1}
129         readerMock.On("GetNodeb", RanName).Return(nb, nil)
130         updatedNb := *nb
131         updatedNb.ConnectionAttempts = 0
132         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
133         writerMock.On("UpdateNodebInfo", &updatedNb).Return(e2managererrors.NewRnibDbError())
134
135         err := manager.AssociateRan(E2TAddress, RanName)
136
137         assert.NotNil(t, err)
138         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
139         readerMock.AssertExpectations(t)
140         writerMock.AssertExpectations(t)
141         httpClientMock.AssertExpectations(t)
142 }
143
144 func TestAssociateRanGetE2tInstanceError(t *testing.T) {
145         manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
146         mockHttpClientAssociateRan(httpClientMock, true)
147         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1}
148         readerMock.On("GetNodeb", RanName).Return(nb, nil)
149         updatedNb := *nb
150         updatedNb.ConnectionAttempts = 0
151         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
152         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
153         var e2tInstance *entities.E2TInstance
154         readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, errors.New("test"))
155
156         err := manager.AssociateRan(E2TAddress, RanName)
157
158         assert.NotNil(t, err)
159         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
160         readerMock.AssertExpectations(t)
161         writerMock.AssertExpectations(t)
162         httpClientMock.AssertExpectations(t)
163 }
164
165 func TestAssociateRanSaveE2tInstanceError(t *testing.T) {
166         manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
167         mockHttpClientAssociateRan(httpClientMock, true)
168         nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1}
169         readerMock.On("GetNodeb", RanName).Return(nb, nil)
170         updatedNb := *nb
171         updatedNb.ConnectionAttempts = 0
172         updatedNb.AssociatedE2TInstanceAddress = E2TAddress
173         writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
174         e2tInstance := &entities.E2TInstance{Address: E2TAddress}
175         readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil)
176         updatedE2tInstance := *e2tInstance
177         updatedE2tInstance.AssociatedRanList = append(updatedE2tInstance.AssociatedRanList, RanName)
178         writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(errors.New("test"))
179
180         err := manager.AssociateRan(E2TAddress, RanName)
181
182         assert.NotNil(t, err)
183         assert.IsType(t, &e2managererrors.RnibDbError{}, err)
184         readerMock.AssertExpectations(t)
185         writerMock.AssertExpectations(t)
186         httpClientMock.AssertExpectations(t)
187 }