Added tests for AnalyzerS API with ContentFilters

This commit is contained in:
Trial97
2020-11-17 09:33:40 +02:00
committed by Dan Christian Bogos
parent 28ea7e8596
commit 53e68bd2cf
6 changed files with 121 additions and 10 deletions

View File

@@ -175,6 +175,7 @@ func (aS *AnalyzerService) V1StringQuery(args *QueryArgs, reply *[]map[string]in
args.ContentFilters, utils.MapStorage{
utils.MetaReq: reqDP,
utils.MetaRep: repDP,
utils.MetaHdr: utils.MapStorage(obj.Fields),
}); err != nil {
return err
} else if !pass {

View File

@@ -52,6 +52,7 @@ var (
testAnalyzerSChargerSv1ProcessEvent,
testAnalyzerSV1Search,
testAnalyzerSV1Search2,
testAnalyzerSV1SearchWithContentFilters,
testAnalyzerSKillEngine,
}
)
@@ -214,6 +215,18 @@ func testAnalyzerSV1Search2(t *testing.T) {
}
}
func testAnalyzerSV1SearchWithContentFilters(t *testing.T) {
var result []map[string]interface{}
if err := anzRPC.Call(utils.AnalyzerSv1StringQuery, &QueryArgs{
HeaderFilters: `+RequestEncoding:\*json`,
ContentFilters: []string{"*string:~*req.Event.Account:1010"},
}, &result); err != nil {
t.Error(err)
} else if len(result) != 1 {
t.Errorf("Unexpected result: %s", utils.ToJSON(result))
}
}
func testAnalyzerSKillEngine(t *testing.T) {
if err := engine.KillEngine(100); err != nil {
t.Error(err)

View File

@@ -30,6 +30,7 @@ import (
"github.com/blevesearch/bleve"
"github.com/blevesearch/bleve/search"
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/engine"
"github.com/cgrates/cgrates/utils"
)
@@ -199,7 +200,11 @@ func TestAnalyzersV1Search(t *testing.T) {
if err = os.MkdirAll(cfg.AnalyzerSCfg().DBPath, 0700); err != nil {
t.Fatal(err)
}
anz, err := NewAnalyzerService(cfg, nil)
dm := engine.NewDataManager(engine.NewInternalDB(nil, nil, true), cfg.CacheCfg(), nil)
fs := engine.NewFilterS(cfg, nil, dm)
fsChan := make(chan *engine.FilterS, 1)
fsChan <- fs
anz, err := NewAnalyzerService(cfg, fsChan)
if err != nil {
t.Fatal(err)
}
@@ -294,6 +299,100 @@ func TestAnalyzersV1Search(t *testing.T) {
t.Errorf("Expected %s received: %s", utils.ToJSON(expRply), utils.ToJSON(reply))
}
reply = []map[string]interface{}{}
if err = anz.V1StringQuery(&QueryArgs{
HeaderFilters: "RequestEncoding:*gob",
ContentFilters: []string{"*string:~*rep:Pong"},
}, &reply); err != nil {
t.Fatal(err)
} else if !reflect.DeepEqual(expRply, reply) {
t.Errorf("Expected %s received: %s", utils.ToJSON(expRply), utils.ToJSON(reply))
}
reply = []map[string]interface{}{}
if err = anz.V1StringQuery(&QueryArgs{
HeaderFilters: "RequestEncoding:*gob",
ContentFilters: []string{"*string:~*req.Opts.EventSource:*attributes"},
}, &reply); err != nil {
t.Fatal(err)
} else if !reflect.DeepEqual(expRply, reply) {
t.Errorf("Expected %s received: %s", utils.ToJSON(expRply), utils.ToJSON(reply))
}
if err = anz.V1StringQuery(&QueryArgs{
HeaderFilters: "RequestEncoding:*gob",
ContentFilters: []string{"*gt:~*hdr.RequestDuration:1m"},
}, &reply); err != nil {
t.Fatal(err)
} else if !reflect.DeepEqual(expRply, reply) {
t.Errorf("Expected %s received: %s", utils.ToJSON(expRply), utils.ToJSON(reply))
}
expRply = []map[string]interface{}{}
reply = []map[string]interface{}{}
if err = anz.V1StringQuery(&QueryArgs{
HeaderFilters: "RequestEncoding:*gob",
ContentFilters: []string{"*string:~*req.Opts.EventSource:*cdrs"},
}, &reply); err != nil {
t.Fatal(err)
} else if !reflect.DeepEqual(expRply, reply) {
t.Errorf("Expected %s received: %s", utils.ToJSON(expRply), utils.ToJSON(reply))
}
if err = anz.V1StringQuery(&QueryArgs{
HeaderFilters: "RequestEncoding:*gob",
ContentFilters: []string{"*notstring:~*req.Opts.EventSource:*attributes"},
}, &reply); err != nil {
t.Fatal(err)
} else if !reflect.DeepEqual(expRply, reply) {
t.Errorf("Expected %s received: %s", utils.ToJSON(expRply), utils.ToJSON(reply))
}
expErr := utils.ErrPrefixNotErrNotImplemented("*type")
if err = anz.V1StringQuery(&QueryArgs{
HeaderFilters: "RequestEncoding:*gob",
ContentFilters: []string{"*type:~*opts.EventSource:*cdrs"},
}, &reply); err == nil || err.Error() != expErr.Error() {
t.Errorf("Expected error: %s,received:%v", expErr, err)
}
sTime := time.Now()
if err = anz.db.Index(utils.ConcatenatedKey(utils.AttributeSv1Ping, strconv.FormatInt(sTime.Unix(), 10)),
&InfoRPC{
RequestDuration: time.Second,
RequestStartTime: sTime,
RequestEncoding: utils.MetaJSON,
RequestID: 0,
RequestMethod: utils.AttributeSv1Ping,
RequestParams: `a`,
Reply: `{}`,
}); err != nil {
t.Fatal(err)
}
expErr = new(json.SyntaxError)
if err = anz.V1StringQuery(&QueryArgs{
HeaderFilters: "RequestMethod:" + utils.AttributeSv1Ping,
ContentFilters: []string{"*type:~*opts.EventSource:*cdrs"},
}, &reply); err == nil || err.Error() != expErr.Error() {
t.Errorf("Expected error: %s,received:%v", expErr, err)
}
if err = anz.db.Index(utils.ConcatenatedKey(utils.AttributeSv1Ping, strconv.FormatInt(sTime.Unix(), 10)),
&InfoRPC{
RequestDuration: time.Second,
RequestStartTime: sTime,
RequestEncoding: utils.MetaJSON,
RequestID: 0,
RequestMethod: utils.AttributeSv1Ping,
RequestParams: `{}`,
Reply: `a`,
}); err != nil {
t.Fatal(err)
}
if err = anz.V1StringQuery(&QueryArgs{
HeaderFilters: "RequestMethod:" + utils.AttributeSv1Ping,
ContentFilters: []string{"*type:~*opts.EventSource:*cdrs"},
}, &reply); err == nil || err.Error() != expErr.Error() {
t.Errorf("Expected error: %s,received:%v", expErr, err)
}
if err = anz.db.Close(); err != nil {
t.Fatal(err)
}

View File

@@ -100,7 +100,7 @@ func TestNewInfoRPC(t *testing.T) {
func TestUnmarshalJSON(t *testing.T) {
expErr := new(json.SyntaxError)
if _, err := unmarshalJSON(json.RawMessage(`a`)); errors.Is(err, expErr) {
if _, err := unmarshalJSON(json.RawMessage(`a`)); err == nil || err.Error() != expErr.Error() {
t.Errorf("Expected error: %s,received %+v", expErr, err)
}
var exp interface{} = true

View File

@@ -63,7 +63,8 @@ func (dDP *dynamicDP) RemoteHost() net.Addr {
var initialDPPrefixes = utils.NewStringSet([]string{utils.MetaReq, utils.MetaVars,
utils.MetaCgreq, utils.MetaCgrep, utils.MetaRep, utils.MetaCGRAReq,
utils.MetaAct, utils.MetaEC, utils.MetaUCH, utils.MetaOpts})
utils.MetaAct, utils.MetaEC, utils.MetaUCH, utils.MetaOpts,
utils.MetaHdr, utils.MetaTrl})
func (dDP *dynamicDP) FieldAsInterface(fldPath []string) (val interface{}, err error) {
if len(fldPath) == 0 {

View File

@@ -516,11 +516,8 @@ func (fltr *FilterRule) passGreaterThan(dDP utils.DataProvider) (bool, error) {
if fldStr, castStr := fldIf.(string); castStr { // attempt converting string since deserialization fails here (ie: time.Time fields)
fldIf = utils.StringToInterface(fldStr)
}
orEqual := false
if fltr.Type == utils.MetaGreaterOrEqual ||
fltr.Type == utils.MetaLessThan {
orEqual = true
}
orEqual := fltr.Type == utils.MetaGreaterOrEqual ||
fltr.Type == utils.MetaLessThan
for _, val := range fltr.rsrValues {
valPath, err := val.CompileDynRule(dDP)
if err != nil {
@@ -532,9 +529,9 @@ func (fltr *FilterRule) passGreaterThan(dDP utils.DataProvider) (bool, error) {
}
if gte, err := utils.GreaterThan(fldIf, sval, orEqual); err != nil {
return false, err
} else if utils.SliceHasMember([]string{utils.MetaGreaterThan, utils.MetaGreaterOrEqual}, fltr.Type) && gte {
} else if (utils.MetaGreaterThan == fltr.Type || utils.MetaGreaterOrEqual == fltr.Type) && gte {
return true, nil
} else if utils.SliceHasMember([]string{utils.MetaLessThan, utils.MetaLessOrEqual}, fltr.Type) && !gte {
} else if (utils.MetaLessThan == fltr.Type || utils.MetaLessOrEqual == fltr.Type) && !gte {
return true, nil
}
}