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"
40 const BaseRMUrl = "http://10.10.2.15:12020/routingmanager"
42 func initE2TAssociationManagerTest(t *testing.T) (*E2TAssociationManager, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.HttpClientMock) {
44 config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
45 config.RoutingManager.BaseUrl = BaseRMUrl
47 readerMock := &mocks.RnibReaderMock{}
48 writerMock := &mocks.RnibWriterMock{}
49 rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
51 e2tInstancesManager := NewE2TInstancesManager(rnibDataService, log)
52 httpClientMock := &mocks.HttpClientMock{}
53 rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock)
54 manager := NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient)
56 return manager, readerMock, writerMock, httpClientMock
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
67 respStatusCode = http.StatusCreated
69 respStatusCode = http.StatusBadRequest
71 httpClientMock.On("Post", url, "application/json", body).Return(&http.Response{StatusCode: respStatusCode, Body: respBody}, nil)
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)
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)
89 err := manager.AssociateRan(E2TAddress, RanName)
92 readerMock.AssertExpectations(t)
93 writerMock.AssertExpectations(t)
94 httpClientMock.AssertExpectations(t)
97 func TestAssociateRanRoutingManagerError(t *testing.T) {
98 manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
99 mockHttpClientAssociateRan(httpClientMock, false)
101 err := manager.AssociateRan(E2TAddress, RanName)
103 assert.NotNil(t, err)
104 assert.IsType(t, &e2managererrors.RoutingManagerError{}, err)
105 readerMock.AssertExpectations(t)
106 writerMock.AssertExpectations(t)
107 httpClientMock.AssertExpectations(t)
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())
116 err := manager.AssociateRan(E2TAddress, RanName)
118 assert.NotNil(t, err)
119 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
120 readerMock.AssertExpectations(t)
121 writerMock.AssertExpectations(t)
122 httpClientMock.AssertExpectations(t)
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)
131 updatedNb.ConnectionAttempts = 0
132 updatedNb.AssociatedE2TInstanceAddress = E2TAddress
133 writerMock.On("UpdateNodebInfo", &updatedNb).Return(e2managererrors.NewRnibDbError())
135 err := manager.AssociateRan(E2TAddress, RanName)
137 assert.NotNil(t, err)
138 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
139 readerMock.AssertExpectations(t)
140 writerMock.AssertExpectations(t)
141 httpClientMock.AssertExpectations(t)
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)
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"))
156 err := manager.AssociateRan(E2TAddress, RanName)
158 assert.NotNil(t, err)
159 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
160 readerMock.AssertExpectations(t)
161 writerMock.AssertExpectations(t)
162 httpClientMock.AssertExpectations(t)
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)
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"))
180 err := manager.AssociateRan(E2TAddress, RanName)
182 assert.NotNil(t, err)
183 assert.IsType(t, &e2managererrors.RnibDbError{}, err)
184 readerMock.AssertExpectations(t)
185 writerMock.AssertExpectations(t)
186 httpClientMock.AssertExpectations(t)