diff --git a/engine/datamanager_test.go b/engine/datamanager_test.go index b8304d20c..9d1ca7036 100644 --- a/engine/datamanager_test.go +++ b/engine/datamanager_test.go @@ -546,3 +546,123 @@ func TestDatamanagerCacheDataFromDBNotCachedActionProfilePrefix(t *testing.T) { 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) + } +} + +// unfinished +// 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 +// }, +// } +// 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 != nil { +// t.Errorf("Expected error <%v>, Received error <%v>", utils.ErrNotImplemented, err) +// } +// } diff --git a/engine/filterhelpers_test.go b/engine/filterhelpers_test.go index 72d1b8f1a..4b7445f7c 100644 --- a/engine/filterhelpers_test.go +++ b/engine/filterhelpers_test.go @@ -23,6 +23,7 @@ import ( "testing" "github.com/cgrates/birpc/context" + "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/utils" ) @@ -45,3 +46,29 @@ func TestFilterHelpersWeightFromDynamics(t *testing.T) { t.Errorf("\nExpected <%+v>, \nReceived <%+v>", expected, result) } } + +func TestFilterHelpersWeightFromDynamicsErr(t *testing.T) { + + ctx := context.Background() + dWs := []*utils.DynamicWeight{ + { + FilterIDs: []string{"*stirng:~*req.Account:1001:4fields"}, + Weight: 64, + }, + } + cfg := config.NewDefaultCGRConfig() + data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items) + dm := NewDataManager(data, config.CgrConfig().CacheCfg(), nil) + + cM := NewConnManager(cfg) + fltrs := NewFilterS(cfg, cM, dm) + tnt := utils.CGRateSorg + ev := utils.MapStorage{} + + expErr := "NOT_IMPLEMENTED:*stirng" + _, err := WeightFromDynamics(ctx, dWs, fltrs, tnt, ev) + if err.Error() != expErr { + t.Errorf("Expected error <%v>, received error <%V>", expErr, err) + } + +} diff --git a/engine/libengine_test.go b/engine/libengine_test.go index b29feca57..c1949be3b 100644 --- a/engine/libengine_test.go +++ b/engine/libengine_test.go @@ -24,6 +24,7 @@ import ( "testing" "time" + "github.com/cgrates/birpc" "github.com/cgrates/birpc/context" "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/utils" @@ -192,27 +193,28 @@ func TestIntServiceNewService(t *testing.T) { type TestRPCDspMock struct{} // exported for service -func (TestRPCDspMock) AccountSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) ActionSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) AttributeSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) CacheSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) ChargerSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) ConfigSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) DispatcherSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) GuardianSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) RateSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) ReplicatorSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) ResourceSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) RouteSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) SessionSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) StatSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) ThresholdSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) CDRsv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) EeSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) CoreSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) AnalyzerSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) AdminSv1Do(*context.Context, interface{}, *string) error { return nil } -func (TestRPCDspMock) LoaderSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) AccountSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) ActionSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) AttributeSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) CacheSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) ChargerSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) ConfigSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) DispatcherSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) GuardianSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) RateSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) ReplicatorSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) ResourceSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) RouteSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) SessionSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) StatSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) ThresholdSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) CDRsv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) EeSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) CoreSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) AnalyzerSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) AdminSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) LoaderSv1Do(*context.Context, interface{}, *string) error { return nil } +func (TestRPCDspMock) ServiceManagerv1Do(*context.Context, interface{}, *string) error { return nil } func TestIntServiceNewDispatcherService(t *testing.T) { expErrMsg := `rpc.Register: no service name for type struct {}` @@ -240,17 +242,52 @@ func TestIntServiceNewDispatcherService(t *testing.T) { "RouteSv1": {"Do", "Ping"}, "SessionSv1": {"Do", "Ping"}, "StatSv1": {"Do", "Ping"}, - "TestRPCDspMock": {"AccountSv1Do", "ActionSv1Do", "AdminSv1Do", "AnalyzerSv1Do", "AttributeSv1Do", "CDRsv1Do", "CacheSv1Do", "ChargerSv1Do", "ConfigSv1Do", "CoreSv1Do", "DispatcherSv1Do", "EeSv1Do", "GuardianSv1Do", "LoaderSv1Do", "Ping", "RateSv1Do", "ReplicatorSv1Do", "ResourceSv1Do", "RouteSv1Do", "SessionSv1Do", "StatSv1Do", "ThresholdSv1Do"}, + "TestRPCDspMock": {"AccountSv1Do", "ActionSv1Do", "AdminSv1Do", "AnalyzerSv1Do", "AttributeSv1Do", "CDRsv1Do", "CacheSv1Do", "ChargerSv1Do", "ConfigSv1Do", "CoreSv1Do", "DispatcherSv1Do", "EeSv1Do", "GuardianSv1Do", "LoaderSv1Do", "Ping", "RateSv1Do", "ReplicatorSv1Do", "ResourceSv1Do", "RouteSv1Do", "ServiceManagerv1Do", "SessionSv1Do", "StatSv1Do", "ThresholdSv1Do"}, "ThresholdSv1": {"Do", "Ping"}, "ReplicatorSv1": {"Do", "Ping"}, - "EeSv1": {"Do", "Ping"}, - "CoreSv1": {"Do", "Ping"}, - "AnalyzerSv1": {"Do", "Ping"}, - "AdminSv1": {"Do", "Ping"}, - "LoaderSv1": {"Do", "Ping"}, + "EeSv1": {"Do", "Ping"}, + "CoreSv1": {"Do", "Ping"}, + "AnalyzerSv1": {"Do", "Ping"}, + "AdminSv1": {"Do", "Ping"}, + "LoaderSv1": {"Do", "Ping"}, + "ServiceManagerV1": {"Do", "Ping"}, } if !reflect.DeepEqual(exp, methods) { t.Errorf("Expeceted: %v, \nreceived: \n%v", utils.ToJSON(exp), utils.ToJSON(methods)) } } + +func TestNewRPCPoolUnsupportedTransport(t *testing.T) { + tmp := Cache + defer func() { + Cache = tmp + }() + + connID := rpcclient.BiRPCInternal + "connID" + cfg := config.NewDefaultCGRConfig() + cfg.RPCConns()[connID] = config.NewDfltRPCConn() + + cc := make(chan birpc.ClientConnector, 1) + + cM := &ConnManager{ + cfg: cfg, + rpcInternal: map[string]chan birpc.ClientConnector{ + connID: cc, + }, + connCache: ltcache.NewCache(-1, 0, true, nil), + } + badConf := []*config.RemoteHost{ + { + Address: "inexistednt Addr", + Transport: "unsupported transport", + }, + } + experr := "Unsupported transport: " + if _, err := NewRPCPool(context.Background(), utils.MetaFirst, "", "", "", cfg.GeneralCfg().ConnectAttempts, + cfg.GeneralCfg().Reconnects, cfg.GeneralCfg().MaxReconnectInterval, cfg.GeneralCfg().ConnectTimeout, + cfg.GeneralCfg().ReplyTimeout, badConf, cc, true, nil, "", cM.connCache); err == nil || err.Error() != experr { + t.Errorf("Expected error <%v>, received error <%v>", experr, err) + } + +}