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