Adding new comments for Oran in all files with licenses
[ric-plt/e2mgr.git] / E2Manager / handlers / httpmsghandlers / setup_request_handler_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 httpmsghandlers
21
22 import (
23         "e2mgr/rnibBuilders"
24         "e2mgr/configuration"
25         "e2mgr/e2managererrors"
26         "e2mgr/e2pdus"
27         "e2mgr/managers"
28         "e2mgr/mocks"
29         "e2mgr/models"
30         "e2mgr/rNibWriter"
31         "e2mgr/rmrCgo"
32         "e2mgr/services"
33         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
34         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
35         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
36         "github.com/stretchr/testify/assert"
37         "github.com/stretchr/testify/mock"
38         "reflect"
39         "testing"
40 )
41
42 func TestSetupHandleNewRanSave_Error(t *testing.T) {
43         readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
44
45         ranName := "RanName"
46         rnibErr := &common.ResourceNotFoundError{}
47         sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
48
49         nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
50         readerMock.On("GetNodeb", ranName).Return(nb, rnibErr)
51
52         vErr := &common.ValidationError{}
53         updatedNb, _ := rnibBuilders.CreateInitialNodeInfo(&sr, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
54         writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(vErr)
55
56         var nbUpdated = &entities.NodebInfo{RanName: ranName, Ip: sr.RanIp, Port: uint32(sr.RanPort), ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
57         writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
58
59         payload := e2pdus.PackedEndcX2setupRequest
60         xaction := []byte(ranName)
61         msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
62
63         rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
64
65         _, actual := handler.Handle(sr)
66         expected := &e2managererrors.RnibDbError{}
67
68         if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
69                 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
70         }
71
72         writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1)
73         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
74         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
75 }
76
77 func TestSetupHandleNewRan_Success(t *testing.T) {
78         readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
79
80         ranName := "RanName"
81         rnibErr := &common.ResourceNotFoundError{}
82         sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
83
84         nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
85         readerMock.On("GetNodeb", ranName).Return(nb, rnibErr)
86
87         updatedNb, _ := rnibBuilders.CreateInitialNodeInfo(&sr, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
88         writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(nil)
89
90         var nbUpdated = &entities.NodebInfo{RanName: ranName, Ip: sr.RanIp, Port: uint32(sr.RanPort), ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
91         writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
92
93         payload := e2pdus.PackedEndcX2setupRequest
94         xaction := []byte(ranName)
95         msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
96
97         rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
98
99         _, actual := handler.Handle(sr)
100
101         assert.Nil(t, actual)
102
103         writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1)
104         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
105         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
106 }
107
108 func TestEndcSetupHandleRmr_Error(t *testing.T) {
109         readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
110
111         ranName := "RanName"
112         nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
113         readerMock.On("GetNodeb", ranName).Return(nb, nil)
114
115         var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
116         writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
117
118         var nbDisconnected = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 0}
119         writerMock.On("UpdateNodebInfo", nbDisconnected).Return(nil)
120
121         payload := e2pdus.PackedEndcX2setupRequest
122         xaction := []byte(ranName)
123         msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
124
125         rmrErr := &e2managererrors.RmrError{}
126         rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, rmrErr)
127
128         sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
129         _, actual := handler.Handle(sr)
130
131         if reflect.TypeOf(actual) != reflect.TypeOf(rmrErr) {
132                 t.Errorf("Error actual = %v, and Expected = %v.", actual, rmrErr)
133         }
134
135         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
136         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
137 }
138
139 func TestEndcSetupHandleExistingDisconnectedRan_Success(t *testing.T) {
140         readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST)
141
142         ranName := "RanName"
143         nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
144         readerMock.On("GetNodeb", ranName).Return(nb, nil)
145
146         var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
147         writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
148
149         payload := e2pdus.PackedEndcX2setupRequest
150         xaction := []byte(ranName)
151         msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
152
153         rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
154
155         sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
156         _, actual := handler.Handle(sr)
157
158         assert.Nil(t, actual)
159
160         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
161         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
162 }
163
164 func TestX2SetupHandleExistingConnectedRan_Success(t *testing.T) {
165         readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
166
167         ranName := "RanName"
168         nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
169         readerMock.On("GetNodeb", ranName).Return(nb, nil)
170
171         var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
172         writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil)
173
174         payload := e2pdus.PackedX2setupRequest
175         xaction := []byte(ranName)
176         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
177
178         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
179
180         sr := models.SetupRequest{"127.0.0.1", 8080, ranName,}
181         _, actual := handler.Handle(sr)
182
183         assert.Nil(t, actual)
184
185         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
186         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
187 }
188
189 func TestX2SetupHandleRnibGet_Error(t *testing.T) {
190         readerMock, _, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
191
192         rnibErr := &common.ValidationError{}
193         nb := &entities.NodebInfo{RanName: "RanName", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
194         readerMock.On("GetNodeb", "RanName").Return(nb, rnibErr)
195
196         sr := models.SetupRequest{"127.0.0.1", 8080, "RanName",}
197         _, actual := handler.Handle(sr)
198
199         expected := &e2managererrors.RnibDbError{}
200         if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
201                 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
202         }
203         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
204 }
205
206 func TestX2SetupHandleShuttingDownRan_Error(t *testing.T) {
207         readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
208
209         nb := &entities.NodebInfo{RanName: "RanName", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
210         readerMock.On("GetNodeb", "RanName").Return(nb, nil)
211
212         sr := models.SetupRequest{"127.0.0.1", 8080, "RanName",}
213         _, actual := handler.Handle(sr)
214
215         expected := &e2managererrors.WrongStateError{}
216         if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
217                 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
218         }
219         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
220         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
221 }
222
223 func TestX2SetupHandleNoPort_Error(t *testing.T) {
224         _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
225
226         sr := models.SetupRequest{"127.0.0.1", 0, "RanName",}
227         _, actual := handler.Handle(sr)
228
229         expected := &e2managererrors.RequestValidationError{}
230         if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
231                 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
232         }
233         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
234         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
235 }
236
237 func TestX2SetupHandleNoRanName_Error(t *testing.T) {
238         _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
239
240         sr := models.SetupRequest{}
241         sr.RanPort = 8080
242         sr.RanIp = "127.0.0.1"
243
244         _, actual := handler.Handle(sr)
245
246         expected := &e2managererrors.RequestValidationError{}
247         if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
248                 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
249         }
250         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
251         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
252 }
253
254 func TestX2SetupHandleNoIP_Error(t *testing.T) {
255         _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
256
257         sr := models.SetupRequest{}
258         sr.RanPort = 8080
259         sr.RanName = "RanName"
260
261         _, actual := handler.Handle(sr)
262
263         expected := &e2managererrors.RequestValidationError{}
264         if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
265                 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
266         }
267         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
268         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
269 }
270
271 func TestX2SetupHandleInvalidIp_Error(t *testing.T) {
272         _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
273
274         sr := models.SetupRequest{}
275         sr.RanPort = 8080
276         sr.RanName = "RanName"
277         sr.RanIp = "invalid ip"
278
279         _, actual := handler.Handle(sr)
280
281         expected := &e2managererrors.RequestValidationError{}
282         if reflect.TypeOf(actual) != reflect.TypeOf(expected) {
283                 t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
284         }
285         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
286         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
287 }
288
289 func initSetupRequestTest(t *testing.T, protocol entities.E2ApplicationProtocol) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.RmrMessengerMock) {
290         log := initLog(t)
291         config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
292
293         readerMock := &mocks.RnibReaderMock{}
294         readerProvider := func() reader.RNibReader {
295                 return readerMock
296         }
297         writerMock := &mocks.RnibWriterMock{}
298         writerProvider := func() rNibWriter.RNibWriter {
299                 return writerMock
300         }
301
302         rmrMessengerMock := &mocks.RmrMessengerMock{}
303         rmrSender := getRmrSender(rmrMessengerMock, log)
304
305         rnibDataService := services.NewRnibDataService(log, config, readerProvider, writerProvider)
306
307         ranSetupManager := managers.NewRanSetupManager(log, rmrSender, rnibDataService)
308         handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManager, protocol)
309
310         return readerMock, writerMock, handler, rmrMessengerMock
311 }