From 8c762e8e7e9375d361ab04b1365f0ea37dd00982 Mon Sep 17 00:00:00 2001 From: porosnicuadrian Date: Fri, 20 Aug 2021 10:08:59 +0300 Subject: [PATCH] MOved attrbiute test + clear cache for compute indexes --- apis/filter_indexes_it_test.go | 122 ++++++++++++++++++++++++++++++--- engine/attributes_test.go | 91 ------------------------ engine/z_attributes_test.go | 93 +++++++++++++++++++++++++ 3 files changed, 204 insertions(+), 102 deletions(-) diff --git a/apis/filter_indexes_it_test.go b/apis/filter_indexes_it_test.go index 2876d2f08..dab69cd1a 100644 --- a/apis/filter_indexes_it_test.go +++ b/apis/filter_indexes_it_test.go @@ -53,6 +53,7 @@ var ( testV1FIdxAttributeComputeIndexes, testV1FIdxAttributeMoreProfilesForFilters, testV1FIdxAttributeSRemoveComputedIndexesIDs, + // testV1FIdxAttributeRemoveIndexesComputeIndexesAllProfiles, testV1FIdxAttributesRemoveProfilesNoIndexes, testV1IndexClearCache, @@ -462,8 +463,6 @@ func testV1FIdxAttributeComputeIndexes(t *testing.T) { } var replyIdx []string - - //matching for our context expectedIDx := []string{"*string:*req.Subject:1004:TEST_ATTRIBUTES_IT_TEST", "*string:*req.Subject:6774:TEST_ATTRIBUTES_IT_TEST", "*string:*req.Subject:22312:TEST_ATTRIBUTES_IT_TEST", @@ -657,6 +656,60 @@ func testV1FIdxAttributeSRemoveComputedIndexesIDs(t *testing.T) { } } +func testV1FIdxAttributeRemoveIndexesComputeIndexesAllProfiles(t *testing.T) { + var reply string + if err := tFIdxRpc.Call(context.Background(), utils.AdminSv1RemoveFilterIndexes, + &AttrRemFilterIndexes{ + Tenant: utils.CGRateSorg, + ItemType: utils.MetaAttributes, + APIOpts: map[string]interface{}{ + utils.CacheOpt: utils.MetaClear, + }, + }, + &reply); err != nil { + t.Error(err) + } else if reply != utils.OK { + t.Errorf("UNexpected reply returned") + } + // compute our indexes + if err := tFIdxRpc.Call(context.Background(), utils.AdminSv1ComputeFilterIndexes, + &utils.ArgsComputeFilterIndexes{Tenant: utils.CGRateSorg, AttributeS: true}, &reply); err != nil { + t.Error(err) + } else if reply != utils.OK { + t.Error("Unexpected reply returned") + } + + expectedIDx := []string{"*prefix:*req.AnswerTime:12:TEST_ATTRIBUTE3", + "*prefix:*req.AnswerTime:12:TEST_ATTRIBUTES_IT_TEST", + "*prefix:*req.AnswerTime:12:TEST_ATTRIBUTES_new_fltr", + "*prefix:*req.AnswerTime:33:TEST_ATTRIBUTE3", + "*prefix:*req.AnswerTime:33:TEST_ATTRIBUTES_IT_TEST", + "*prefix:*req.AnswerTime:33:TEST_ATTRIBUTES_new_fltr", + "*prefix:*req.Destinations:+0775:TEST_ATTRIBUTES_IT_TEST", + "*prefix:*req.Destinations:+442:TEST_ATTRIBUTES_IT_TEST", + "*string:*opts.*context:*chargers:TEST_ATTRIBUTES_new_fltr", + "*string:*opts.*context:*sessions:TEST_ATTRIBUTE3", + "*string:*opts.*context:*sessions:TEST_ATTRIBUTES_IT_TEST", + "*string:*opts.Subsystems:*attributes:TEST_ATTRIBUTES_IT_TEST", + "*string:*req.Subject:1004:TEST_ATTRIBUTES_IT_TEST", + "*string:*req.Subject:22312:TEST_ATTRIBUTES_IT_TEST", + "*string:*req.Subject:6774:TEST_ATTRIBUTES_IT_TEST", + "*string:*req.Usage:123s:TEST_ATTRIBUTES_IT_TEST", + "*string:*req.Usage:123s:TEST_ATTRIBUTES_new_fltr", + } + var replyIdx []string + if err := tFIdxRpc.Call(context.Background(), utils.AdminSv1GetFilterIndexes, + &AttrGetFilterIndexes{Tenant: utils.CGRateSorg, ItemType: utils.MetaAttributes}, &replyIdx); err != nil { + t.Error(err) + } else { + sort.Strings(expectedIDx) + sort.Strings(replyIdx) + if !reflect.DeepEqual(expectedIDx, replyIdx) { + t.Errorf("Expected %+v \n, received %+v", utils.ToJSON(expectedIDx), utils.ToJSON(replyIdx)) + } + } +} + func testV1FIdxAttributesRemoveProfilesNoIndexes(t *testing.T) { //as we delete our profiles, indexes will be deleted too var reply string @@ -1015,7 +1068,12 @@ func testV1FIdxAccountSRemoveComputedIndexesIDs(t *testing.T) { //indexes will ne removed again var reply string if err := tFIdxRpc.Call(context.Background(), utils.AdminSv1RemoveFilterIndexes, - &AttrRemFilterIndexes{Tenant: utils.CGRateSorg, ItemType: utils.MetaAccounts}, + &AttrRemFilterIndexes{ + Tenant: utils.CGRateSorg, + ItemType: utils.MetaAccounts, + APIOpts: map[string]interface{}{ + utils.CacheOpt: utils.MetaClear, + }}, &reply); err != nil { t.Error(err) } else if reply != utils.OK { @@ -1479,7 +1537,13 @@ func testV1FIdxActionSRemoveComputedIndexesIDs(t *testing.T) { //indexes will be removed again var reply string if err := tFIdxRpc.Call(context.Background(), utils.AdminSv1RemoveFilterIndexes, - &AttrRemFilterIndexes{Tenant: utils.CGRateSorg, ItemType: utils.MetaActions}, + &AttrRemFilterIndexes{ + Tenant: utils.CGRateSorg, + ItemType: utils.MetaActions, + APIOpts: map[string]interface{}{ + utils.CacheOpt: utils.MetaClear, + }, + }, &reply); err != nil { t.Error(err) } else if reply != utils.OK { @@ -1890,7 +1954,13 @@ func testV1FIdxChargerSRemoveComputedIndexesIDs(t *testing.T) { // indexes will be removed again var reply string if err := tFIdxRpc.Call(context.Background(), utils.AdminSv1RemoveFilterIndexes, - &AttrRemFilterIndexes{Tenant: utils.CGRateSorg, ItemType: utils.MetaChargers}, + &AttrRemFilterIndexes{ + Tenant: utils.CGRateSorg, + ItemType: utils.MetaChargers, + APIOpts: map[string]interface{}{ + utils.CacheOpt: utils.MetaClear, + }, + }, &reply); err != nil { t.Error(err) } else if reply != utils.OK { @@ -2343,7 +2413,13 @@ func testV1FIdxRateSRemoveComputedIndexesIDs(t *testing.T) { // indexes will be removed again var reply string if err := tFIdxRpc.Call(context.Background(), utils.AdminSv1RemoveFilterIndexes, - &AttrRemFilterIndexes{Tenant: utils.CGRateSorg, ItemType: utils.MetaRateProfiles}, + &AttrRemFilterIndexes{ + Tenant: utils.CGRateSorg, + ItemType: utils.MetaRateProfiles, + APIOpts: map[string]interface{}{ + utils.CacheOpt: utils.MetaClear, + }, + }, &reply); err != nil { t.Error(err) } else if reply != utils.OK { @@ -2875,8 +2951,14 @@ func testV1FIdxRateProfileRatesRemoveComputedIndexesIDs(t *testing.T) { // indexes will be removed for both context, both RateProfile var reply string if err := tFIdxRpc.Call(context.Background(), utils.AdminSv1RemoveFilterIndexes, - &AttrRemFilterIndexes{Tenant: utils.CGRateSorg, ItemType: utils.MetaRateProfileRates, - Context: "RATE_1"}, + &AttrRemFilterIndexes{ + Tenant: utils.CGRateSorg, + ItemType: utils.MetaRateProfileRates, + Context: "RATE_1", + APIOpts: map[string]interface{}{ + utils.CacheOpt: utils.MetaClear, + }, + }, &reply); err != nil { t.Error(err) } else if reply != utils.OK { @@ -3355,7 +3437,13 @@ func testV1FIdxResourceSRemoveComputedIndexesIDs(t *testing.T) { // indexes will be removed again var reply string if err := tFIdxRpc.Call(context.Background(), utils.AdminSv1RemoveFilterIndexes, - &AttrRemFilterIndexes{Tenant: utils.CGRateSorg, ItemType: utils.MetaResources}, + &AttrRemFilterIndexes{ + Tenant: utils.CGRateSorg, + ItemType: utils.MetaResources, + APIOpts: map[string]interface{}{ + utils.CacheOpt: utils.MetaClear, + }, + }, &reply); err != nil { t.Error(err) } else if reply != utils.OK { @@ -3798,7 +3886,13 @@ func testV1FIdxRouteSRemoveComputedIndexesIDs(t *testing.T) { // indexes will be removed again var reply string if err := tFIdxRpc.Call(context.Background(), utils.AdminSv1RemoveFilterIndexes, - &AttrRemFilterIndexes{Tenant: utils.CGRateSorg, ItemType: utils.MetaRoutes}, + &AttrRemFilterIndexes{ + Tenant: utils.CGRateSorg, + ItemType: utils.MetaRoutes, + APIOpts: map[string]interface{}{ + utils.CacheOpt: utils.MetaClear, + }, + }, &reply); err != nil { t.Error(err) } else if reply != utils.OK { @@ -4239,7 +4333,13 @@ func testV1FIdxStatSRemoveComputedIndexesIDs(t *testing.T) { // indexes will be removed again var reply string if err := tFIdxRpc.Call(context.Background(), utils.AdminSv1RemoveFilterIndexes, - &AttrRemFilterIndexes{Tenant: utils.CGRateSorg, ItemType: utils.MetaStats}, + &AttrRemFilterIndexes{ + Tenant: utils.CGRateSorg, + ItemType: utils.MetaStats, + APIOpts: map[string]interface{}{ + utils.CacheOpt: utils.MetaClear, + }, + }, &reply); err != nil { t.Error(err) } else if reply != utils.OK { diff --git a/engine/attributes_test.go b/engine/attributes_test.go index 2ea8d6853..3f9cdb0e4 100644 --- a/engine/attributes_test.go +++ b/engine/attributes_test.go @@ -848,94 +848,3 @@ func TestAttributesV1ProcessEventMultipleRuns2(t *testing.T) { } } -func TestAttributesPorcessEventMatchingProcessRuns(t *testing.T) { - Cache.Clear(nil) - cfg := config.NewDefaultCGRConfig() - cfg.AttributeSCfg().Enabled = true - cfg.AttributeSCfg().IndexedSelects = false - db := NewInternalDB(nil, nil, true) - dm := NewDataManager(db, cfg.CacheCfg(), nil) - fltrS := NewFilterS(cfg, nil, dm) - fltr := &Filter{ - Tenant: "cgrates.org", - ID: "Process_Runs_Fltr", - Rules: []*FilterRule{ - { - Type: utils.MetaGreaterThan, - Element: "~*vars.*processRuns", - Values: []string{"1"}, - }, - }, - } - if err := dm.SetFilter(context.Background(), fltr, true); err != nil { - t.Error(err) - } - - attrPfr := &AttributeProfile{ - Tenant: "cgrates.org", - ID: "ATTR_ProcessRuns", - FilterIDs: []string{"Process_Runs_Fltr"}, - Attributes: []*Attribute{ - { - Path: "*req.CompanyName", - Type: utils.MetaVariable, - Value: config.NewRSRParsersMustCompile("ITSYS COMMUNICATIONS SRL", utils.InfieldSep), - }, - }, - Weight: 20, - } - // this I'll match first, no fltr and processRuns will be 1 - attrPfr2 := &AttributeProfile{ - Tenant: "cgrates.org", - ID: "ATTR_MatchSecond", - Attributes: []*Attribute{ - { - Path: "*req.Password", - Type: utils.MetaVariable, - Value: config.NewRSRParsersMustCompile("CGRateS.org", utils.InfieldSep), - }, - }, - Weight: 10, - } - - attrPfr.Compile() - fltr.Compile() - attrPfr2.Compile() - if err := dm.SetAttributeProfile(context.Background(), attrPfr, true); err != nil { - t.Error(err) - } - if err := dm.SetAttributeProfile(context.Background(), attrPfr2, true); err != nil { - t.Error(err) - } - - attr := NewAttributeService(dm, fltrS, cfg) - - args := &AttrArgsProcessEvent{ - ProcessRuns: utils.IntPointer(2), - CGREvent: &utils.CGREvent{ - Event: map[string]interface{}{ - "Account": "pc_test", - "CompanyName": "MY_company_will_be_changed", - }, - }, - } - reply := &AttrSProcessEventReply{} - expReply := &AttrSProcessEventReply{ - MatchedProfiles: []string{"cgrates.org:ATTR_MatchSecond", "cgrates.org:ATTR_ProcessRuns"}, - AlteredFields: []string{"*req.Password", "*req.CompanyName"}, - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - Event: map[string]interface{}{ - "Account": "pc_test", - "CompanyName": "ITSYS COMMUNICATIONS SRL", - "Password": "CGRateS.org", - }, - APIOpts: map[string]interface{}{}, - }, - } - if err := attr.V1ProcessEvent(context.Background(), args, reply); err != nil { - t.Error(err) - } else if !reflect.DeepEqual(expReply, reply) { - t.Errorf("Expected %+v \n, received %+v", utils.ToJSON(expReply), utils.ToJSON(reply)) - } -} diff --git a/engine/z_attributes_test.go b/engine/z_attributes_test.go index 6c41e79cb..2fd228ec5 100644 --- a/engine/z_attributes_test.go +++ b/engine/z_attributes_test.go @@ -2910,3 +2910,96 @@ func TestAttributeMetaTenant(t *testing.T) { t.Errorf("Expecting %s, received: %s", utils.ToJSON(eRply), utils.ToJSON(reply)) } } + +func TestAttributesPorcessEventMatchingProcessRuns(t *testing.T) { + Cache.Clear(nil) + cfg := config.NewDefaultCGRConfig() + cfg.AttributeSCfg().Enabled = true + cfg.AttributeSCfg().IndexedSelects = false + db := NewInternalDB(nil, nil, true) + dm := NewDataManager(db, cfg.CacheCfg(), nil) + fltrS := NewFilterS(cfg, nil, dm) + fltr := &Filter{ + Tenant: "cgrates.org", + ID: "Process_Runs_Fltr", + Rules: []*FilterRule{ + { + Type: utils.MetaGreaterThan, + Element: "~*vars.*processRuns", + Values: []string{"1"}, + }, + }, + } + if err := dm.SetFilter(context.Background(), fltr, true); err != nil { + t.Error(err) + } + + attrPfr := &AttributeProfile{ + Tenant: "cgrates.org", + ID: "ATTR_ProcessRuns", + FilterIDs: []string{"Process_Runs_Fltr"}, + Attributes: []*Attribute{ + { + Path: "*req.CompanyName", + Type: utils.MetaVariable, + Value: config.NewRSRParsersMustCompile("ITSYS COMMUNICATIONS SRL", utils.InfieldSep), + }, + }, + Weight: 20, + } + // this I'll match first, no fltr and processRuns will be 1 + attrPfr2 := &AttributeProfile{ + Tenant: "cgrates.org", + ID: "ATTR_MatchSecond", + Attributes: []*Attribute{ + { + Path: "*req.Password", + Type: utils.MetaVariable, + Value: config.NewRSRParsersMustCompile("CGRateS.org", utils.InfieldSep), + }, + }, + Weight: 10, + } + + attrPfr.Compile() + fltr.Compile() + attrPfr2.Compile() + if err := dm.SetAttributeProfile(context.Background(), attrPfr, true); err != nil { + t.Error(err) + } + if err := dm.SetAttributeProfile(context.Background(), attrPfr2, true); err != nil { + t.Error(err) + } + + attr := NewAttributeService(dm, fltrS, cfg) + + args := &AttrArgsProcessEvent{ + ProcessRuns: utils.IntPointer(2), + CGREvent: &utils.CGREvent{ + Event: map[string]interface{}{ + "Account": "pc_test", + "CompanyName": "MY_company_will_be_changed", + }, + }, + } + reply := &AttrSProcessEventReply{} + expReply := &AttrSProcessEventReply{ + MatchedProfiles: []string{"cgrates.org:ATTR_MatchSecond", "cgrates.org:ATTR_ProcessRuns"}, + AlteredFields: []string{"*req.CompanyName", "*req.Password"}, + CGREvent: &utils.CGREvent{ + Tenant: "cgrates.org", + Event: map[string]interface{}{ + "Account": "pc_test", + "CompanyName": "ITSYS COMMUNICATIONS SRL", + "Password": "CGRateS.org", + }, + APIOpts: map[string]interface{}{}, + }, + } + if err := attr.V1ProcessEvent(context.Background(), args, reply); err != nil { + t.Error(err) + } else if sort.Strings(reply.AlteredFields); !reflect.DeepEqual(expReply, reply) { + t.Errorf("Expected %+v \n, received %+v", utils.ToJSON(expReply), utils.ToJSON(reply)) + } +} +