/* Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments Copyright (C) ITsysCOM GmbH This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see */ package engine import ( "testing" "time" "github.com/cgrates/birpc" "github.com/cgrates/birpc/context" "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/utils" ) func TestDatamanagerCacheDataFromDBNoPrfxErr(t *testing.T) { dm := NewDataManager(nil, nil, nil) err := dm.CacheDataFromDB(context.Background(), "", []string{}, false) if err == nil || err.Error() != "unsupported cache prefix" { t.Errorf("\nExpected <%+v>, \nReceived <%+v>", "unsupported cache prefix", err) } } func TestDatamanagerCacheDataFromDBNoDMErr(t *testing.T) { var dm *DataManager err := dm.CacheDataFromDB(context.Background(), "", []string{}, false) if err == nil || err != utils.ErrNoDatabaseConn { t.Errorf("\nExpected <%+v>, \nReceived <%+v>", utils.ErrNoDatabaseConn, err) } } func TestDatamanagerCacheDataFromDBNoLimitZeroErr(t *testing.T) { cfg := config.NewDefaultCGRConfig() dm := NewDataManager(nil, cfg.CacheCfg(), nil) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.AttributeProfilePrefix]: { Limit: 0, }, } err := dm.CacheDataFromDB(context.Background(), utils.AttributeProfilePrefix, []string{}, false) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBMetaAPIBanErr(t *testing.T) { cfg := config.NewDefaultCGRConfig() dm := NewDataManager(nil, cfg.CacheCfg(), nil) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.MetaAPIBan]: { Limit: 1, }, } err := dm.CacheDataFromDB(context.Background(), utils.MetaAPIBan, []string{}, false) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBMustBeCached(t *testing.T) { cfg := config.NewDefaultCGRConfig() dm := NewDataManager(nil, cfg.CacheCfg(), nil) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.AttributeProfilePrefix]: { Limit: 1, }, } err := dm.CacheDataFromDB(context.Background(), utils.AttributeProfilePrefix, []string{utils.MetaAny}, true) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBNotCachedResourceProfiles(t *testing.T) { // cfg := config.NewDefaultCGRConfig() // dm := NewDataManager(nil, cfg.CacheCfg(), nil) cfg := config.NewDefaultCGRConfig() connMng := NewConnManager(cfg) dataDB, err := NewDataDBConn(cfg.DataDbCfg().Type, cfg.DataDbCfg().Host, cfg.DataDbCfg().Port, cfg.DataDbCfg().Name, cfg.DataDbCfg().User, cfg.DataDbCfg().Password, cfg.GeneralCfg().DBDataEncoding, cfg.DataDbCfg().Opts, cfg.DataDbCfg().Items) if err != nil { t.Error(err) } defer dataDB.Close() dm := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), connMng) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.ResourceProfilesPrefix]: { Limit: 1, }, utils.CacheRPCResponses: { Limit: 1, }, } err = dm.CacheDataFromDB(context.Background(), utils.ResourceProfilesPrefix, []string{utils.MetaAny}, false) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBNotCachedResources(t *testing.T) { // cfg := config.NewDefaultCGRConfig() // dm := NewDataManager(nil, cfg.CacheCfg(), nil) cfg := config.NewDefaultCGRConfig() connMng := NewConnManager(cfg) dataDB, err := NewDataDBConn(cfg.DataDbCfg().Type, cfg.DataDbCfg().Host, cfg.DataDbCfg().Port, cfg.DataDbCfg().Name, cfg.DataDbCfg().User, cfg.DataDbCfg().Password, cfg.GeneralCfg().DBDataEncoding, cfg.DataDbCfg().Opts, cfg.DataDbCfg().Items) if err != nil { t.Error(err) } defer dataDB.Close() dm := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), connMng) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.ResourcesPrefix]: { Limit: 1, }, utils.CacheRPCResponses: { Limit: 1, }, } err = dm.CacheDataFromDB(context.Background(), utils.ResourcesPrefix, []string{utils.MetaAny}, false) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBNotCachedStatQueueProfiles(t *testing.T) { // cfg := config.NewDefaultCGRConfig() // dm := NewDataManager(nil, cfg.CacheCfg(), nil) cfg := config.NewDefaultCGRConfig() connMng := NewConnManager(cfg) dataDB, err := NewDataDBConn(cfg.DataDbCfg().Type, cfg.DataDbCfg().Host, cfg.DataDbCfg().Port, cfg.DataDbCfg().Name, cfg.DataDbCfg().User, cfg.DataDbCfg().Password, cfg.GeneralCfg().DBDataEncoding, cfg.DataDbCfg().Opts, cfg.DataDbCfg().Items) if err != nil { t.Error(err) } defer dataDB.Close() dm := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), connMng) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.StatQueueProfilePrefix]: { Limit: 1, }, utils.CacheRPCResponses: { Limit: 1, }, } err = dm.CacheDataFromDB(context.Background(), utils.StatQueueProfilePrefix, []string{utils.MetaAny}, false) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBNotCachedStatQueuePrefix(t *testing.T) { // cfg := config.NewDefaultCGRConfig() // dm := NewDataManager(nil, cfg.CacheCfg(), nil) cfg := config.NewDefaultCGRConfig() connMng := NewConnManager(cfg) dataDB, err := NewDataDBConn(cfg.DataDbCfg().Type, cfg.DataDbCfg().Host, cfg.DataDbCfg().Port, cfg.DataDbCfg().Name, cfg.DataDbCfg().User, cfg.DataDbCfg().Password, cfg.GeneralCfg().DBDataEncoding, cfg.DataDbCfg().Opts, cfg.DataDbCfg().Items) if err != nil { t.Error(err) } defer dataDB.Close() dm := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), connMng) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.StatQueuePrefix]: { Limit: 1, }, utils.CacheRPCResponses: { Limit: 1, }, } err = dm.CacheDataFromDB(context.Background(), utils.StatQueuePrefix, []string{utils.MetaAny}, false) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBNotCachedThresholdProfilePrefix(t *testing.T) { // cfg := config.NewDefaultCGRConfig() // dm := NewDataManager(nil, cfg.CacheCfg(), nil) cfg := config.NewDefaultCGRConfig() connMng := NewConnManager(cfg) dataDB, err := NewDataDBConn(cfg.DataDbCfg().Type, cfg.DataDbCfg().Host, cfg.DataDbCfg().Port, cfg.DataDbCfg().Name, cfg.DataDbCfg().User, cfg.DataDbCfg().Password, cfg.GeneralCfg().DBDataEncoding, cfg.DataDbCfg().Opts, cfg.DataDbCfg().Items) if err != nil { t.Error(err) } defer dataDB.Close() dm := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), connMng) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.ThresholdProfilePrefix]: { Limit: 1, }, utils.CacheRPCResponses: { Limit: 1, }, } err = dm.CacheDataFromDB(context.Background(), utils.ThresholdProfilePrefix, []string{utils.MetaAny}, false) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBNotCachedThresholdPrefix(t *testing.T) { // cfg := config.NewDefaultCGRConfig() // dm := NewDataManager(nil, cfg.CacheCfg(), nil) cfg := config.NewDefaultCGRConfig() connMng := NewConnManager(cfg) dataDB, err := NewDataDBConn(cfg.DataDbCfg().Type, cfg.DataDbCfg().Host, cfg.DataDbCfg().Port, cfg.DataDbCfg().Name, cfg.DataDbCfg().User, cfg.DataDbCfg().Password, cfg.GeneralCfg().DBDataEncoding, cfg.DataDbCfg().Opts, cfg.DataDbCfg().Items) if err != nil { t.Error(err) } defer dataDB.Close() dm := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), connMng) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.ThresholdPrefix]: { Limit: 1, }, utils.CacheRPCResponses: { Limit: 1, }, } err = dm.CacheDataFromDB(context.Background(), utils.ThresholdPrefix, []string{utils.MetaAny}, false) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBNotCachedFilterPrefix(t *testing.T) { // cfg := config.NewDefaultCGRConfig() // dm := NewDataManager(nil, cfg.CacheCfg(), nil) cfg := config.NewDefaultCGRConfig() connMng := NewConnManager(cfg) dataDB, err := NewDataDBConn(cfg.DataDbCfg().Type, cfg.DataDbCfg().Host, cfg.DataDbCfg().Port, cfg.DataDbCfg().Name, cfg.DataDbCfg().User, cfg.DataDbCfg().Password, cfg.GeneralCfg().DBDataEncoding, cfg.DataDbCfg().Opts, cfg.DataDbCfg().Items) if err != nil { t.Error(err) } defer dataDB.Close() dm := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), connMng) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.FilterPrefix]: { Limit: 1, }, utils.CacheRPCResponses: { Limit: 1, }, } err = dm.CacheDataFromDB(context.Background(), utils.FilterPrefix, []string{utils.MetaAny}, false) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBNotCachedRouteProfilePrefix(t *testing.T) { // cfg := config.NewDefaultCGRConfig() // dm := NewDataManager(nil, cfg.CacheCfg(), nil) cfg := config.NewDefaultCGRConfig() connMng := NewConnManager(cfg) dataDB, err := NewDataDBConn(cfg.DataDbCfg().Type, cfg.DataDbCfg().Host, cfg.DataDbCfg().Port, cfg.DataDbCfg().Name, cfg.DataDbCfg().User, cfg.DataDbCfg().Password, cfg.GeneralCfg().DBDataEncoding, cfg.DataDbCfg().Opts, cfg.DataDbCfg().Items) if err != nil { t.Error(err) } defer dataDB.Close() dm := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), connMng) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.RouteProfilePrefix]: { Limit: 1, }, utils.CacheRPCResponses: { Limit: 1, }, } err = dm.CacheDataFromDB(context.Background(), utils.RouteProfilePrefix, []string{utils.MetaAny}, false) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBNotCachedAttributeProfilePrefix(t *testing.T) { // cfg := config.NewDefaultCGRConfig() // dm := NewDataManager(nil, cfg.CacheCfg(), nil) cfg := config.NewDefaultCGRConfig() connMng := NewConnManager(cfg) dataDB, err := NewDataDBConn(cfg.DataDbCfg().Type, cfg.DataDbCfg().Host, cfg.DataDbCfg().Port, cfg.DataDbCfg().Name, cfg.DataDbCfg().User, cfg.DataDbCfg().Password, cfg.GeneralCfg().DBDataEncoding, cfg.DataDbCfg().Opts, cfg.DataDbCfg().Items) if err != nil { t.Error(err) } defer dataDB.Close() dm := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), connMng) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.AttributeProfilePrefix]: { Limit: 1, }, utils.CacheRPCResponses: { Limit: 1, }, } err = dm.CacheDataFromDB(context.Background(), utils.AttributeProfilePrefix, []string{utils.MetaAny}, false) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBNotCachedChargerProfilePrefix(t *testing.T) { // cfg := config.NewDefaultCGRConfig() // dm := NewDataManager(nil, cfg.CacheCfg(), nil) cfg := config.NewDefaultCGRConfig() connMng := NewConnManager(cfg) dataDB, err := NewDataDBConn(cfg.DataDbCfg().Type, cfg.DataDbCfg().Host, cfg.DataDbCfg().Port, cfg.DataDbCfg().Name, cfg.DataDbCfg().User, cfg.DataDbCfg().Password, cfg.GeneralCfg().DBDataEncoding, cfg.DataDbCfg().Opts, cfg.DataDbCfg().Items) if err != nil { t.Error(err) } defer dataDB.Close() dm := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), connMng) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.ChargerProfilePrefix]: { Limit: 1, }, utils.CacheRPCResponses: { Limit: 1, }, } err = dm.CacheDataFromDB(context.Background(), utils.ChargerProfilePrefix, []string{utils.MetaAny}, false) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBNotCachedDispatcherProfilePrefix(t *testing.T) { // cfg := config.NewDefaultCGRConfig() // dm := NewDataManager(nil, cfg.CacheCfg(), nil) cfg := config.NewDefaultCGRConfig() connMng := NewConnManager(cfg) dataDB, err := NewDataDBConn(cfg.DataDbCfg().Type, cfg.DataDbCfg().Host, cfg.DataDbCfg().Port, cfg.DataDbCfg().Name, cfg.DataDbCfg().User, cfg.DataDbCfg().Password, cfg.GeneralCfg().DBDataEncoding, cfg.DataDbCfg().Opts, cfg.DataDbCfg().Items) if err != nil { t.Error(err) } defer dataDB.Close() dm := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), connMng) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.DispatcherProfilePrefix]: { Limit: 1, }, utils.CacheRPCResponses: { Limit: 1, }, } err = dm.CacheDataFromDB(context.Background(), utils.DispatcherProfilePrefix, []string{utils.MetaAny}, false) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBNotCachedDispatcherHostPrefix(t *testing.T) { // cfg := config.NewDefaultCGRConfig() // dm := NewDataManager(nil, cfg.CacheCfg(), nil) cfg := config.NewDefaultCGRConfig() connMng := NewConnManager(cfg) dataDB, err := NewDataDBConn(cfg.DataDbCfg().Type, cfg.DataDbCfg().Host, cfg.DataDbCfg().Port, cfg.DataDbCfg().Name, cfg.DataDbCfg().User, cfg.DataDbCfg().Password, cfg.GeneralCfg().DBDataEncoding, cfg.DataDbCfg().Opts, cfg.DataDbCfg().Items) if err != nil { t.Error(err) } defer dataDB.Close() dm := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), connMng) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.DispatcherHostPrefix]: { Limit: 1, }, utils.CacheRPCResponses: { Limit: 1, }, } err = dm.CacheDataFromDB(context.Background(), utils.DispatcherHostPrefix, []string{utils.MetaAny}, false) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBNotCachedAccountFilterIndexPrfx(t *testing.T) { // cfg := config.NewDefaultCGRConfig() // dm := NewDataManager(nil, cfg.CacheCfg(), nil) cfg := config.NewDefaultCGRConfig() connMng := NewConnManager(cfg) dataDB, err := NewDataDBConn(cfg.DataDbCfg().Type, cfg.DataDbCfg().Host, cfg.DataDbCfg().Port, cfg.DataDbCfg().Name, cfg.DataDbCfg().User, cfg.DataDbCfg().Password, cfg.GeneralCfg().DBDataEncoding, cfg.DataDbCfg().Opts, cfg.DataDbCfg().Items) if err != nil { t.Error(err) } defer dataDB.Close() dm := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), connMng) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.AccountFilterIndexPrfx]: { Limit: 1, }, utils.CacheRPCResponses: { Limit: 1, }, } err = dm.CacheDataFromDB(context.Background(), utils.AccountFilterIndexPrfx, []string{utils.MetaAny}, false) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBNotCachedAccountPrefix(t *testing.T) { // cfg := config.NewDefaultCGRConfig() // dm := NewDataManager(nil, cfg.CacheCfg(), nil) cfg := config.NewDefaultCGRConfig() connMng := NewConnManager(cfg) dataDB, err := NewDataDBConn(cfg.DataDbCfg().Type, cfg.DataDbCfg().Host, cfg.DataDbCfg().Port, cfg.DataDbCfg().Name, cfg.DataDbCfg().User, cfg.DataDbCfg().Password, cfg.GeneralCfg().DBDataEncoding, cfg.DataDbCfg().Opts, cfg.DataDbCfg().Items) if err != nil { t.Error(err) } defer dataDB.Close() dm := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), connMng) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.AccountPrefix]: { Limit: 1, }, utils.CacheRPCResponses: { Limit: 1, }, } err = dm.CacheDataFromDB(context.Background(), utils.AccountPrefix, []string{utils.MetaAny}, false) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBNotCachedRateProfilePrefix(t *testing.T) { // cfg := config.NewDefaultCGRConfig() // dm := NewDataManager(nil, cfg.CacheCfg(), nil) cfg := config.NewDefaultCGRConfig() connMng := NewConnManager(cfg) dataDB, err := NewDataDBConn(cfg.DataDbCfg().Type, cfg.DataDbCfg().Host, cfg.DataDbCfg().Port, cfg.DataDbCfg().Name, cfg.DataDbCfg().User, cfg.DataDbCfg().Password, cfg.GeneralCfg().DBDataEncoding, cfg.DataDbCfg().Opts, cfg.DataDbCfg().Items) if err != nil { t.Error(err) } defer dataDB.Close() dm := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), connMng) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.RateProfilePrefix]: { Limit: 1, }, utils.CacheRPCResponses: { Limit: 1, }, } err = dm.CacheDataFromDB(context.Background(), utils.RateProfilePrefix, []string{utils.MetaAny}, false) if err != nil { t.Error(err) } } func TestDatamanagerCacheDataFromDBNotCachedActionProfilePrefix(t *testing.T) { // cfg := config.NewDefaultCGRConfig() // dm := NewDataManager(nil, cfg.CacheCfg(), nil) cfg := config.NewDefaultCGRConfig() connMng := NewConnManager(cfg) dataDB, err := NewDataDBConn(cfg.DataDbCfg().Type, cfg.DataDbCfg().Host, cfg.DataDbCfg().Port, cfg.DataDbCfg().Name, cfg.DataDbCfg().User, cfg.DataDbCfg().Password, cfg.GeneralCfg().DBDataEncoding, cfg.DataDbCfg().Opts, cfg.DataDbCfg().Items) if err != nil { t.Error(err) } defer dataDB.Close() dm := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), connMng) dm.cacheCfg.Partitions = map[string]*config.CacheParamCfg{ utils.CachePrefixToInstance[utils.ActionProfilePrefix]: { Limit: 1, }, utils.CacheRPCResponses: { Limit: 1, }, } err = dm.CacheDataFromDB(context.Background(), utils.ActionProfilePrefix, []string{utils.MetaAny}, false) if err != nil { t.Error(err) } } func TestDataManagerDataDB(t *testing.T) { var dm *DataManager rcv := dm.DataDB() if rcv != nil { t.Errorf("Expected DataDB to be nil, Received <%+v>", rcv) } } func TestDataManagerSetFilterDMNil(t *testing.T) { expErr := utils.ErrNoDatabaseConn var dm *DataManager err := dm.SetFilter(context.Background(), nil, true) if err != expErr { t.Errorf("Expected error <%v>, Received error <%v>", expErr, err) } } func TestDataManagerSetFilterErrConnID(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() cfg := config.NewDefaultCGRConfig() cfg.DataDbCfg().Items[utils.MetaFilters].Remote = true config.SetCgrConfig(cfg) data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) dm := NewDataManager(data, cfg.CacheCfg(), nil) fltr := &Filter{ Tenant: "cgrates.org", ID: "fltr1", Rules: []*FilterRule{{ Type: utils.MetaString, Element: "~*req.Account", Values: []string{"1001", "1002"}, }}, } expErr := "MANDATORY_IE_MISSING: [connIDs]" err := dm.SetFilter(context.Background(), fltr, true) if err.Error() != expErr { t.Errorf("Expected error <%v>, Received error <%v>", expErr, err) } } func TestDataManagerSetFilterErrSetFilterDrv(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) dm := NewDataManager(data, cfg.CacheCfg(), nil) dm.dataDB = &DataDBMock{ GetFilterDrvF: func(ctx *context.Context, str1 string, str2 string) (*Filter, error) { return nil, utils.ErrNotFound }, } fltr := &Filter{ Tenant: "cgrates.org", ID: "fltr1", Rules: []*FilterRule{{ Type: utils.MetaString, Element: "~*req.Account", Values: []string{"1001", "1002"}, }}, } err := dm.SetFilter(context.Background(), fltr, true) if err != utils.ErrNotImplemented { t.Errorf("Expected error <%v>, Received error <%v>", utils.ErrNotImplemented, err) } } func TestDataManagerSetFilterErrUpdateFilterIndex(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetIndexesDrvF: func(ctx *context.Context, idxItmType, tntCtx, idxKey, transactionID string) (indexes map[string]utils.StringSet, err error) { return nil, utils.ErrNotImplemented }, SetFilterDrvF: func(ctx *context.Context, fltr *Filter) error { return nil }, } fltr := &Filter{ Tenant: "cgrates.org", ID: "*stirng:~*req.Account:1001", Rules: []*FilterRule{{ Type: utils.MetaString, Element: "~*req.Account", Values: []string{"1001", "1002"}, }}, } err := dm.SetFilter(context.Background(), fltr, true) if err != utils.ErrNotImplemented { t.Errorf("Expected error <%v>, Received error <%v>", utils.ErrNotImplemented, err) } } func TestDataManagerSetFilterErrItemReplicate(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() cfg.DataDbCfg().Items[utils.MetaFilters].Replicate = true config.SetCgrConfig(cfg) data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetIndexesDrvF: func(ctx *context.Context, idxItmType, tntCtx, idxKey, transactionID string) (indexes map[string]utils.StringSet, err error) { return nil, nil }, SetFilterDrvF: func(ctx *context.Context, fltr *Filter) error { return nil }, } fltr := &Filter{ Tenant: "cgrates.org", ID: "*stirng:~*req.Account:1001", Rules: []*FilterRule{{ Type: utils.MetaString, Element: "~*req.Account", Values: []string{"1001", "1002"}, }}, } expErr := "MANDATORY_IE_MISSING: [connIDs]" err := dm.SetFilter(context.Background(), fltr, true) if err.Error() != expErr { t.Errorf("Expected error <%v>, Received error <%v>", expErr, err) } } func TestDataManagerRemoveFilterNildm(t *testing.T) { var dm *DataManager expErr := utils.ErrNoDatabaseConn err := dm.RemoveFilter(context.Background(), utils.CGRateSorg, "fltr1", true) if err != expErr { t.Errorf("Expected error <%v>, Received error <%v>", expErr, err) } } func TestDataManagerRemoveFilterErrGetFilter(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetFilterDrvF: func(ctx *context.Context, str1, str2 string) (*Filter, error) { return nil, utils.ErrNotImplemented }, } expErr := utils.ErrNotImplemented err := dm.RemoveFilter(context.Background(), utils.CGRateSorg, "fltr1", true) if err != expErr { t.Errorf("Expected error <%v>, Received error <%v>", expErr, err) } } func TestDataManagerRemoveFilterErrGetIndexes(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetFilterDrvF: func(ctx *context.Context, str1, str2 string) (*Filter, error) { return nil, utils.ErrNotFound }, } expErr := utils.ErrNotImplemented err := dm.RemoveFilter(context.Background(), utils.CGRateSorg, "fltr1", true) if err != expErr { t.Errorf("Expected error <%v>, Received error <%v>", expErr, err) } } func TestDataManagerRemoveFilterErrGetIndexesBrokenReference(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetIndexesDrvF: func(ctx *context.Context, idxItmType, tntCtx, idxKey, transactionID string) (indexes map[string]utils.StringSet, err error) { return nil, nil }, } fltrId := "*stirng:~*req.Account:1001:4fields" expErr := "cannot remove filter because will broken the reference to following items: null" err := dm.RemoveFilter(context.Background(), utils.CGRateSorg, fltrId, true) if err.Error() != expErr { t.Errorf("Expected error <%v>, Received error <%v>", expErr, err) } } func TestDataManagerRemoveFilterErrRemoveFilterDrv(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetFilterDrvF: func(ctx *context.Context, str1 string, str2 string) (*Filter, error) { return &Filter{}, nil }, GetIndexesDrvF: func(ctx *context.Context, idxItmType, tntCtx, idxKey, transactionID string) (indexes map[string]utils.StringSet, err error) { return map[string]utils.StringSet{}, utils.ErrNotFound }, RemoveFilterDrvF: func(ctx *context.Context, str1 string, str2 string) error { return utils.ErrNotImplemented }, } fltrId := "fltr1" expErr := utils.ErrNotImplemented err := dm.RemoveFilter(context.Background(), utils.CGRateSorg, fltrId, true) if err != expErr { t.Errorf("Expected error <%v>, Received error <%v>", expErr, err) } } func TestDataManagerRemoveFilterErrNilOldFltr(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) var fltrId string var tnt string expErr := utils.ErrNotFound err := dm.RemoveFilter(context.Background(), tnt, fltrId, false) if err != expErr { t.Errorf("Expected error <%v>, Received error <%v>", expErr, err) } } func TestDataManagerRemoveFilterReplicateTrue(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() cfg.DataDbCfg().Items[utils.MetaFilters].Replicate = true cfg.DataDbCfg().RplConns = []string{} config.SetCgrConfig(cfg) data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetFilterDrvF: func(ctx *context.Context, str1 string, str2 string) (*Filter, error) { return &Filter{}, nil }, RemoveFilterDrvF: func(ctx *context.Context, str1 string, str2 string) error { return nil }, } tnt := utils.CGRateSorg fltrId := "*stirng:~*req.Account:1001" // tested replicate dm.RemoveFilter(context.Background(), tnt, fltrId, false) } func TestDataManagerRemoveAccountNilDM(t *testing.T) { var dm *DataManager expErr := utils.ErrNoDatabaseConn err := dm.RemoveAccount(context.Background(), utils.CGRateSorg, "acc1", false) if err != expErr { t.Errorf("Expected error <%v>, Received error <%v>", expErr, err) } } func TestDataManagerRemoveAccountErrGetAccount(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) { return nil, utils.ErrNotImplemented }, } expErr := utils.ErrNotImplemented err := dm.RemoveAccount(context.Background(), utils.CGRateSorg, "fltr1", false) if err != expErr { t.Errorf("Expected error <%v>, Received error <%v>", expErr, err) } } func TestDataManagerRemoveAccountErrRemoveAccountDrv(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) { return &utils.Account{}, nil }, RemoveAccountDrvF: func(ctx *context.Context, str1, str2 string) error { return utils.ErrNotImplemented }, } expErr := utils.ErrNotImplemented err := dm.RemoveAccount(context.Background(), utils.CGRateSorg, "fltr1", false) if err != expErr { t.Errorf("Expected error <%v>, Received error <%v>", expErr, err) } } func TestDataManagerRemoveAccountErrNiloldRpp(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) var fltrId string var tnt string expErr := utils.ErrNotFound err := dm.RemoveAccount(context.Background(), tnt, fltrId, false) if err != expErr { t.Errorf("Expected error <%v>, Received error <%v>", expErr, err) } } func TestDataManagerRemoveAccountErrRemoveItemFromFilterIndex(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) { return &utils.Account{}, nil }, RemoveAccountDrvF: func(ctx *context.Context, str1, str2 string) error { return nil }, SetIndexesDrvF: func(ctx *context.Context, idxItmType, tntCtx string, indexes map[string]utils.StringSet, commit bool, transactionID string) (err error) { return utils.ErrNotImplemented }, } tnt := utils.CGRateSorg fltrId := "*stirng:~*req.Account:1001" expErr := utils.ErrNotImplemented err := dm.RemoveAccount(context.Background(), tnt, fltrId, true) if err != expErr { t.Errorf("Expected error <%v>, Received error <%v>", expErr, err) } } func TestDataManagerRemoveAccountErrRemoveIndexFiltersItem(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) { return &utils.Account{ FilterIDs: []string{"fltr1"}, }, nil }, RemoveAccountDrvF: func(ctx *context.Context, str1, str2 string) error { return nil }, GetIndexesDrvF: func(ctx *context.Context, idxItmType, tntCtx, idxKey, transactionID string) (indexes map[string]utils.StringSet, err error) { return nil, utils.ErrNotImplemented }, } tnt := utils.CGRateSorg fltrId := "*stirng:~*req.Account:1001" expErr := utils.ErrNotImplemented err := dm.RemoveAccount(context.Background(), tnt, fltrId, true) if err != expErr { t.Errorf("Expected error <%v>, Received error <%v>", expErr, err) } } func TestDataManagerRemoveAccountReplicateTrue(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() cfg.DataDbCfg().Items[utils.MetaFilters].Replicate = true cfg.DataDbCfg().RplConns = []string{} config.SetCgrConfig(cfg) data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) { return &utils.Account{}, nil }, RemoveAccountDrvF: func(ctx *context.Context, str1, str2 string) error { return nil }, } tnt := utils.CGRateSorg fltrId := "*stirng:~*req.Account:1001" // tested replicate dm.RemoveAccount(context.Background(), tnt, fltrId, false) } func TestDataManagerRemoveDispatcherHostErrNilDM(t *testing.T) { var dm *DataManager if err := dm.RemoveDispatcherHost(context.Background(), utils.CGRateSorg, "*stirng:~*req.Account:1001"); err == nil || err != utils.ErrNoDatabaseConn { t.Error(err) } } func TestDataManagerRemoveDispatcherHostErroldDppNil(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) if err := dm.RemoveDispatcherHost(context.Background(), utils.CGRateSorg, "*stirng:~*req.Account:1001"); err == nil || err != utils.ErrNotFound { t.Error(err) } } func TestDataManagerRemoveDispatcherHostErrGetDisp(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetDispatcherHostDrvF: func(ctx *context.Context, s1, s2 string) (*DispatcherHost, error) { return nil, utils.ErrNotImplemented }, } if err := dm.RemoveDispatcherHost(context.Background(), utils.CGRateSorg, "*stirng:~*req.Account:1001"); err == nil || err != utils.ErrNotImplemented { t.Error(err) } } func TestDataManagerRemoveDispatcherHostErrRemoveDisp(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetDispatcherHostDrvF: func(ctx *context.Context, s1, s2 string) (*DispatcherHost, error) { return &DispatcherHost{}, nil }, RemoveDispatcherHostDrvF: func(ctx *context.Context, s1, s2 string) error { return utils.ErrNotImplemented }, } if err := dm.RemoveDispatcherHost(context.Background(), utils.CGRateSorg, "*stirng:~*req.Account:1001"); err == nil || err != utils.ErrNotImplemented { t.Error(err) } } func TestDataManagerRemoveDispatcherHostReplicateTrue(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() cfg.DataDbCfg().Items[utils.MetaDispatcherHosts].Replicate = true cfg.DataDbCfg().RplConns = []string{} config.SetCgrConfig(cfg) data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetDispatcherHostDrvF: func(ctx *context.Context, s1, s2 string) (*DispatcherHost, error) { return &DispatcherHost{}, nil }, RemoveDispatcherHostDrvF: func(ctx *context.Context, s1, s2 string) error { return nil }, } // tested replicate dm.RemoveDispatcherHost(context.Background(), utils.CGRateSorg, "*stirng:~*req.Account:1001") } func TestDataManagerSetDispatcherHostErrNilDM(t *testing.T) { var dm *DataManager if err := dm.SetDispatcherHost(context.Background(), nil); err == nil || err != utils.ErrNoDatabaseConn { t.Error(err) } } func TestDataManagerSetDispatcherHostErrDataDB(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ SetDispatcherHostDrvF: func(ctx *context.Context, dh *DispatcherHost) error { return utils.ErrNotImplemented }, } defer data.Close() if err := dm.SetDispatcherHost(context.Background(), nil); err == nil || err != utils.ErrNotImplemented { t.Error(err) } } func TestDataManagerSetDispatcherHostReplicateTrue(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() cfg.DataDbCfg().Items[utils.MetaDispatcherHosts].Replicate = true config.SetCgrConfig(cfg) data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) dm := NewDataManager(data, cfg.CacheCfg(), nil) dpp := &DispatcherHost{ Tenant: utils.CGRateSorg, RemoteHost: &config.RemoteHost{ ID: "ID", Address: "127.0.0.1", Transport: utils.MetaJSON, ConnectAttempts: 1, Reconnects: 1, MaxReconnectInterval: time.Minute, ConnectTimeout: time.Nanosecond, ReplyTimeout: time.Nanosecond, TLS: true, ClientKey: "key", ClientCertificate: "ce", CaCertificate: "ca", }, } // tested replicate dm.SetDispatcherHost(context.Background(), dpp) } func TestDMRemoveAccountReplicate(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() cfg.DataDbCfg().Items[utils.MetaAccounts].Replicate = true config.SetCgrConfig(cfg) data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) { return &utils.Account{}, nil }, RemoveAccountDrvF: func(ctx *context.Context, str1, str2 string) error { return nil }, } // tested replicate if err := dm.RemoveAccount(context.Background(), utils.CGRateSorg, "accId", false); err != nil { t.Error(err) } } func TestDMSetAccountNilDM(t *testing.T) { var dm *DataManager ap := &utils.Account{} expErr := utils.ErrNoDatabaseConn if err := dm.SetAccount(context.Background(), ap, false); err == nil || err != utils.ErrNoDatabaseConn { t.Errorf("Expected error <%v>, Received <%v>", expErr, err) } } func TestDMSetAccountcheckFiltersErr(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) ap := &utils.Account{ Tenant: "cgrates.org", ID: "accId", Weights: []*utils.DynamicWeight{ { Weight: 0, }, }, FilterIDs: []string{":::"}, Balances: map[string]*utils.Balance{ "AbstractBalance1": { ID: "AbstractBalance1", Weights: utils.DynamicWeights{ { Weight: 25, }, }, Type: utils.MetaAbstract, Units: utils.NewDecimal(int64(40*time.Second), 0), CostIncrements: []*utils.CostIncrement{ { Increment: utils.NewDecimal(int64(time.Second), 0), FixedFee: utils.NewDecimal(0, 0), RecurrentFee: utils.NewDecimal(0, 0), }, }, }, }, Blockers: utils.DynamicBlockers{ { FilterIDs: []string{"fltrID"}, Blocker: true, }, }, Opts: make(map[string]interface{}), ThresholdIDs: []string{utils.MetaNone}, } expErr := "broken reference to filter: <:::> for item with ID: cgrates.org:accId" if err := dm.SetAccount(context.Background(), ap, true); err == nil || err.Error() != expErr { t.Errorf("Expected error <%v>, Received <%v>", expErr, err) } } func TestDMSetAccountGetAccountErr(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) { return nil, utils.ErrNotImplemented }, } ap := &utils.Account{ Tenant: "cgrates.org", ID: "accId", Weights: []*utils.DynamicWeight{ { Weight: 0, }, }, FilterIDs: []string{"*stirng:~*req.Account:1001"}, Balances: map[string]*utils.Balance{ "AbstractBalance1": { ID: "AbstractBalance1", Weights: utils.DynamicWeights{ { Weight: 25, }, }, Type: utils.MetaAbstract, Units: utils.NewDecimal(int64(40*time.Second), 0), CostIncrements: []*utils.CostIncrement{ { Increment: utils.NewDecimal(int64(time.Second), 0), FixedFee: utils.NewDecimal(0, 0), RecurrentFee: utils.NewDecimal(0, 0), }, }, }, }, Blockers: utils.DynamicBlockers{ { FilterIDs: []string{"fltrID"}, Blocker: true, }, }, Opts: make(map[string]interface{}), ThresholdIDs: []string{utils.MetaNone}, } expErr := utils.ErrNotImplemented if err := dm.SetAccount(context.Background(), ap, true); err == nil || err != expErr { t.Errorf("Expected error <%v>, Received <%v>", expErr, err) } } func TestDMSetAccountSetAccountDrvErr(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) { return &utils.Account{ Tenant: "cgrates.org", }, nil }, SetAccountDrvF: func(ctx *context.Context, profile *utils.Account) error { return utils.ErrNotImplemented }, } ap := &utils.Account{ Tenant: "cgrates.org", ID: "accId", Weights: []*utils.DynamicWeight{ { Weight: 0, }, }, FilterIDs: []string{"*stirng:~*req.Account:1001"}, Balances: map[string]*utils.Balance{ "AbstractBalance1": { ID: "AbstractBalance1", Weights: utils.DynamicWeights{ { Weight: 25, }, }, Type: utils.MetaAbstract, Units: utils.NewDecimal(int64(40*time.Second), 0), CostIncrements: []*utils.CostIncrement{ { Increment: utils.NewDecimal(int64(time.Second), 0), FixedFee: utils.NewDecimal(0, 0), RecurrentFee: utils.NewDecimal(0, 0), }, }, }, }, Blockers: utils.DynamicBlockers{ { FilterIDs: []string{"fltrID"}, Blocker: true, }, }, Opts: make(map[string]interface{}), ThresholdIDs: []string{utils.MetaNone}, } expErr := utils.ErrNotImplemented if err := dm.SetAccount(context.Background(), ap, true); err == nil || err != expErr { t.Errorf("Expected error <%v>, Received <%v>", expErr, err) } } func TestDMSetAccountupdatedIndexesErr(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) { return &utils.Account{ Tenant: "cgrates.org", }, nil }, SetAccountDrvF: func(ctx *context.Context, profile *utils.Account) error { return nil }, } ap := &utils.Account{ Tenant: "cgrates.org", ID: "accId", Weights: []*utils.DynamicWeight{ { Weight: 0, }, }, FilterIDs: []string{"*stirng:~*req.Account:1001"}, Balances: map[string]*utils.Balance{ "AbstractBalance1": { ID: "AbstractBalance1", Weights: utils.DynamicWeights{ { Weight: 25, }, }, Type: utils.MetaAbstract, Units: utils.NewDecimal(int64(40*time.Second), 0), CostIncrements: []*utils.CostIncrement{ { Increment: utils.NewDecimal(int64(time.Second), 0), FixedFee: utils.NewDecimal(0, 0), RecurrentFee: utils.NewDecimal(0, 0), }, }, }, }, Blockers: utils.DynamicBlockers{ { FilterIDs: []string{"fltrID"}, Blocker: true, }, }, Opts: make(map[string]interface{}), ThresholdIDs: []string{utils.MetaNone}, } expErr := utils.ErrNotImplemented if err := dm.SetAccount(context.Background(), ap, true); err == nil || err != expErr { t.Errorf("Expected error <%v>, Received <%v>", expErr, err) } } func TestDMSetAccountReplicateTrue(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() cfg := config.NewDefaultCGRConfig() cfg.DataDbCfg().Items[utils.MetaAccounts].Replicate = true config.SetCgrConfig(cfg) data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) { return &utils.Account{}, nil }, SetAccountDrvF: func(ctx *context.Context, profile *utils.Account) error { return nil }, } ap := &utils.Account{ Tenant: "cgrates.org", ID: "accId", Weights: []*utils.DynamicWeight{ { Weight: 0, }, }, FilterIDs: []string{"*stirng:~*req.Account:1001"}, Balances: map[string]*utils.Balance{ "AbstractBalance1": { ID: "AbstractBalance1", Weights: utils.DynamicWeights{ { Weight: 25, }, }, Type: utils.MetaAbstract, Units: utils.NewDecimal(int64(40*time.Second), 0), CostIncrements: []*utils.CostIncrement{ { Increment: utils.NewDecimal(int64(time.Second), 0), FixedFee: utils.NewDecimal(0, 0), RecurrentFee: utils.NewDecimal(0, 0), }, }, }, }, Blockers: utils.DynamicBlockers{ { FilterIDs: []string{"fltrID"}, Blocker: true, }, }, Opts: make(map[string]interface{}), ThresholdIDs: []string{utils.MetaNone}, } // tests replicete dm.SetAccount(context.Background(), ap, false) } func TestDMRemoveThresholdProfileNilDM(t *testing.T) { var dm *DataManager expErr := utils.ErrNoDatabaseConn if err := dm.RemoveThresholdProfile(context.Background(), utils.CGRateSorg, "ThrPrf1", false); err == nil || err != utils.ErrNoDatabaseConn { t.Errorf("Expected error <%v>, Received <%v>", expErr, err) } } func TestDMRemoveThresholdProfileGetErr(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) { return nil, utils.ErrNotImplemented }, } expErr := utils.ErrNotImplemented if err := dm.RemoveThresholdProfile(context.Background(), utils.CGRateSorg, "ThrPrf1", false); err == nil || err != expErr { t.Errorf("Expected error <%v>, Received <%v>", expErr, err) } } func TestDMRemoveThresholdProfileRmvErr(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) { return nil, nil }, RemThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (err error) { return utils.ErrNotImplemented }, } expErr := utils.ErrNotImplemented if err := dm.RemoveThresholdProfile(context.Background(), utils.CGRateSorg, "ThrPrf1", false); err == nil || err != expErr { t.Errorf("Expected error <%v>, Received <%v>", expErr, err) } } func TestDMRemoveThresholdProfileOldThrNil(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) { return nil, nil }, RemThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (err error) { return nil }, } expErr := utils.ErrNotFound if err := dm.RemoveThresholdProfile(context.Background(), utils.CGRateSorg, "ThrPrf1", false); err == nil || err != expErr { t.Errorf("Expected error <%v>, Received <%v>", expErr, err) } } func TestDMRemoveThresholdProfileIndxTrueErr1(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) { return &ThresholdProfile{ Tenant: "cgrates.org", ID: "THD_2", FilterIDs: []string{"*string:~*req.Account:1001"}, ActionProfileIDs: []string{"actPrfID"}, MaxHits: 7, MinHits: 0, Weights: utils.DynamicWeights{ { Weight: 20, }, }, Async: true, }, nil }, RemThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (err error) { return nil }, } expErr := utils.ErrNotImplemented if err := dm.RemoveThresholdProfile(context.Background(), utils.CGRateSorg, "THD_2", true); err == nil || err != expErr { t.Errorf("Expected error <%v>, Received <%v>", expErr, err) } } func TestDMRemoveThresholdProfileIndxTrueErr2(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) { return &ThresholdProfile{ Tenant: "cgrates.org", ID: "THD_2", FilterIDs: []string{"*string:~*req.Account:1001", "noPrefix"}, ActionProfileIDs: []string{"actPrfID"}, MaxHits: 7, MinHits: 0, Weights: utils.DynamicWeights{ { Weight: 20, }, }, Async: true, }, nil }, RemThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (err error) { return nil }, GetIndexesDrvF: func(ctx *context.Context, idxItmType, tntCtx, idxKey, transactionID string) (indexes map[string]utils.StringSet, err error) { return nil, utils.ErrNotImplemented }, } expErr := utils.ErrNotImplemented if err := dm.RemoveThresholdProfile(context.Background(), utils.CGRateSorg, "THD_2", true); err == nil || err != expErr { t.Errorf("Expected error <%v>, Received <%v>", expErr, err) } } func TestDMRemoveThresholdProfileReplicateTrue(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() cfg := config.NewDefaultCGRConfig() cfg.DataDbCfg().Items[utils.MetaThresholdProfiles].Replicate = true config.SetCgrConfig(cfg) data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) { return &ThresholdProfile{ Tenant: "cgrates.org", ID: "THD_2", FilterIDs: []string{"*string:~*req.Account:1001"}, ActionProfileIDs: []string{"actPrfID"}, MaxHits: 7, MinHits: 0, Weights: utils.DynamicWeights{ { Weight: 20, }, }, Async: true, }, nil }, RemThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (err error) { return nil }, } // tests replicate dm.RemoveThresholdProfile(context.Background(), utils.CGRateSorg, "THD_2", false) } func TestDMSetThresholdErr(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ SetThresholdDrvF: func(ctx *context.Context, t *Threshold) error { return utils.ErrNotImplemented }, } th := &Threshold{ Tenant: "cgrates.org", ID: "TH_1", Hits: 0, } expErr := utils.ErrNotImplemented if err := dm.SetThreshold(context.Background(), th); err == nil || err != expErr { t.Errorf("Expected error <%v>, Received <%v>", expErr, err) } } func TestDMSetThresholdReplicateTrue(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() cfg.DataDbCfg().Items[utils.MetaThresholds].Replicate = true config.SetCgrConfig(cfg) data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) th := &Threshold{ Tenant: "cgrates.org", ID: "TH_1", Hits: 0, } // tests replicate dm.SetThreshold(context.Background(), th) } func TestDMRemoveThresholdReplicateTrue(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() cfg.DataDbCfg().Items[utils.MetaThresholds].Replicate = true config.SetCgrConfig(cfg) data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) th := &Threshold{ Tenant: "cgrates.org", ID: "TH_1", Hits: 0, } if err := dm.DataDB().SetThresholdDrv(context.Background(), th); err != nil { t.Error(err) } rcv, err := dm.GetThreshold(context.Background(), utils.CGRateSorg, "TH_1", true, false, utils.NonTransactional) if err != nil { t.Error(err) } else if th != rcv { t.Errorf("Expected <%+v> , Received <%+v>", th, rcv) } // tests replicate if err := dm.RemoveThreshold(context.Background(), "cgrates.org", "TH_1"); err != nil { t.Error(err) } if getRcv, err := dm.GetThreshold(context.Background(), utils.CGRateSorg, "TH_1", true, false, utils.NonTransactional); err == nil || err != utils.ErrNotFound { t.Error(err) } else if getRcv != nil { t.Errorf("Expected <%+v>, \nReceived <%+v>\n", nil, getRcv) } } func TestDMGetThresholdCacheGetErr(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) if err := Cache.Set(context.Background(), utils.CacheThresholds, utils.ConcatenatedKey(utils.CGRateSorg, "TH_1"), nil, []string{}, true, utils.NonTransactional); err != nil { t.Error(err) } _, err := dm.GetThreshold(context.Background(), utils.CGRateSorg, "TH_1", true, false, utils.NonTransactional) if err == nil || err != utils.ErrNotFound { t.Error(err) } } // unfinished, getting **Threshold GetThresholdDrv outputing *, we need plain // func TestDMGetThresholdSetThErr(t *testing.T) { // tmp := Cache // cfgtmp := config.CgrConfig() // tmpCM := connMgr // defer func() { // Cache = tmp // config.SetCgrConfig(cfgtmp) // connMgr = tmpCM // }() // Cache.Clear(nil) // cfg := config.NewDefaultCGRConfig() // cfg.DataDbCfg().Items[utils.MetaThresholds].Remote = true // cfg.DataDbCfg().RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, // utils.MetaThresholds)} // config.SetCgrConfig(cfg) // data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) // th := &Threshold{ // Tenant: "cgrates.org", // ID: "TH_1", // Hits: 0, // } // cc := &ccMock{ // calls: map[string]func(ctx *context.Context, args interface{}, reply interface{}) error{ // utils.ReplicatorSv1GetThreshold: func(ctx *context.Context, args, reply interface{}) error { // rplCast, canCast := reply.(*Threshold) // if !canCast { // t.Errorf("Wrong argument type : %T", reply) // return nil // } // *rplCast = *th // return nil // }, // }, // } // rpcInternal := make(chan birpc.ClientConnector, 1) // rpcInternal <- cc // cM := NewConnManager(cfg) // cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaThresholds), utils.ReplicatorSv1, rpcInternal) // dm := NewDataManager(data, cfg.CacheCfg(), cM) // _, err := dm.GetThreshold(context.Background(), utils.CGRateSorg, "TH_1", false, false, utils.NonTransactional) // if err == nil || err != utils.ErrNotFound { // t.Error(err) // } // } func TestDMGetThresholdSetThErr(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)} cfg.CacheCfg().Partitions[utils.MetaThresholds].Replicate = true config.SetCgrConfig(cfg) data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cc := make(chan birpc.ClientConnector, 1) cc <- &ccMock{ calls: map[string]func(ctx *context.Context, args interface{}, reply interface{}) error{ utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply interface{}) error { return utils.ErrNotImplemented }, }, } cM := NewConnManager(cfg) cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc) dm := NewDataManager(data, cfg.CacheCfg(), cM) Cache = NewCacheS(cfg, dm, connMgr, nil) expErr := utils.ErrNotImplemented _, err := dm.GetThreshold(context.Background(), utils.CGRateSorg, "TH_1", false, true, utils.NonTransactional) if err == nil || err != expErr { t.Errorf("Expected <%v> , Received <%v>", expErr, err) } } func TestDMSetStatQueueNewErr(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) experr := "marshal mock error" dm.ms = mockMarshal(experr) sq := &StatQueue{ SQMetrics: map[string]StatMetric{ "key": statMetricMock(""), }, } if err := dm.SetStatQueue(context.Background(), sq); err == nil || err.Error() != experr { t.Errorf("Expected error <%v>, Received <%v>", experr, err) } } func TestDMSetStatQueueSetDrvErr(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ SetStatQueueDrvF: func(ctx *context.Context, ssq *StoredStatQueue, sq *StatQueue) error { return utils.ErrNotImplemented }, } sq := &StatQueue{ SQMetrics: map[string]StatMetric{ utils.MetaASR: &StatASR{ Metric: &Metric{ Value: utils.NewDecimal(1, 0), Count: 1, Events: map[string]*DecimalWithCompress{ "cgrates.org:TestStatRemExpired_1": {Stat: utils.NewDecimalFromFloat64(1), CompressFactor: 1}, }, }, }, }, sqPrfl: &StatQueueProfile{ Metrics: []*MetricWithFilters{ { MetricID: utils.MetaASR, }, }, }, } expErr := utils.ErrNotImplemented if err := dm.SetStatQueue(context.Background(), sq); err != expErr { t.Errorf("Expected error <%v>, Received <%v>", expErr, err) } } func TestDMSetStatQueueReplicateTrue(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() cfg.DataDbCfg().Items[utils.MetaStatQueues].Replicate = true config.SetCgrConfig(cfg) data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) sq := &StatQueue{ SQMetrics: map[string]StatMetric{ utils.MetaASR: &StatASR{ Metric: &Metric{ Value: utils.NewDecimal(1, 0), Count: 1, Events: map[string]*DecimalWithCompress{ "cgrates.org:TestStatRemExpired_1": {Stat: utils.NewDecimalFromFloat64(1), CompressFactor: 1}, }, }, }, }, sqPrfl: &StatQueueProfile{ Metrics: []*MetricWithFilters{ { MetricID: utils.MetaASR, }, }, }, } // tests replicate dm.SetStatQueue(context.Background(), sq) } func TestDMGetThresholdProfileSetThErr2(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)} cfg.CacheCfg().Partitions[utils.MetaThresholds].Replicate = true config.SetCgrConfig(cfg) data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cc := make(chan birpc.ClientConnector, 1) cc <- &ccMock{ calls: map[string]func(ctx *context.Context, args interface{}, reply interface{}) error{ utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply interface{}) error { return utils.ErrNotImplemented }, }, } cM := NewConnManager(cfg) cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetThresholdDrvF: func(ctx *context.Context, tenant, id string) (*Threshold, error) { return &Threshold{}, nil }, } Cache = NewCacheS(cfg, dm, connMgr, nil) expErr := utils.ErrNotImplemented _, err := dm.GetThreshold(context.Background(), utils.CGRateSorg, "TH_1", false, true, utils.NonTransactional) if err == nil || err != expErr { t.Errorf("Expected <%v> , Received <%v>", expErr, err) } } func TestDMGetThresholdGetThProflErr(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) if err := Cache.Set(context.Background(), utils.CacheThresholdProfiles, utils.ConcatenatedKey(utils.CGRateSorg, "TH_1"), nil, []string{}, true, utils.NonTransactional); err != nil { t.Error(err) } expErr := utils.ErrNotFound _, err := dm.GetThresholdProfile(context.Background(), utils.CGRateSorg, "TH_1", true, true, utils.NonTransactional) if err == nil || err != expErr { t.Errorf("Expected <%v> , Received <%v>", expErr, err) } } func TestDMGetThresholdProfileDMErr(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() Cache.Clear(nil) var dm *DataManager expErr := utils.ErrNoDatabaseConn _, err := dm.GetThresholdProfile(context.Background(), utils.CGRateSorg, "TH_1", true, true, utils.NonTransactional) if err == nil || err != expErr { t.Errorf("Expected <%v> , Received <%v>", expErr, err) } } // unfinished, open issue // func TestGetThresholdProfileSetThErr(t *testing.T) { // tmp := Cache // cfgtmp := config.CgrConfig() // tmpCM := connMgr // defer func() { // Cache = tmp // config.SetCgrConfig(cfgtmp) // connMgr = tmpCM // }() // Cache.Clear(nil) // cfg := config.NewDefaultCGRConfig() // cfg.DataDbCfg().Items[utils.MetaThresholdProfiles].Remote = true // cfg.DataDbCfg().RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, // utils.MetaThresholds)} // config.SetCgrConfig(cfg) // data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) // th := &Threshold{ // Tenant: "cgrates.org", // ID: "TH_1", // Hits: 0, // } // cc := &ccMock{ // calls: map[string]func(ctx *context.Context, args interface{}, reply interface{}) error{ // utils.ReplicatorSv1GetThresholdProfile: func(ctx *context.Context, args, reply interface{}) error { // rplCast, canCast := reply.(*Threshold) // if !canCast { // t.Errorf("Wrong argument type : %T", reply) // return nil // } // *rplCast = *th // return nil // }, // }, // } // rpcInternal := make(chan birpc.ClientConnector, 1) // rpcInternal <- cc // cM := NewConnManager(cfg) // cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaThresholds), utils.ReplicatorSv1, rpcInternal) // dm := NewDataManager(data, cfg.CacheCfg(), cM) // _, err := dm.GetThresholdProfile(context.Background(), utils.CGRateSorg, "TH_1", false, false, utils.NonTransactional) // if err == nil || err != utils.ErrNotFound { // t.Error(err) // } // } func TestDMGetThresholdProfileSetThPrfErr(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)} cfg.CacheCfg().Partitions[utils.MetaThresholdProfiles].Replicate = true config.SetCgrConfig(cfg) data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cc := make(chan birpc.ClientConnector, 1) cc <- &ccMock{ calls: map[string]func(ctx *context.Context, args interface{}, reply interface{}) error{ utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply interface{}) error { return utils.ErrNotImplemented }, }, } cM := NewConnManager(cfg) cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc) dm := NewDataManager(data, cfg.CacheCfg(), cM) Cache = NewCacheS(cfg, dm, connMgr, nil) expErr := utils.ErrNotImplemented _, err := dm.GetThresholdProfile(context.Background(), utils.CGRateSorg, "TH_1", false, true, utils.NonTransactional) if err == nil || err != expErr { t.Errorf("Expected <%v> , Received <%v>", expErr, err) } } func TestDMGetThresholdProfileSetThPrfErr2(t *testing.T) { tmp := Cache cfgtmp := config.CgrConfig() defer func() { Cache = tmp config.SetCgrConfig(cfgtmp) }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)} cfg.CacheCfg().Partitions[utils.MetaThresholdProfiles].Replicate = true config.SetCgrConfig(cfg) data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cc := make(chan birpc.ClientConnector, 1) cc <- &ccMock{ calls: map[string]func(ctx *context.Context, args interface{}, reply interface{}) error{ utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply interface{}) error { return utils.ErrNotImplemented }, }, } cM := NewConnManager(cfg) cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc) dm := NewDataManager(data, cfg.CacheCfg(), cM) dm.dataDB = &DataDBMock{ GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) { return &ThresholdProfile{}, nil }, } Cache = NewCacheS(cfg, dm, connMgr, nil) expErr := utils.ErrNotImplemented _, err := dm.GetThresholdProfile(context.Background(), utils.CGRateSorg, "TH_1", false, true, utils.NonTransactional) if err == nil || err != expErr { t.Errorf("Expected <%v> , Received <%v>", expErr, err) } } // unfinished set without using cache.set and then go cache.get func TestDMCacheDataFromDBResourceProfilesPrefix(t *testing.T) { tmp := Cache defer func() { Cache = tmp }() Cache.Clear(nil) cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) cM := NewConnManager(cfg) dm := NewDataManager(data, cfg.CacheCfg(), cM) if err := Cache.Set(context.Background(), utils.CachePrefixToInstance[utils.ResourceProfilesPrefix], "cgrates.org:RL2", &ResourceProfile{}, []string{}, true, utils.NonTransactional); err != nil { t.Error(err) } rp := &ResourceProfile{ Tenant: "cgrates.org", ID: "RL2", FilterIDs: []string{"fltr_test"}, Weights: utils.DynamicWeights{ { Weight: 100, }}, Limit: 2, ThresholdIDs: []string{"TEST_ACTIONS"}, Blocker: false, UsageTTL: time.Millisecond, AllocationMessage: "ALLOC", } if err := dm.SetResourceProfile(context.Background(), rp, false); err != nil { t.Error(err) } if err := dm.CacheDataFromDB(context.Background(), utils.ResourceProfilesPrefix, []string{utils.MetaAny}, true); err != nil { t.Error(err) } }