From 1ab824067455bb29595e2acfd4de3b8206e2d1fa Mon Sep 17 00:00:00 2001 From: TeoV Date: Wed, 6 Mar 2019 17:03:15 +0200 Subject: [PATCH] Update ComputeFilterIndexer method + tests some uncovered cases ( empty filters ) --- apier/v1/filter_indexes.go | 29 ++--- apier/v1/filter_indexes_it_test.go | 194 +++++++++++++++++++++++++++-- 2 files changed, 199 insertions(+), 24 deletions(-) diff --git a/apier/v1/filter_indexes.go b/apier/v1/filter_indexes.go index 9fcdcf74c..81c118f3e 100644 --- a/apier/v1/filter_indexes.go +++ b/apier/v1/filter_indexes.go @@ -232,6 +232,8 @@ func (self *ApierV1) ComputeFilterIndexes(args utils.ArgsComputeFilterIndexes, r if err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } + //DispatcherProfile Indexes + fmt.Println("Args : ", utils.ToJSON(args)) dspIndexes, err := self.computeDispatcherIndexes(args.Tenant, args.Context, args.DispatcherIDs, transactionID) if err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) @@ -410,9 +412,8 @@ func (self *ApierV1) computeThresholdIndexes(tenant string, thIDs *[]string, fltrID, th) } return nil, err - } else { - thdsIndexers.IndexTPFilter(engine.FilterToTPFilter(fltr), th.ID) } + thdsIndexers.IndexTPFilter(engine.FilterToTPFilter(fltr), th.ID) } } if transactionID == utils.NonTransactional { @@ -450,6 +451,9 @@ func (self *ApierV1) computeAttributeIndexes(tenant, context string, attrIDs *[] if err != nil { return nil, err } + if !utils.IsSliceMember(ap.Contexts, context) { + continue + } fltrIDs := make([]string, len(ap.FilterIDs)) for i, fltrID := range ap.FilterIDs { fltrIDs[i] = fltrID @@ -478,9 +482,8 @@ func (self *ApierV1) computeAttributeIndexes(tenant, context string, attrIDs *[] fltrID, ap) } return nil, err - } else { - attrIndexers.IndexTPFilter(engine.FilterToTPFilter(fltr), ap.ID) } + attrIndexers.IndexTPFilter(engine.FilterToTPFilter(fltr), ap.ID) } } if transactionID == utils.NonTransactional { @@ -545,9 +548,8 @@ func (self *ApierV1) computeResourceIndexes(tenant string, rsIDs *[]string, fltrID, rp) } return nil, err - } else { - rpIndexers.IndexTPFilter(engine.FilterToTPFilter(fltr), rp.ID) } + rpIndexers.IndexTPFilter(engine.FilterToTPFilter(fltr), rp.ID) } } if transactionID == utils.NonTransactional { @@ -612,9 +614,8 @@ func (self *ApierV1) computeStatIndexes(tenant string, stIDs *[]string, fltrID, sqp) } return nil, err - } else { - sqpIndexers.IndexTPFilter(engine.FilterToTPFilter(fltr), sqp.ID) } + sqpIndexers.IndexTPFilter(engine.FilterToTPFilter(fltr), sqp.ID) } } if transactionID == utils.NonTransactional { @@ -679,9 +680,8 @@ func (self *ApierV1) computeSupplierIndexes(tenant string, sppIDs *[]string, fltrID, spp) } return nil, err - } else { - sppIndexers.IndexTPFilter(engine.FilterToTPFilter(fltr), spp.ID) } + sppIndexers.IndexTPFilter(engine.FilterToTPFilter(fltr), spp.ID) } } if transactionID == utils.NonTransactional { @@ -746,9 +746,8 @@ func (self *ApierV1) computeChargerIndexes(tenant string, cppIDs *[]string, fltrID, cpp) } return nil, err - } else { - cppIndexes.IndexTPFilter(engine.FilterToTPFilter(fltr), cpp.ID) } + cppIndexes.IndexTPFilter(engine.FilterToTPFilter(fltr), cpp.ID) } } if transactionID == utils.NonTransactional { @@ -786,6 +785,9 @@ func (self *ApierV1) computeDispatcherIndexes(tenant, context string, dspIDs *[] if err != nil { return nil, err } + if !utils.IsSliceMember(dsp.Subsystems, context) { + continue + } fltrIDs := make([]string, len(dsp.FilterIDs)) for i, fltrID := range dsp.FilterIDs { fltrIDs[i] = fltrID @@ -814,9 +816,8 @@ func (self *ApierV1) computeDispatcherIndexes(tenant, context string, dspIDs *[] fltrID, dsp) } return nil, err - } else { - dspIndexes.IndexTPFilter(engine.FilterToTPFilter(fltr), dsp.ID) } + dspIndexes.IndexTPFilter(engine.FilterToTPFilter(fltr), dsp.ID) } } if transactionID == utils.NonTransactional { diff --git a/apier/v1/filter_indexes_it_test.go b/apier/v1/filter_indexes_it_test.go index 654e3a98d..fa8a1c88f 100644 --- a/apier/v1/filter_indexes_it_test.go +++ b/apier/v1/filter_indexes_it_test.go @@ -20,7 +20,6 @@ along with this program. If not, see package v1 import ( - // "fmt" "net/rpc" "net/rpc/jsonrpc" "path" @@ -91,6 +90,8 @@ var sTestsFilterIndexesSV1 = []func(t *testing.T){ testV1FIdxdxInitDataDb, testV1FIdxSetDispatcherProfile, testV1FIdxComputeDispatcherProfileIndexes, + testV1FIdxSetDispatcherProfile2, + testV1FIdxComputeDispatcherProfileIndexes2, testV1FIdxStopEngine, } @@ -1623,15 +1624,6 @@ func testV1FIdxSetDispatcherProfile(t *testing.T) { t.Errorf("Expecting : %+v, received: %+v", utils.OK, reply) } - var dsp *engine.DispatcherProfile - if err := tFIdxRpc.Call(utils.ApierV1GetDispatcherProfile, - &utils.TenantID{Tenant: "cgrates.org", ID: "DSP_Test1"}, - &dsp); err != nil { - t.Error(err) - } else if !reflect.DeepEqual(dispatcherProfile, dsp) { - t.Errorf("Expecting : %+v, received: %+v", dispatcherProfile, dsp) - } - //verify *string index for *attributes subsystem arg := &AttrGetFilterIndexes{ Tenant: tenant, @@ -1758,6 +1750,188 @@ func testV1FIdxComputeDispatcherProfileIndexes(t *testing.T) { } } +func testV1FIdxSetDispatcherProfile2(t *testing.T) { + var reply string + //add a new dispatcherProfile with empty filterIDs + //should create an index of type *none:*any:*any for *attributes subsystem + dispatcherProfile = &engine.DispatcherProfile{ + Tenant: "cgrates.org", + ID: "DSP_Test2", + Subsystems: []string{utils.MetaAttributes}, + Weight: 20, + } + + if err := tFIdxRpc.Call(utils.ApierV1SetDispatcherProfile, + dispatcherProfile, + &reply); err != nil { + t.Error(err) + } else if reply != utils.OK { + t.Errorf("Expecting : %+v, received: %+v", utils.OK, reply) + } + + //add a new dispatcherProfile with empty filterIDs + //should create an index of type *none:*any:*any for *sessions subsystem + dispatcherProfile2 := &engine.DispatcherProfile{ + Tenant: "cgrates.org", + ID: "DSP_Test3", + Subsystems: []string{utils.MetaSessionS}, + Weight: 20, + } + + if err := tFIdxRpc.Call(utils.ApierV1SetDispatcherProfile, + dispatcherProfile2, + &reply); err != nil { + t.Error(err) + } else if reply != utils.OK { + t.Errorf("Expecting : %+v, received: %+v", utils.OK, reply) + } + + //verify indexes for *attributes subsystem + arg := &AttrGetFilterIndexes{ + Tenant: tenant, + Context: utils.MetaAttributes, + ItemType: utils.MetaDispatchers, + } + expectedIndexes := []string{ + "*none:*any:*any:DSP_Test2", + "*prefix:~RandomField:RandomValue:DSP_Test1", + "*string:~Account:1001:DSP_Test1", + "*string:~Subject:2012:DSP_Test1", + } + sort.Strings(expectedIndexes) + var idx []string + if err := tFIdxRpc.Call("ApierV1.GetFilterIndexes", arg, &idx); err != nil { + t.Error(err) + } else if sort.Strings(idx); !reflect.DeepEqual(expectedIndexes, idx) { + t.Errorf("Expecting: %+v, received: %+v", expectedIndexes, idx) + } + + //verify indexes for *sessions subsystem + arg = &AttrGetFilterIndexes{ + Tenant: tenant, + Context: utils.MetaSessionS, + ItemType: utils.MetaDispatchers, + } + expectedIndexes = []string{ + "*none:*any:*any:DSP_Test3", + "*prefix:~RandomField:RandomValue:DSP_Test1", + "*string:~Account:1001:DSP_Test1", + "*string:~Subject:2012:DSP_Test1", + } + sort.Strings(expectedIndexes) + if err := tFIdxRpc.Call("ApierV1.GetFilterIndexes", arg, &idx); err != nil { + t.Error(err) + } else if sort.Strings(idx); !reflect.DeepEqual(expectedIndexes, idx) { + t.Errorf("Expecting: %+v, received: %+v", expectedIndexes, idx) + } + //remove the indexes for *sessions subsystem + if err := tFIdxRpc.Call("ApierV1.RemoveFilterIndexes", &AttrRemFilterIndexes{ + ItemType: utils.MetaDispatchers, + Tenant: tenant, + Context: utils.MetaSessionS}, &reply); err != nil { + t.Error(err) + } else if reply != utils.OK { + t.Error("Unexpected reply returned", reply) + } + + //verify if indexes was removed for *sessions + var indexes []string + if err := tFIdxRpc.Call("ApierV1.GetFilterIndexes", arg, + &indexes); err == nil || err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + + //remove the indexes for *attribute subsystem + if err := tFIdxRpc.Call("ApierV1.RemoveFilterIndexes", &AttrRemFilterIndexes{ + ItemType: utils.MetaDispatchers, + Tenant: tenant, + Context: utils.MetaAttributes}, &reply); err != nil { + t.Error(err) + } else if reply != utils.OK { + t.Error("Unexpected reply returned", reply) + } + + //verify indexes for *attributes subsystem + arg = &AttrGetFilterIndexes{ + Tenant: tenant, + Context: utils.MetaAttributes, + ItemType: utils.MetaDispatchers, + } + if err := tFIdxRpc.Call("ApierV1.GetFilterIndexes", arg, + &idx); err == nil || err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } +} + +func testV1FIdxComputeDispatcherProfileIndexes2(t *testing.T) { + var result string + //recompute indexes for dispatcherProfile for *sessions subsystem + if err := tFIdxRpc.Call(utils.ApierV1ComputeFilterIndexes, + utils.ArgsComputeFilterIndexes{ + Tenant: tenant, + Context: utils.MetaSessionS, + ThresholdIDs: &emptySlice, + AttributeIDs: &emptySlice, + ResourceIDs: &emptySlice, + StatIDs: &emptySlice, + SupplierIDs: &emptySlice, + ChargerIDs: &emptySlice, + DispatcherIDs: nil, + }, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Errorf("Error: %+v", result) + } + expectedIndexes := []string{ + "*none:*any:*any:DSP_Test3", + "*prefix:~RandomField:RandomValue:DSP_Test1", + "*string:~Account:1001:DSP_Test1", + "*string:~Subject:2012:DSP_Test1", + } + sort.Strings(expectedIndexes) + var indexes []string + if err := tFIdxRpc.Call("ApierV1.GetFilterIndexes", &AttrGetFilterIndexes{ + ItemType: utils.MetaDispatchers, + Tenant: tenant, + Context: utils.MetaSessionS}, &indexes); err != nil { + t.Error(err) + } else if sort.Strings(indexes); !reflect.DeepEqual(expectedIndexes, indexes) { + t.Errorf("Expecting: %+v, received: %+v", expectedIndexes, utils.ToJSON(indexes)) + } + + //recompute indexes for dispatcherProfile for *attributes subsystem + if err := tFIdxRpc.Call(utils.ApierV1ComputeFilterIndexes, + utils.ArgsComputeFilterIndexes{ + Tenant: tenant, + Context: utils.MetaAttributes, + ThresholdIDs: &emptySlice, + AttributeIDs: &emptySlice, + ResourceIDs: &emptySlice, + StatIDs: &emptySlice, + SupplierIDs: &emptySlice, + ChargerIDs: &emptySlice, + DispatcherIDs: nil, + }, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Errorf("Error: %+v", result) + } + expectedIndexes = []string{ + "*none:*any:*any:DSP_Test2", + "*prefix:~RandomField:RandomValue:DSP_Test1", + "*string:~Account:1001:DSP_Test1", + "*string:~Subject:2012:DSP_Test1", + } + sort.Strings(expectedIndexes) + if err := tFIdxRpc.Call("ApierV1.GetFilterIndexes", &AttrGetFilterIndexes{ + ItemType: utils.MetaDispatchers, + Tenant: tenant, + Context: utils.MetaAttributes}, &indexes); err != nil { + t.Error(err) + } else if sort.Strings(indexes); !reflect.DeepEqual(expectedIndexes, indexes) { + t.Errorf("Expecting: %+v, received: %+v", expectedIndexes, utils.ToJSON(indexes)) + } +} func testV1FIdxStopEngine(t *testing.T) { if err := engine.KillEngine(100); err != nil { t.Error(err)