X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=internal%2Fsdlgoredis%2Fsdlgoredis_test.go;h=469e8c4b8b58bd1e8d1307eb320e40375012e5b2;hb=refs%2Fchanges%2F40%2F6740%2F2;hp=4869d8fce8def3f4567e452baf21731b425d3a45;hpb=33961a269bf51f6c713fcb00576cdc0b9ac98ee9;p=ric-plt%2Fsdlgo.git diff --git a/internal/sdlgoredis/sdlgoredis_test.go b/internal/sdlgoredis/sdlgoredis_test.go index 4869d8f..469e8c4 100644 --- a/internal/sdlgoredis/sdlgoredis_test.go +++ b/internal/sdlgoredis/sdlgoredis_test.go @@ -42,6 +42,10 @@ type pubSubMock struct { mock.Mock } +type MockOS struct { + mock.Mock +} + func (m *pubSubMock) Channel() <-chan *redis.Message { return m.Called().Get(0).(chan *redis.Message) } @@ -141,6 +145,11 @@ func setSubscribeNotifications() (*pubSubMock, sdlgoredis.SubscribeFn) { } } +func (m *MockOS) Getenv(key string, defValue string) string { + a := m.Called(key, defValue) + return a.String(0) +} + func setup(commandsExists bool) (*pubSubMock, *clientMock, *sdlgoredis.DB) { mock := new(clientMock) pubSubMock, subscribeNotifications := setSubscribeNotifications() @@ -171,6 +180,54 @@ func setup(commandsExists bool) (*pubSubMock, *clientMock, *sdlgoredis.DB) { return pubSubMock, mock, db } +func setupEnv(host, port, msname, sntport, clsaddrlist string) ([]*clientMock, []*sdlgoredis.DB) { + var clmocks []*clientMock + + dummyCommandInfo := redis.CommandInfo{ + Name: "dummy", + } + cmdResult := make(map[string]*redis.CommandInfo, 0) + + cmdResult = map[string]*redis.CommandInfo{ + "dummy": &dummyCommandInfo, + } + + osmock := new(MockOS) + osmock.On("Getenv", "DBAAS_SERVICE_HOST", "localhost").Return(host) + osmock.On("Getenv", "DBAAS_SERVICE_PORT", "6379").Return(port) + osmock.On("Getenv", "DBAAS_MASTER_NAME", "").Return(msname) + osmock.On("Getenv", "DBAAS_SERVICE_SENTINEL_PORT", "").Return(sntport) + osmock.On("Getenv", "DBAAS_CLUSTER_ADDR_LIST", "").Return(clsaddrlist) + + clients := sdlgoredis.ReadConfigAndCreateDbClients( + osmock, + func(addr, port, clusterName string, isHa bool) sdlgoredis.RedisClient { + clm := new(clientMock) + clm.On("Command").Return(redis.NewCommandsInfoCmdResult(cmdResult, nil)) + clmocks = append(clmocks, clm) + return clm + }, + ) + + return clmocks, clients +} + +func TestCloseDbSuccessfully(t *testing.T) { + _, r, db := setup(true) + r.On("Close").Return(nil) + err := db.CloseDB() + assert.Nil(t, err) + r.AssertExpectations(t) +} + +func TestCloseDbFailure(t *testing.T) { + _, r, db := setup(true) + r.On("Close").Return(errors.New("Some error")) + err := db.CloseDB() + assert.NotNil(t, err) + r.AssertExpectations(t) +} + func TestMSetSuccessfully(t *testing.T) { _, r, db := setup(true) expectedKeysAndValues := []interface{}{"key1", "value1", "key2", 2} @@ -353,9 +410,9 @@ func TestSetIECommandMissing(t *testing.T) { func TestSetIEPubKeyExists(t *testing.T) { _, r, db := setup(true) - expectedMessage := []interface{}{"SETIEPUB", "key", "newdata", "olddata", "channel", "message"} + expectedMessage := []interface{}{"SETIEMPUB", "key", "newdata", "olddata", "channel", "message"} r.On("Do", expectedMessage).Return(redis.NewCmdResult("OK", nil)) - result, err := db.SetIEPub("channel", "message", "key", "olddata", "newdata") + result, err := db.SetIEPub([]string{"channel", "message"}, "key", "olddata", "newdata") assert.True(t, result) assert.Nil(t, err) r.AssertExpectations(t) @@ -363,9 +420,9 @@ func TestSetIEPubKeyExists(t *testing.T) { func TestSetIEPubKeyDoesntExists(t *testing.T) { _, r, db := setup(true) - expectedMessage := []interface{}{"SETIEPUB", "key", "newdata", "olddata", "channel", "message"} + expectedMessage := []interface{}{"SETIEMPUB", "key", "newdata", "olddata", "channel", "message"} r.On("Do", expectedMessage).Return(redis.NewCmdResult(nil, nil)) - result, err := db.SetIEPub("channel", "message", "key", "olddata", "newdata") + result, err := db.SetIEPub([]string{"channel", "message"}, "key", "olddata", "newdata") assert.False(t, result) assert.Nil(t, err) r.AssertExpectations(t) @@ -373,9 +430,9 @@ func TestSetIEPubKeyDoesntExists(t *testing.T) { func TestSetIEPubFailure(t *testing.T) { _, r, db := setup(true) - expectedMessage := []interface{}{"SETIEPUB", "key", "newdata", "olddata", "channel", "message"} + expectedMessage := []interface{}{"SETIEMPUB", "key", "newdata", "olddata", "channel", "message"} r.On("Do", expectedMessage).Return(redis.NewCmdResult(nil, errors.New("Some error"))) - result, err := db.SetIEPub("channel", "message", "key", "olddata", "newdata") + result, err := db.SetIEPub([]string{"channel", "message"}, "key", "olddata", "newdata") assert.False(t, result) assert.NotNil(t, err) r.AssertExpectations(t) @@ -383,9 +440,9 @@ func TestSetIEPubFailure(t *testing.T) { func TestSetIEPubCommandMissing(t *testing.T) { _, r, db := setup(false) - expectedMessage := []interface{}{"SETIEPUB", "key", "newdata", "olddata", "channel", "message"} + expectedMessage := []interface{}{"SETIEMPUB", "key", "newdata", "olddata", "channel", "message"} r.AssertNotCalled(t, "Do", expectedMessage) - result, err := db.SetIEPub("channel", "message", "key", "olddata", "newdata") + result, err := db.SetIEPub([]string{"channel", "message"}, "key", "olddata", "newdata") assert.False(t, result) assert.NotNil(t, err) r.AssertExpectations(t) @@ -393,9 +450,9 @@ func TestSetIEPubCommandMissing(t *testing.T) { func TestSetNXPubKeyDoesntExist(t *testing.T) { _, r, db := setup(true) - expectedMessage := []interface{}{"SETNXPUB", "key", "data", "channel", "message"} + expectedMessage := []interface{}{"SETNXMPUB", "key", "data", "channel", "message"} r.On("Do", expectedMessage).Return(redis.NewCmdResult("OK", nil)) - result, err := db.SetNXPub("channel", "message", "key", "data") + result, err := db.SetNXPub([]string{"channel", "message"}, "key", "data") assert.True(t, result) assert.Nil(t, err) r.AssertExpectations(t) @@ -403,9 +460,9 @@ func TestSetNXPubKeyDoesntExist(t *testing.T) { func TestSetNXPubKeyExists(t *testing.T) { _, r, db := setup(true) - expectedMessage := []interface{}{"SETNXPUB", "key", "data", "channel", "message"} + expectedMessage := []interface{}{"SETNXMPUB", "key", "data", "channel", "message"} r.On("Do", expectedMessage).Return(redis.NewCmdResult(nil, nil)) - result, err := db.SetNXPub("channel", "message", "key", "data") + result, err := db.SetNXPub([]string{"channel", "message"}, "key", "data") assert.False(t, result) assert.Nil(t, err) r.AssertExpectations(t) @@ -413,9 +470,9 @@ func TestSetNXPubKeyExists(t *testing.T) { func TestSetNXPubFailure(t *testing.T) { _, r, db := setup(true) - expectedMessage := []interface{}{"SETNXPUB", "key", "data", "channel", "message"} + expectedMessage := []interface{}{"SETNXMPUB", "key", "data", "channel", "message"} r.On("Do", expectedMessage).Return(redis.NewCmdResult(nil, errors.New("Some error"))) - result, err := db.SetNXPub("channel", "message", "key", "data") + result, err := db.SetNXPub([]string{"channel", "message"}, "key", "data") assert.False(t, result) assert.NotNil(t, err) r.AssertExpectations(t) @@ -423,9 +480,9 @@ func TestSetNXPubFailure(t *testing.T) { func TestSetNXPubCommandMissing(t *testing.T) { _, r, db := setup(false) - expectedMessage := []interface{}{"SETNXPUB", "key", "data", "channel", "message"} + expectedMessage := []interface{}{"SETNXMPUB", "key", "data", "channel", "message"} r.AssertNotCalled(t, "Do", expectedMessage) - result, err := db.SetNXPub("channel", "message", "key", "data") + result, err := db.SetNXPub([]string{"channel", "message"}, "key", "data") assert.False(t, result) assert.NotNil(t, err) r.AssertExpectations(t) @@ -467,9 +524,9 @@ func TestSetNXFailure(t *testing.T) { func TestDelIEPubKeyDoesntExist(t *testing.T) { _, r, db := setup(true) - expectedMessage := []interface{}{"DELIEPUB", "key", "data", "channel", "message"} - r.On("Do", expectedMessage).Return(redis.NewCmdResult(0, nil)) - result, err := db.DelIEPub("channel", "message", "key", "data") + expectedMessage := []interface{}{"DELIEMPUB", "key", "data", "channel", "message"} + r.On("Do", expectedMessage).Return(redis.NewCmdResult(int64(0), nil)) + result, err := db.DelIEPub([]string{"channel", "message"}, "key", "data") assert.False(t, result) assert.Nil(t, err) r.AssertExpectations(t) @@ -477,9 +534,19 @@ func TestDelIEPubKeyDoesntExist(t *testing.T) { func TestDelIEPubKeyExists(t *testing.T) { _, r, db := setup(true) - expectedMessage := []interface{}{"DELIEPUB", "key", "data", "channel", "message"} + expectedMessage := []interface{}{"DELIEMPUB", "key", "data", "channel", "message"} + r.On("Do", expectedMessage).Return(redis.NewCmdResult(int64(1), nil)) + result, err := db.DelIEPub([]string{"channel", "message"}, "key", "data") + assert.True(t, result) + assert.Nil(t, err) + r.AssertExpectations(t) +} + +func TestDelIEPubKeyExistsIntTypeRedisValue(t *testing.T) { + _, r, db := setup(true) + expectedMessage := []interface{}{"DELIEMPUB", "key", "data", "channel", "message"} r.On("Do", expectedMessage).Return(redis.NewCmdResult(1, nil)) - result, err := db.DelIEPub("channel", "message", "key", "data") + result, err := db.DelIEPub([]string{"channel", "message"}, "key", "data") assert.True(t, result) assert.Nil(t, err) r.AssertExpectations(t) @@ -487,9 +554,9 @@ func TestDelIEPubKeyExists(t *testing.T) { func TestDelIEPubFailure(t *testing.T) { _, r, db := setup(true) - expectedMessage := []interface{}{"DELIEPUB", "key", "data", "channel", "message"} - r.On("Do", expectedMessage).Return(redis.NewCmdResult(0, errors.New("Some error"))) - result, err := db.DelIEPub("channel", "message", "key", "data") + expectedMessage := []interface{}{"DELIEMPUB", "key", "data", "channel", "message"} + r.On("Do", expectedMessage).Return(redis.NewCmdResult(int64(0), errors.New("Some error"))) + result, err := db.DelIEPub([]string{"channel", "message"}, "key", "data") assert.False(t, result) assert.NotNil(t, err) r.AssertExpectations(t) @@ -497,9 +564,9 @@ func TestDelIEPubFailure(t *testing.T) { func TestDelIEPubCommandMissing(t *testing.T) { _, r, db := setup(false) - expectedMessage := []interface{}{"DELIEPUB", "key", "data", "channel", "message"} + expectedMessage := []interface{}{"DELIEMPUB", "key", "data", "channel", "message"} r.AssertNotCalled(t, "Do", expectedMessage) - result, err := db.DelIEPub("channel", "message", "key", "data") + result, err := db.DelIEPub([]string{"channel", "message"}, "key", "data") assert.False(t, result) assert.NotNil(t, err) r.AssertExpectations(t) @@ -508,7 +575,7 @@ func TestDelIEPubCommandMissing(t *testing.T) { func TestDelIEKeyDoesntExist(t *testing.T) { _, r, db := setup(true) expectedMessage := []interface{}{"DELIE", "key", "data"} - r.On("Do", expectedMessage).Return(redis.NewCmdResult(0, nil)) + r.On("Do", expectedMessage).Return(redis.NewCmdResult(int64(0), nil)) result, err := db.DelIE("key", "data") assert.False(t, result) assert.Nil(t, err) @@ -516,6 +583,16 @@ func TestDelIEKeyDoesntExist(t *testing.T) { } func TestDelIEKeyExists(t *testing.T) { + _, r, db := setup(true) + expectedMessage := []interface{}{"DELIE", "key", "data"} + r.On("Do", expectedMessage).Return(redis.NewCmdResult(int64(1), nil)) + result, err := db.DelIE("key", "data") + assert.True(t, result) + assert.Nil(t, err) + r.AssertExpectations(t) +} + +func TestDelIEKeyExistsIntTypeRedisValue(t *testing.T) { _, r, db := setup(true) expectedMessage := []interface{}{"DELIE", "key", "data"} r.On("Do", expectedMessage).Return(redis.NewCmdResult(1, nil)) @@ -528,7 +605,7 @@ func TestDelIEKeyExists(t *testing.T) { func TestDelIEFailure(t *testing.T) { _, r, db := setup(true) expectedMessage := []interface{}{"DELIE", "key", "data"} - r.On("Do", expectedMessage).Return(redis.NewCmdResult(0, errors.New("Some error"))) + r.On("Do", expectedMessage).Return(redis.NewCmdResult(int64(0), errors.New("Some error"))) result, err := db.DelIE("key", "data") assert.False(t, result) assert.NotNil(t, err) @@ -828,3 +905,75 @@ func TestPExpireIELockNotHeld(t *testing.T) { assert.NotNil(t, err) r.AssertExpectations(t) } + +func TestClientStandaloneRedisLegacyEnv(t *testing.T) { + rcls, dbs := setupEnv( + "service-ricplt-dbaas-tcp-cluster-0.ricplt", "6376", "", "", "", + ) + assert.Equal(t, 1, len(rcls)) + assert.Equal(t, 1, len(dbs)) + + expectedKeysAndValues := []interface{}{"key1", "value1"} + rcls[0].On("MSet", expectedKeysAndValues).Return(redis.NewStatusResult("OK", nil)) + err := dbs[0].MSet("key1", "value1") + assert.Nil(t, err) + rcls[0].AssertExpectations(t) +} + +func TestClientSentinelRedisLegacyEnv(t *testing.T) { + rcls, dbs := setupEnv( + "service-ricplt-dbaas-tcp-cluster-0.ricplt", "6376", "dbaasmaster", "26376", "", + ) + assert.Equal(t, 1, len(rcls)) + assert.Equal(t, 1, len(dbs)) + + expectedKeysAndValues := []interface{}{"key1", "value1"} + rcls[0].On("MSet", expectedKeysAndValues).Return(redis.NewStatusResult("OK", nil)) + err := dbs[0].MSet("key1", "value1") + assert.Nil(t, err) + rcls[0].AssertExpectations(t) +} + +func TestClientTwoStandaloneRedisEnvs(t *testing.T) { + rcls, dbs := setupEnv( + "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(rcls)) + assert.Equal(t, 2, len(dbs)) + + expectedKeysAndValues := []interface{}{"key1", "value1"} + rcls[0].On("MSet", expectedKeysAndValues).Return(redis.NewStatusResult("OK", nil)) + err := dbs[0].MSet("key1", "value1") + assert.Nil(t, err) + rcls[0].AssertExpectations(t) + + expectedKeysAndValues = []interface{}{"key2", "value2"} + rcls[1].On("MSet", expectedKeysAndValues).Return(redis.NewStatusResult("OK", nil)) + err = dbs[1].MSet("key2", "value2") + assert.Nil(t, err) + rcls[0].AssertExpectations(t) + rcls[1].AssertExpectations(t) +} + +func TestClientTwoSentinelRedisEnvs(t *testing.T) { + rcls, dbs := setupEnv( + "service-ricplt-dbaas-tcp-cluster-0.ricplt", "6376", "dbaasmaster", "26376", + "service-ricplt-dbaas-tcp-cluster-0.ricplt,service-ricplt-dbaas-tcp-cluster-1.ricplt", + ) + assert.Equal(t, 2, len(rcls)) + assert.Equal(t, 2, len(dbs)) + + expectedKeysAndValues := []interface{}{"key1", "value1"} + rcls[0].On("MSet", expectedKeysAndValues).Return(redis.NewStatusResult("OK", nil)) + err := dbs[0].MSet("key1", "value1") + assert.Nil(t, err) + rcls[0].AssertExpectations(t) + + expectedKeysAndValues = []interface{}{"key2", "value2"} + rcls[1].On("MSet", expectedKeysAndValues).Return(redis.NewStatusResult("OK", nil)) + err = dbs[1].MSet("key2", "value2") + assert.Nil(t, err) + rcls[0].AssertExpectations(t) + rcls[1].AssertExpectations(t) +}