diff --git a/engine/datamanager_test.go b/engine/datamanager_test.go index accf43112..462f0f544 100644 --- a/engine/datamanager_test.go +++ b/engine/datamanager_test.go @@ -20,7 +20,6 @@ package engine import ( "errors" "reflect" - "strings" "testing" "time" @@ -1792,21 +1791,23 @@ func TestGetResourceRemote(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.CacheCfg().Partitions[utils.CacheResources].Replicate = true cfg.DataDbCfg().RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)} - cfg.DataDbCfg().RplFiltered = true + cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaCaches)} cfg.DataDbCfg().Items = map[string]*config.ItemOpt{ utils.CacheResources: { Limit: 3, Replicate: true, - APIKey: "key", - RouteID: "route", - Remote: true, + + Remote: true, }, } @@ -1833,11 +1834,15 @@ func TestGetResourceRemote(t *testing.T) { *reply.(**Resource) = rS return nil }, + utils.CacheSv1ReplicateSet: func(args, reply interface{}) error { + return errors.New("Can't Replicate") + }, }, } db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) 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) config.SetCgrConfig(cfg) @@ -1848,6 +1853,11 @@ func TestGetResourceRemote(t *testing.T) { } else if !reflect.DeepEqual(rS, val) { t.Errorf("expected %v,received %v", utils.ToJSON(rS), utils.ToJSON(val)) } + Cache = NewCacheS(cfg, dm, nil) + SetConnManager(connMgr) + if _, err := dm.GetResource(rS.Tenant, rS.ID, false, true, utils.NonTransactional); err == nil || err.Error() != "Can't Replicate" { + t.Error(err) + } } func TestGetResourceProfileRemote(t *testing.T) { @@ -3732,9 +3742,64 @@ func TestCacheDataFromDB(t *testing.T) { Cache = tmp SetDataStorage(tmpDm) }() + Cache.Clear(nil) db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) dm := NewDataManager(db, cfg.CacheCfg(), nil) - if err := dm.CacheDataFromDB("*test_", []string{}, true); err == nil || !strings.Contains(err.Error(), "unsupported cache prefix") { + + if err := dm.CacheDataFromDB("INVALID", nil, false); err == nil || err.Error() != utils.UnsupportedCachePrefix { + t.Error(err) + } + rp := &RatingPlan{ + Id: "id", + DestinationRates: map[string]RPRateList{ + "DestinationRates": {&RPRate{Rating: "Rating"}}}, + Ratings: map[string]*RIRate{"Ratings": {ConnectFee: 0.7}}, + Timings: map[string]*RITiming{"Timings": {Months: utils.Months{4}}}, + } + if err := dm.SetRatingPlan(rp); err != nil { + t.Error(err) + } + if _, hasIt := Cache.Get(utils.CacheRatingPlans, rp.Id); hasIt { + t.Error("Already in cache") + } + if err := dm.CacheDataFromDB(utils.RatingPlanPrefix, []string{rp.Id}, false); err != nil { + t.Error(err) + } + rP := &RatingProfile{ + Id: "*out:TCDDBSWF:call:*any", + RatingPlanActivations: RatingPlanActivations{&RatingPlanActivation{ + ActivationTime: time.Date(2015, 01, 01, 8, 0, 0, 0, time.UTC), + RatingPlanId: rp.Id, + }}, + } + if err := dm.SetRatingProfile(rP); err != nil { + t.Error(err) + } + if _, hasIt := Cache.Get(utils.CacheRatingProfiles, rP.Id); hasIt { + t.Error("Already in cache") + } + if err := dm.CacheDataFromDB(utils.RatingProfilePrefix, []string{rP.Id}, false); err != nil { + t.Error(err) + } + as := Actions{ + &Action{ + ActionType: utils.MetaSetBalance, + Filters: []string{"*string:~*req.BalanceMap.*monetary[0].ID:*default", "*lt:~*req.BalanceMap.*monetary[0].Value:0"}, + Balance: &BalanceFilter{ + Type: utils.StringPointer("*sms"), + ID: utils.StringPointer("for_v3hsillmilld500m_sms_ill"), + Disabled: utils.BoolPointer(true), + }, + Weight: 9, + }, + } + if err := dm.SetActions("test", as); err != nil { + t.Error(err) + } + if _, hasIt := Cache.Get(utils.CacheActions, "test"); hasIt { + t.Error("Already in cache") + } + if err := dm.CacheDataFromDB(utils.ActionPrefix, []string{"test"}, false); err != nil { t.Error(err) } } diff --git a/engine/routes_test.go b/engine/routes_test.go index a142fa187..9109d8495 100644 --- a/engine/routes_test.go +++ b/engine/routes_test.go @@ -2042,6 +2042,131 @@ func TestPopulateSortingDataStatsErr(t *testing.T) { t.Error(err) } } + +func TestPopulateSortingDataAccsErr(t *testing.T) { + utils.Logger.SetLogLevel(4) + utils.Logger.SetSyslog(nil) + cfg := config.NewDefaultCGRConfig() + buf := new(bytes.Buffer) + log.SetOutput(buf) + defer func() { + utils.Logger.SetLogLevel(0) + log.SetOutput(os.Stderr) + config.SetCgrConfig(config.NewDefaultCGRConfig()) + }() + cfg.RouteSCfg().RALsConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaRALs)} + clientConn := make(chan rpcclient.ClientConnector, 1) + clientConn <- &ccMock{ + calls: map[string]func(args interface{}, reply interface{}) error{ + utils.ResponderGetMaxSessionTimeOnAccounts: func(args, reply interface{}) error { + rpl := map[string]interface{}{ + utils.CapMaxUsage: 50 * time.Second, + utils.Cost: 12.12, + } + *reply.(*map[string]interface{}) = rpl + return nil + }, + }, + } + connMgr := NewConnManager(cfg, map[string]chan rpcclient.ClientConnector{ + utils.ConcatenatedKey(utils.MetaInternal, utils.MetaRALs): clientConn, + }) + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "voiceEvent", + Time: utils.TimePointer(time.Now()), + Event: map[string]interface{}{ + utils.AccountField: "1001", + utils.Destination: "1002", + utils.SetupTime: "2023-03-03 11:39:32 +0100 CET", + utils.Usage: 5 * time.Second, + }, + APIOpts: map[string]interface{}{ + utils.OptsEEsVerbose: struct{}{}, + }, + } + route := &Route{ + ID: "ROUTE1", + AccountIDs: []string{"Acc"}, + RatingPlanIDs: []string{"RP_1002_LOW"}, + Weight: 10, + Blocker: false, + } + extraOpts := &optsGetRoutes{ + sortingStrategy: utils.MetaLoad, + ignoreErrors: true, + maxCost: 11.11, + } + rpS := NewRouteService(dm, nil, cfg, connMgr) + expLog := `ignoring route with ID:` + if _, pass, err := rpS.populateSortingData(ev, route, extraOpts); err != nil || pass { + t.Error(err) + } else if rcvLog := buf.String(); !strings.Contains(rcvLog, expLog) { + t.Errorf("Logger %v doesn't contain %v", rcvLog, expLog) + } +} +func TestPopulateSortingDataAccs2(t *testing.T) { + utils.Logger.SetLogLevel(4) + utils.Logger.SetSyslog(nil) + cfg := config.NewDefaultCGRConfig() + buf := new(bytes.Buffer) + log.SetOutput(buf) + defer func() { + utils.Logger.SetLogLevel(0) + log.SetOutput(os.Stderr) + config.SetCgrConfig(config.NewDefaultCGRConfig()) + }() + cfg.RouteSCfg().RALsConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaRALs)} + clientConn := make(chan rpcclient.ClientConnector, 1) + clientConn <- &ccMock{ + calls: map[string]func(args interface{}, reply interface{}) error{ + utils.ResponderGetMaxSessionTimeOnAccounts: func(args, reply interface{}) error { + rpl := map[string]interface{}{} + *reply.(*map[string]interface{}) = rpl + return nil + }, + utils.ResponderGetCostOnRatingPlans: func(args, reply interface{}) error { + return nil + }, + }, + } + connMgr := NewConnManager(cfg, map[string]chan rpcclient.ClientConnector{ + utils.ConcatenatedKey(utils.MetaInternal, utils.MetaRALs): clientConn, + }) + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "voiceEvent", + Time: utils.TimePointer(time.Now()), + Event: map[string]interface{}{ + utils.AccountField: "1001", + utils.Destination: "1002", + utils.SetupTime: "2023-03-03 11:39:32 +0100 CET", + utils.Usage: 5 * time.Second, + }, + APIOpts: map[string]interface{}{ + utils.OptsEEsVerbose: struct{}{}, + }, + } + route := &Route{ + ID: "ROUTE1", + AccountIDs: []string{"Acc"}, + RatingPlanIDs: []string{"RP_1002_LOW"}, + Weight: 10, + Blocker: false, + } + extraOpts := &optsGetRoutes{ + sortingStrategy: utils.MetaLoad, + ignoreErrors: true, + maxCost: 11.11, + } + rpS := NewRouteService(dm, nil, cfg, connMgr) + expLog := `ignoring route with ID:` + if _, pass, err := rpS.populateSortingData(ev, route, extraOpts); err != nil || pass { + t.Error(err) + } else if rcvLog := buf.String(); !strings.Contains(rcvLog, expLog) { + t.Errorf("Logger %v doesn't contain %v", rcvLog, expLog) + } +} func TestV1GetRoutesList(t *testing.T) { defer func() { config.SetCgrConfig(config.NewDefaultCGRConfig()) diff --git a/engine/tpreader_test.go b/engine/tpreader_test.go index 82a346153..dfbc76b89 100644 --- a/engine/tpreader_test.go +++ b/engine/tpreader_test.go @@ -1970,20 +1970,3 @@ func TestLoadRatingPlansFiltered(t *testing.T) { t.Error(err) } } - -// func TestLoadRatingProfilesErr(t *testing.T) { -// cfg := config.NewDefaultCGRConfig() -// defer func() { -// config.SetCgrConfig(config.NewDefaultCGRConfig()) -// }() -// db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) -// _ = NewDataManager(db, cfg.CacheCfg(), nil) - -// tpr, err := NewTpReader(db, db, utils.EmptyString, cfg.GeneralCfg().DefaultTimezone, nil, nil, true) -// if err != nil { -// t.Error(err) -// } -// if err := tpr.LoadRatingProfiles(); err != nil { -// t.Error(err) -// } -// }