2 Copyright (c) 2021 AT&T Intellectual Property.
3 Copyright (c) 2018-2021 Nokia.
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
9 http://www.apache.org/licenses/LICENSE-2.0
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.
19 * This source code is part of the near-RT RIC (RAN Intelligent Controller)
20 * platform project (RICP).
23 package sdlgoredis_test
27 "gerrit.o-ran-sc.org/r/ric-plt/sdlgo/internal/sdlgoredis"
28 "github.com/stretchr/testify/assert"
32 type dbStateMock struct {
33 state sdlgoredis.DbState
36 func setupDbState() *dbStateMock {
37 return new(dbStateMock)
40 func (ds *dbStateMock) setMasterError(err error) {
41 ds.state.MasterDbState.Err = err
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
51 func (ds *dbStateMock) setReplicaError(err error) {
52 if ds.state.ReplicasDbState == nil {
53 ds.state.ReplicasDbState = new(sdlgoredis.ReplicasDbState)
55 ds.state.ReplicasDbState.Err = err
58 func (ds *dbStateMock) addReplicaFields(role, ip, port, mls, flags string) {
59 if ds.state.ReplicasDbState == nil {
60 ds.state.ReplicasDbState = new(sdlgoredis.ReplicasDbState)
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)
71 func (ds *dbStateMock) setSentinelError(err error) {
72 if ds.state.SentinelsDbState == nil {
73 ds.state.SentinelsDbState = new(sdlgoredis.SentinelsDbState)
75 ds.state.SentinelsDbState.Err = err
78 func (ds *dbStateMock) addSentinelFields(ip, port, flags string) {
79 if ds.state.SentinelsDbState == nil {
80 ds.state.SentinelsDbState = new(sdlgoredis.SentinelsDbState)
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)
89 func TestIsOnlineWhenSingleMasterSuccessfully(t *testing.T) {
91 st.setMasterFields("master", "1.2.3.4", "60000", "0", "master")
92 err := st.state.IsOnline()
96 func TestIsOnlineWhenSingleMasterFailureIfErrorHasSet(t *testing.T) {
97 testErr := errors.New("Some error")
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)
105 func TestIsOnlineWhenSingleMasterFailureIfNotMasterRole(t *testing.T) {
106 expErr := errors.New("No master DB, current role 'not-master'")
108 st.setMasterFields("not-master", "1.2.3.4", "60000", "0", "master")
109 err := st.state.IsOnline()
110 assert.Equal(t, expErr, err)
113 func TestIsOnlineWhenSingleMasterFailureIfErrorFlags(t *testing.T) {
114 expErr := errors.New("Master flags are 'any-error,master', expected 'master'")
116 st.setMasterFields("master", "1.2.3.4", "60000", "0", "any-error,master")
117 err := st.state.IsOnline()
118 assert.Equal(t, expErr, err)
121 func TestGetAddressMasterSuccessfully(t *testing.T) {
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)
128 func TestGetAddressMasterFailureNoIpPort(t *testing.T) {
130 st.setMasterFields("master", "", "", "0", "master")
131 addr := st.state.MasterDbState.GetAddress()
132 assert.Equal(t, "", addr)
135 func TestIsOnlineWhenMasterAndTwoReplicasSuccessfully(t *testing.T) {
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()
146 func TestIsOnlineWhenMasterAndTwoReplicasFailureIfErrorHasSet(t *testing.T) {
147 testErr := errors.New("Some error")
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)
159 func TestIsOnlineWhenMasterAndOneReplicaFailureIfSentinelErrorHasSet(t *testing.T) {
160 testErr := errors.New("Some error")
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)
170 func TestIsOnlineWhenMasterAndTwoReplicasFailureIfNotSlaveRole(t *testing.T) {
171 expErr := errors.New("Replica role is 'not-slave', expected 'slave'")
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)
182 func TestIsOnlineWhenMasterAndTwoReplicasFailureIfMasterLinkDown(t *testing.T) {
183 expErr := errors.New("Replica link to the master is down")
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)
194 func TestIsOnlineWhenMasterAndTwoReplicasFailureIfErrorFlags(t *testing.T) {
195 expErr := errors.New("Replica flags are 'any-error,slave', expected 'slave'")
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)
206 func TestIsOnlineWhenMasterAndOneReplicaFailureIfSentinelErrorFlags(t *testing.T) {
207 expErr := errors.New("Sentinel flags are 'any-error,sentinel', expected 'sentinel'")
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)
216 func TestGetAddressReplicasSuccessfully(t *testing.T) {
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)
229 func TestGetAddressReplicasNoIpPort(t *testing.T) {
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)
242 func TestGetAddressSentinelsSuccessfully(t *testing.T) {
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)
255 func TestGetAddressSentinelsNoIpPort(t *testing.T) {
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)