From 6bfdb6d767ac01ca3d069bd8ead879c713daf80a Mon Sep 17 00:00:00 2001 From: porosnicuadrian Date: Fri, 28 May 2021 16:56:51 +0300 Subject: [PATCH] Test cases for sanitization path in config sanity --- apis/account_test.go | 2 +- config/configsanity.go | 25 ++ config/configsanity_test.go | 579 ++++++++++++++++++++++++++++++++++++ migrator/routes_it_test.go | 2 +- 4 files changed, 606 insertions(+), 2 deletions(-) diff --git a/apis/account_test.go b/apis/account_test.go index 0a50479c0..ad8babcc5 100644 --- a/apis/account_test.go +++ b/apis/account_test.go @@ -402,7 +402,7 @@ func TestAccountSetGetAccountErrorBadFilter(t *testing.T) { var setRply string err := admS.SetAccount(context.Background(), ext, &setRply) - if err == nil || err.Error() != "SERVER_ERROR: broken reference to filter: *string*req.Account1001 for item with ID: cgrates.org:test_ID1" { + if err == nil || err.Error() != "SERVER_ERROR: broken reference to filter: <*string*req.Account1001> for item with ID: cgrates.org:test_ID1" { t.Errorf("\nExpected <%+v>, \nReceived <%+v>", "SERVER_ERROR: broken reference to filter: *string*req.Account1001 for item with ID: cgrates.org:test_ID1", err) } if !reflect.DeepEqual(setRply, "") { diff --git a/config/configsanity.go b/config/configsanity.go index 8d5b80a1a..e6ccea23b 100644 --- a/config/configsanity.go +++ b/config/configsanity.go @@ -400,11 +400,36 @@ func (cfg *CGRConfig) checkConfigSanity() error { if field.Type != utils.MetaNone && field.Path == utils.EmptyString { return fmt.Errorf("<%s> %s for %s at %s", utils.DNSAgent, utils.NewErrMandatoryIeMissing(utils.Path), req.ID, field.Tag) } + if err := utils.IsPathValidForExporters(field.Path); err != nil { + return fmt.Errorf("<%s> %s for %s at %s", utils.DNSAgent, err, field.Path, utils.Path) + } + for _, val := range field.Value { + if err := utils.IsPathValidForExporters(val.path); err != nil { + return fmt.Errorf("<%s> %s for %s at %s of %s", utils.DNSAgent, err, val.path, utils.Values, utils.RequestFieldsCfg) + } + } + if err := utils.CheckInLineFilter(field.Filters); err != nil { + return fmt.Errorf("<%s> %s for %s at %s", utils.DNSAgent, err, field.Filters, utils.RequestFieldsCfg) + } } for _, field := range req.ReplyFields { if field.Type != utils.MetaNone && field.Path == utils.EmptyString { return fmt.Errorf("<%s> %s for %s at %s", utils.DNSAgent, utils.NewErrMandatoryIeMissing(utils.Path), req.ID, field.Tag) } + if err := utils.IsPathValidForExporters(field.Path); err != nil { + return fmt.Errorf("<%s> %s for %s at %s", utils.DNSAgent, err, field.Path, utils.Path) + } + for _, val := range field.Value { + if err := utils.IsPathValidForExporters(val.path); err != nil { + return fmt.Errorf("<%s> %s for %s at %s of %s", utils.DNSAgent, err, val.path, utils.Values, utils.ReplyFieldsCfg) + } + } + if err := utils.CheckInLineFilter(field.Filters); err != nil { + return fmt.Errorf("<%s> %s for %s at %s", utils.DNSAgent, err, field.Filters, utils.ReplyFieldsCfg) + } + } + if err := utils.CheckInLineFilter(req.Filters); err != nil { + return fmt.Errorf("<%s> %s for %s at %s", utils.DNSAgent, err, req.Filters, utils.RequestProcessorsCfg) } } } diff --git a/config/configsanity_test.go b/config/configsanity_test.go index 4abc1ff6d..0f90e834a 100644 --- a/config/configsanity_test.go +++ b/config/configsanity_test.go @@ -181,6 +181,151 @@ func TestConfigSanityLoaders(t *testing.T) { if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { t.Errorf("Expecting: %+q received: %+q", expected, err) } + + cfg.loaderCfg[0].Data[0].Fields[0].Path = "~req." + expected = " Empty field path for ~req. at Path" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.loaderCfg[0].Data[0].Fields[0].Path = "~*req.Destination" + + cfg.loaderCfg[0].Data[0].Fields[0].Value = RSRParsers{{}} + cfg.loaderCfg[0].Data[0].Fields[0].Value[0].path = "~req." + expected = " Empty field path for ~req. at Values" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.loaderCfg[0].Data[0].Fields[0].Value[0].path = "*req.Destination" + + cfg.loaderCfg[0].Data[0].Fields[0].Filters = make([]string, 1) + cfg.loaderCfg[0].Data[0].Fields[0].Filters = []string{"*string:~*req..Field"} + expected = " inline parse error for string: <*string:~*req..Field> for [*string:~*req..Field] at Filters" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.loaderCfg[0].Data[0].Fields[0].Filters = []string{"~req.Valid.Field"} +} + +func TestConfigSanitySessionS(t *testing.T) { + cfg = NewDefaultCGRConfig() + cfg.sessionSCfg = &SessionSCfg{ + Enabled: true, + TerminateAttempts: 0, + } + expected := " 'terminate_attempts' should be at least 1" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sessionSCfg.TerminateAttempts = 1 + + cfg.sessionSCfg.ChargerSConns = []string{utils.MetaInternal} + expected = " not enabled but requested by component" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sessionSCfg.ChargerSConns = []string{"test"} + expected = " connection with id: not defined" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sessionSCfg.ChargerSConns = []string{} + cfg.chargerSCfg.Enabled = true + + cfg.sessionSCfg.ResSConns = []string{utils.MetaInternal} + expected = " not enabled but requested by component" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sessionSCfg.ResSConns = []string{"test"} + expected = " connection with id: not defined" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sessionSCfg.ResSConns = []string{} + cfg.resourceSCfg.Enabled = true + + cfg.sessionSCfg.ThreshSConns = []string{utils.MetaInternal} + expected = " not enabled but requested by component" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sessionSCfg.ThreshSConns = []string{"test"} + expected = " connection with id: not defined" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sessionSCfg.ThreshSConns = []string{} + cfg.thresholdSCfg.Enabled = true + + cfg.sessionSCfg.StatSConns = []string{utils.MetaInternal} + expected = " not enabled but requested by component" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sessionSCfg.StatSConns = []string{"test"} + expected = " connection with id: not defined" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sessionSCfg.StatSConns = []string{} + cfg.statsCfg.Enabled = true + + cfg.sessionSCfg.RouteSConns = []string{utils.MetaInternal} + expected = " not enabled but requested by component" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sessionSCfg.RouteSConns = []string{"test"} + expected = " connection with id: not defined" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sessionSCfg.RouteSConns = []string{} + cfg.routeSCfg.Enabled = true + + cfg.sessionSCfg.AttrSConns = []string{utils.MetaInternal} + expected = " not enabled but requested by component" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sessionSCfg.AttrSConns = []string{"test"} + expected = " connection with id: not defined" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sessionSCfg.AttrSConns = []string{} + cfg.attributeSCfg.Enabled = true + + cfg.sessionSCfg.CDRsConns = []string{utils.MetaInternal} + expected = " not enabled but requested by component" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sessionSCfg.CDRsConns = []string{"test"} + expected = " connection with id: not defined" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sessionSCfg.CDRsConns = []string{} + cfg.cdrsCfg.Enabled = true + cfg.sessionSCfg.ReplicationConns = []string{"test"} + expected = " connection with id: not defined" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sessionSCfg.ReplicationConns = []string{} + + cfg.cacheCfg.Partitions[utils.CacheClosedSessions].Limit = 0 + expected = " *closed_sessions needs to be != 0, received: 0" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.cacheCfg.Partitions[utils.CacheClosedSessions].Limit = 1 + expected = " the following protected field can't be altered by session: " + cfg.sessionSCfg.AlterableFields = utils.NewStringSet([]string{utils.CGRID}) + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } } func TestConfigSanityFreeSWITCHAgent(t *testing.T) { @@ -301,6 +446,27 @@ func TestConfigSanityDAgent(t *testing.T) { if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { t.Errorf("Expecting: %+q received: %+q", expected, err) } + + cfg.templates[utils.MetaEEs][0].Path = "~Req." + expected = " Empty field path for ~Req. at Path" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.templates[utils.MetaEEs][0].Path = "*req.OriginID" + + cfg.templates[utils.MetaEEs][0].Value[0].path = "~Req." + expected = " Empty field path for ~Req. at Values" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.templates[utils.MetaEEs][0].Value[0].path = "*req.OriginID" + + cfg.templates[utils.MetaEEs][0].Filters = []string{"*string:~*req..Field"} + expected = " inline parse error for string: <*string:~*req..Field> for [*string:~*req..Field] at templates" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.templates[utils.MetaEEs][0].Filters = []string{"*string:~*req.VAlid.Field"} cfg.templates = nil expected = " MANDATORY_IE_MISSING: [Path] for cgrates at SessionId" @@ -309,10 +475,62 @@ func TestConfigSanityDAgent(t *testing.T) { } cfg.diameterAgentCfg.RequestProcessors[0].RequestFields[0].Type = utils.MetaNone + cfg.diameterAgentCfg.RequestProcessors[0].RequestFields[0].Filters = []string{"*string:~*req..Field"} + expected = " inline parse error for string: <*string:~*req..Field> for [*string:~*req..Field] at request_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.diameterAgentCfg.RequestProcessors[0].RequestFields[0].Filters = []string{"*string:~*req.Valid.Field"} + + cfg.diameterAgentCfg.RequestProcessors[0].RequestFields[0].Path = "~REQ." + expected = " Empty field path for ~REQ. at Path" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.diameterAgentCfg.RequestProcessors[0].RequestFields[0].Path = "*req.Valid.Field" + + cfg.diameterAgentCfg.RequestProcessors[0].RequestFields[0].Value[0].path = "~REQ." + expected = " Empty field path for ~REQ. at Values of request_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.diameterAgentCfg.RequestProcessors[0].RequestFields[0].Value[0].path = "*req.Valid.Field" + cfg.diameterAgentCfg.RequestProcessors[0].RequestFields = []*FCTemplate{} + expected = " MANDATORY_IE_MISSING: [Path] for cgrates at SessionId" if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { t.Errorf("Expecting: %+q received: %+q", expected, err) } + cfg.diameterAgentCfg.RequestProcessors[0].ReplyFields[0].Type = utils.MetaNone + + cfg.diameterAgentCfg.RequestProcessors[0].ReplyFields[0].Filters = []string{"*string:~*req..Field"} + expected = " inline parse error for string: <*string:~*req..Field> for [*string:~*req..Field] at reply_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.diameterAgentCfg.RequestProcessors[0].ReplyFields[0].Filters = []string{"*string:~*req.Valid.Field"} + + cfg.diameterAgentCfg.RequestProcessors[0].ReplyFields[0].Path = "~REQ." + expected = " Empty field path for ~REQ. at Path" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.diameterAgentCfg.RequestProcessors[0].ReplyFields[0].Path = "*req.Valid.Field" + + cfg.diameterAgentCfg.RequestProcessors[0].ReplyFields[0].Value[0].path = "~REQ." + expected = " Empty field path for ~REQ. at Values of reply_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.diameterAgentCfg.RequestProcessors[0].ReplyFields[0].Value[0].path = "*req.Valid.Field" + cfg.diameterAgentCfg.RequestProcessors[0].ReplyFields = []*FCTemplate{} + + cfg.diameterAgentCfg.RequestProcessors[0].Filters = []string{"*string:~*req..Field"} + expected = " inline parse error for string: <*string:~*req..Field> for [*string:~*req..Field] at request_processors" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.diameterAgentCfg.RequestProcessors[0].Filters = []string{"*string:~*req.Valid.Field"} } func TestConfigSanityRadiusAgent(t *testing.T) { @@ -357,10 +575,63 @@ func TestConfigSanityRadiusAgent(t *testing.T) { } cfg.radiusAgentCfg.RequestProcessors[0].RequestFields[0].Type = utils.MetaNone + cfg.radiusAgentCfg.RequestProcessors[0].RequestFields[0].Path = "~req." + expected = " Empty field path for ~req. at Path" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.radiusAgentCfg.RequestProcessors[0].RequestFields[0].Path = "*req.OriginID" + + cfg.radiusAgentCfg.RequestProcessors[0].RequestFields[0].Value[0].path = "~req." + expected = " Empty field path for ~req. at Values of request_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.radiusAgentCfg.RequestProcessors[0].RequestFields[0].Value[0].path = "*req.OriginID" + + cfg.radiusAgentCfg.RequestProcessors[0].RequestFields[0].Filters = []string{"*empty:*ec"} + expected = " inline parse error for string: <*empty:*ec> for [*empty:*ec] at request_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.radiusAgentCfg.RequestProcessors[0].RequestFields[0].Filters = []string{"*string:~*req.Account:1001"} + cfg.radiusAgentCfg.RequestProcessors[0].RequestFields = []*FCTemplate{} + + cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields[0].Path = "~req." + expected = " Empty field path for ~req. at Path" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields[0].Path = "*req.OriginID" + + cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields[0].Value[0].path = "~req." + expected = " Empty field path for ~req. at Values of reply_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields[0].Value[0].path = "*req.OriginID" + + cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields[0].Filters = []string{"*empty:*ec"} + expected = " inline parse error for string: <*empty:*ec> for [*empty:*ec] at reply_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields[0].Filters = []string{"*string:~*req.Account:1001"} + + cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields[0].Type = "changed" + cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields[0].Path = utils.EmptyString expected = " MANDATORY_IE_MISSING: [Path] for cgrates at SessionId" if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { t.Errorf("Expecting: %+q received: %+q", expected, err) } + cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields = []*FCTemplate{} + + cfg.radiusAgentCfg.RequestProcessors[0].Filters = []string{"*empty:*ec"} + expected = " inline parse error for string: <*empty:*ec> for [*empty:*ec] at request_processors" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.radiusAgentCfg.RequestProcessors[0].Filters = []string{"*string:~*req.Account:1001"} } func TestConfigSanityDNSAgent(t *testing.T) { @@ -405,10 +676,63 @@ func TestConfigSanityDNSAgent(t *testing.T) { } cfg.dnsAgentCfg.RequestProcessors[0].RequestFields[0].Type = utils.MetaNone + cfg.dnsAgentCfg.RequestProcessors[0].RequestFields[0].Value[0].path = "~req." + expected = " Empty field path for ~req. at Values of request_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.dnsAgentCfg.RequestProcessors[0].RequestFields[0].Value[0].path = "*req.Value" + + cfg.dnsAgentCfg.RequestProcessors[0].RequestFields[0].Filters = []string{"*empty:~*req"} + expected = " inline parse error for string: <*empty:~*req> for [*empty:~*req] at request_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.dnsAgentCfg.RequestProcessors[0].RequestFields[0].Filters = []string{"*string:~*req.Account:1001"} + + cfg.dnsAgentCfg.RequestProcessors[0].RequestFields[0].Path = "~req." + expected = " Empty field path for ~req. at Path" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.dnsAgentCfg.RequestProcessors[0].RequestFields[0].Path = "*req.Value" + cfg.dnsAgentCfg.RequestProcessors[0].RequestFields = []*FCTemplate{} + + cfg.dnsAgentCfg.RequestProcessors[0].ReplyFields[0].Path = "~req." + cfg.dnsAgentCfg.RequestProcessors[0].ReplyFields[0].Type = "CHANGED" + expected = " Empty field path for ~req. at Path" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.dnsAgentCfg.RequestProcessors[0].ReplyFields[0].Path = utils.EmptyString + expected = " MANDATORY_IE_MISSING: [Path] for cgrates at SessionId" if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { t.Errorf("Expecting: %+q received: %+q", expected, err) } + cfg.dnsAgentCfg.RequestProcessors[0].ReplyFields[0].Path = "*empty:*ec" + + cfg.dnsAgentCfg.RequestProcessors[0].ReplyFields[0].Value[0].path = "~req." + expected = " Empty field path for ~req. at Values of reply_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.dnsAgentCfg.RequestProcessors[0].ReplyFields[0].Value[0].path = "*empty:*ec" + + cfg.dnsAgentCfg.RequestProcessors[0].ReplyFields[0].Filters = []string{"*empty:*ec"} + expected = " inline parse error for string: <*empty:*ec> for [*empty:*ec] at reply_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.dnsAgentCfg.RequestProcessors[0].ReplyFields = []*FCTemplate{} + + cfg.dnsAgentCfg.RequestProcessors[0].Filters = []string{"*empty:*ec"} + expected = " inline parse error for string: <*empty:*ec> for [*empty:*ec] at request_processors" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.dnsAgentCfg.RequestProcessors[0].Filters = []string{"*string:~*req.Account:1001"} + } func TestConfigSanityHTTPAgent1(t *testing.T) { @@ -462,11 +786,80 @@ func TestConfigSanityHTTPAgent1(t *testing.T) { if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { t.Errorf("Expecting: %+q received: %+q", expected, err) } + cfg.httpAgentCfg[0].RequestProcessors[0].RequestFields[0].Type = utils.MetaNone expected = " MANDATORY_IE_MISSING: [Path] for cgrates at SessionId" if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { t.Errorf("Expecting: %+q received: %+q", expected, err) } + + cfg.httpAgentCfg[0].RequestProcessors[0].RequestFields[0].Path = "~Field1..Field2[0]" + expected = " Empty field path for ~Field1..Field2[0] at Path" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + + cfg.httpAgentCfg[0].RequestProcessors[0].RequestFields[0].Value = RSRParsers{ + &RSRParser{ + Rules: "~*req.Session-Id2", + path: "~Field1..Field2[0]", + }, + } + cfg.httpAgentCfg[0].RequestProcessors[0].RequestFields[0].Path = utils.EmptyString + expected = " Empty field path for ~Field1..Field2[0] at Values of request_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.httpAgentCfg[0].RequestProcessors[0].RequestFields[0].Value = RSRParsers{ + &RSRParser{ + Rules: "~*req.Session-Id2", + path: "~Field1.Field2[0]", + }, + } + cfg.httpAgentCfg[0].RequestProcessors[0].RequestFields[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"} + expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at request_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.httpAgentCfg[0].RequestProcessors[0].RequestFields[0].Filters = nil + + cfg.httpAgentCfg[0].RequestProcessors[0].ReplyFields[0].Path = "~Field1..Field2[0]" + expected = " Empty field path for ~Field1..Field2[0] at Path" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + + cfg.httpAgentCfg[0].RequestProcessors[0].ReplyFields[0].Value = RSRParsers{ + &RSRParser{ + Rules: "~*req.Session-Id2", + path: "~Field1..Field2[0]", + }, + } + cfg.httpAgentCfg[0].RequestProcessors[0].ReplyFields[0].Path = utils.EmptyString + cfg.httpAgentCfg[0].RequestProcessors[0].ReplyFields[0].Type = utils.MetaNone + expected = " Empty field path for ~Field1..Field2[0] at Values of reply_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + + cfg.httpAgentCfg[0].RequestProcessors[0].ReplyFields[0].Value = RSRParsers{ + &RSRParser{ + Rules: "~*req.Session-Id2", + path: "~Field1.Field2[0]", + }, + } + cfg.httpAgentCfg[0].RequestProcessors[0].ReplyFields[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"} + expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at reply_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.httpAgentCfg[0].RequestProcessors[0].ReplyFields[0].Filters = nil + + cfg.httpAgentCfg[0].RequestProcessors[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"} + expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at request_processors" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } } func TestConfigSanitySipAgent(t *testing.T) { @@ -506,6 +899,7 @@ func TestConfigSanitySipAgent(t *testing.T) { t.Errorf("Expecting: %+q received: %+q", expected, err) } + //Request fields cfg.rpcConns["test"] = nil expected = " MANDATORY_IE_MISSING: [Path] for cgrates at SessionId" if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { @@ -516,6 +910,76 @@ func TestConfigSanitySipAgent(t *testing.T) { if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { t.Errorf("Expecting: %+q received: %+q", expected, err) } + + cfg.sipAgentCfg.RequestProcessors[0].RequestFields[0].Path = "~Field1..Field2[0]" + expected = " Empty field path for ~Field1..Field2[0] at Path" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + + cfg.sipAgentCfg.RequestProcessors[0].RequestFields[0].Value = RSRParsers{ + &RSRParser{ + Rules: "~*req.Session-Id2", + path: "~Field1..Field2[0]", + }, + } + cfg.sipAgentCfg.RequestProcessors[0].RequestFields[0].Path = utils.EmptyString + expected = " Empty field path for ~Field1..Field2[0] at Values of request_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + + cfg.sipAgentCfg.RequestProcessors[0].RequestFields[0].Value = RSRParsers{ + &RSRParser{ + Rules: "~*req.Session-Id2", + path: "~Field1.Field2[0]", + }, + } + cfg.sipAgentCfg.RequestProcessors[0].RequestFields[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"} + expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at request_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sipAgentCfg.RequestProcessors[0].RequestFields[0].Filters = nil + + //Reply fields + cfg.sipAgentCfg.RequestProcessors[0].ReplyFields[0].Path = "~Field1..Field2[0]" + expected = " Empty field path for ~Field1..Field2[0] at Path" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + + cfg.sipAgentCfg.RequestProcessors[0].ReplyFields[0].Value = RSRParsers{ + &RSRParser{ + Rules: "~*req.Session-Id2", + path: "~Field1..Field2[0]", + }, + } + cfg.sipAgentCfg.RequestProcessors[0].ReplyFields[0].Path = utils.EmptyString + cfg.sipAgentCfg.RequestProcessors[0].ReplyFields[0].Type = utils.MetaNone + expected = " Empty field path for ~Field1..Field2[0] at Values of reply_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + + cfg.sipAgentCfg.RequestProcessors[0].ReplyFields[0].Value = RSRParsers{ + &RSRParser{ + Rules: "~*req.Session-Id2", + path: "~Field1.Field2[0]", + }, + } + cfg.sipAgentCfg.RequestProcessors[0].ReplyFields[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"} + expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at reply_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.sipAgentCfg.RequestProcessors[0].ReplyFields[0].Filters = nil + + cfg.sipAgentCfg.RequestProcessors[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"} + expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at request_processors" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } } func TestConfigSanityAttributesCfg(t *testing.T) { @@ -722,6 +1186,8 @@ func TestConfigSanityEventReader(t *testing.T) { }, PartialCacheAction: utils.MetaNone, } + + //CacheDumpFields expected = " MANDATORY_IE_MISSING: [Path] for at SessionId" if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { t.Errorf("Expecting: %+q received: %+q", expected, err) @@ -731,6 +1197,79 @@ func TestConfigSanityEventReader(t *testing.T) { if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected { t.Errorf("Expecting: %+q received: %+q", expected, err) } + + cfg.ersCfg.Readers[0].CacheDumpFields[0].Path = "~Field1..Field2[0]" + expected = " Empty field path for ~Field1..Field2[0] at Path" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + + cfg.ersCfg.Readers[0].CacheDumpFields[0].Value = RSRParsers{ + &RSRParser{ + Rules: "~*req.Session-Id2", + path: "~Field1..Field2[0]", + }, + } + cfg.ersCfg.Readers[0].CacheDumpFields[0].Path = "~Field1.Field3[0]" + cfg.ersCfg.Readers[0].CacheDumpFields[0].Type = utils.MetaUnixTimestamp + expected = " Empty field path for ~Field1..Field2[0] at Values of cache_dump_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + + cfg.ersCfg.Readers[0].CacheDumpFields[0].Type = utils.MetaNone + cfg.ersCfg.Readers[0].CacheDumpFields[0].Value = RSRParsers{ + &RSRParser{ + Rules: "~*req.Session-Id2", + path: "~Field1.Field2[0]", + }, + } + cfg.ersCfg.Readers[0].CacheDumpFields[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"} + expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at cache_dump_fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.ersCfg.Readers[0].CacheDumpFields[0].Filters = nil + + //Fields + cfg.ersCfg.Readers[0].Fields[0].Path = "~Field1..Field2[0]" + expected = " Empty field path for ~Field1..Field2[0] at Path" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + + cfg.ersCfg.Readers[0].Fields[0].Value = RSRParsers{ + &RSRParser{ + Rules: "~*req.Session-Id2", + path: "~Field1..Field2[0]", + }, + } + cfg.ersCfg.Readers[0].Fields[0].Path = "~Field1.Field3[0]" + cfg.ersCfg.Readers[0].Fields[0].Type = utils.MetaUnixTimestamp + expected = " Empty field path for ~Field1..Field2[0] at Values of fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + + cfg.ersCfg.Readers[0].Fields[0].Type = utils.MetaNone + cfg.ersCfg.Readers[0].Fields[0].Value = RSRParsers{ + &RSRParser{ + Rules: "~*req.Session-Id2", + path: "~Field1.Field2[0]", + }, + } + cfg.ersCfg.Readers[0].Fields[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"} + expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.ersCfg.Readers[0].Fields[0].Filters = nil + + cfg.ersCfg.Readers[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"} + expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at readers" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } } func TestConfigSanityEventExporter(t *testing.T) { @@ -795,6 +1334,46 @@ func TestConfigSanityEventExporter(t *testing.T) { if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected { t.Errorf("Expecting: %+q received: %+q", expected, err) } + + cfg.eesCfg.Exporters[0].Type = utils.MetaHTTPPost + cfg.eesCfg.Exporters[0].Fields[0].Path = "~Field1..Field2[0]" + expected = " Empty field path for ~Field1..Field2[0] at Path" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + + cfg.eesCfg.Exporters[0].Fields[0].Value = RSRParsers{ + &RSRParser{ + Rules: "~*req.Session-Id2", + path: "~Field1..Field2[0]", + }, + } + cfg.eesCfg.Exporters[0].Fields[0].Path = "~Field1.Field3[0]" + cfg.eesCfg.Exporters[0].Fields[0].Type = utils.MetaUnixTimestamp + expected = " Empty field path for ~Field1..Field2[0] at Values of fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + + cfg.eesCfg.Exporters[0].Fields[0].Type = utils.MetaNone + cfg.eesCfg.Exporters[0].Fields[0].Value = RSRParsers{ + &RSRParser{ + Rules: "~*req.Session-Id2", + path: "~Field1.Field2[0]", + }, + } + cfg.eesCfg.Exporters[0].Fields[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"} + expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at fields" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.eesCfg.Exporters[0].Fields[0].Filters = nil + + cfg.eesCfg.Exporters[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"} + expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at exporters" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } } func TestConfigSanityCache(t *testing.T) { diff --git a/migrator/routes_it_test.go b/migrator/routes_it_test.go index 58fe8f427..1d19b1687 100644 --- a/migrator/routes_it_test.go +++ b/migrator/routes_it_test.go @@ -195,7 +195,7 @@ func testSupITMigrateAndMove(t *testing.T) { }}, } switch supAction { - case utils.Migrate: // for the momment only one version of rating plans exists + case utils.Migrate: // for the moment only one version of rating plans exists case utils.Move: if err := supMigrator.dmIN.DataManager().SetRouteProfile(context.TODO(), supPrfl, true); err != nil { t.Error(err)