From ef60112e6beee1fb7a8b0110dccf6d2b93354f1f Mon Sep 17 00:00:00 2001 From: ionutboangiu Date: Thu, 6 May 2021 10:00:38 +0300 Subject: [PATCH] Implement and test passCronExp func in engine/filters.go --- config/config_json_test.go | 2 +- config/datadbcfg_test.go | 2 +- ees/ee_test.go | 2 +- engine/filters.go | 51 ++++++++------ engine/filters_test.go | 141 +++++++++++++++++++++++++++++++++---- 5 files changed, 158 insertions(+), 40 deletions(-) diff --git a/config/config_json_test.go b/config/config_json_test.go index d7d55dc02..4435e998b 100644 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -353,7 +353,7 @@ func TestDfDataDbJsonCfg(t *testing.T) { Replicate: utils.BoolPointer(false), Remote: utils.BoolPointer(false), }, - utils.MetaCronExp: { + utils.CacheTimings: { Replicate: utils.BoolPointer(false), Remote: utils.BoolPointer(false), }, diff --git a/config/datadbcfg_test.go b/config/datadbcfg_test.go index 4b67a9961..c97e7c93a 100644 --- a/config/datadbcfg_test.go +++ b/config/datadbcfg_test.go @@ -448,7 +448,7 @@ func TestDataDbCfgloadFromJsonCfgItems(t *testing.T) { }, RmtConns: []string{"Conn1"}, Items: map[string]*ItemOpt{ - utils.MetaCronExp: {}, + utils.CacheTimings: {}, utils.MetaResourceProfile: {}, utils.MetaResources: {}, utils.MetaStatQueueProfiles: {}, diff --git a/ees/ee_test.go b/ees/ee_test.go index c578e4f15..5cfd530d6 100644 --- a/ees/ee_test.go +++ b/ees/ee_test.go @@ -253,7 +253,7 @@ func TestNewEventExporterCase8(t *testing.T) { cgrCfg.EEsCfg().Exporters[0].Type = utils.MetaSQL filterS := engine.NewFilterS(cgrCfg, nil, nil) _, err := NewEventExporter(cgrCfg, 0, filterS) - errExpect := "MANDATORY_IE_MISSING: [tableName]" + errExpect := "MANDATORY_IE_MISSING: [sqlTableName]" if err == nil || err.Error() != errExpect { t.Errorf("Expected %+v \n but got %+v", errExpect, err) } diff --git a/engine/filters.go b/engine/filters.go index 29c8d9f77..eee8742e0 100644 --- a/engine/filters.go +++ b/engine/filters.go @@ -25,6 +25,7 @@ import ( "github.com/cgrates/birpc/context" "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/utils" + "github.com/cgrates/cron" ) // NewFilterS initializtes the filter service @@ -473,31 +474,37 @@ func (fltr *FilterRule) passStringSuffix(dDP utils.DataProvider) (bool, error) { } func (fltr *FilterRule) passCronExp(ctx *context.Context, dDP utils.DataProvider) (bool, error) { - // tm, err := fltr.rsrElement.ParseDataProvider(dDP) - // if err != nil { - // if err == utils.ErrNotFound { - // return false, nil - // } - // return false, err - // } - // tmTime, err := utils.IfaceAsTime(tm, config.CgrConfig().GeneralCfg().DefaultTimezone) - // if err != nil { - // return false, err - // } + tm, err := fltr.rsrElement.ParseDataProvider(dDP) + if err != nil { + if err == utils.ErrNotFound { + return false, nil + } + return false, err + } + tmTime, err := utils.IfaceAsTime(tm, config.CgrConfig().GeneralCfg().DefaultTimezone) + if err != nil { + return false, err + } - // for _, valCronIDVal := range fltr.rsrValues { - // valTmID, err := valCronIDVal.ParseDataProvider(dDP) - // if err != nil { - // return false, err - // } + // tmTime = tmTime.Truncate(time.Second) + tmTime = tmTime.Truncate(time.Minute) + tmBefore := tmTime.Add(-time.Second) - // if err = connMgr.Call(ctx, config.CgrConfig().FilterSCfg().AdminSConns, utils.APIerSv1GetTPTiming, ,); err != nil { - // continue - // } + for _, valCronIDVal := range fltr.rsrValues { + valTmID, err := valCronIDVal.ParseDataProvider(dDP) + if err != nil { + continue + } + exp, err := cron.ParseStandard(valTmID) + if err != nil { + continue + } + if exp.Next(tmBefore) == tmTime { + return true, nil + } + } - // } - // return false, nil - return false, utils.ErrNotImplemented + return false, nil } func (fltr *FilterRule) passDestinations(ctx *context.Context, dDP utils.DataProvider) (bool, error) { diff --git a/engine/filters_test.go b/engine/filters_test.go index 0d464ff17..dbddc6123 100644 --- a/engine/filters_test.go +++ b/engine/filters_test.go @@ -1097,20 +1097,131 @@ func TestFilterPassRSRFieldsWithMultplieValues(t *testing.T) { } } -// func TestFilterPassCronExp(t *testing.T) { -// ev := utils.MapStorage{ -// utils.MetaReq: utils.MapStorage{ -// utils.AnswerTime: "2018-01-07T17:00:10Z", -// }, -// } +func TestFilterPassCronExpOK(t *testing.T) { + ev := utils.MapStorage{ + utils.MetaReq: utils.MapStorage{ + utils.AnswerTime: "2021-05-05T12:00:01Z", + }, + } -// cfg := config.NewDefaultCGRConfig() -// dm := NewDataManager(NewInternalDB(nil, nil, true), cfg.CacheCfg(), nil) -// fltr := NewFilterS(cfg, nil, dm) + cfg := config.NewDefaultCGRConfig() + dm := NewDataManager(NewInternalDB(nil, nil, true), cfg.CacheCfg(), nil) + fltr := NewFilterS(cfg, nil, dm) -// if passes, err := fltr.Pass(context.Background(), "cgrates.org", []string{"*cronexp:~*req.AnswerTime:* 10-12 * * *"}, ev); err != nil { -// t.Error(err) -// } else if !passes { -// t.Error("Not passing") -// } -// } + if passes, err := fltr.Pass(context.Background(), "cgrates.org", + []string{"*cronexp:~*req.AnswerTime:0 12 5 5 *"}, ev); err != nil { + t.Error(err) + } else if !passes { + t.Error("Not passing") + } +} + +func TestFilterPassCronExpNotActive(t *testing.T) { + ev := utils.MapStorage{ + utils.MetaReq: utils.MapStorage{ + utils.AnswerTime: "2021-05-05T12:00:01Z", + }, + } + + cfg := config.NewDefaultCGRConfig() + dm := NewDataManager(NewInternalDB(nil, nil, true), cfg.CacheCfg(), nil) + fltr := NewFilterS(cfg, nil, dm) + + if passes, err := fltr.Pass(context.Background(), "cgrates.org", + []string{"*cronexp:~*req.AnswerTime:1 12 5 5 *"}, ev); err != nil { + t.Error(err) + } else if passes { + t.Error("should not be passing") + } +} + +func TestFilterPassCronExpParseErrWrongPath(t *testing.T) { + ev := utils.MapStorage{ + utils.MetaReq: 13, + } + + cfg := config.NewDefaultCGRConfig() + dm := NewDataManager(NewInternalDB(nil, nil, true), cfg.CacheCfg(), nil) + fltr := NewFilterS(cfg, nil, dm) + experr := utils.ErrWrongPath + + if passes, err := fltr.Pass(context.Background(), "cgrates.org", + []string{"*cronexp:~*req.AnswerTime:1 12 5 5 *"}, ev); err != experr { + t.Errorf("\nexpected: <%+v>, \nreceived: <%+v>", experr, err) + } else if passes { + t.Errorf("should not be passing") + } +} + +func TestFilterPassCronExpErrNotFound(t *testing.T) { + ev := utils.MapStorage{} + + cfg := config.NewDefaultCGRConfig() + dm := NewDataManager(NewInternalDB(nil, nil, true), cfg.CacheCfg(), nil) + fltr := NewFilterS(cfg, nil, dm) + + if passes, err := fltr.Pass(context.Background(), "cgrates.org", + []string{"*cronexp:~*req.AnswerTime:1 12 5 5 *"}, ev); err != nil { + t.Errorf("Expected nil, got %+v", err) + } else if passes { + t.Error("should not be passing") + } +} + +func TestFilterPassCronExpConvertTimeErr(t *testing.T) { + ev := utils.MapStorage{ + utils.MetaReq: utils.MapStorage{ + utils.AnswerTime: "invalid time format", + }, + } + + cfg := config.NewDefaultCGRConfig() + dm := NewDataManager(NewInternalDB(nil, nil, true), cfg.CacheCfg(), nil) + fltr := NewFilterS(cfg, nil, dm) + experr := "Unsupported time format" + + if passes, err := fltr.Pass(context.Background(), "cgrates.org", + []string{"*cronexp:~*req.AnswerTime:1 12 5 5 *"}, ev); err.Error() != experr { + t.Errorf("\nexpected: <%+v>, \nreceived: <%+v>", experr, err) + } else if passes { + t.Error("should not be passing") + } +} + +func TestFilterPassCronExpParseExpErr(t *testing.T) { + fltr, err := NewFilterRule(utils.MetaCronExp, "~*req.AnswerTime", []string{"* * * * * *"}) + if err != nil { + t.Fatal(err) + } + + ev := utils.MapStorage{ + utils.MetaReq: utils.MapStorage{ + utils.AnswerTime: "2021-05-05T12:00:01Z", + }, + } + + if passes, err := fltr.passCronExp(context.Background(), ev); err != nil { + t.Errorf("Expected nil, got %+v", err) + } else if passes { + t.Error("should not be passing") + } +} + +func TestFilterPassCronExpParseDPErr(t *testing.T) { + fltr, err := NewFilterRule(utils.MetaCronExp, "~*req.AnswerTime", []string{"~* * * * *"}) + if err != nil { + t.Fatal(err) + } + + ev := utils.MapStorage{ + utils.MetaReq: utils.MapStorage{ + utils.AnswerTime: "2021-05-05T12:00:01Z", + }, + } + + if passes, err := fltr.passCronExp(context.Background(), ev); err != nil { + t.Errorf("Expected nil, got %+v", err) + } else if passes { + t.Error("should not be passing") + } +}