sync from Azure to LF
[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/configuration"
22         "e2mgr/e2managererrors"
23         "e2mgr/e2pdus"
24         "e2mgr/logger"
25         "e2mgr/mocks"
26         "e2mgr/rNibWriter"
27         "e2mgr/rmrCgo"
28         "e2mgr/services"
29         "fmt"
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         "testing"
36 )
37
38 func initRanSetupManagerTest(t *testing.T) (*mocks.RmrMessengerMock, *mocks.RnibWriterMock, *RanSetupManager) {
39         logger, err := logger.InitLogger(logger.DebugLevel)
40         if err != nil {
41                 t.Errorf("#... - failed to initialize logger, error: %s", err)
42         }
43         config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
44
45         rmrMessengerMock := &mocks.RmrMessengerMock{}
46         rmrSender := initRmrSender(rmrMessengerMock, logger)
47
48         readerMock := &mocks.RnibReaderMock{}
49         rnibReaderProvider := func() reader.RNibReader {
50                 return readerMock
51         }
52         writerMock := &mocks.RnibWriterMock{}
53         rnibWriterProvider := func() rNibWriter.RNibWriter {
54                 return writerMock
55         }
56         rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider)
57         ranSetupManager := NewRanSetupManager(logger, rmrSender, rnibDataService)
58         return rmrMessengerMock, writerMock, ranSetupManager
59 }
60
61 func TestExecuteSetupConnectingX2Setup(t *testing.T) {
62         rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t)
63
64         ranName := "test1"
65
66         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
67         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
68         var rnibErr error
69         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
70
71         payload := e2pdus.PackedX2setupRequest
72         xaction := []byte(ranName)
73         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
74         rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
75
76         if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err != nil {
77                 t.Errorf("want: success, got: error: %s", err)
78         }
79
80         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
81         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
82 }
83
84 func TestExecuteSetupConnectingEndcX2Setup(t *testing.T) {
85         rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t)
86
87         ranName := "test1"
88
89                 var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
90         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
91         var rnibErr error
92         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
93
94         payload := e2pdus.PackedEndcX2setupRequest
95         xaction := []byte(ranName)
96         msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
97         rmrMessengerMock.On("SendMsg", mock.Anything).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         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
122         rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, fmt.Errorf("send failure"))
123
124         if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil {
125                 t.Errorf("want: failure, got: success")
126         }
127
128         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
129         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
130 }
131
132 func TestExecuteSetupConnectingRnibError(t *testing.T) {
133         rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t)
134
135         ranName := "test1"
136
137         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
138         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
139         var argNodebDisconnected = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
140         var rnibErr = common.NewInternalError(fmt.Errorf("DB error"))
141         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
142         writerMock.On("UpdateNodebInfo", argNodebDisconnected).Return(rnibErr)
143
144         payload := []byte{0}
145         xaction := []byte(ranName)
146         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
147         rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, fmt.Errorf("send failure"))
148
149         if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil {
150                 t.Errorf("want: failure, got: success")
151         } else {
152                 assert.IsType(t, e2managererrors.NewRnibDbError(), err)
153         }
154
155         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
156         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
157 }
158
159 func TestExecuteSetupDisconnectedRnibError(t *testing.T) {
160         rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t)
161
162         ranName := "test1"
163
164         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
165         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
166         var argNodebDisconnected = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
167         var rnibErr error
168         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
169         writerMock.On("UpdateNodebInfo", argNodebDisconnected).Return(common.NewInternalError(fmt.Errorf("DB error")))
170
171         payload := []byte{0}
172         xaction := []byte(ranName)
173         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
174         rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, fmt.Errorf("send failure"))
175
176         if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil {
177                 t.Errorf("want: failure, got: success")
178         } else {
179                 assert.IsType(t, e2managererrors.NewRnibDbError(), err)
180         }
181
182         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
183         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1)
184 }
185
186 func TestExecuteSetupUnsupportedProtocol(t *testing.T) {
187         rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t)
188
189         ranName := "test1"
190
191         var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_UNKNOWN_E2_APPLICATION_PROTOCOL}
192         var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_UNKNOWN_E2_APPLICATION_PROTOCOL, ConnectionAttempts: 1}
193         var rnibErr error
194         writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
195
196         payload := e2pdus.PackedX2setupRequest
197         xaction := []byte(ranName)
198         msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
199         rmrMessengerMock.On("SendMsg", mock.Anything).Return(msg, nil)
200
201         if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil {
202                 t.Errorf("want: error, got: success")
203         }
204
205         writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
206         rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0)
207 }
208
209 func initLog(t *testing.T) *logger.Logger {
210         log, err := logger.InitLogger(logger.InfoLevel)
211         if err != nil {
212                 t.Errorf("#initLog test - failed to initialize logger, error: %s", err)
213         }
214         return log
215 }