From b6de12b643247889814ef8cb5f447639f27799f0 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 1 Jul 2021 12:34:28 +0300 Subject: [PATCH] Added *sipcid field type --- config/configsanity.go | 9 +++-- engine/attributes.go | 10 ++++++ engine/attributes_test.go | 72 +++++++++++++++++++++++++++++++++++++++ utils/consts.go | 2 ++ 4 files changed, 90 insertions(+), 3 deletions(-) diff --git a/config/configsanity.go b/config/configsanity.go index b83be210b..f73668646 100644 --- a/config/configsanity.go +++ b/config/configsanity.go @@ -781,7 +781,8 @@ func (cfg *CGRConfig) checkConfigSanity() error { field.Type == utils.MetaMultiply || field.Type == utils.MetaDivide || field.Type == utils.MetaValueExponent || - field.Type == utils.MetaUnixTimestamp { + field.Type == utils.MetaUnixTimestamp || + field.Type == utils.MetaSIPCID { 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.ERs, err, val.path, utils.Values, utils.CacheDumpFieldsCfg) @@ -809,7 +810,8 @@ func (cfg *CGRConfig) checkConfigSanity() error { field.Type == utils.MetaMultiply || field.Type == utils.MetaDivide || field.Type == utils.MetaValueExponent || - field.Type == utils.MetaUnixTimestamp { + field.Type == utils.MetaUnixTimestamp || + field.Type == utils.MetaSIPCID { 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.ERs, err, val.path, utils.Values, utils.FieldsCfg) @@ -879,7 +881,8 @@ func (cfg *CGRConfig) checkConfigSanity() error { field.Type == utils.MetaMultiply || field.Type == utils.MetaDivide || field.Type == utils.MetaValueExponent || - field.Type == utils.MetaUnixTimestamp { + field.Type == utils.MetaUnixTimestamp || + field.Type == utils.MetaSIPCID { 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.EEs, err, val.path, utils.Values, utils.FieldsCfg) diff --git a/engine/attributes.go b/engine/attributes.go index af07ad3ba..52ce74f4b 100644 --- a/engine/attributes.go +++ b/engine/attributes.go @@ -21,6 +21,7 @@ package engine import ( "fmt" "math" + "sort" "strconv" "strings" "time" @@ -542,6 +543,15 @@ func ParseAttribute(dp utils.DataProvider, attrType, path string, value config.R reqNr = 0 } return usedCCTime + time.Duration(debitItvl.Nanoseconds()*reqNr), nil + case utils.MetaSIPCID: + values := make([]string, len(value)) + for i, val := range value { + if values[i], err = val.ParseDataProvider(dp); err != nil { + return + } + } + sort.Strings(values[1:]) + out = strings.Join(values, utils.InfieldSep) default: return utils.EmptyString, fmt.Errorf("unsupported type: <%s>", attrType) } diff --git a/engine/attributes_test.go b/engine/attributes_test.go index a6e145d3c..6bca54a6b 100644 --- a/engine/attributes_test.go +++ b/engine/attributes_test.go @@ -1169,3 +1169,75 @@ func TestAttributesattributeProfileForEventErrPass(t *testing.T) { t.Errorf("\nexpected: <%+v>, \nreceived: <%+v>", nil, rcv) } } + +func TestAttributesParseAttributeSIPCID(t *testing.T) { + exp := "12345;1001;1002" + dp := utils.MapStorage{ + utils.MetaReq: utils.MapStorage{ + "cid": "12345", + "to": "1001", + "from": "1002", + }, + } + if out, err := ParseAttribute(dp, utils.MetaSIPCID, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.to;~*req.from", utils.InfieldSep), + 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err != nil { + t.Fatal(err) + } else if exp != out { + t.Errorf("Expected %q, Received %q", exp, out) + } + + dp = utils.MapStorage{ + utils.MetaReq: utils.MapStorage{ + "cid": "12345", + "to": "1002", + "from": "1001", + }, + } + if out, err := ParseAttribute(dp, utils.MetaSIPCID, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.to;~*req.from", utils.InfieldSep), + 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err != nil { + t.Fatal(err) + } else if exp != out { + t.Errorf("Expected %q, Received %q", exp, out) + } + + exp = "12345;1001;1002;1003" + dp = utils.MapStorage{ + utils.MetaReq: utils.MapStorage{ + "cid": "12345", + "to": "1001", + "from": "1002", + "extra": "1003", + }, + } + if out, err := ParseAttribute(dp, utils.MetaSIPCID, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.to;~*req.extra;~*req.from", + utils.InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err != nil { + t.Fatal(err) + } else if exp != out { + t.Errorf("Expected %q, Received %q", exp, out) + } + + dp = utils.MapStorage{ + utils.MetaReq: utils.MapStorage{ + "cid": "12345", + "to": "1002", + "from": "1001", + "extra": "1003", + }, + } + if out, err := ParseAttribute(dp, utils.MetaSIPCID, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", + utils.InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err != nil { + t.Fatal(err) + } else if exp != out { + t.Errorf("Expected %q, Received %q", exp, out) + } + + dp = utils.MapStorage{ + utils.MetaReq: utils.MapStorage{ + "cid": "12345", + }, + } + if _, err := ParseAttribute(dp, utils.MetaSIPCID, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err != utils.ErrNotFound { + t.Errorf("Expected <%+v>, received <%+v>", utils.ErrNotFound, err) + } +} diff --git a/utils/consts.go b/utils/consts.go index 4daceac18..0a0a83bb1 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -422,6 +422,7 @@ const ( MetaDifference = "*difference" MetaVariable = "*variable" MetaCCUsage = "*cc_usage" + MetaSIPCID = "*sipcid" MetaValueExponent = "*value_exponent" NegativePrefix = "!" MatchStartPrefix = "^" @@ -2714,6 +2715,7 @@ var StringTmplType = StringSet{ MetaUsageDifference: struct{}{}, MetaPrefix: struct{}{}, MetaSuffix: struct{}{}, + MetaSIPCID: struct{}{}, } // Time duration suffix