cc323098ac3da00e4c75aaff670dbb8761de8155
[ric-plt/sdlgo.git] / internal / sdlgoredis / dbstate_test.go
1 /*
2    Copyright (c) 2021 AT&T Intellectual Property.
3    Copyright (c) 2018-2021 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 /*
19  * This source code is part of the near-RT RIC (RAN Intelligent Controller)
20  * platform project (RICP).
21  */
22
23 package sdlgoredis_test
24
25 import (
26         "errors"
27         "gerrit.o-ran-sc.org/r/ric-plt/sdlgo/internal/sdlgoredis"
28         "github.com/stretchr/testify/assert"
29         "testing"
30 )
31
32 type dbStateMock struct {
33         state sdlgoredis.DbState
34 }
35
36 func setupDbState() *dbStateMock {
37         return new(dbStateMock)
38 }
39
40 func (ds *dbStateMock) setMasterError(err error) {
41         ds.state.MasterDbState.Err = err
42 }
43
44 func (ds *dbStateMock) setMasterFields(role, ip, port, rCnt, flags string) {
45         ds.state.MasterDbState.Fields.Role = role
46         ds.state.MasterDbState.Fields.Ip = ip
47         ds.state.MasterDbState.Fields.Port = port
48         ds.state.MasterDbState.Fields.Flags = flags
49 }
50
51 func (ds *dbStateMock) setReplicaError(err error) {
52         if ds.state.ReplicasDbState == nil {
53                 ds.state.ReplicasDbState = new(sdlgoredis.ReplicasDbState)
54         }
55         ds.state.ReplicasDbState.Err = err
56 }
57
58 func (ds *dbStateMock) addReplicaFields(role, ip, port, mls, flags string) {
59         if ds.state.ReplicasDbState == nil {
60                 ds.state.ReplicasDbState = new(sdlgoredis.ReplicasDbState)
61         }
62         newState := new(sdlgoredis.ReplicaDbState)
63         newState.Fields.Role = role
64         newState.Fields.Ip = ip
65         newState.Fields.Port = port
66         newState.Fields.MasterLinkStatus = mls
67         newState.Fields.Flags = flags
68         ds.state.ReplicasDbState.States = append(ds.state.ReplicasDbState.States, newState)
69 }
70
71 func (ds *dbStateMock) setSentinelError(err error) {
72         if ds.state.SentinelsDbState == nil {
73                 ds.state.SentinelsDbState = new(sdlgoredis.SentinelsDbState)
74         }
75         ds.state.SentinelsDbState.Err = err
76 }
77
78 func (ds *dbStateMock) addSentinelFields(ip, port, flags string) {
79         if ds.state.SentinelsDbState == nil {
80                 ds.state.SentinelsDbState = new(sdlgoredis.SentinelsDbState)
81         }
82         newState := new(sdlgoredis.SentinelDbState)
83         newState.Fields.Ip = ip
84         newState.Fields.Port = port
85         newState.Fields.Flags = flags
86         ds.state.SentinelsDbState.States = append(ds.state.SentinelsDbState.States, newState)
87 }
88
89 func TestIsOnlineWhenSingleMasterSuccessfully(t *testing.T) {
90         st := setupDbState()
91         st.setMasterFields("master", "1.2.3.4", "60000", "0", "master")
92         err := st.state.IsOnline()
93         assert.Nil(t, err)
94 }
95
96 func TestIsOnlineWhenSingleMasterFailureIfErrorHasSet(t *testing.T) {
97         testErr := errors.New("Some error")
98         st := setupDbState()
99         st.setMasterFields("master", "1.2.3.4", "60000", "0", "master")
100         st.setMasterError(testErr)
101         err := st.state.IsOnline()
102         assert.Equal(t, testErr, err)
103 }
104
105 func TestIsOnlineWhenSingleMasterFailureIfNotMasterRole(t *testing.T) {
106         expErr := errors.New("No master DB, current role 'not-master'")
107         st := setupDbState()
108         st.setMasterFields("not-master", "1.2.3.4", "60000", "0", "master")
109         err := st.state.IsOnline()
110         assert.Equal(t, expErr, err)
111 }
112
113 func TestIsOnlineWhenSingleMasterFailureIfErrorFlags(t *testing.T) {
114         expErr := errors.New("Master flags are 'any-error,master', expected 'master'")
115         st := setupDbState()
116         st.setMasterFields("master", "1.2.3.4", "60000", "0", "any-error,master")
117         err := st.state.IsOnline()
118         assert.Equal(t, expErr, err)
119 }
120
121 func TestGetAddressMasterSuccessfully(t *testing.T) {
122         st := setupDbState()
123         st.setMasterFields("master", "1.2.3.4", "60000", "0", "master")
124         addr := st.state.MasterDbState.GetAddress()
125         assert.Equal(t, "1.2.3.4:60000", addr)
126 }
127
128 func TestGetAddressMasterFailureNoIpPort(t *testing.T) {
129         st := setupDbState()
130         st.setMasterFields("master", "", "", "0", "master")
131         addr := st.state.MasterDbState.GetAddress()
132         assert.Equal(t, "", addr)
133 }
134
135 func TestIsOnlineWhenMasterAndTwoReplicasSuccessfully(t *testing.T) {
136         st := setupDbState()
137         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
138         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
139         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "slave")
140         st.addSentinelFields("6.7.8.9", "11234", "sentinel")
141         st.addSentinelFields("6.7.8.10", "13450", "sentinel")
142         err := st.state.IsOnline()
143         assert.Nil(t, err)
144 }
145
146 func TestIsOnlineWhenMasterAndTwoReplicasFailureIfErrorHasSet(t *testing.T) {
147         testErr := errors.New("Some error")
148         st := setupDbState()
149         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
150         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
151         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "slave")
152         st.addSentinelFields("6.7.8.9", "11234", "sentinel")
153         st.addSentinelFields("6.7.8.10", "13450", "sentinel")
154         st.setReplicaError(testErr)
155         err := st.state.IsOnline()
156         assert.Equal(t, testErr, err)
157 }
158
159 func TestIsOnlineWhenMasterAndOneReplicaFailureIfSentinelErrorHasSet(t *testing.T) {
160         testErr := errors.New("Some error")
161         st := setupDbState()
162         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
163         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
164         st.addSentinelFields("6.7.8.9", "11234", "sentinel")
165         st.setSentinelError(testErr)
166         err := st.state.IsOnline()
167         assert.Equal(t, testErr, err)
168 }
169
170 func TestIsOnlineWhenMasterAndTwoReplicasFailureIfNotSlaveRole(t *testing.T) {
171         expErr := errors.New("Replica role is 'not-slave', expected 'slave'")
172         st := setupDbState()
173         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
174         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
175         st.addReplicaFields("not-slave", "6.7.8.10", "3450", "ok", "slave")
176         st.addSentinelFields("6.7.8.9", "11234", "sentinel")
177         st.addSentinelFields("6.7.8.10", "13450", "sentinel")
178         err := st.state.IsOnline()
179         assert.Equal(t, expErr, err)
180 }
181
182 func TestIsOnlineWhenMasterAndTwoReplicasFailureIfMasterLinkDown(t *testing.T) {
183         expErr := errors.New("Replica link to the master is down")
184         st := setupDbState()
185         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
186         st.addReplicaFields("slave", "6.7.8.9", "1234", "nok", "slave")
187         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "slave")
188         st.addSentinelFields("6.7.8.9", "11234", "sentinel")
189         st.addSentinelFields("6.7.8.10", "13450", "sentinel")
190         err := st.state.IsOnline()
191         assert.Equal(t, expErr, err)
192 }
193
194 func TestIsOnlineWhenMasterAndTwoReplicasFailureIfErrorFlags(t *testing.T) {
195         expErr := errors.New("Replica flags are 'any-error,slave', expected 'slave'")
196         st := setupDbState()
197         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
198         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
199         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "any-error,slave")
200         st.addSentinelFields("6.7.8.9", "11234", "sentinel")
201         st.addSentinelFields("6.7.8.10", "13450", "sentinel")
202         err := st.state.IsOnline()
203         assert.Equal(t, expErr, err)
204 }
205
206 func TestIsOnlineWhenMasterAndOneReplicaFailureIfSentinelErrorFlags(t *testing.T) {
207         expErr := errors.New("Sentinel flags are 'any-error,sentinel', expected 'sentinel'")
208         st := setupDbState()
209         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
210         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
211         st.addSentinelFields("6.7.8.9", "112345", "any-error,sentinel")
212         err := st.state.IsOnline()
213         assert.Equal(t, expErr, err)
214 }
215
216 func TestGetAddressReplicasSuccessfully(t *testing.T) {
217         st := setupDbState()
218         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
219         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
220         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "slave")
221         st.addSentinelFields("6.7.8.9", "11234", "sentinel")
222         st.addSentinelFields("6.7.8.10", "13450", "sentinel")
223         addr := st.state.ReplicasDbState.States[0].GetAddress()
224         assert.Equal(t, "6.7.8.9:1234", addr)
225         addr = st.state.ReplicasDbState.States[1].GetAddress()
226         assert.Equal(t, "6.7.8.10:3450", addr)
227 }
228
229 func TestGetAddressReplicasNoIpPort(t *testing.T) {
230         st := setupDbState()
231         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
232         st.addReplicaFields("slave", "", "", "ok", "slave")
233         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "slave")
234         st.addSentinelFields("6.7.8.9", "11234", "sentinel")
235         st.addSentinelFields("6.7.8.10", "13450", "sentinel")
236         addr := st.state.ReplicasDbState.States[0].GetAddress()
237         assert.Equal(t, "", addr)
238         addr = st.state.ReplicasDbState.States[1].GetAddress()
239         assert.Equal(t, "6.7.8.10:3450", addr)
240 }
241
242 func TestGetAddressSentinelsSuccessfully(t *testing.T) {
243         st := setupDbState()
244         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
245         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
246         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "slave")
247         st.addSentinelFields("6.7.8.9", "11234", "sentinel")
248         st.addSentinelFields("6.7.8.10", "13450", "sentinel")
249         addr := st.state.SentinelsDbState.States[0].GetAddress()
250         assert.Equal(t, "6.7.8.9:11234", addr)
251         addr = st.state.SentinelsDbState.States[1].GetAddress()
252         assert.Equal(t, "6.7.8.10:13450", addr)
253 }
254
255 func TestGetAddressSentinelsNoIpPort(t *testing.T) {
256         st := setupDbState()
257         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
258         st.addReplicaFields("slave", "", "", "ok", "slave")
259         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "slave")
260         st.addSentinelFields("", "", "sentinel")
261         st.addSentinelFields("6.7.8.10", "13450", "sentinel")
262         addr := st.state.SentinelsDbState.States[0].GetAddress()
263         assert.Equal(t, "", addr)
264         addr = st.state.SentinelsDbState.States[1].GetAddress()
265         assert.Equal(t, "6.7.8.10:13450", addr)
266 }