Implement SDL CLI 'healthcheck' -command
[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 TestIsOnlineWhenSingleMasterSuccessfully(t *testing.T) {
72         st := setupDbState()
73         st.setMasterFields("master", "1.2.3.4", "60000", "0", "master")
74         err := st.state.IsOnline()
75         assert.Nil(t, err)
76 }
77
78 func TestIsOnlineWhenSingleMasterFailureIfErrorHasSet(t *testing.T) {
79         testErr := errors.New("Some error")
80         st := setupDbState()
81         st.setMasterFields("master", "1.2.3.4", "60000", "0", "master")
82         st.setMasterError(testErr)
83         err := st.state.IsOnline()
84         assert.Equal(t, testErr, err)
85 }
86
87 func TestIsOnlineWhenSingleMasterFailureIfNotMasterRole(t *testing.T) {
88         expErr := errors.New("No master DB, current role 'not-master'")
89         st := setupDbState()
90         st.setMasterFields("not-master", "1.2.3.4", "60000", "0", "master")
91         err := st.state.IsOnline()
92         assert.Equal(t, expErr, err)
93 }
94
95 func TestIsOnlineWhenSingleMasterFailureIfErrorFlags(t *testing.T) {
96         expErr := errors.New("Master flags are 'any-error,master', expected 'master'")
97         st := setupDbState()
98         st.setMasterFields("master", "1.2.3.4", "60000", "0", "any-error,master")
99         err := st.state.IsOnline()
100         assert.Equal(t, expErr, err)
101 }
102
103 func TestGetAddressMasterSuccessfully(t *testing.T) {
104         st := setupDbState()
105         st.setMasterFields("master", "1.2.3.4", "60000", "0", "master")
106         addr := st.state.MasterDbState.GetAddress()
107         assert.Equal(t, "1.2.3.4:60000", addr)
108 }
109
110 func TestGetAddressMasterFailureNoIpPort(t *testing.T) {
111         st := setupDbState()
112         st.setMasterFields("master", "", "", "0", "master")
113         addr := st.state.MasterDbState.GetAddress()
114         assert.Equal(t, "", addr)
115 }
116
117 func TestIsOnlineWhenMasterAndTwoReplicasSuccessfully(t *testing.T) {
118         st := setupDbState()
119         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
120         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
121         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "slave")
122         err := st.state.IsOnline()
123         assert.Nil(t, err)
124 }
125
126 func TestIsOnlineWhenMasterAndTwoReplicasFailureIfErrorHasSet(t *testing.T) {
127         testErr := errors.New("Some error")
128         st := setupDbState()
129         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
130         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
131         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "slave")
132         st.setReplicaError(testErr)
133         err := st.state.IsOnline()
134         assert.Equal(t, testErr, err)
135 }
136
137 func TestIsOnlineWhenMasterAndTwoReplicasFailureIfNotSlaveRole(t *testing.T) {
138         expErr := errors.New("Replica role is 'not-slave', expected 'slave'")
139         st := setupDbState()
140         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
141         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
142         st.addReplicaFields("not-slave", "6.7.8.10", "3450", "ok", "slave")
143         err := st.state.IsOnline()
144         assert.Equal(t, expErr, err)
145 }
146
147 func TestIsOnlineWhenMasterAndTwoReplicasFailureIfMasterLinkDown(t *testing.T) {
148         expErr := errors.New("Replica link to the master is down")
149         st := setupDbState()
150         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
151         st.addReplicaFields("slave", "6.7.8.9", "1234", "nok", "slave")
152         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "slave")
153         err := st.state.IsOnline()
154         assert.Equal(t, expErr, err)
155 }
156
157 func TestIsOnlineWhenMasterAndTwoReplicasFailureIfErrorFlags(t *testing.T) {
158         expErr := errors.New("Replica flags are 'any-error,slave', expected 'slave'")
159         st := setupDbState()
160         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
161         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
162         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "any-error,slave")
163         err := st.state.IsOnline()
164         assert.Equal(t, expErr, err)
165 }
166
167 func TestGetAddressReplicasSuccessfully(t *testing.T) {
168         st := setupDbState()
169         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
170         st.addReplicaFields("slave", "6.7.8.9", "1234", "ok", "slave")
171         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "slave")
172         addr := st.state.ReplicasDbState.States[0].GetAddress()
173         assert.Equal(t, "6.7.8.9:1234", addr)
174         addr = st.state.ReplicasDbState.States[1].GetAddress()
175         assert.Equal(t, "6.7.8.10:3450", addr)
176 }
177
178 func TestGetAddressReplicasNoIpPort(t *testing.T) {
179         st := setupDbState()
180         st.setMasterFields("master", "1.2.3.4", "60000", "2", "master")
181         st.addReplicaFields("slave", "", "", "ok", "slave")
182         st.addReplicaFields("slave", "6.7.8.10", "3450", "ok", "slave")
183         addr := st.state.ReplicasDbState.States[0].GetAddress()
184         assert.Equal(t, "", addr)
185         addr = st.state.ReplicasDbState.States[1].GetAddress()
186         assert.Equal(t, "6.7.8.10:3450", addr)
187 }