+
+func TestClientStandaloneRedisLegacyEnv(t *testing.T) {
+ setupVals := setupEnv(
+ true,
+ "service-ricplt-dbaas-tcp-cluster-0.ricplt", "6376", "", "", "", "",
+ )
+ assert.Equal(t, 1, len(setupVals.rClient))
+ assert.Equal(t, 1, len(setupVals.db))
+
+ expectedKeysAndValues := []interface{}{"key1", "value1"}
+ setupVals.rClient[0].On("MSet", expectedKeysAndValues).Return(redis.NewStatusResult("OK", nil))
+ err := setupVals.db[0].MSet("key1", "value1")
+ assert.Nil(t, err)
+ setupVals.rClient[0].AssertExpectations(t)
+}
+
+func TestClientSentinelRedisLegacyEnv(t *testing.T) {
+ setupVals := setupEnv(
+ true,
+ "service-ricplt-dbaas-tcp-cluster-0.ricplt", "6376", "dbaasmaster", "26376", "", "3",
+ )
+ assert.Equal(t, 1, len(setupVals.rClient))
+ assert.Equal(t, 1, len(setupVals.db))
+
+ expectedKeysAndValues := []interface{}{"key1", "value1"}
+ setupVals.rClient[0].On("MSet", expectedKeysAndValues).Return(redis.NewStatusResult("OK", nil))
+ err := setupVals.db[0].MSet("key1", "value1")
+ assert.Nil(t, err)
+ setupVals.rClient[0].AssertExpectations(t)
+}
+
+func TestClientTwoStandaloneRedisEnvs(t *testing.T) {
+ setupVals := setupEnv(
+ true,
+ "service-ricplt-dbaas-tcp-cluster-0.ricplt", "6376", "", "",
+ "service-ricplt-dbaas-tcp-cluster-0.ricplt,service-ricplt-dbaas-tcp-cluster-1.ricplt", "",
+ )
+ assert.Equal(t, 2, len(setupVals.rClient))
+ assert.Equal(t, 2, len(setupVals.db))
+
+ expectedKeysAndValues := []interface{}{"key1", "value1"}
+ setupVals.rClient[0].On("MSet", expectedKeysAndValues).Return(redis.NewStatusResult("OK", nil))
+ err := setupVals.db[0].MSet("key1", "value1")
+ assert.Nil(t, err)
+ setupVals.rClient[0].AssertExpectations(t)
+
+ expectedKeysAndValues = []interface{}{"key2", "value2"}
+ setupVals.rClient[1].On("MSet", expectedKeysAndValues).Return(redis.NewStatusResult("OK", nil))
+ err = setupVals.db[1].MSet("key2", "value2")
+ assert.Nil(t, err)
+ setupVals.rClient[0].AssertExpectations(t)
+ setupVals.rClient[1].AssertExpectations(t)
+}
+
+func TestClientTwoSentinelRedisEnvs(t *testing.T) {
+ setupVals := setupEnv(
+ true,
+ "service-ricplt-dbaas-tcp-cluster-0.ricplt", "6376", "dbaasmaster", "26376",
+ "service-ricplt-dbaas-tcp-cluster-0.ricplt,service-ricplt-dbaas-tcp-cluster-1.ricplt", "3",
+ )
+ assert.Equal(t, 2, len(setupVals.rClient))
+ assert.Equal(t, 2, len(setupVals.db))
+
+ expectedKeysAndValues := []interface{}{"key1", "value1"}
+ setupVals.rClient[0].On("MSet", expectedKeysAndValues).Return(redis.NewStatusResult("OK", nil))
+ err := setupVals.db[0].MSet("key1", "value1")
+ assert.Nil(t, err)
+ setupVals.rClient[0].AssertExpectations(t)
+
+ expectedKeysAndValues = []interface{}{"key2", "value2"}
+ setupVals.rClient[1].On("MSet", expectedKeysAndValues).Return(redis.NewStatusResult("OK", nil))
+ err = setupVals.db[1].MSet("key2", "value2")
+ assert.Nil(t, err)
+ setupVals.rClient[0].AssertExpectations(t)
+ setupVals.rClient[1].AssertExpectations(t)
+}
+
+func TestInfoOfMasterRedisWithTwoSlavesSuccessfully(t *testing.T) {
+ _, r, db := setupHaEnv(true)
+ redisInfo := "# Replication\r\n" +
+ "role:master\r\n" +
+ "connected_slaves:2\r\n" +
+ "min_slaves_good_slaves:2\r\n" +
+ "slave0:ip=1.2.3.4,port=6379,state=online,offset=100200300,lag=0\r\n" +
+ "slave1:ip=5.6.7.8,port=6379,state=online,offset=100200300,lag=0\r\n"
+ expInfo := &sdlgoredis.DbInfo{
+ Fields: sdlgoredis.DbInfoFields{
+ MasterRole: true,
+ ConnectedReplicaCnt: 2,
+ },
+ }
+
+ r.On("Info", []string{"all"}).Return(redis.NewStringResult(redisInfo, nil))
+ info, err := db.Info()
+ assert.Nil(t, err)
+ assert.Equal(t, expInfo, info)
+ r.AssertExpectations(t)
+}
+
+func TestInfoOfMasterRedisWithOneSlaveOnlineAndOtherSlaveNotOnlineSuccessfully(t *testing.T) {
+ _, r, db := setupHaEnv(true)
+ redisInfo := "# Replication\r\n" +
+ "role:master\r\n" +
+ "connected_slaves:1\r\n" +
+ "min_slaves_good_slaves:2\r\n" +
+ "slave0:ip=1.2.3.4,port=6379,state=online,offset=100200300,lag=0\r\n" +
+ "slave1:ip=5.6.7.8,port=6379,state=wait_bgsave,offset=100200300,lag=0\r\n"
+ expInfo := &sdlgoredis.DbInfo{
+ Fields: sdlgoredis.DbInfoFields{
+ MasterRole: true,
+ ConnectedReplicaCnt: 1,
+ },
+ }
+
+ r.On("Info", []string{"all"}).Return(redis.NewStringResult(redisInfo, nil))
+ info, err := db.Info()
+ assert.Nil(t, err)
+ assert.Equal(t, expInfo, info)
+ r.AssertExpectations(t)
+}
+
+func TestInfoOfStandaloneMasterRedisSuccessfully(t *testing.T) {
+ _, r, db := setupHaEnv(true)
+ redisInfo := "# Replication\r\n" +
+ "role:master\r\n" +
+ "connected_slaves:0\r\n" +
+ "min_slaves_good_slaves:0\r\n"
+ expInfo := &sdlgoredis.DbInfo{
+ Fields: sdlgoredis.DbInfoFields{
+ MasterRole: true,
+ ConnectedReplicaCnt: 0,
+ },
+ }
+
+ r.On("Info", []string{"all"}).Return(redis.NewStringResult(redisInfo, nil))
+ info, err := db.Info()
+ assert.Nil(t, err)
+ assert.Equal(t, expInfo, info)
+ r.AssertExpectations(t)
+}
+
+func TestInfoWithGibberishContentSuccessfully(t *testing.T) {
+ _, r, db := setupHaEnv(true)
+ redisInfo := "!#¤%&?+?´-\r\n"
+ expInfo := &sdlgoredis.DbInfo{}
+
+ r.On("Info", []string{"all"}).Return(redis.NewStringResult(redisInfo, nil))
+ info, err := db.Info()
+ assert.Nil(t, err)
+ assert.Equal(t, expInfo, info)
+ r.AssertExpectations(t)
+}
+
+func TestInfoWithEmptyContentSuccessfully(t *testing.T) {
+ _, r, db := setupHaEnv(true)
+ var redisInfo string
+ expInfo := &sdlgoredis.DbInfo{
+ Fields: sdlgoredis.DbInfoFields{
+ MasterRole: false,
+ },
+ }
+
+ r.On("Info", []string{"all"}).Return(redis.NewStringResult(redisInfo, nil))
+ info, err := db.Info()
+ assert.Nil(t, err)
+ assert.Equal(t, expInfo, info)
+ r.AssertExpectations(t)
+}
+
+func TestStateWithMasterAndTwoSlaveRedisSuccessfully(t *testing.T) {
+ _, r, s, db := setupHaEnvWithSentinels(true)
+ redisMasterState := map[string]string{
+ "role-reported": "master",
+ }
+ redisSlavesState := make([]interface{}, 2)
+ redisSlavesState[0] = []interface{}{
+ "role-reported", "slave",
+ "ip", "10.20.30.40",
+ "port", "6379",
+ "flags", "slave",
+ "master-link-status", "up",
+ }
+ redisSlavesState[1] = []interface{}{
+ "master-link-status", "up",
+ "ip", "10.20.30.50",
+ "flags", "slave",
+ "port", "30000",
+ "role-reported", "slave",
+ }
+ redisSentinelsState := make([]interface{}, 2)
+ redisSentinelsState[0] = []interface{}{
+ "ip", "10.20.30.40",
+ "port", "26379",
+ "flags", "sentinel",
+ }
+ redisSentinelsState[1] = []interface{}{
+ "ip", "10.20.30.50",
+ "flags", "sentinel",
+ "port", "30001",
+ }
+
+ expState := &sdlgoredis.DbState{
+ MasterDbState: sdlgoredis.MasterDbState{
+ Fields: sdlgoredis.MasterDbStateFields{
+ Role: "master",
+ },
+ },
+ ReplicasDbState: &sdlgoredis.ReplicasDbState{
+ States: []*sdlgoredis.ReplicaDbState{
+ &sdlgoredis.ReplicaDbState{
+ Fields: sdlgoredis.ReplicaDbStateFields{
+ Role: "slave",
+ Ip: "10.20.30.40",
+ Port: "6379",
+ MasterLinkStatus: "up",
+ Flags: "slave",
+ },
+ },
+ &sdlgoredis.ReplicaDbState{
+ Fields: sdlgoredis.ReplicaDbStateFields{
+ Role: "slave",
+ Ip: "10.20.30.50",
+ Port: "30000",
+ MasterLinkStatus: "up",
+ Flags: "slave",
+ },
+ },
+ },
+ },
+ SentinelsDbState: &sdlgoredis.SentinelsDbState{
+ States: []*sdlgoredis.SentinelDbState{
+ &sdlgoredis.SentinelDbState{
+ Fields: sdlgoredis.SentinelDbStateFields{
+ Ip: "10.20.30.40",
+ Port: "26379",
+ Flags: "sentinel",
+ },
+ },
+ &sdlgoredis.SentinelDbState{
+ Fields: sdlgoredis.SentinelDbStateFields{
+ Ip: "10.20.30.50",
+ Port: "30001",
+ Flags: "sentinel",
+ },
+ },
+ },
+ },
+ }
+
+ s[0].On("Master", "dbaasmaster").Return(redis.NewStringStringMapResult(redisMasterState, nil))
+ s[0].On("Slaves", "dbaasmaster").Return(redis.NewSliceResult(redisSlavesState, nil))
+ s[0].On("Sentinels", "dbaasmaster").Return(redis.NewSliceResult(redisSentinelsState, nil))
+ ret, err := db.State()
+ assert.Nil(t, err)
+ assert.Equal(t, expState, ret)
+ r.AssertExpectations(t)
+}
+
+func TestStateWithMasterAndOneSlaveRedisFailureInMasterRedisCall(t *testing.T) {
+ _, r, s, db := setupHaEnvWithSentinels(true)
+ redisMasterState := map[string]string{}
+ redisSlavesState := make([]interface{}, 1)
+ redisSlavesState[0] = []interface{}{
+ "role-reported", "slave",
+ "ip", "10.20.30.40",
+ "port", "6379",
+ "flags", "slave",
+ "master-link-status", "up",
+ }
+ redisSentinelsState := make([]interface{}, 1)
+ redisSentinelsState[0] = []interface{}{
+ "ip", "10.20.30.40",
+ "port", "26379",
+ "flags", "sentinel",
+ }
+
+ expState := &sdlgoredis.DbState{
+ MasterDbState: sdlgoredis.MasterDbState{
+ Err: errors.New("Some error"),
+ },
+ ReplicasDbState: &sdlgoredis.ReplicasDbState{
+ States: []*sdlgoredis.ReplicaDbState{
+ &sdlgoredis.ReplicaDbState{
+ Fields: sdlgoredis.ReplicaDbStateFields{
+ Role: "slave",
+ Ip: "10.20.30.40",
+ Port: "6379",
+ MasterLinkStatus: "up",
+ Flags: "slave",
+ },
+ },
+ },
+ },
+ SentinelsDbState: &sdlgoredis.SentinelsDbState{
+ States: []*sdlgoredis.SentinelDbState{
+ &sdlgoredis.SentinelDbState{
+ Fields: sdlgoredis.SentinelDbStateFields{
+ Ip: "10.20.30.40",
+ Port: "26379",
+ Flags: "sentinel",
+ },
+ },
+ },
+ },
+ }
+
+ s[0].On("Master", "dbaasmaster").Return(redis.NewStringStringMapResult(redisMasterState, errors.New("Some error")))
+ s[0].On("Slaves", "dbaasmaster").Return(redis.NewSliceResult(redisSlavesState, nil))
+ s[0].On("Sentinels", "dbaasmaster").Return(redis.NewSliceResult(redisSentinelsState, nil))
+ ret, err := db.State()
+ assert.NotNil(t, err)
+ assert.Equal(t, expState, ret)
+ r.AssertExpectations(t)
+}
+
+func TestStateWithMasterAndOneSlaveRedisFailureInSlavesRedisCall(t *testing.T) {
+ _, r, s, db := setupHaEnvWithSentinels(true)
+ redisMasterState := map[string]string{
+ "role-reported": "master",
+ }
+ redisSlavesState := make([]interface{}, 1)
+ redisSlavesState[0] = []interface{}{}
+ redisSentinelsState := make([]interface{}, 1)
+ redisSentinelsState[0] = []interface{}{
+ "ip", "10.20.30.40",
+ "port", "26379",
+ "flags", "sentinel",
+ }
+
+ expState := &sdlgoredis.DbState{
+ MasterDbState: sdlgoredis.MasterDbState{
+ Fields: sdlgoredis.MasterDbStateFields{
+ Role: "master",
+ },
+ },
+ ReplicasDbState: &sdlgoredis.ReplicasDbState{
+ Err: errors.New("Some error"),
+ States: []*sdlgoredis.ReplicaDbState{},
+ },
+ SentinelsDbState: &sdlgoredis.SentinelsDbState{
+ States: []*sdlgoredis.SentinelDbState{
+ &sdlgoredis.SentinelDbState{
+ Fields: sdlgoredis.SentinelDbStateFields{
+ Ip: "10.20.30.40",
+ Port: "26379",
+ Flags: "sentinel",
+ },
+ },
+ },
+ },
+ }
+
+ s[0].On("Master", "dbaasmaster").Return(redis.NewStringStringMapResult(redisMasterState, nil))
+ s[0].On("Slaves", "dbaasmaster").Return(redis.NewSliceResult(redisSlavesState, errors.New("Some error")))
+ s[0].On("Sentinels", "dbaasmaster").Return(redis.NewSliceResult(redisSentinelsState, nil))
+ ret, err := db.State()
+ assert.NotNil(t, err)
+ assert.Equal(t, expState, ret)
+ r.AssertExpectations(t)
+}
+
+func TestStateWithMasterAndOneSlaveRedisFailureInSentinelsRedisCall(t *testing.T) {
+ _, r, s, db := setupHaEnvWithSentinels(true)
+ redisMasterState := map[string]string{
+ "role-reported": "master",
+ }
+ redisSlavesState := make([]interface{}, 1)
+ redisSlavesState[0] = []interface{}{
+ "role-reported", "slave",
+ "ip", "10.20.30.40",
+ "port", "6379",
+ "flags", "slave",
+ "master-link-status", "up",
+ }
+ redisSentinelsState := make([]interface{}, 1)
+ redisSentinelsState[0] = []interface{}{
+ "ip", "10.20.30.40",
+ "port", "26379",
+ "flags", "sentinel",
+ }
+
+ expState := &sdlgoredis.DbState{
+ MasterDbState: sdlgoredis.MasterDbState{
+ Fields: sdlgoredis.MasterDbStateFields{
+ Role: "master",
+ },
+ },
+ ReplicasDbState: &sdlgoredis.ReplicasDbState{
+ States: []*sdlgoredis.ReplicaDbState{
+ &sdlgoredis.ReplicaDbState{
+ Fields: sdlgoredis.ReplicaDbStateFields{
+ Role: "slave",
+ Ip: "10.20.30.40",
+ Port: "6379",
+ MasterLinkStatus: "up",
+ Flags: "slave",
+ },
+ },
+ },
+ },
+ SentinelsDbState: &sdlgoredis.SentinelsDbState{
+ Err: errors.New("Some error"),
+ States: []*sdlgoredis.SentinelDbState{},
+ },
+ }
+
+ s[0].On("Master", "dbaasmaster").Return(redis.NewStringStringMapResult(redisMasterState, nil))
+ s[0].On("Slaves", "dbaasmaster").Return(redis.NewSliceResult(redisSlavesState, nil))
+ s[0].On("Sentinels", "dbaasmaster").Return(redis.NewSliceResult(redisSentinelsState, errors.New("Some error")))
+ ret, err := db.State()
+ assert.NotNil(t, err)
+ assert.Equal(t, expState, ret)
+ r.AssertExpectations(t)
+}
+
+func TestStateWithSingleMasterRedisSuccessfully(t *testing.T) {
+ _, r, db := setupSingleEnv(true)
+ redisInfo := "# Replication\r\n" +
+ "role:master\r\n" +
+ "connected_slaves:0\r\n" +
+ "min_slaves_good_slaves:0\r\n"
+
+ expState := &sdlgoredis.DbState{
+ MasterDbState: sdlgoredis.MasterDbState{
+ Fields: sdlgoredis.MasterDbStateFields{
+ Role: "master",
+ Flags: "master",
+ },
+ },
+ }
+
+ r.On("Info", []string{"all"}).Return(redis.NewStringResult(redisInfo, nil))
+ ret, err := db.State()
+ assert.Nil(t, err)
+ assert.Equal(t, expState, ret)
+ r.AssertExpectations(t)
+}
+
+func TestStateWithSingleMasterRedisFailureInInfoCall(t *testing.T) {
+ _, r, db := setupSingleEnv(true)
+ redisInfo := ""
+ expState := &sdlgoredis.DbState{}
+
+ r.On("Info", []string{"all"}).Return(redis.NewStringResult(redisInfo, errors.New("Some error")))
+ ret, err := db.State()
+ assert.NotNil(t, err)
+ assert.Equal(t, expState, ret)
+ r.AssertExpectations(t)
+}