Update ComputeFilterIndexer method + tests some uncovered cases ( empty filters )

This commit is contained in:
TeoV
2019-03-06 17:03:15 +02:00
committed by Dan Christian Bogos
parent c77e59743e
commit 1ab8240674
2 changed files with 199 additions and 24 deletions

View File

@@ -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 {

View File

@@ -20,7 +20,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
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)