[RICPLT-1854] Refactor X2/ENDC Setup/Setup Failure Response
[ric-plt/e2mgr.git] / E2Manager / managers / ran_setup_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
18 package managers
19
20 import (
21         "e2mgr/e2managererrors"
22         "e2mgr/e2pdus"
23         "e2mgr/logger"
24         "e2mgr/mocks"
25         "e2mgr/rNibWriter"
26         "e2mgr/rmrCgo"
27         "fmt"
28         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
29         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
30         "github.com/stretchr/testify/assert"
31         "github.com/stretchr/testify/mock"
32         "testing"
33 )
34
35 func TestExecuteSetupConnectingX2Setup(t *testing.T) {
36         log := initLog(t)
37
38         ranName := "test1"
39
40         writerMock := &mocks.RnibWriterMock{}
41         writerProvider := func() rNibWriter.RNibWriter {
42                 return writerMock
43         }
44
45         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
46         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
47         var rnibErr error
48         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
49
50         payload := e2pdus.PackedX2setupRequest
51         xaction := []byte(ranName)
52         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
53         rmrMessengerMock := &mocks.RmrMessengerMock{}
54         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
55         rmrService := getRmrService(rmrMessengerMock, log)
56
57         mgr := NewRanSetupManager(log, rmrService, writerProvider)
58         if err := mgr.ExecuteSetup(initialNodeb); err != nil {
59                 t.Errorf("want: success, got: error: %s", err)
60         }
61
62         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
63         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
64 }
65
66 func TestExecuteSetupConnectingEndcX2Setup(t *testing.T) {
67         log := initLog(t)
68
69         ranName := "test1"
70
71         writerMock := &mocks.RnibWriterMock{}
72         writerProvider := func() rNibWriter.RNibWriter {
73                 return writerMock
74         }
75
76         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
77         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
78         var rnibErr error
79         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
80
81         payload := e2pdus.PackedEndcX2setupRequest
82         xaction := []byte(ranName)
83         msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
84         rmrMessengerMock := &mocks.RmrMessengerMock{}
85         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
86         rmrService := getRmrService(rmrMessengerMock, log)
87
88         mgr := NewRanSetupManager(log, rmrService, writerProvider)
89         if err := mgr.ExecuteSetup(initialNodeb); err != nil {
90                 t.Errorf("want: success, got: error: %s", err)
91         }
92
93         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
94         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
95 }
96
97 func TestExecuteSetupDisconnected(t *testing.T) {
98         log := initLog(t)
99
100         ranName := "test1"
101
102         writerMock := &mocks.RnibWriterMock{}
103         writerProvider := func() rNibWriter.RNibWriter {
104                 return writerMock
105         }
106
107         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
108         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
109         var argNodebDisconnected = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
110         var rnibErr error
111         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
112         writerMock.On("UpdateNodebInfo", argNodebDisconnected).Return(rnibErr)
113
114         payload := []byte{0}
115         xaction := []byte(ranName)
116         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
117         rmrMessengerMock := &mocks.RmrMessengerMock{}
118         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, fmt.Errorf("send failure"))
119         rmrService := getRmrService(rmrMessengerMock, log)
120
121         mgr := NewRanSetupManager(log, rmrService, writerProvider)
122         if err := mgr.ExecuteSetup(initialNodeb); err == nil {
123                 t.Errorf("want: failure, got: success")
124         }
125
126         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
127         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
128 }
129
130 func TestExecuteSetupConnectingRnibError(t *testing.T) {
131         log := initLog(t)
132
133         ranName := "test1"
134
135         writerMock := &mocks.RnibWriterMock{}
136         writerProvider := func() rNibWriter.RNibWriter {
137                 return writerMock
138         }
139
140         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
141         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
142         var argNodebDisconnected = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
143         var rnibErr = common.NewInternalError(fmt.Errorf("DB error"))
144         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
145         writerMock.On("UpdateNodebInfo", argNodebDisconnected).Return(rnibErr)
146
147         payload := []byte{0}
148         xaction := []byte(ranName)
149         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
150         rmrMessengerMock := &mocks.RmrMessengerMock{}
151         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, fmt.Errorf("send failure"))
152         rmrService := getRmrService(rmrMessengerMock, log)
153
154         mgr := NewRanSetupManager(log, rmrService, writerProvider)
155         if err := mgr.ExecuteSetup(initialNodeb); err == nil {
156                 t.Errorf("want: failure, got: success")
157         } else {
158                 assert.IsType(t, e2managererrors.NewRnibDbError(), err)
159         }
160
161         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
162         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
163 }
164
165 func TestExecuteSetupDisconnectedRnibError(t *testing.T) {
166         log := initLog(t)
167
168         ranName := "test1"
169
170         writerMock := &mocks.RnibWriterMock{}
171         writerProvider := func() rNibWriter.RNibWriter {
172                 return writerMock
173         }
174
175         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
176         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
177         var argNodebDisconnected = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
178         var rnibErr error
179         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
180         writerMock.On("UpdateNodebInfo", argNodebDisconnected).Return(common.NewInternalError(fmt.Errorf("DB error")))
181
182         payload := []byte{0}
183         xaction := []byte(ranName)
184         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
185         rmrMessengerMock := &mocks.RmrMessengerMock{}
186         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, fmt.Errorf("send failure"))
187         rmrService := getRmrService(rmrMessengerMock, log)
188
189         mgr := NewRanSetupManager(log, rmrService, writerProvider)
190         if err := mgr.ExecuteSetup(initialNodeb); err == nil {
191                 t.Errorf("want: failure, got: success")
192         } else {
193                 assert.IsType(t, e2managererrors.NewRnibDbError(), err)
194         }
195
196         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
197         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
198 }
199
200 func TestExecuteSetupUnsupportedProtocol(t *testing.T) {
201         log := initLog(t)
202
203         ranName := "test1"
204
205         writerMock := &mocks.RnibWriterMock{}
206         writerProvider := func() rNibWriter.RNibWriter {
207                 return writerMock
208         }
209
210         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_UNKNOWN_E2_APPLICATION_PROTOCOL}
211         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_UNKNOWN_E2_APPLICATION_PROTOCOL, ConnectionAttempts: 1}
212         var rnibErr error
213         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
214
215         payload := e2pdus.PackedX2setupRequest
216         xaction := []byte(ranName)
217         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
218         rmrMessengerMock := &mocks.RmrMessengerMock{}
219         rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
220         rmrService := getRmrService(rmrMessengerMock, log)
221
222         mgr := NewRanSetupManager(log, rmrService, writerProvider)
223         if err := mgr.ExecuteSetup(initialNodeb); err == nil {
224                 t.Errorf("want: error, got: success")
225         }
226
227         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
228         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
229 }
230
231 func initLog(t *testing.T) *logger.Logger {
232         log, err := logger.InitLogger(logger.InfoLevel)
233         if err != nil {
234                 t.Errorf("#initLog test - failed to initialize logger, error: %s", err)
235         }
236         return log
237 }