From 4725e5dfe9f843b05cd0aae22cd6a4ac4a056b89 Mon Sep 17 00:00:00 2001 From: DanB Date: Thu, 2 Jul 2015 18:54:09 +0200 Subject: [PATCH] CgrEvent PassFilters implementation --- engine/pubsub.go | 9 +++++++-- engine/pubsub_test.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/engine/pubsub.go b/engine/pubsub.go index 0a1116b69..72dfde16a 100644 --- a/engine/pubsub.go +++ b/engine/pubsub.go @@ -19,7 +19,12 @@ type SubscribeInfo struct { type CgrEvent map[string]string -func (ce CgrEvent) Match(rsrFields utils.RSRFields) bool { +func (ce CgrEvent) PassFilters(rsrFields utils.RSRFields) bool { + for _, rsrFld := range rsrFields { + if !rsrFld.FilterPasses(ce[rsrFld.Id]) { + return false + } + } return true } @@ -127,7 +132,7 @@ func (ps *PubSub) Publish(pi PublishInfo, reply *string) error { ps.removeSubscriber(key) continue // subscription expired, do not send event } - if !pi.Event.Match(subData.Filters) { + if !pi.Event.PassFilters(subData.Filters) { continue // the event does not match the filters } split := utils.InfieldSplit(key) diff --git a/engine/pubsub_test.go b/engine/pubsub_test.go index 21935ead8..d506ec291 100644 --- a/engine/pubsub_test.go +++ b/engine/pubsub_test.go @@ -206,3 +206,37 @@ func TestPublishExpiredSave(t *testing.T) { t.Error("Error saving subscribers: ", err, subs) } } + +func TestCgrEventPassFilters(t *testing.T) { + ev := CgrEvent{"EventName": "TEST_EVENT", "Header1": "Value1", "Header2": "Value2"} + if !ev.PassFilters(utils.ParseRSRFieldsMustCompile("EventName(TEST_EVENT)", utils.INFIELD_SEP)) { + t.Error("Not passing filter") + } + if ev.PassFilters(utils.ParseRSRFieldsMustCompile("EventName(DUMMY_EVENT)", utils.INFIELD_SEP)) { + t.Error("Passing filter") + } + if !ev.PassFilters(utils.ParseRSRFieldsMustCompile("^EventName::TEST_EVENT(TEST_EVENT)", utils.INFIELD_SEP)) { + t.Error("Not passing filter") + } + if !ev.PassFilters(utils.ParseRSRFieldsMustCompile("^EventName::DUMMY", utils.INFIELD_SEP)) { // Should pass since we have no filter defined + t.Error("Not passing no filter") + } + if !ev.PassFilters(utils.ParseRSRFieldsMustCompile("~EventName:s/^(\\w*)_/$1/(TEST)", utils.INFIELD_SEP)) { + t.Error("Not passing filter") + } + if !ev.PassFilters(utils.ParseRSRFieldsMustCompile("~EventName:s/^(\\w*)_/$1/:s/^(\\w)(\\w)(\\w)(\\w)/$1$3$4/(TST)", utils.INFIELD_SEP)) { + t.Error("Not passing filter") + } + if !ev.PassFilters(utils.ParseRSRFieldsMustCompile("EventName(TEST_EVENT);Header1(Value1)", utils.INFIELD_SEP)) { + t.Error("Not passing filter") + } + if ev.PassFilters(utils.ParseRSRFieldsMustCompile("EventName(TEST_EVENT);Header1(Value2)", utils.INFIELD_SEP)) { + t.Error("Passing filter") + } + if !ev.PassFilters(utils.ParseRSRFieldsMustCompile("EventName(TEST_EVENT);~Header1:s/(\\d)/$1/(1)", utils.INFIELD_SEP)) { + t.Error("Not passing filter") + } + if ev.PassFilters(utils.ParseRSRFieldsMustCompile("EventName(TEST_EVENT);~Header1:s/(\\d)/$1/(2)", utils.INFIELD_SEP)) { + t.Error("Passing filter") + } +}