diff --git a/engine/action_trigger_test.go b/engine/action_trigger_test.go
index 8b1020055..f1f8f51fc 100644
--- a/engine/action_trigger_test.go
+++ b/engine/action_trigger_test.go
@@ -19,7 +19,11 @@ along with this program. If not, see
package engine
import (
+ "bytes"
+ "log"
+ "os"
"reflect"
+ "strings"
"testing"
"time"
@@ -256,11 +260,17 @@ func TestActionTriggerCreateBalance(t *testing.T) {
}
-func TestATExecute(t *testing.T) {
+func TestATExecute22(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
tmp := Cache
tmpDm := dm
+ utils.Logger.SetLogLevel(4)
+ utils.Logger.SetSyslog(nil)
+ buf := new(bytes.Buffer)
+ log.SetOutput(buf)
defer func() {
+ utils.Logger.SetLogLevel(0)
+ log.SetOutput(os.Stderr)
Cache = tmp
SetDataStorage(tmpDm)
config.SetCgrConfig(config.NewDefaultCGRConfig())
@@ -290,7 +300,6 @@ func TestATExecute(t *testing.T) {
AllowNegative: false,
UpdateTime: time.Date(2019, 3, 1, 12, 0, 0, 0, time.UTC),
}
- fltrStr := `*lt:~*req.BalanceMap.*monetary.GetTotalValue:3`
db.db.Set(utils.CacheActions, "actID", Actions{
{
Id: "cgrates.org:id1",
@@ -300,18 +309,31 @@ func TestATExecute(t *testing.T) {
Type: utils.StringPointer("test"),
Value: &utils.ValueFormula{Static: 1.1},
},
- Filters: []string{fltrStr},
+ Filters: []string{
+ "fltr",
+ },
},
}, []string{}, true, utils.NonTransactional)
+ fltrNew := &Filter{
+ ID: "fltr",
+ Tenant: "cgrates.org",
+ Rules: []*FilterRule{
+ {
+ Type: utils.MetaString,
+ Element: "~*req.ID",
+ Values: []string{"acc_id", "acc1", "acc2"},
+ },
+ },
+ }
SetDataStorage(dm)
fltr := NewFilterS(cfg, nil, dm)
- db.db.Set(utils.CacheFilters, utils.ConcatenatedKey("cgrates.org", fltrStr), &Filter{
- ActivationInterval: &utils.ActivationInterval{
- ActivationTime: time.Date(2022, 1, 12, 1, 0, 0, 0, time.UTC),
- ExpiryTime: time.Date(2024, 1, 12, 1, 0, 0, 0, time.UTC),
- },
- }, []string{}, true, utils.NonTransactional)
+ db.db.Set(utils.CacheFilters, utils.ConcatenatedKey("cgrates.org", "fltr"),
+ fltrNew, []string{}, true, utils.NonTransactional)
if err := at.Execute(ub, fltr); err != nil {
t.Error(err)
}
+ expLog := ` not available, aborting execution!`
+ if rcvLog := buf.String(); !strings.Contains(rcvLog, expLog) {
+ t.Errorf("expected %v,received%v", expLog, rcvLog)
+ }
}
diff --git a/engine/balances_test.go b/engine/balances_test.go
index d3f7e6f59..c2591bf0e 100644
--- a/engine/balances_test.go
+++ b/engine/balances_test.go
@@ -18,7 +18,11 @@ along with this program. If not, see
package engine
import (
+ "bytes"
+ "log"
+ "os"
"reflect"
+ "strings"
"testing"
"time"
@@ -753,3 +757,38 @@ func TestBalanceDebitUnits2(t *testing.T) {
t.Errorf("received %v", err)
}
}
+
+func TestGetMinutesForCredi(t *testing.T) {
+ utils.Logger.SetLogLevel(4)
+ utils.Logger.SetSyslog(nil)
+ buf := new(bytes.Buffer)
+ log.SetOutput(buf)
+ defer func() {
+ utils.Logger.SetLogLevel(0)
+ log.SetOutput(os.Stderr)
+ }()
+ b := &Balance{
+ Value: 20 * float64(time.Second),
+ DestinationIDs: utils.NewStringMap("NAT"),
+ Weight: 10, RatingSubject: "rif",
+ }
+ cd := &CallDescriptor{
+ Category: "postpaid",
+ ToR: utils.MetaVoice,
+ Tenant: "foehn",
+ Subject: "foehn",
+ Account: "foehn",
+ Destination: "0034678096720",
+ TimeStart: time.Date(2015, 4, 24, 7, 59, 4, 0, time.UTC),
+ TimeEnd: time.Date(2015, 4, 24, 8, 2, 0, 0, time.UTC),
+ LoopIndex: 0,
+ DurationIndex: 176 * time.Second,
+ }
+ if dur, _ := b.GetMinutesForCredit(cd, 12); dur != 0 {
+ t.Error(err)
+ }
+ expLog := `Error getting new cost for balance subject:`
+ if rcvLog := buf.String(); !strings.Contains(rcvLog, expLog) {
+ t.Errorf("expected %v,received %v", utils.ToJSON(expLog), utils.ToJSON(rcvLog))
+ }
+}
diff --git a/engine/cdrs_test.go b/engine/cdrs_test.go
index 3a75d0256..9d2e2c045 100644
--- a/engine/cdrs_test.go
+++ b/engine/cdrs_test.go
@@ -248,51 +248,7 @@ func TestArgV1ProcessClone(t *testing.T) {
}
-func TestCDRV1GetCDRs(t *testing.T) {
-
- cfg := config.NewDefaultCGRConfig()
- defer func() {
- config.SetCgrConfig(config.NewDefaultCGRConfig())
- }()
- db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items)
- dm := NewDataManager(db, cfg.CacheCfg(), nil)
- cdrS := &CDRServer{
- cgrCfg: cfg,
- connMgr: nil,
- cdrDb: NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items),
- dm: dm,
- }
- args := utils.RPCCDRsFilterWithAPIOpts{
-
- RPCCDRsFilter: &utils.RPCCDRsFilter{
- CGRIDs: []string{"CGRIDs"},
- NotCGRIDs: []string{"NotCGRIDs"},
- RunIDs: []string{"RunIDs"},
- NotRunIDs: []string{"NotRunIDs"},
- OriginIDs: []string{"OriginIDs"},
- NotOriginIDs: []string{"NotOriginIDs"},
- OriginHosts: []string{"OriginHosts"},
- SetupTimeStart: "2020-04-18T11:46:26.371Z",
- SetupTimeEnd: "2020-04-18T11:46:26.371Z",
- },
- Tenant: "cgrates.org",
- APIOpts: map[string]interface{}{},
- }
- cdrs := &[]*CDR{
- {
- CGRID: "cgrid"},
- {
- CGRID: "cgr1d",
- },
- }
- if err := cdrS.V1GetCDRs(args, cdrs); err == nil || err.Error() != fmt.Sprintf("SERVER_ERROR: %s", utils.ErrNotFound) {
- t.Error(utils.NewErrServerError(utils.ErrNotFound))
- }
-
-}
-
func TestCDRV1CountCDRs(t *testing.T) {
-
cfg := config.NewDefaultCGRConfig()
cfg.GeneralCfg().DefaultTimezone = "UTC"
db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items)
@@ -314,7 +270,33 @@ func TestCDRV1CountCDRs(t *testing.T) {
if err := cdrS.V1CountCDRs(args, &i); err != nil {
t.Error(err)
}
-
+}
+func TestV1CountCDRsErr(t *testing.T) {
+ cfg := config.NewDefaultCGRConfig()
+ cfg.GeneralCfg().DefaultTimezone = "UTC"
+ db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items)
+ dm := NewDataManager(db, cfg.CacheCfg(), nil)
+ cdrS := &CDRServer{
+ cgrCfg: cfg,
+ connMgr: nil,
+ cdrDb: NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items),
+ dm: dm,
+ }
+ args := &utils.RPCCDRsFilterWithAPIOpts{
+ RPCCDRsFilter: &utils.RPCCDRsFilter{
+ Accounts: []string{"1001"},
+ RunIDs: []string{utils.MetaDefault},
+ SetupTimeStart: "fdd",
+ },
+ Tenant: "cgrates.org",
+ APIOpts: map[string]interface{}{
+ utils.OptsAPIKey: "cdrs12345",
+ },
+ }
+ i := utils.Int64Pointer(23)
+ if err := cdrS.V1CountCDRs(args, i); err == nil {
+ t.Error(err)
+ }
}
func TestV1RateCDRs(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
@@ -1356,10 +1338,15 @@ func TestV2StoreSessionCost(t *testing.T) {
if !has {
t.Error("has no value")
}
-
if !reflect.DeepEqual(exp, rcv) {
t.Errorf("expected %+v,received %+v", utils.ToJSON(exp), utils.ToJSON(rcv))
}
+ args = &ArgsV2CDRSStoreSMCost{
+ Cost: &V2SMCost{},
+ }
+ if err = cdrS.V2StoreSessionCost(args, &reply); err == nil {
+ t.Error(err)
+ }
}
func TestV2StoreSessionCostSet(t *testing.T) {
@@ -1510,7 +1497,41 @@ func TestV1RateCDRS(t *testing.T) {
if err := cdrS.V1RateCDRs(arg, &reply); err == nil || err != utils.ErrNotFound {
t.Error(err)
}
+}
+func TestV1GetCDRsErr(t *testing.T) {
+ cfg := config.NewDefaultCGRConfig()
+ defer func() {
+ config.SetCgrConfig(config.NewDefaultCGRConfig())
+ }()
+ db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items)
+ dm := NewDataManager(db, cfg.CacheCfg(), nil)
+ cdrS := &CDRServer{
+ cgrCfg: cfg,
+ connMgr: nil,
+ cdrDb: NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items),
+ dm: dm,
+ }
+ args := utils.RPCCDRsFilterWithAPIOpts{
+
+ RPCCDRsFilter: &utils.RPCCDRsFilter{
+ CGRIDs: []string{"CGRIDs"},
+ NotCGRIDs: []string{"NotCGRIDs"},
+ OriginHosts: []string{"OriginHosts"},
+ SetupTimeStart: "time",
+ SetupTimeEnd: "2020-04-18T11:46:26.371Z",
+ },
+ Tenant: "cgrates.org",
+ APIOpts: map[string]interface{}{},
+ }
+ var cdrs *[]*CDR
+ if err := cdrS.V1GetCDRs(args, cdrs); err == nil {
+ t.Error(utils.NewErrServerError(utils.ErrNotFound))
+ }
+ args.RPCCDRsFilter.SetupTimeStart = ""
+ if err := cdrS.V1GetCDRs(args, cdrs); err == nil || err.Error() != fmt.Sprintf("SERVER_ERROR: %s", utils.ErrNotFound) {
+ t.Error(utils.NewErrServerError(utils.ErrNotFound))
+ }
}
func TestGetCostFromRater2(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
diff --git a/engine/datamanager_test.go b/engine/datamanager_test.go
index 625a86e30..606930aab 100644
--- a/engine/datamanager_test.go
+++ b/engine/datamanager_test.go
@@ -1284,7 +1284,6 @@ func TestDmDispatcherHost(t *testing.T) {
dm := NewDataManager(db, cfg.CacheCfg(), connMgr)
config.SetCgrConfig(cfg)
SetDataStorage(dm)
-
dH := &DispatcherHost{
Tenant: "testTenant",
RemoteHost: &config.RemoteHost{
@@ -1309,3 +1308,295 @@ func TestDmDispatcherHost(t *testing.T) {
t.Error("has not been removed from the cache")
}
}
+
+func TestChargerProfileRemote(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().RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.ReplicatorSv1)}
+ cfg.DataDbCfg().RplFiltered = true
+ cfg.DataDbCfg().Items = map[string]*config.ItemOpt{
+ utils.CacheChargerProfiles: {
+ Limit: 3,
+ Replicate: true,
+ APIKey: "key",
+ RouteID: "route",
+ },
+ }
+ clientConn := make(chan rpcclient.ClientConnector, 1)
+ clientConn <- &ccMock{
+ calls: map[string]func(args interface{}, reply interface{}) error{
+ utils.ReplicatorSv1SetDispatcherHost: func(args, reply interface{}) error {
+ chrgPrflApiOpts, cancast := args.(ChargerProfileWithAPIOpts)
+ if !cancast {
+ return utils.ErrNotConvertible
+ }
+ dm.DataDB().SetChargerProfileDrv(chrgPrflApiOpts.ChargerProfile)
+ return nil
+ },
+ utils.ReplicatorSv1RemoveChargerProfile: func(args, reply interface{}) error {
+ tntApiOpts, cancast := args.(utils.TenantIDWithAPIOpts)
+ if !cancast {
+ return utils.ErrNotConvertible
+ }
+ dm.DataDB().RemoveChargerProfileDrv(tntApiOpts.Tenant, tntApiOpts.ID)
+ return nil
+ },
+ },
+ }
+ db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items)
+ connMgr := NewConnManager(cfg, map[string]chan rpcclient.ClientConnector{
+ utils.ConcatenatedKey(utils.MetaInternal, utils.ReplicatorSv1): clientConn,
+ })
+ dm := NewDataManager(db, cfg.CacheCfg(), connMgr)
+ config.SetCgrConfig(cfg)
+ SetDataStorage(dm)
+ chrPrf := &ChargerProfile{
+ Tenant: "cgrates.org",
+ ID: "CPP_3",
+ FilterIDs: []string{"FLTR_CP_3"},
+ ActivationInterval: &utils.ActivationInterval{
+ ActivationTime: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC),
+ },
+ RunID: "*rated",
+ AttributeIDs: []string{"ATTR_1"},
+ Weight: 20,
+ }
+ if err := dm.SetChargerProfile(chrPrf, false); err != nil {
+ t.Error(err)
+ }
+ if val, err := dm.GetChargerProfile(chrPrf.Tenant, chrPrf.ID, true, false, utils.NonTransactional); err != nil {
+ t.Error(err)
+ } else if !reflect.DeepEqual(chrPrf, val) {
+ t.Errorf("expected %v,received %v", utils.ToJSON(val), utils.ToJSON(chrPrf))
+ }
+ if err = dm.RemoveChargerProfile(chrPrf.Tenant, chrPrf.ID, false); err != nil {
+ t.Error(err)
+ }
+ if _, has := db.db.Get(utils.CacheChargerProfiles, chrPrf.TenantID()); has {
+ t.Error("should been removed from the cache")
+ }
+}
+
+func TestDispatcherProfileRemote(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().RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.ReplicatorSv1)}
+ cfg.DataDbCfg().RplFiltered = true
+ cfg.DataDbCfg().Items = map[string]*config.ItemOpt{
+ utils.CacheDispatcherProfiles: {
+ Limit: 3,
+ Replicate: true,
+ APIKey: "key",
+ RouteID: "route",
+ },
+ }
+ clientConn := make(chan rpcclient.ClientConnector, 1)
+ clientConn <- &ccMock{
+ calls: map[string]func(args interface{}, reply interface{}) error{
+ utils.ReplicatorSv1SetDispatcherProfile: func(args, reply interface{}) error {
+ dspApiOpts, cancast := args.(DispatcherProfileWithAPIOpts)
+ if !cancast {
+ return utils.ErrNotConvertible
+ }
+ dm.DataDB().SetDispatcherProfileDrv(dspApiOpts.DispatcherProfile)
+ return nil
+ },
+ utils.ReplicatorSv1RemoveDispatcherProfile: func(args, reply interface{}) error {
+ tntApiOpts, cancast := args.(utils.TenantIDWithAPIOpts)
+ if !cancast {
+ return utils.ErrNotConvertible
+ }
+ dm.DataDB().RemoveDispatcherProfileDrv(tntApiOpts.Tenant, tntApiOpts.ID)
+ return nil
+ },
+ },
+ }
+ db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items)
+ connMgr := NewConnManager(cfg, map[string]chan rpcclient.ClientConnector{
+ utils.ConcatenatedKey(utils.MetaInternal, utils.ReplicatorSv1): clientConn,
+ })
+ dm := NewDataManager(db, cfg.CacheCfg(), connMgr)
+ config.SetCgrConfig(cfg)
+ SetDataStorage(dm)
+ dsp := &DispatcherProfile{
+ Tenant: "cgrates.org",
+ ID: "Dsp1",
+ FilterIDs: []string{"*string:~*req.Account:1001"},
+ Subsystems: []string{utils.MetaAny},
+ Strategy: utils.MetaFirst,
+ Weight: 20,
+ }
+ if err := dm.SetDispatcherProfile(dsp, false); err != nil {
+ t.Error(err)
+ }
+ if val, err := dm.GetDispatcherProfile(dsp.Tenant, dsp.ID, true, false, utils.NonTransactional); err != nil {
+ t.Error(err)
+ } else if !reflect.DeepEqual(val, dsp) {
+ t.Errorf("expected %v,received %v", utils.ToJSON(dsp), utils.ToJSON(val))
+ }
+ if err := dm.RemoveDispatcherProfile(dsp.Tenant, dsp.ID, false); err != nil {
+ t.Error(err)
+ }
+ if _, has := db.db.Get(utils.CacheDispatcherProfiles, dsp.TenantID()); has {
+ t.Error("should been removed from the cache")
+ }
+}
+
+func TestRouteProfileRemote(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().RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.ReplicatorSv1)}
+ cfg.DataDbCfg().RplFiltered = true
+ cfg.DataDbCfg().Items = map[string]*config.ItemOpt{
+ utils.CacheRouteProfiles: {
+ Limit: 3,
+ Replicate: true,
+ APIKey: "key",
+ RouteID: "route",
+ },
+ }
+ clientConn := make(chan rpcclient.ClientConnector, 1)
+ clientConn <- &ccMock{
+ calls: map[string]func(args interface{}, reply interface{}) error{
+ utils.ReplicatorSv1SetRouteProfile: func(args, reply interface{}) error {
+ routeApiOpts, cancast := args.(RouteProfileWithAPIOpts)
+ if !cancast {
+ return utils.ErrNotConvertible
+ }
+ dm.DataDB().SetRouteProfileDrv(routeApiOpts.RouteProfile)
+ return nil
+ },
+ utils.ReplicatorSv1RemoveRouteProfile: func(args, reply interface{}) error {
+ tntApiOpts, cancast := args.(utils.TenantIDWithAPIOpts)
+ if !cancast {
+ return utils.ErrNotConvertible
+ }
+ dm.DataDB().RemoveRouteProfileDrv(tntApiOpts.Tenant, tntApiOpts.ID)
+ return nil
+ },
+ },
+ }
+ db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items)
+ connMgr := NewConnManager(cfg, map[string]chan rpcclient.ClientConnector{
+ utils.ConcatenatedKey(utils.MetaInternal, utils.ReplicatorSv1): clientConn,
+ })
+ dm := NewDataManager(db, cfg.CacheCfg(), connMgr)
+ config.SetCgrConfig(cfg)
+ SetDataStorage(dm)
+ rpp := &RouteProfile{
+ Tenant: "cgrates.org",
+ ID: "ROUTE_ACNT_1002",
+ FilterIDs: []string{"FLTR_ACNT_1002"},
+ }
+ if err := dm.SetRouteProfile(rpp, false); err != nil {
+ t.Error(err)
+ }
+ if val, err := dm.GetRouteProfile(rpp.Tenant, rpp.ID, true, false, utils.NonTransactional); err != nil {
+ t.Error(err)
+ } else if !reflect.DeepEqual(val, rpp) {
+ t.Errorf("expected %v,received %v", utils.ToJSON(rpp), utils.ToJSON(val))
+ }
+ if err := dm.RemoveRouteProfile(rpp.Tenant, rpp.ID, false); err != nil {
+ t.Error(err)
+ }
+ if _, has := db.db.Get(utils.CacheRouteProfiles, rpp.TenantID()); has {
+ t.Error("should been removed from the cache")
+ }
+}
+
+func TestRatingPlanRemote(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().RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.ReplicatorSv1)}
+ cfg.DataDbCfg().RplFiltered = true
+ cfg.DataDbCfg().Items = map[string]*config.ItemOpt{
+ utils.CacheRatingPlans: {
+ Limit: 3,
+ Replicate: true,
+ APIKey: "key",
+ RouteID: "route",
+ },
+ }
+ clientConn := make(chan rpcclient.ClientConnector, 1)
+ clientConn <- &ccMock{
+ calls: map[string]func(args interface{}, reply interface{}) error{
+ utils.ReplicatorSv1SetRatingPlan: func(args, reply interface{}) error {
+ rPnApiOpts, cancast := args.(RatingPlanWithAPIOpts)
+ if !cancast {
+ return utils.ErrNotConvertible
+ }
+ dm.DataDB().SetRatingPlanDrv(rPnApiOpts.RatingPlan)
+ return nil
+ },
+ utils.ReplicatorSv1RemoveRatingPlan: func(args, reply interface{}) error {
+ strApiOpts, cancast := args.(utils.StringWithAPIOpts)
+ if !cancast {
+ return utils.ErrNotConvertible
+ }
+ dm.DataDB().RemoveRatingPlanDrv(strApiOpts.Arg)
+ return nil
+ },
+ },
+ }
+ db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items)
+ connMgr := NewConnManager(cfg, map[string]chan rpcclient.ClientConnector{
+ utils.ConcatenatedKey(utils.MetaInternal, utils.ReplicatorSv1): clientConn,
+ })
+ dm := NewDataManager(db, cfg.CacheCfg(), connMgr)
+ config.SetCgrConfig(cfg)
+ SetDataStorage(dm)
+ rP := &RatingPlan{
+ Id: "RP1",
+ Timings: map[string]*RITiming{
+ "30eab300": {
+ Years: utils.Years{},
+ Months: utils.Months{},
+ MonthDays: utils.MonthDays{},
+ WeekDays: utils.WeekDays{},
+ StartTime: "00:00:00",
+ },
+ },
+ }
+ if err := dm.SetRatingPlan(rP); err != nil {
+ t.Error(err)
+ }
+ if val, err := dm.GetRatingPlan(rP.Id, false, utils.NonTransactional); err != nil {
+ t.Error(err)
+ } else if !reflect.DeepEqual(val, rP) {
+ t.Errorf("expected %v,received %v", utils.ToJSON(rP), utils.ToJSON(val))
+ }
+ if err = dm.RemoveRatingPlan(rP.Id, utils.NonTransactional); err != nil {
+ t.Error(err)
+ }
+ if _, has := db.db.Get(utils.CacheRatingPlans, rP.Id); has {
+ t.Error("should been removed from the caches")
+ }
+}
diff --git a/engine/dispatcherprfl_test.go b/engine/dispatcherprfl_test.go
index 0b3dd43d3..1dfaef765 100644
--- a/engine/dispatcherprfl_test.go
+++ b/engine/dispatcherprfl_test.go
@@ -21,6 +21,7 @@ import (
"reflect"
"testing"
+ "github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/utils"
)
@@ -321,3 +322,19 @@ func TestDispatcherHostProfileCloneWithParams(t *testing.T) {
t.Errorf("\nexpected: <%+v>, \nreceived: <%+v", exp, rcv)
}
}
+
+func TestDispatcherHostCallErr(t *testing.T) {
+ dH := &DispatcherHost{
+ Tenant: "testTenant",
+ RemoteHost: &config.RemoteHost{
+ ID: "testID",
+ Address: "",
+ Transport: "",
+ TLS: false,
+ },
+ }
+ var reply string
+ if err := dH.Call(utils.AttributeSv1Ping, &utils.CGREvent{}, &reply); err == nil || err.Error() != "dial tcp: missing address" {
+ t.Error(err)
+ }
+}
diff --git a/engine/responder_test.go b/engine/responder_test.go
index 5d25554dc..0b066dcff 100644
--- a/engine/responder_test.go
+++ b/engine/responder_test.go
@@ -20,7 +20,10 @@ package engine
import (
"bytes"
"encoding/gob"
+ "log"
+ "os"
"reflect"
+ "strings"
"testing"
"time"
@@ -631,7 +634,7 @@ func TestResponderDebit(t *testing.T) {
}
}
-func TestGetCostOnRatingPlans(t *testing.T) {
+func TestGetCostOnRatingPlansErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items)
@@ -1119,10 +1122,18 @@ func TestResponderRefundRoundingSet(t *testing.T) {
}
-func TestGetMaxSessionTimeOnAccounts(t *testing.T) {
+func TestGetMaxSessionTimeOnAccountsErr(t *testing.T) {
+ utils.Logger.SetLogLevel(4)
+ utils.Logger.SetSyslog(nil)
+ buf := new(bytes.Buffer)
+ log.SetOutput(buf)
cfg := config.NewDefaultCGRConfig()
db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items)
dm := NewDataManager(db, cfg.CacheCfg(), nil)
+ defer func() {
+ utils.Logger.SetLogLevel(0)
+ log.SetOutput(os.Stderr)
+ }()
arg := &utils.GetMaxSessionTimeOnAccountsArgs{
Subject: "subject",
Tenant: "",
@@ -1141,8 +1152,12 @@ func TestGetMaxSessionTimeOnAccounts(t *testing.T) {
connMgr: nil,
},
}
+ expLog := ` ignoring cost for account: `
if err := rs.GetMaxSessionTimeOnAccounts(arg, reply); err == nil || err != utils.ErrAccountNotFound {
t.Error(err)
}
+ if rcvLog := buf.String(); !strings.Contains(rcvLog, expLog) {
+ t.Errorf("logger %v doesn't contain %v", utils.ToJSON(rcvLog), utils.ToJSON(expLog))
+ }
}
diff --git a/engine/routes_test.go b/engine/routes_test.go
index 546e0bc23..0bfa02022 100644
--- a/engine/routes_test.go
+++ b/engine/routes_test.go
@@ -1038,9 +1038,15 @@ func TestRouteServiceSortRoutes(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
data := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items)
dmSPP := NewDataManager(data, config.CgrConfig().CacheCfg(), nil)
- cfg.RouteSCfg().StringIndexedFields = nil
- cfg.RouteSCfg().PrefixIndexedFields = nil
rpS := NewRouteService(dmSPP, &FilterS{dm: dmSPP, cfg: cfg, connMgr: nil}, cfg, nil)
+ utils.Logger.SetLogLevel(4)
+ utils.Logger.SetSyslog(nil)
+ buf := new(bytes.Buffer)
+ log.SetOutput(buf)
+ defer func() {
+ utils.Logger.SetLogLevel(0)
+ log.SetOutput(os.Stderr)
+ }()
lcs := &LeastCostSorter{
sorting: "sort",
rS: rpS,
@@ -1049,72 +1055,22 @@ func TestRouteServiceSortRoutes(t *testing.T) {
routes := map[string]*Route{
"route1": {
ID: "id",
- FilterIDs: []string{"filterid1", "filterid2", "filterid3"},
- AccountIDs: []string{"acc_id1", "acc_id2", "acc_id3"},
- RatingPlanIDs: []string{"rate1", "rate2", "rate3", "rate4"},
- ResourceIDs: []string{"rsc1", "rsc2", "rsc3"},
- StatIDs: []string{"stat1", "stat2", "stat3"},
+ FilterIDs: []string{"filterid1"},
+ AccountIDs: []string{"acc_id1"},
+ RatingPlanIDs: []string{"rate1"},
+ ResourceIDs: []string{"rsc1"},
+ StatIDs: []string{"stat1"},
Weight: 2.3,
Blocker: true,
RouteParameters: "route",
cacheRoute: map[string]interface{}{
"*ratio": "ratio",
},
- lazyCheckRules: []*FilterRule{
- {
- Type: "*string",
- Element: "elem",
- Values: []string{"val1", "val2", "val3"},
- rsrValues: config.RSRParsers{
- &config.RSRParser{Rules: "public"},
- {Rules: "private"},
- }},
- {
- Type: "*string",
- Element: "elem",
- Values: []string{"val1", "val2", "val3"},
- rsrValues: config.RSRParsers{
- &config.RSRParser{Rules: "public"},
- {Rules: "private"},
- },
- },
- },
- },
- "route2": {
- ID: "id",
- FilterIDs: []string{"filterid1", "filterid2", "filterid3"},
- AccountIDs: []string{"acc_id1", "acc_id2", "acc_id3"},
- RatingPlanIDs: []string{"rate1", "rate2", "rate3", "rate4"},
- ResourceIDs: []string{"rsc1", "rsc2", "rsc3"},
- StatIDs: []string{"stat1", "stat2", "stat3"},
- Weight: 2.3,
- Blocker: true,
- RouteParameters: "route",
- cacheRoute: map[string]interface{}{
- "*ratio": "ratio",
- },
- lazyCheckRules: []*FilterRule{
- {
- Type: "*string",
- Element: "elem",
- Values: []string{"val1", "val2", "val3"},
- rsrValues: config.RSRParsers{
- &config.RSRParser{Rules: "public"},
- {Rules: "private"},
- }},
- {
- Type: "*string",
- Element: "elem",
- Values: []string{"val1", "val2", "val3"},
- rsrValues: config.RSRParsers{
- &config.RSRParser{Rules: "public"},
- {Rules: "private"},
- },
- },
- },
+ lazyCheckRules: []*FilterRule{},
},
}
- ev := &utils.CGREvent{ //matching RouteProfile1
+
+ ev := &utils.CGREvent{
Tenant: "cgrates.org",
ID: "utils.CGREvent1",
Event: map[string]interface{}{
@@ -1145,10 +1101,26 @@ func TestRouteServiceSortRoutes(t *testing.T) {
} else if !reflect.DeepEqual(val, expSr) {
t.Errorf("recived %+v", utils.ToJSON(val))
}
+ routes["route1"].RatingPlanIDs = []string{}
+ routes["route1"].AccountIDs = []string{}
+ expLog := `empty RatingPlanIDs or AccountIDs`
+ if _, err = lcs.SortRoutes(prflID, routes, ev, extraOpts); err == nil {
+ t.Error(err)
+ } else if rcvLog := buf.String(); !strings.Contains(rcvLog, expLog) {
+ t.Errorf("Logger %v doesn't contain %v", utils.ToJSON(rcvLog), utils.ToJSON(expLog))
+ }
}
func TestRDSRSortRoutes(t *testing.T) {
+ utils.Logger.SetLogLevel(4)
+ utils.Logger.SetSyslog(nil)
+ buf := new(bytes.Buffer)
+ log.SetOutput(buf)
+ defer func() {
+ utils.Logger.SetLogLevel(0)
+ log.SetOutput(os.Stderr)
+ }()
cfg := config.NewDefaultCGRConfig()
data := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items)
dmSPP := NewDataManager(data, config.CgrConfig().CacheCfg(), nil)
@@ -1163,11 +1135,11 @@ func TestRDSRSortRoutes(t *testing.T) {
routes := map[string]*Route{
"sorted_route1": {
ID: "id",
- FilterIDs: []string{"filterid1", "filterid2", "filterid3"},
- AccountIDs: []string{"acc_id1", "acc_id2", "acc_id3"},
- RatingPlanIDs: []string{"rate1", "rate2", "rate3", "rate4"},
- ResourceIDs: []string{"rsc1", "rsc2", "rsc3"},
- StatIDs: []string{"stat1", "stat2", "stat3"},
+ FilterIDs: []string{"filterid1"},
+ AccountIDs: []string{"acc_id1"},
+ RatingPlanIDs: []string{"rate1"},
+ ResourceIDs: []string{"rsc1"},
+ StatIDs: []string{"stat1"},
Weight: 2.3,
Blocker: true,
RouteParameters: "route",
@@ -1179,51 +1151,11 @@ func TestRDSRSortRoutes(t *testing.T) {
Type: "*string",
Element: "elem",
Values: []string{"val1", "val2", "val3"},
- rsrValues: config.RSRParsers{
- &config.RSRParser{Rules: "public"},
- {Rules: "private"},
- }},
- {
- Type: "*string",
- Element: "elem",
- Values: []string{"val1", "val2", "val3"},
- rsrValues: config.RSRParsers{
- &config.RSRParser{Rules: "public"},
- {Rules: "private"},
- },
},
- },
- },
- "sorted_route2": {
- ID: "id",
- FilterIDs: []string{"filterid1", "filterid2", "filterid3"},
- AccountIDs: []string{"acc_id1", "acc_id2", "acc_id3"},
- RatingPlanIDs: []string{"rate1", "rate2", "rate3", "rate4"},
- ResourceIDs: []string{"rsc1", "rsc2", "rsc3"},
- StatIDs: []string{"stat1", "stat2", "stat3"},
- Weight: 2.3,
- Blocker: true,
- RouteParameters: "route",
- cacheRoute: map[string]interface{}{
- "*ratio": "ratio",
- },
- lazyCheckRules: []*FilterRule{
{
Type: "*string",
Element: "elem",
Values: []string{"val1", "val2", "val3"},
- rsrValues: config.RSRParsers{
- &config.RSRParser{Rules: "public"},
- {Rules: "private"},
- }},
- {
- Type: "*string",
- Element: "elem",
- Values: []string{"val1", "val2", "val3"},
- rsrValues: config.RSRParsers{
- &config.RSRParser{Rules: "public"},
- {Rules: "private"},
- },
},
},
},
@@ -1248,6 +1180,14 @@ func TestRDSRSortRoutes(t *testing.T) {
if _, err := rds.SortRoutes(prflID, routes, ev, extraOpts); err != nil {
t.Error(err)
}
+ routes["sorted_route1"].ResourceIDs = []string{}
+ expLog := `empty ResourceIDs`
+ if _, err = rds.SortRoutes(prflID, routes, ev, extraOpts); err == nil {
+ t.Error(err)
+ } else if rcvLog := buf.String(); !strings.Contains(rcvLog, expLog) {
+ t.Errorf("Logger %v doesn't contain %v", utils.ToJSON(rcvLog), utils.ToJSON(expLog))
+ }
+
}
func TestQosRSortRoutes(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
@@ -1356,7 +1296,14 @@ func TestReaSortRoutes(t *testing.T) {
dm := NewDataManager(db, config.CgrConfig().CacheCfg(), nil)
cfg.RouteSCfg().RALsConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaRALs)}
cfg.RouteSCfg().StatSConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaStats)}
- cfg.GeneralCfg().DefaultTimezone = "UTC"
+ utils.Logger.SetLogLevel(4)
+ utils.Logger.SetSyslog(nil)
+ buf := new(bytes.Buffer)
+ log.SetOutput(buf)
+ defer func() {
+ utils.Logger.SetLogLevel(0)
+ log.SetOutput(os.Stderr)
+ }()
clientConn := make(chan rpcclient.ClientConnector, 1)
clientConn <- &ccMock{
calls: map[string]func(args interface{}, reply interface{}) error{
@@ -1402,20 +1349,6 @@ func TestReaSortRoutes(t *testing.T) {
"*ratio": "ratio",
},
},
- "sorted_route2": {
- ID: "id",
- FilterIDs: []string{"filterid1"},
- AccountIDs: []string{"acc_id1"},
- RatingPlanIDs: []string{"rate1"},
- ResourceIDs: []string{"rsc"},
- StatIDs: []string{"statID"},
- Weight: 2.3,
- Blocker: true,
- RouteParameters: "route",
- cacheRoute: map[string]interface{}{
- "*ratio": "ratio",
- },
- },
}
ev := &utils.CGREvent{
Tenant: "cgrates.org",
@@ -1436,86 +1369,48 @@ func TestReaSortRoutes(t *testing.T) {
if _, err := rea.SortRoutes(prflID, routes, ev, extraOpts); err != nil {
t.Error(err)
}
+ routes["sorted_route1"].ResourceIDs = []string{}
+ expLog := `empty ResourceIDs`
+ if _, err = rea.SortRoutes(prflID, routes, ev, extraOpts); err == nil {
+ t.Error(err)
+ } else if rcvLog := buf.String(); !strings.Contains(rcvLog, expLog) {
+ t.Errorf("Logger %v doesn't contain %v", utils.ToJSON(rcvLog), utils.ToJSON(expLog))
+ }
+
}
func TestHCRSortRoutes(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items)
dmSPP := NewDataManager(data, config.CgrConfig().CacheCfg(), nil)
- cfg.RouteSCfg().StringIndexedFields = nil
- cfg.RouteSCfg().PrefixIndexedFields = nil
rpS := NewRouteService(dmSPP, &FilterS{dm: dmSPP, cfg: cfg, connMgr: nil}, cfg, nil)
hcr := &HightCostSorter{
sorting: utils.MetaHC,
rS: rpS,
}
+ utils.Logger.SetLogLevel(4)
+ utils.Logger.SetSyslog(nil)
+ buf := new(bytes.Buffer)
+ log.SetOutput(buf)
+ defer func() {
+ utils.Logger.SetLogLevel(0)
+ log.SetOutput(os.Stderr)
+ }()
prflID := "CGREvent1"
routes := map[string]*Route{
"sorted_route1": {
ID: "id",
- FilterIDs: []string{"filterid1", "filterid2", "filterid3"},
- AccountIDs: []string{"acc_id1", "acc_id2", "acc_id3"},
- RatingPlanIDs: []string{"rate1", "rate2", "rate3", "rate4"},
- ResourceIDs: []string{"rsc1", "rsc2", "rsc3"},
- StatIDs: []string{"stat1", "stat2", "stat3"},
+ FilterIDs: []string{"filterid1"},
+ AccountIDs: []string{"acc_id1"},
+ RatingPlanIDs: []string{"rate1"},
+ ResourceIDs: []string{"rsc1"},
+ StatIDs: []string{"stat1"},
Weight: 2.3,
Blocker: true,
RouteParameters: "route",
cacheRoute: map[string]interface{}{
"*ratio": "ratio",
},
- lazyCheckRules: []*FilterRule{
- {
- Type: "*string",
- Element: "elem",
- Values: []string{"val1", "val2", "val3"},
- rsrValues: config.RSRParsers{
- &config.RSRParser{Rules: "public"},
- {Rules: "private"},
- }},
- {
- Type: "*string",
- Element: "elem",
- Values: []string{"val1", "val2", "val3"},
- rsrValues: config.RSRParsers{
- &config.RSRParser{Rules: "public"},
- {Rules: "private"},
- },
- },
- },
- },
- "sorted_route2": {
- ID: "id",
- FilterIDs: []string{"filterid1", "filterid2", "filterid3"},
- AccountIDs: []string{"acc_id1", "acc_id2", "acc_id3"},
- RatingPlanIDs: []string{"rate1", "rate2", "rate3", "rate4"},
- ResourceIDs: []string{"rsc1", "rsc2", "rsc3"},
- StatIDs: []string{"stat1", "stat2", "stat3"},
- Weight: 2.3,
- Blocker: true,
- RouteParameters: "route",
- cacheRoute: map[string]interface{}{
- "*ratio": "ratio",
- },
- lazyCheckRules: []*FilterRule{
- {
- Type: "*string",
- Element: "elem",
- Values: []string{"val1", "val2", "val3"},
- rsrValues: config.RSRParsers{
- &config.RSRParser{Rules: "public"},
- {Rules: "private"},
- }},
- {
- Type: "*string",
- Element: "elem",
- Values: []string{"val1", "val2", "val3"},
- rsrValues: config.RSRParsers{
- &config.RSRParser{Rules: "public"},
- {Rules: "private"},
- },
- },
- },
},
}
ev := &utils.CGREvent{
@@ -1538,6 +1433,15 @@ func TestHCRSortRoutes(t *testing.T) {
if _, err := hcr.SortRoutes(prflID, routes, ev, extraOpts); err != nil {
t.Error(err)
}
+ routes["sorted_route1"].RatingPlanIDs = []string{}
+ routes["sorted_route1"].AccountIDs = []string{}
+ expLog := `empty RatingPlanIDs or AccountIDs`
+ if _, err := hcr.SortRoutes(prflID, routes, ev, extraOpts); err == nil {
+ t.Error(err)
+ } else if rcvLog := buf.String(); !strings.Contains(rcvLog, expLog) {
+ t.Errorf("Logger %v doesn't contains %v", rcvLog, expLog)
+ }
+
}
func TestLoadDistributionSorterSortRoutes(t *testing.T) {
cfg := config.NewDefaultCGRConfig()