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