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