diff --git a/engine/datamanager_test.go b/engine/datamanager_test.go index 418f2227e..b9ee00dd3 100644 --- a/engine/datamanager_test.go +++ b/engine/datamanager_test.go @@ -19,6 +19,7 @@ package engine import ( "errors" + "fmt" "reflect" "testing" "time" @@ -1362,6 +1363,62 @@ func TestDMThresholdProfile(t *testing.T) { } } +func TestDMRemoveThresholdProfileErr(t *testing.T) { + cfg := config.NewDefaultCGRConfig() + tmpDm := dm + tmp := Cache + defer func() { + config.SetCgrConfig(config.NewDefaultCGRConfig()) + Cache = tmp + SetDataStorage(tmpDm) + }() + Cache.Clear(nil) + cfg.DataDbCfg().Items = map[string]*config.ItemOpt{ + utils.MetaThresholdProfiles: { + Remote: true, + }, + } + cfg.DataDbCfg().RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)} + db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) + clientConn := make(chan rpcclient.ClientConnector, 1) + clientConn <- &ccMock{ + calls: map[string]func(args interface{}, reply interface{}) error{ + utils.ReplicatorSv1GetThresholdProfile: func(args, reply interface{}) error { + return fmt.Errorf("Can't Replicate") + }, + }, + } + connMgr := NewConnManager(cfg, map[string]chan rpcclient.ClientConnector{ + utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator): clientConn, + }) + dm := NewDataManager(db, cfg.CacheCfg(), connMgr) + Cache.Set(utils.MetaThresholdProfiles, "cgrates.org:TEST_PROFILE1", nil, []string{}, true, utils.NonTransactional) + if err := dm.RemoveThresholdProfile("cgrates.org", "TEST_PROFILE1", true); err == nil || err != utils.ErrNotFound { + t.Error(err) + } + Cache.Remove(utils.MetaThresholdProfiles, "cgrates.org:TEST_PROFILE1", true, utils.NonTransactional) + var dm2 *DataManager + if err = dm2.RemoveThresholdProfile("cgrates.org", "TEST_PROFILE1", true); err == nil || err != utils.ErrNoDatabaseConn { + t.Error(err) + } + dm2 = NewDataManager(db, cfg.CacheCfg(), nil) + dm2.dataDB = &DataDBMock{ + GetThresholdProfileDrvF: func(tenant, id string) (tp *ThresholdProfile, err error) { + return + }, + RemThresholdProfileDrvF: func(tenant, id string) (err error) { + return utils.ErrNotImplemented + }, + } + if err = dm2.RemoveThresholdProfile("cgrates.org", "TEST_PROFILE1", true); err == nil || err != utils.ErrNotImplemented { + t.Error(err) + } + config.SetCgrConfig(cfg) + if err = dm.RemoveThresholdProfile("cgrates.org", "TEST_PROFILE1", true); err == nil || err.Error() != "Can't Replicate" { + t.Error(err) + } + +} func TestDmDispatcherHost(t *testing.T) { cfg := config.NewDefaultCGRConfig() tmpDm := dm @@ -4043,6 +4100,55 @@ func TestCacheDataFromDB(t *testing.T) { t.Error(err) } } +func TestCacheDataFromDBErr(t *testing.T) { + cfg := config.NewDefaultCGRConfig() + tmpDm := dm + tmp := Cache + tmpConn := connMgr + defer func() { + config.SetCgrConfig(config.NewDefaultCGRConfig()) + Cache = tmp + SetDataStorage(tmpDm) + SetConnManager(tmpConn) + }() + Cache.Clear(nil) + cfg.DataDbCfg().Items = map[string]*config.ItemOpt{ + utils.MetaThresholdProfiles: { + Remote: true, + }, + } + cfg.DataDbCfg().RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)} + cfg.CacheCfg().Partitions[utils.CacheThresholdProfiles].Replicate = true + cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaCaches)} + db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) + clientConn := make(chan rpcclient.ClientConnector, 1) + clientConn <- &ccMock{ + calls: map[string]func(args interface{}, reply interface{}) error{ + utils.ReplicatorSv1GetThresholdProfile: func(args, reply interface{}) error { + return errors.New("Another Error") + }, + utils.CacheSv1ReplicateSet: func(args, reply interface{}) error { + return fmt.Errorf("New Error") + }, + }, + } + connMgr := NewConnManager(cfg, map[string]chan rpcclient.ClientConnector{ + utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator): clientConn, + utils.ConcatenatedKey(utils.MetaInternal, utils.MetaCaches): clientConn, + }) + dm := NewDataManager(db, cfg.CacheCfg(), connMgr) + Cache = NewCacheS(cfg, dm, nil) + SetConnManager(connMgr) + thdPrf := &ThresholdProfile{ + Tenant: "cgrates.org", + ID: "TH1", + FilterIDs: []string{"*string:~*req.Account:1001", "*notstring:~*req.Destination:+49123"}, + } + + if err := dm.CacheDataFromDB(utils.ThresholdProfilePrefix, []string{utils.ConcatenatedKey(thdPrf.Tenant, thdPrf.ID)}, false); err == nil { + t.Error(err) + } +} func TestDMGetRouteProfile(t *testing.T) { cfg := config.NewDefaultCGRConfig() @@ -4526,3 +4632,96 @@ func TestDmIndexes(t *testing.T) { t.Error(err) } } + +func TestDmCheckFilters(t *testing.T) { + cfg := config.NewDefaultCGRConfig() + defer func() { + config.SetCgrConfig(config.NewDefaultCGRConfig()) + }() + cfg.DataDbCfg().Items = map[string]*config.ItemOpt{ + utils.MetaFilters: { + Remote: true, + }, + } + cfg.DataDbCfg().RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)} + clientConn := make(chan rpcclient.ClientConnector, 1) + clientConn <- &ccMock{ + calls: map[string]func(args interface{}, reply interface{}) error{ + utils.ReplicatorSv1GetFilter: func(args, reply interface{}) error { + fltr := &Filter{ + ID: "FLTR_1", + Tenant: "cgrates.org", + Rules: []*FilterRule{ + { + Type: utils.MetaString, + Element: "~*req.Account", + Values: []string{"1001", "1002"}, + }, + }, + } + *reply.(*Filter) = *fltr + return nil + }, + }, + } + connMgr := NewConnManager(cfg, map[string]chan rpcclient.ClientConnector{ + utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator): clientConn, + }) + db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) + dm := NewDataManager(db, cfg.CacheCfg(), connMgr) + config.SetCgrConfig(cfg) + if err := dm.checkFilters("cgrates.org", []string{"FLTR_1"}); err == nil || err.Error() != "broken reference to filter: " { + t.Error(err) + } +} + +func TestRemoveFilterIndexes(t *testing.T) { + cfg := config.NewDefaultCGRConfig() + defer func() { + config.SetCgrConfig(config.NewDefaultCGRConfig()) + }() + cfg.DataDbCfg().Items = map[string]*config.ItemOpt{ + utils.CacheThresholdFilterIndexes: { + Remote: true, + }, + } + cfg.DataDbCfg().RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)} + clientConn := make(chan rpcclient.ClientConnector, 1) + clientConn <- &ccMock{ + calls: map[string]func(args interface{}, reply interface{}) error{ + utils.ReplicatorSv1GetIndexes: func(args, reply interface{}) error { + return utils.ErrNotImplemented + }, + }, + } + connMgr := NewConnManager(cfg, map[string]chan rpcclient.ClientConnector{ + utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator): clientConn, + }) + db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) + dm := NewDataManager(db, cfg.CacheCfg(), connMgr) + fp3 := &Filter{ + Tenant: "cgrates.org", + ID: "Filter3", + Rules: []*FilterRule{ + { + Element: "~*req.Destination", + Type: utils.MetaString, + Values: []string{"30", "50"}, + }, + }} + if err := dm.SetFilter(fp3, true); err != nil { + t.Error(err) + } + + if err := removeFilterIndexesForFilter(dm, utils.CacheThresholdFilterIndexes, "cgrates.org", []string{"Filter3"}, utils.StringSet{ + "Filter3:THD1": {}, + }); err != nil { + t.Error(err) + } + config.SetCgrConfig(cfg) + if err := removeFilterIndexesForFilter(dm, utils.CacheThresholdFilterIndexes, "cgrates.org", []string{"Filter3"}, utils.StringSet{ + "Filter3:THD1": {}, + }); err == nil || err != utils.ErrUnsupporteServiceMethod { + t.Error(err) + } +} diff --git a/engine/tpreader_test.go b/engine/tpreader_test.go index 4244048db..1d8dfc3ca 100644 --- a/engine/tpreader_test.go +++ b/engine/tpreader_test.go @@ -2061,3 +2061,142 @@ func TestTPRLoadAccountActions(t *testing.T) { t.Error(err) } } +func TestTpReaderRemoveFromDatabase(t *testing.T) { + cfg := config.NewDefaultCGRConfig() + defer func() { + config.SetCgrConfig(config.NewDefaultCGRConfig()) + }() + db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) + tpr, err := NewTpReader(db, db, "", "", nil, nil, false) + if err != nil { + t.Error(err) + } + dest := &Destination{ + Id: "DST2", + Prefixes: []string{"1001"}, + } + tpr.destinations = map[string]*Destination{ + "GERMANY": dest, + } + if tpr.dm.SetDestination(dest, utils.NonTransactional); err != nil { + t.Error(err) + } + acc := &Account{ + ID: "cgrates.org:1001", + } + ap1 := &ActionPlan{ + Id: "TestActionPlansRemoveMember1", + AccountIDs: utils.StringMap{"one": true}, + ActionTimings: []*ActionTiming{ + { + Uuid: "uuid1", + Timing: &RateInterval{ + Timing: &RITiming{ + Years: utils.Years{2012}, + Months: utils.Months{}, + MonthDays: utils.MonthDays{}, + WeekDays: utils.WeekDays{}, + StartTime: utils.MetaASAP, + }, + }, + Weight: 10, + ActionsID: "MINI", + }, + }, + } + if err := tpr.dm.SetAccount(acc); err != nil { + t.Error(err) + } + if err := tpr.dm.SetActionPlan(ap1.Id, ap1, true, utils.NonTransactional); err != nil { + t.Error(err) + } + if err = tpr.dm.SetAccountActionPlans(acc.ID, []string{ap1.Id}, false); err != nil { + t.Error(err) + } + tpr.acntActionPlans = map[string][]string{ + acc.ID: {ap1.Id}, + } + if err := tpr.RemoveFromDatabase(false, false); err != nil { + t.Error(err) + } + if err := tpr.RemoveFromDatabase(false, true); err == nil || err != utils.ErrNotFound { + t.Error(err) + } +} + +func TestTpReaderRemoveFromDatabaseDspPrf(t *testing.T) { + cfg := config.NewDefaultCGRConfig() + defer func() { + config.SetCgrConfig(config.NewDefaultCGRConfig()) + }() + db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) + tpr, err := NewTpReader(db, db, "", "", nil, nil, false) + if err != nil { + t.Error(err) + } + dspPrf := &DispatcherProfile{ + Tenant: "cgrates.org", + ID: "Dsp1", + FilterIDs: []string{"*string:~*req.Accont:1001"}, + ActivationInterval: &utils.ActivationInterval{ + ActivationTime: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC), + ExpiryTime: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC), + }, + Strategy: utils.MetaRandom, + Weight: 20, + } + if err := tpr.dm.SetDispatcherProfile(dspPrf, true); err != nil { + t.Error(err) + } + tpr.dispatcherProfiles = map[utils.TenantID]*utils.TPDispatcherProfile{ + { + Tenant: "cgrates.org", + ID: "Dsp1", + }: { + Tenant: "cgrates.org", + ID: "Dsp1", + }, + } + if err = tpr.RemoveFromDatabase(false, true); err != nil { + t.Error(err) + } + if err = tpr.RemoveFromDatabase(false, true); err == nil || err != utils.ErrDSPProfileNotFound { + t.Error(err) + } +} + +func TestTpReaderRemoveFromDatabaseDspHst(t *testing.T) { + cfg := config.NewDefaultCGRConfig() + defer func() { + config.SetCgrConfig(config.NewDefaultCGRConfig()) + }() + db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) + tpr, err := NewTpReader(db, db, "", "", nil, nil, false) + if err != nil { + t.Error(err) + } + dspHst := &DispatcherHost{ + Tenant: "cgrates.org", + RemoteHost: &config.RemoteHost{ + ID: "Host2", + Address: "127.0.0.1:2013", + TLS: false, + Transport: utils.MetaGOB, + }, + } + if err = tpr.dm.SetDispatcherHost(dspHst); err != nil { + t.Error(err) + } + tpr.dispatcherHosts = map[utils.TenantID]*utils.TPDispatcherHost{ + {}: { + ID: "Host2", + Tenant: "cgrates.org", + }, + } + if err = tpr.RemoveFromDatabase(false, true); err != nil { + t.Error(err) + } + if err = tpr.RemoveFromDatabase(false, true); err == nil || err != utils.ErrDSPHostNotFound { + t.Error(err) + } +}