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) setError(err error) {
44 func (ds *dbStateMock) setPrimaryError(err error) {
45 ds.state.PrimaryDbState.Err = err
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
55 func (ds *dbStateMock) setReplicaError(err error) {
56 if ds.state.ReplicasDbState == nil {
57 ds.state.ReplicasDbState = new(sdlgoredis.ReplicasDbState)
59 ds.state.ReplicasDbState.Err = err
62 func (ds *dbStateMock) addReplicaFields(role, ip, port, mls, flags string) {
63 if ds.state.ReplicasDbState == nil {
64 ds.state.ReplicasDbState = new(sdlgoredis.ReplicasDbState)
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)
75 func (ds *dbStateMock) setSentinelError(err error) {
76 if ds.state.SentinelsDbState == nil {
77 ds.state.SentinelsDbState = new(sdlgoredis.SentinelsDbState)
79 ds.state.SentinelsDbState.Err = err
82 func (ds *dbStateMock) addSentinelFields(ip, port, flags string) {
83 if ds.state.SentinelsDbState == nil {
84 ds.state.SentinelsDbState = new(sdlgoredis.SentinelsDbState)
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)
93 func TestIsOnlineFailureIfErrorHasSet(t *testing.T) {
94 testErr := errors.New("Some error")
97 err := st.state.IsOnline()
98 assert.Equal(t, testErr, err)
101 func TestIsOnlineWhenSinglePrimarySuccessfully(t *testing.T) {
103 st.setPrimaryFields("master", "1.2.3.4", "60000", "0", "master")
104 err := st.state.IsOnline()
108 func TestIsOnlineWhenSinglePrimaryFailureIfErrorHasSet(t *testing.T) {
109 testErr := errors.New("Some error")
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)
117 func TestIsOnlineWhenSinglePrimaryFailureIfNotPrimaryRole(t *testing.T) {
118 expErr := errors.New("No primary DB, current role 'not-master'")
120 st.setPrimaryFields("not-master", "1.2.3.4", "60000", "0", "master")
121 err := st.state.IsOnline()
122 assert.Equal(t, expErr, err)
125 func TestIsOnlineWhenSinglePrimaryFailureIfErrorFlags(t *testing.T) {
126 expErr := errors.New("Primary flags are 'any-error,master', expected 'master'")
128 st.setPrimaryFields("master", "1.2.3.4", "60000", "0", "any-error,master")
129 err := st.state.IsOnline()
130 assert.Equal(t, expErr, err)
133 func TestGetAddressPrimarySuccessfully(t *testing.T) {
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)
140 func TestGetAddressPrimaryFailureNoIpPort(t *testing.T) {
142 st.setPrimaryFields("master", "", "", "0", "master")
143 addr := st.state.PrimaryDbState.GetAddress()
144 assert.Equal(t, "", addr)
147 func TestIsOnlineWhenPrimaryAndTwoReplicasSuccessfully(t *testing.T) {
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()
158 func TestIsOnlineWhenPrimaryAndTwoReplicasFailureIfErrorHasSet(t *testing.T) {
159 testErr := errors.New("Some error")
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)
171 func TestIsOnlineWhenPrimaryAndOneReplicaFailureIfSentinelErrorHasSet(t *testing.T) {
172 testErr := errors.New("Some error")
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)
182 func TestIsOnlineWhenPrimaryAndTwoReplicasFailureIfNotReplicaRole(t *testing.T) {
183 expErr := errors.New("Replica role is 'not-slave', expected 'slave'")
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)
194 func TestIsOnlineWhenPrimaryAndTwoReplicasFailureIfPrimaryLinkDown(t *testing.T) {
195 expErr := errors.New("Replica link to the primary is down")
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)
206 func TestIsOnlineWhenPrimaryAndTwoReplicasFailureIfErrorFlags(t *testing.T) {
207 expErr := errors.New("Replica flags are 'any-error,slave', expected 'slave'")
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)
218 func TestIsOnlineWhenPrimaryAndOneReplicaFailureIfSentinelErrorFlags(t *testing.T) {
219 expErr := errors.New("Sentinel flags are 'any-error,sentinel', expected 'sentinel'")
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)
228 func TestGetAddressReplicasSuccessfully(t *testing.T) {
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)
241 func TestGetAddressReplicasNoIpPort(t *testing.T) {
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)
254 func TestGetAddressSentinelsSuccessfully(t *testing.T) {
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)
267 func TestGetAddressSentinelsNoIpPort(t *testing.T) {
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)