From 4ea3ac49dac4f36bc9b0b9ea9a1eb9d50104562d Mon Sep 17 00:00:00 2001 From: DanB Date: Mon, 7 Jul 2014 19:22:43 +0200 Subject: [PATCH] Allow derived charging regexp filters with empty templates --- utils/rsrfield.go | 2 +- utils/storedcdr.go | 2 ++ utils/storedcdr_test.go | 31 ++++++++++++++++++++++++++++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/utils/rsrfield.go b/utils/rsrfield.go index 56731428c..baf93ca21 100644 --- a/utils/rsrfield.go +++ b/utils/rsrfield.go @@ -46,7 +46,7 @@ func NewRSRField(fldStr string) (*RSRField, error) { return nil, fmt.Errorf("Invalid Search&Replace field rule. %s", fldStr) } rsrField := &RSRField{Id: spltRules[0][1:]} // Original id in form ~hdr_name - rulesRgxp := regexp.MustCompile(`(?:(.+[^\\])\/(.+[^\\])\/){1,}`) + rulesRgxp := regexp.MustCompile(`(?:(.+[^\\])\/(.+[^\\])*\/){1,}`) for _, ruleStr := range spltRules[1:] { // :s/ already removed through split allMatches := rulesRgxp.FindStringSubmatch(ruleStr) if len(allMatches) != 3 { diff --git a/utils/storedcdr.go b/utils/storedcdr.go index 2f5f13412..b08a815c7 100644 --- a/utils/storedcdr.go +++ b/utils/storedcdr.go @@ -145,6 +145,8 @@ func (storedCdr *StoredCdr) PassesFieldFilter(fieldFilter *RSRField) bool { // Hardcode the template with maximum of 5 groups ordered preparedFilter.RSRules[idx] = &ReSearchReplace{SearchRegexp: fieldFilter.RSRules[idx].SearchRegexp, ReplaceTemplate: "$1$2$3$4$5"} } + fmt.Printf("For filterId: %s, preparedFilter match result: %s, filter match result: %s\n", + fieldFilter.Id, storedCdr.FieldAsString(preparedFilter), storedCdr.FieldAsString(fieldFilter)) if storedCdr.FieldAsString(preparedFilter) == storedCdr.FieldAsString(fieldFilter) && preparedFilter.RegexpMatched() { return true } diff --git a/utils/storedcdr_test.go b/utils/storedcdr_test.go index d6b2f7a84..5d0fb9142 100644 --- a/utils/storedcdr_test.go +++ b/utils/storedcdr_test.go @@ -79,7 +79,7 @@ func TestFieldAsString(t *testing.T) { } func TestPassesFieldFilter(t *testing.T) { - cdr := StoredCdr{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: VOICE, AccId: "dsafdsaf", + cdr := &StoredCdr{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: "test", ReqType: "rated", Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: DEFAULT_RUNID, @@ -122,6 +122,35 @@ func TestPassesFieldFilter(t *testing.T) { } } +func TestPassesFieldFilterDn1(t *testing.T) { + cdr := &StoredCdr{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), Account: "futurem0005", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, + } + acntPrefxFltr, _ := NewRSRField(`~account:s/^\w+[s,h,m,p]\d{4}$//`) + if !cdr.PassesFieldFilter(acntPrefxFltr) { + t.Error("Not passing valid filter") + } + cdr = &StoredCdr{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), Account: "futurem00005", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, + } + if cdr.PassesFieldFilter(acntPrefxFltr) { + t.Error("Should not pass filter") + } + cdr = &StoredCdr{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), Account: "0402129281", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, + } + acntPrefxFltr, _ = NewRSRField(`~account:s/^0\d{9}$//`) + if !cdr.PassesFieldFilter(acntPrefxFltr) { + t.Error("Not passing valid filter") + } + cdr = &StoredCdr{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), Account: "04021292812", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, + } + if cdr.PassesFieldFilter(acntPrefxFltr) { + t.Error("Should not pass filter") + } +} + func TestUsageMultiply(t *testing.T) { cdr := StoredCdr{Usage: time.Duration(10) * time.Second} if cdr.UsageMultiply(1024.0, 0); cdr.Usage != time.Duration(10240)*time.Second {