Fix sdlcli healthcheck DBAAS status in SEP install
[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) setError(err error) {
41         ds.state.Err = err
42 }
43
44 func (ds *dbStateMock) setPrimaryError(err error) {
45         ds.state.PrimaryDbState.Err = err
46 }
47
48 func (ds *dbStateMock) setPrimaryFields(role, ip, port, rCnt, flags string) {
49         ds.state.PrimaryDbState.Fields.Role = role
50         ds.state.PrimaryDbState.Fields.Ip = ip
51         ds.state.PrimaryDbState.Fields.Port = port
52         ds.state.PrimaryDbState.Fields.Flags = flags
53 }
54
55 func (ds *dbStateMock) setReplicaError(err error) {
56         if ds.state.ReplicasDbState == nil {
57                 ds.state.ReplicasDbState = new(sdlgoredis.ReplicasDbState)
58         }
59         ds.state.ReplicasDbState.Err = err
60 }
61
62 func (ds *dbStateMock) addReplicaFields(role, ip, port, mls, flags string) {
63         if ds.state.ReplicasDbState == nil {
64                 ds.state.ReplicasDbState = new(sdlgoredis.ReplicasDbState)
65         }
66         newState := new(sdlgoredis.ReplicaDbState)
67         newState.Fields.Role = role
68         newState.Fields.Ip = ip
69         newState.Fields.Port = port
70         newState.Fields.PrimaryLinkStatus = mls
71         newState.Fields.Flags = flags
72         ds.state.ReplicasDbState.States = append(ds.state.ReplicasDbState.States, newState)
73 }
74
75 func (ds *dbStateMock) setSentinelError(err error) {
76         if ds.state.SentinelsDbState == nil {
77                 ds.state.SentinelsDbState = new(sdlgoredis.SentinelsDbState)
78         }
79         ds.state.SentinelsDbState.Err = err
80 }
81
82 func (ds *dbStateMock) addSentinelFields(ip, port, flags string) {
83         if ds.state.SentinelsDbState == nil {
84                 ds.state.SentinelsDbState = new(sdlgoredis.SentinelsDbState)
85         }
86         newState := new(sdlgoredis.SentinelDbState)
87         newState.Fields.Ip = ip
88         newState.Fields.Port = port
89         newState.Fields.Flags = flags
90         ds.state.SentinelsDbState.States = append(ds.state.SentinelsDbState.States, newState)
91 }
92
93 func TestIsOnlineFailureIfErrorHasSet(t *testing.T) {
94         testErr := errors.New("Some error")
95         st := setupDbState()
96         st.setError(testErr)
97         err := st.state.IsOnline()
98         assert.Equal(t, testErr, err)
99 }
100
101 func TestIsOnlineWhenSinglePrimarySuccessfully(t *testing.T) {
102         st := setupDbState()
103         st.setPrimaryFields("master", "1.2.3.4", "60000", "0", "master")
104         err := st.state.IsOnline()
105         assert.Nil(t, err)
106 }
107
108 func TestIsOnlineWhenSinglePrimaryFailureIfErrorHasSet(t *testing.T) {
109         testErr := errors.New("Some error")
110         st := setupDbState()
111         st.setPrimaryFields("master", "1.2.3.4", "60000", "0", "master")
112         st.setPrimaryError(testErr)
113         err := st.state.IsOnline()
114         assert.Equal(t, testErr, err)
115 }
116
117 func TestIsOnlineWhenSinglePrimaryFailureIfNotPrimaryRole(t *testing.T) {
118         expErr := errors.New("No primary DB, current role 'not-master'")
119         st := setupDbState()
120         st.setPrimaryFields("not-master", "1.2.3.4", "60000", "0", "master")
121         err := st.state.IsOnline()
122         assert.Equal(t, expErr, err)
123 }
124
125 func TestIsOnlineWhenSinglePrimaryFailureIfErrorFlags(t *testing.T) {
126         expErr := errors.New("Primary flags are 'any-error,master', expected 'master'")
127         st := setupDbState()
128         st.setPrimaryFields("master", "1.2.3.4", "60000", "0", "any-error,master")
129         err := st.state.IsOnline()
130         assert.Equal(t, expErr, err)
131 }
132
133 func TestGetAddressPrimarySuccessfully(t *testing.T) {
134         st := setupDbState()
135         st.setPrimaryFields("master", "1.2.3.4", "60000", "0", "master")
136         addr := st.state.PrimaryDbState.GetAddress()
137         assert.Equal(t, "1.2.3.4:60000", addr)
138 }
139
140 func TestGetAddressPrimaryFailureNoIpPort(t *testing.T) {
141         st := setupDbState()
142         st.setPrimaryFields("master", "", "", "0", "master")
143         addr := st.state.PrimaryDbState.GetAddress()
144         assert.Equal(t, "", addr)
145 }
146
147 func TestIsOnlineWhenPrimaryAndTwoReplicasSuccessfully(t *testing.T) {
148         st := setupDbState()
149         st.setPrimaryFields("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         err := st.state.IsOnline()
155         assert.Nil(t, err)
156 }
157
158 func TestIsOnlineWhenPrimaryAndTwoReplicasFailureIfErrorHasSet(t *testing.T) {
159         testErr := errors.New("Some error")
160         st := setupDbState()
161         st.setPrimaryFields("master", "1.2.3.4", "60000", "2", "master")
162         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
163         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "slave")
164         st.addSentinelFields("6.7.8.9", "11234", "sentinel")
165         st.addSentinelFields("6.7.8.10", "13450", "sentinel")
166         st.setReplicaError(testErr)
167         err := st.state.IsOnline()
168         assert.Equal(t, testErr, err)
169 }
170
171 func TestIsOnlineWhenPrimaryAndOneReplicaFailureIfSentinelErrorHasSet(t *testing.T) {
172         testErr := errors.New("Some error")
173         st := setupDbState()
174         st.setPrimaryFields("master", "1.2.3.4", "60000", "2", "master")
175         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
176         st.addSentinelFields("6.7.8.9", "11234", "sentinel")
177         st.setSentinelError(testErr)
178         err := st.state.IsOnline()
179         assert.Equal(t, testErr, err)
180 }
181
182 func TestIsOnlineWhenPrimaryAndTwoReplicasFailureIfNotReplicaRole(t *testing.T) {
183         expErr := errors.New("Replica role is 'not-slave', expected 'slave'")
184         st := setupDbState()
185         st.setPrimaryFields("master", "1.2.3.4", "60000", "2", "master")
186         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
187         st.addReplicaFields("not-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 TestIsOnlineWhenPrimaryAndTwoReplicasFailureIfPrimaryLinkDown(t *testing.T) {
195         expErr := errors.New("Replica link to the primary is down")
196         st := setupDbState()
197         st.setPrimaryFields("master", "1.2.3.4", "60000", "2", "master")
198         st.addReplicaFields("slave", "6.7.8.9", "1234", "nok", "slave")
199         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "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 TestIsOnlineWhenPrimaryAndTwoReplicasFailureIfErrorFlags(t *testing.T) {
207         expErr := errors.New("Replica flags are 'any-error,slave', expected 'slave'")
208         st := setupDbState()
209         st.setPrimaryFields("master", "1.2.3.4", "60000", "2", "master")
210         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
211         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "any-error,slave")
212         st.addSentinelFields("6.7.8.9", "11234", "sentinel")
213         st.addSentinelFields("6.7.8.10", "13450", "sentinel")
214         err := st.state.IsOnline()
215         assert.Equal(t, expErr, err)
216 }
217
218 func TestIsOnlineWhenPrimaryAndOneReplicaFailureIfSentinelErrorFlags(t *testing.T) {
219         expErr := errors.New("Sentinel flags are 'any-error,sentinel', expected 'sentinel'")
220         st := setupDbState()
221         st.setPrimaryFields("master", "1.2.3.4", "60000", "2", "master")
222         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
223         st.addSentinelFields("6.7.8.9", "112345", "any-error,sentinel")
224         err := st.state.IsOnline()
225         assert.Equal(t, expErr, err)
226 }
227
228 func TestGetAddressReplicasSuccessfully(t *testing.T) {
229         st := setupDbState()
230         st.setPrimaryFields("master", "1.2.3.4", "60000", "2", "master")
231         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
232         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "slave")
233         st.addSentinelFields("6.7.8.9", "11234", "sentinel")
234         st.addSentinelFields("6.7.8.10", "13450", "sentinel")
235         addr := st.state.ReplicasDbState.States[0].GetAddress()
236         assert.Equal(t, "6.7.8.9:1234", addr)
237         addr = st.state.ReplicasDbState.States[1].GetAddress()
238         assert.Equal(t, "6.7.8.10:3450", addr)
239 }
240
241 func TestGetAddressReplicasNoIpPort(t *testing.T) {
242         st := setupDbState()
243         st.setPrimaryFields("master", "1.2.3.4", "60000", "2", "master")
244         st.addReplicaFields("slave", "", "", "ok", "slave")
245         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "slave")
246         st.addSentinelFields("6.7.8.9", "11234", "sentinel")
247         st.addSentinelFields("6.7.8.10", "13450", "sentinel")
248         addr := st.state.ReplicasDbState.States[0].GetAddress()
249         assert.Equal(t, "", addr)
250         addr = st.state.ReplicasDbState.States[1].GetAddress()
251         assert.Equal(t, "6.7.8.10:3450", addr)
252 }
253
254 func TestGetAddressSentinelsSuccessfully(t *testing.T) {
255         st := setupDbState()
256         st.setPrimaryFields("master", "1.2.3.4", "60000", "2", "master")
257         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
258         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "slave")
259         st.addSentinelFields("6.7.8.9", "11234", "sentinel")
260         st.addSentinelFields("6.7.8.10", "13450", "sentinel")
261         addr := st.state.SentinelsDbState.States[0].GetAddress()
262         assert.Equal(t, "6.7.8.9:11234", addr)
263         addr = st.state.SentinelsDbState.States[1].GetAddress()
264         assert.Equal(t, "6.7.8.10:13450", addr)
265 }
266
267 func TestGetAddressSentinelsNoIpPort(t *testing.T) {
268         st := setupDbState()
269         st.setPrimaryFields("master", "1.2.3.4", "60000", "2", "master")
270         st.addReplicaFields("slave", "", "", "ok", "slave")
271         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "slave")
272         st.addSentinelFields("", "", "sentinel")
273         st.addSentinelFields("6.7.8.10", "13450", "sentinel")
274         addr := st.state.SentinelsDbState.States[0].GetAddress()
275         assert.Equal(t, "", addr)
276         addr = st.state.SentinelsDbState.States[1].GetAddress()
277         assert.Equal(t, "6.7.8.10:13450", addr)
278 }