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) setPrimaryError(err error) {
41 ds.state.PrimaryDbState.Err = err
44 func (ds *dbStateMock) setPrimaryFields(role, ip, port, rCnt, flags string) {
45 ds.state.PrimaryDbState.Fields.Role = role
46 ds.state.PrimaryDbState.Fields.Ip = ip
47 ds.state.PrimaryDbState.Fields.Port = port
48 ds.state.PrimaryDbState.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.PrimaryLinkStatus = 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 TestIsOnlineWhenSinglePrimarySuccessfully(t *testing.T) {
91 st.setPrimaryFields("master", "1.2.3.4", "60000", "0", "master")
92 err := st.state.IsOnline()
96 func TestIsOnlineWhenSinglePrimaryFailureIfErrorHasSet(t *testing.T) {
97 testErr := errors.New("Some error")
99 st.setPrimaryFields("master", "1.2.3.4", "60000", "0", "master")
100 st.setPrimaryError(testErr)
101 err := st.state.IsOnline()
102 assert.Equal(t, testErr, err)
105 func TestIsOnlineWhenSinglePrimaryFailureIfNotPrimaryRole(t *testing.T) {
106 expErr := errors.New("No primary DB, current role 'not-master'")
108 st.setPrimaryFields("not-master", "1.2.3.4", "60000", "0", "master")
109 err := st.state.IsOnline()
110 assert.Equal(t, expErr, err)
113 func TestIsOnlineWhenSinglePrimaryFailureIfErrorFlags(t *testing.T) {
114 expErr := errors.New("Primary flags are 'any-error,master', expected 'master'")
116 st.setPrimaryFields("master", "1.2.3.4", "60000", "0", "any-error,master")
117 err := st.state.IsOnline()
118 assert.Equal(t, expErr, err)
121 func TestGetAddressPrimarySuccessfully(t *testing.T) {
123 st.setPrimaryFields("master", "1.2.3.4", "60000", "0", "master")
124 addr := st.state.PrimaryDbState.GetAddress()
125 assert.Equal(t, "1.2.3.4:60000", addr)
128 func TestGetAddressPrimaryFailureNoIpPort(t *testing.T) {
130 st.setPrimaryFields("master", "", "", "0", "master")
131 addr := st.state.PrimaryDbState.GetAddress()
132 assert.Equal(t, "", addr)
135 func TestIsOnlineWhenPrimaryAndTwoReplicasSuccessfully(t *testing.T) {
137 st.setPrimaryFields("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 TestIsOnlineWhenPrimaryAndTwoReplicasFailureIfErrorHasSet(t *testing.T) {
147 testErr := errors.New("Some error")
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 st.setReplicaError(testErr)
155 err := st.state.IsOnline()
156 assert.Equal(t, testErr, err)
159 func TestIsOnlineWhenPrimaryAndOneReplicaFailureIfSentinelErrorHasSet(t *testing.T) {
160 testErr := errors.New("Some error")
162 st.setPrimaryFields("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 TestIsOnlineWhenPrimaryAndTwoReplicasFailureIfNotReplicaRole(t *testing.T) {
171 expErr := errors.New("Replica role is 'not-slave', expected 'slave'")
173 st.setPrimaryFields("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 TestIsOnlineWhenPrimaryAndTwoReplicasFailureIfPrimaryLinkDown(t *testing.T) {
183 expErr := errors.New("Replica link to the primary is down")
185 st.setPrimaryFields("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 TestIsOnlineWhenPrimaryAndTwoReplicasFailureIfErrorFlags(t *testing.T) {
195 expErr := errors.New("Replica flags are 'any-error,slave', expected 'slave'")
197 st.setPrimaryFields("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 TestIsOnlineWhenPrimaryAndOneReplicaFailureIfSentinelErrorFlags(t *testing.T) {
207 expErr := errors.New("Sentinel flags are 'any-error,sentinel', expected 'sentinel'")
209 st.setPrimaryFields("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.setPrimaryFields("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.setPrimaryFields("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.setPrimaryFields("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.setPrimaryFields("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)