Coverage tests in ees package and updated Go version in Ansible scripts

This commit is contained in:
nickolasdaniel
2021-03-12 17:01:55 +02:00
committed by Dan Christian Bogos
parent d9641e9cf7
commit 4be82cd76f
23 changed files with 517 additions and 143 deletions

View File

@@ -5,7 +5,7 @@
##################### Golang Vars #############################
###############################################################
# Go language SDK version number
golang_version: '1.14'
golang_version: '1.16.1'
go_version_target: "go version go{{ golang_version }} linux/amd64"
# Mirror to download the Go language SDK redistributable package from
golang_mirror: 'https://storage.googleapis.com/golang'

View File

@@ -5,7 +5,7 @@
##################### Golang Vars #############################
###############################################################
# Go language SDK version number
golang_version: '1.14'
golang_version: '1.16.1'
go_version_target: "go version go{{ golang_version }} linux/amd64"
# Mirror to download the Go language SDK redistributable package from
golang_mirror: 'https://storage.googleapis.com/golang'

View File

@@ -5,7 +5,7 @@
##################### Golang Vars #############################
###############################################################
# Go language SDK version number
golang_version: '1.14'
golang_version: '1.16.1'
go_version_target: "go version go{{ golang_version }} linux/amd64"
# Mirror to download the Go language SDK redistributable package from
golang_mirror: 'https://storage.googleapis.com/golang'

View File

@@ -29,7 +29,7 @@
##################### Golang Vars #############################
###############################################################
# Go language SDK version number
golang_version: '1.14'
golang_version: '1.16.1'
go_version_target: "go version go{{ golang_version }} linux/amd64"
# Mirror to download the Go language SDK redistributable package from
golang_mirror: 'https://storage.googleapis.com/golang'

View File

@@ -17,7 +17,7 @@
##################### Golang Vars #############################
###############################################################
# Go language SDK version number
golang_version: '1.14'
golang_version: '1.16.1'
go_version_target: "go version go{{ golang_version }} linux/amd64"
# Mirror to download the Go language SDK redistributable package from
golang_mirror: 'https://storage.googleapis.com/golang'

View File

@@ -17,7 +17,7 @@
##################### Golang Vars #############################
###############################################################
# Go language SDK version number
golang_version: '1.15.7'
golang_version: '1.16.1'
go_version_target: "go version go{{ golang_version }} linux/amd64"
# Mirror to download the Go language SDK redistributable package from
golang_mirror: 'https://storage.googleapis.com/golang'

View File

@@ -5,7 +5,7 @@
##################### Golang Vars #############################
###############################################################
# Go language SDK version number
golang_version: '1.14'
golang_version: '1.16.1'
go_version_target: "go version go{{ golang_version }} linux/amd64"
# Mirror to download the Go language SDK redistributable package from
golang_mirror: 'https://storage.googleapis.com/golang'

View File

@@ -16,7 +16,7 @@
##################### Golang Vars #############################
###############################################################
# Go language SDK version number
golang_version: '1.14'
golang_version: '1.16.1'
go_version_target: "go version go{{ golang_version }} linux/amd64"
# Mirror to download the Go language SDK redistributable package from
golang_mirror: 'https://storage.googleapis.com/golang'

View File

@@ -153,18 +153,8 @@ func (eEe *ElasticEe) ExportEvent(cgrEv *utils.CGREvent) (err error) {
return
}
for el := eeReq.OrdNavMP[utils.MetaExp].GetFirstElement(); el != nil; el = el.Next() {
var nmIt utils.NMInterface
if nmIt, err = eeReq.OrdNavMP[utils.MetaExp].Field(el.Value); err != nil {
return
}
itm, isNMItem := nmIt.(*config.NMItem)
if !isNMItem {
err = fmt.Errorf("cannot encode reply value: %s, err: not NMItems", utils.ToJSON(el.Value))
return
}
if itm == nil {
continue // all attributes, not writable to diameter packet
}
nmIt, _ := eeReq.OrdNavMP[utils.MetaExp].Field(el.Value)
itm := nmIt.(*config.NMItem)
valMp[strings.Join(itm.Path, utils.NestingSep)] = utils.IfaceAsString(itm.Data)
}
}

View File

@@ -22,6 +22,7 @@ import (
"testing"
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/engine"
"github.com/cgrates/cgrates/utils"
)
@@ -244,3 +245,67 @@ func TestInitCase10(t *testing.T) {
t.Errorf("Expected %+v \n but got %+v", utils.ToJSON(eeExpect), utils.ToJSON(ee.opts.WaitForActiveShards))
}
}
func TestElasticExportEvent(t *testing.T) {
cgrCfg := config.NewDefaultCGRConfig()
cgrEv := new(utils.CGREvent)
newIDb := engine.NewInternalDB(nil, nil, true)
newDM := engine.NewDataManager(newIDb, cgrCfg.CacheCfg(), nil)
filterS := engine.NewFilterS(cgrCfg, nil, newDM)
dc, err := newEEMetrics(utils.FirstNonEmpty(
"Local",
utils.EmptyString,
))
if err != nil {
t.Error(err)
}
eEe, err := NewElasticExporter(cgrCfg, 0, filterS, dc)
if err != nil {
t.Error(err)
}
cgrEv.Event = map[string]interface{}{
"test1": "value",
}
cgrCfg.EEsCfg().Exporters[0].Fields = []*config.FCTemplate{
{
Path: "*exp.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field1", utils.InfieldSep),
},
{
Path: "*exp.2", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("*req.field2", utils.InfieldSep),
},
}
for _, field := range cgrCfg.EEsCfg().Exporters[0].Fields {
field.ComputePath()
}
errExpect := `unsupported protocol scheme ""`
if err := eEe.ExportEvent(cgrEv); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but got %q", errExpect, err)
}
cgrCfg.EEsCfg().Exporters[0].ComputeFields()
if err := eEe.ExportEvent(cgrEv); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but got %q", errExpect, err)
}
cgrCfg.EEsCfg().Exporters[0].Fields = []*config.FCTemplate{
{
Path: "*exp.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field1", utils.InfieldSep),
Filters: []string{"*wrong-type"},
},
{
Path: "*exp.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field1", utils.InfieldSep),
Filters: []string{"*wrong-type"},
},
}
for _, field := range cgrCfg.EEsCfg().Exporters[0].Fields {
field.ComputePath()
}
cgrCfg.EEsCfg().Exporters[0].ComputeFields()
errExpect = "inline parse error for string: <*wrong-type>"
if err := eEe.ExportEvent(cgrEv); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but received %q", errExpect, err)
}
eEe.OnEvicted("test", "test")
}

View File

@@ -106,6 +106,7 @@ func (fCsv *FileCSVee) ExportEvent(cgrEv *utils.CGREvent) (err error) {
var csvRecord []string
if len(fCsv.cgrCfg.EEsCfg().Exporters[fCsv.cfgIdx].ContentFields()) == 0 {
csvRecord = make([]string, 0, len(cgrEv.Event))
for _, val := range cgrEv.Event {
csvRecord = append(csvRecord, utils.IfaceAsString(val))
}
@@ -124,13 +125,7 @@ func (fCsv *FileCSVee) ExportEvent(cgrEv *utils.CGREvent) (err error) {
if err = eeReq.SetFields(fCsv.cgrCfg.EEsCfg().Exporters[fCsv.cfgIdx].ContentFields()); err != nil {
return
}
for el := eeReq.OrdNavMP[utils.MetaExp].GetFirstElement(); el != nil; el = el.Next() {
var strVal string
if strVal, err = eeReq.OrdNavMP[utils.MetaExp].FieldAsString(el.Value.Slice()); err != nil {
return
}
csvRecord = append(csvRecord, strVal)
}
csvRecord = eeReq.OrdNavMP[utils.MetaExp].OrderedFieldsAsStrings()
}
updateEEMetrics(fCsv.dc, cgrEv.Event, utils.FirstNonEmpty(fCsv.cgrCfg.EEsCfg().Exporters[fCsv.cfgIdx].Timezone,
@@ -143,7 +138,6 @@ func (fCsv *FileCSVee) composeHeader() (err error) {
if len(fCsv.cgrCfg.EEsCfg().Exporters[fCsv.cfgIdx].HeaderFields()) == 0 {
return
}
var csvRecord []string
oNm := map[string]*utils.OrderedNavigableMap{
utils.MetaHdr: utils.NewOrderedNavigableMap(),
}
@@ -156,14 +150,7 @@ func (fCsv *FileCSVee) composeHeader() (err error) {
if err = eeReq.SetFields(fCsv.cgrCfg.EEsCfg().Exporters[fCsv.cfgIdx].HeaderFields()); err != nil {
return
}
for el := eeReq.OrdNavMP[utils.MetaHdr].GetFirstElement(); el != nil; el = el.Next() {
var strVal string
if strVal, err = eeReq.OrdNavMP[utils.MetaHdr].FieldAsString(el.Value.Slice()); err != nil {
return
}
csvRecord = append(csvRecord, strVal)
}
return fCsv.csvWriter.Write(csvRecord)
return fCsv.csvWriter.Write(eeReq.OrdNavMP[utils.MetaHdr].OrderedFieldsAsStrings())
}
// Compose and cache the trailer
@@ -171,7 +158,6 @@ func (fCsv *FileCSVee) composeTrailer() (err error) {
if len(fCsv.cgrCfg.EEsCfg().Exporters[fCsv.cfgIdx].TrailerFields()) == 0 {
return
}
var csvRecord []string
oNm := map[string]*utils.OrderedNavigableMap{
utils.MetaTrl: utils.NewOrderedNavigableMap(),
}
@@ -184,14 +170,8 @@ func (fCsv *FileCSVee) composeTrailer() (err error) {
if err = eeReq.SetFields(fCsv.cgrCfg.EEsCfg().Exporters[fCsv.cfgIdx].TrailerFields()); err != nil {
return
}
for el := eeReq.OrdNavMP[utils.MetaTrl].GetFirstElement(); el != nil; el = el.Next() {
var strVal string
if strVal, err = eeReq.OrdNavMP[utils.MetaTrl].FieldAsString(el.Value.Slice()); err != nil {
return
}
csvRecord = append(csvRecord, strVal)
}
return fCsv.csvWriter.Write(csvRecord)
return fCsv.csvWriter.Write(eeReq.OrdNavMP[utils.MetaTrl].OrderedFieldsAsStrings())
}
func (fCsv *FileCSVee) GetMetrics() utils.MapStorage {

View File

@@ -219,11 +219,11 @@ func TestFileCsvExportEvent(t *testing.T) {
cgrCfg.EEsCfg().Exporters[fCsv.cfgIdx].Fields = []*config.FCTemplate{
{
Path: "*exp.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field1", utils.InfieldSep),
Value: config.NewRSRParsersMustCompile("~*req.test1", utils.InfieldSep),
},
{
Path: "*exp.2", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field2", utils.InfieldSep),
Value: config.NewRSRParsersMustCompile("3", utils.InfieldSep),
},
}
for _, field := range cgrCfg.EEsCfg().Exporters[fCsv.cfgIdx].Fields {
@@ -232,12 +232,18 @@ func TestFileCsvExportEvent(t *testing.T) {
if err := fCsv.ExportEvent(cgrEv); err != nil {
t.Error(err)
}
csvNW.Flush()
expected := "value\n"
if expected != byteBuff.String() {
t.Errorf("Expected %q but received %q", expected, byteBuff.String())
}
byteBuff.Reset()
cgrCfg.EEsCfg().Exporters[fCsv.cfgIdx].ComputeFields()
if err := fCsv.ExportEvent(cgrEv); err != nil {
t.Error(err)
}
csvNW.Flush()
expected := "value\n\n"
expected = "value,3\n"
if expected != byteBuff.String() {
t.Errorf("Expected %q but received %q", expected, byteBuff.String())
}
@@ -263,5 +269,5 @@ func TestFileCsvExportEvent(t *testing.T) {
if err := fCsv.ExportEvent(cgrEv); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but received %q", errExpect, err)
}
fCsv.OnEvicted("test", "test")
}

View File

@@ -95,6 +95,7 @@ func (fFwv *FileFWVee) ExportEvent(cgrEv *utils.CGREvent) (err error) {
fFwv.dc[utils.NumberOfEvents] = fFwv.dc[utils.NumberOfEvents].(int64) + 1
var records []string
if len(fFwv.cgrCfg.EEsCfg().Exporters[fFwv.cfgIdx].ContentFields()) == 0 {
records = make([]string, 0, len(cgrEv.Event))
for _, val := range cgrEv.Event {
records = append(records, utils.IfaceAsString(val))
}
@@ -113,22 +114,17 @@ func (fFwv *FileFWVee) ExportEvent(cgrEv *utils.CGREvent) (err error) {
if err = eeReq.SetFields(fFwv.cgrCfg.EEsCfg().Exporters[fFwv.cfgIdx].ContentFields()); err != nil {
return
}
for el := eeReq.OrdNavMP[utils.MetaExp].GetFirstElement(); el != nil; el = el.Next() {
var strVal string
if strVal, err = eeReq.OrdNavMP[utils.MetaExp].FieldAsString(el.Value.Slice()); err != nil {
return
}
records = append(records, strVal)
}
records = eeReq.OrdNavMP[utils.MetaExp].OrderedFieldsAsStrings()
}
updateEEMetrics(fFwv.dc, cgrEv.Event, utils.FirstNonEmpty(fFwv.cgrCfg.EEsCfg().Exporters[fFwv.cfgIdx].Timezone,
fFwv.cgrCfg.GeneralCfg().DefaultTimezone))
for _, record := range append(records, "\n") {
for _, record := range records {
if _, err = io.WriteString(fFwv.file, record); err != nil {
return
}
}
_, err = io.WriteString(fFwv.file, "\n")
return
}
@@ -137,7 +133,6 @@ func (fFwv *FileFWVee) composeHeader() (err error) {
if len(fFwv.cgrCfg.EEsCfg().Exporters[fFwv.cfgIdx].HeaderFields()) == 0 {
return
}
var records []string
oNm := map[string]*utils.OrderedNavigableMap{
utils.MetaHdr: utils.NewOrderedNavigableMap(),
}
@@ -150,18 +145,12 @@ func (fFwv *FileFWVee) composeHeader() (err error) {
if err = eeReq.SetFields(fFwv.cgrCfg.EEsCfg().Exporters[fFwv.cfgIdx].HeaderFields()); err != nil {
return
}
for el := eeReq.OrdNavMP[utils.MetaHdr].GetFirstElement(); el != nil; el = el.Next() {
var strVal string
if strVal, err = eeReq.OrdNavMP[utils.MetaHdr].FieldAsString(el.Value.Slice()); err != nil {
return
}
records = append(records, strVal)
}
for _, record := range append(records, "\n") {
for _, record := range eeReq.OrdNavMP[utils.MetaHdr].OrderedFieldsAsStrings() {
if _, err = io.WriteString(fFwv.file, record); err != nil {
return
}
}
_, err = io.WriteString(fFwv.file, "\n")
return
}
@@ -170,7 +159,6 @@ func (fFwv *FileFWVee) composeTrailer() (err error) {
if len(fFwv.cgrCfg.EEsCfg().Exporters[fFwv.cfgIdx].TrailerFields()) == 0 {
return
}
var records []string
oNm := map[string]*utils.OrderedNavigableMap{
utils.MetaTrl: utils.NewOrderedNavigableMap(),
}
@@ -183,18 +171,12 @@ func (fFwv *FileFWVee) composeTrailer() (err error) {
if err = eeReq.SetFields(fFwv.cgrCfg.EEsCfg().Exporters[fFwv.cfgIdx].TrailerFields()); err != nil {
return
}
for el := eeReq.OrdNavMP[utils.MetaTrl].GetFirstElement(); el != nil; el = el.Next() {
var strVal string
if strVal, err = eeReq.OrdNavMP[utils.MetaTrl].FieldAsString(el.Value.Slice()); err != nil {
return
}
records = append(records, strVal)
}
for _, record := range append(records, "\n") {
for _, record := range eeReq.OrdNavMP[utils.MetaTrl].OrderedFieldsAsStrings() {
if _, err = io.WriteString(fFwv.file, record); err != nil {
return
}
}
_, err = io.WriteString(fFwv.file, "\n")
return
}

View File

@@ -55,7 +55,16 @@ func TestFileFwvGetMetrics(t *testing.T) {
}
}
func TestFilveFwvComposeHeader(t *testing.T) {
// type MyError struct{}
// func (m *MyError) Error() string {
// return "ERR"
// }
// func (nopCloser) WriteString(w io.Writer, s string) error {
// return &MyError{}
// }
func TestFileFwvComposeHeader(t *testing.T) {
cgrCfg := config.NewDefaultCGRConfig()
newIDb := engine.NewInternalDB(nil, nil, true)
newDM := engine.NewDataManager(newIDb, cgrCfg.CacheCfg(), nil)
@@ -116,6 +125,7 @@ func TestFilveFwvComposeHeader(t *testing.T) {
if err := fFwv.composeHeader(); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but received %q", errExpect, err)
}
}
func TestFileFwvComposeTrailer(t *testing.T) {
@@ -210,11 +220,11 @@ func TestFileFwvExportEvent(t *testing.T) {
cgrCfg.EEsCfg().Exporters[fFwv.cfgIdx].Fields = []*config.FCTemplate{
{
Path: "*exp.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field1", utils.InfieldSep),
Value: config.NewRSRParsersMustCompile("~*req.test1", utils.InfieldSep),
},
{
Path: "*exp.2", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field2", utils.InfieldSep),
Value: config.NewRSRParsersMustCompile("3", utils.InfieldSep),
},
}
for _, field := range cgrCfg.EEsCfg().Exporters[fFwv.cfgIdx].Fields {
@@ -223,12 +233,18 @@ func TestFileFwvExportEvent(t *testing.T) {
if err := fFwv.ExportEvent(cgrEv); err != nil {
t.Error(err)
}
csvNW.Flush()
expected := "value\n"
if expected != byteBuff.String() {
t.Errorf("Expected %q but received %q", expected, byteBuff.String())
}
cgrCfg.EEsCfg().Exporters[fFwv.cfgIdx].ComputeFields()
byteBuff.Reset()
if err := fFwv.ExportEvent(cgrEv); err != nil {
t.Error(err)
}
csvNW.Flush()
expected := "value\n\n"
expected = "value3\n"
if expected != byteBuff.String() {
t.Errorf("Expected %q but received %q", expected, byteBuff.String())
}

View File

@@ -20,7 +20,6 @@ package ees
import (
"encoding/json"
"fmt"
"net/http"
"strings"
"sync"
@@ -100,18 +99,8 @@ func (httpEE *HTTPjsonMapEE) ExportEvent(cgrEv *utils.CGREvent) (err error) {
return
}
for el := eeReq.OrdNavMP[utils.MetaExp].GetFirstElement(); el != nil; el = el.Next() {
var nmIt utils.NMInterface
if nmIt, err = eeReq.OrdNavMP[utils.MetaExp].Field(el.Value); err != nil {
return
}
itm, isNMItem := nmIt.(*config.NMItem)
if !isNMItem {
err = fmt.Errorf("cannot encode reply value: %s, err: not NMItems", utils.ToJSON(el.Value))
return
}
if itm == nil {
continue // all attributes, not writable to diameter packet
}
nmIt, _ := eeReq.OrdNavMP[utils.MetaExp].Field(el.Value)
itm := nmIt.(*config.NMItem)
valMp[strings.Join(itm.Path, utils.NestingSep)] = utils.IfaceAsString(itm.Data)
}
if hdr, err = httpEE.composeHeader(); err != nil {
@@ -157,18 +146,8 @@ func (httpEE *HTTPjsonMapEE) composeHeader() (hdr http.Header, err error) {
return
}
for el := eeReq.OrdNavMP[utils.MetaHdr].GetFirstElement(); el != nil; el = el.Next() {
var nmIt utils.NMInterface
if nmIt, err = eeReq.OrdNavMP[utils.MetaHdr].Field(el.Value); err != nil {
return
}
itm, isNMItem := nmIt.(*config.NMItem)
if !isNMItem {
err = fmt.Errorf("cannot encode reply value: %s, err: not NMItems", utils.ToJSON(el.Value))
return
}
if itm == nil {
continue // all attributes, not writable to diameter packet
}
nmIt, _ := eeReq.OrdNavMP[utils.MetaHdr].Field(el.Value) //Safe to ignore error, since the path always exists
itm := nmIt.(*config.NMItem) //We only store nmItems in the map
hdr.Set(strings.Join(itm.Path, utils.NestingSep), utils.IfaceAsString(itm.Data))
}
return

202
ees/httpjsonmap_test.go Normal file
View File

@@ -0,0 +1,202 @@
/*
Real-time Online/Offline Charging System (OerS) for Telecom & ISP environments
Copyright (C) ITsysCOM GmbH
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package ees
import (
"reflect"
"testing"
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/engine"
"github.com/cgrates/cgrates/utils"
)
func TestHttpJsonMapID(t *testing.T) {
httpEE := &HTTPjsonMapEE{
id: "3",
}
if rcv := httpEE.ID(); !reflect.DeepEqual(rcv, "3") {
t.Errorf("Expected %+v but got %+v", "3", rcv)
}
}
func TestHttpJsonMapGetMetrics(t *testing.T) {
dc, err := newEEMetrics(utils.FirstNonEmpty(
"Local",
utils.EmptyString,
))
if err != nil {
t.Error(err)
}
httpEE := &HTTPjsonMapEE{
dc: dc,
}
if rcv := httpEE.GetMetrics(); !reflect.DeepEqual(rcv, httpEE.dc) {
t.Errorf("Expected %+v \n but got %+v", utils.ToJSON(rcv), utils.ToJSON(httpEE.dc))
}
}
func TestHttpJsonMapExportEvent(t *testing.T) {
cgrCfg := config.NewDefaultCGRConfig()
cgrCfg.EEsCfg().Exporters[0].Type = utils.MetaSQSjsonMap
cgrEv := new(utils.CGREvent)
newIDb := engine.NewInternalDB(nil, nil, true)
newDM := engine.NewDataManager(newIDb, cgrCfg.CacheCfg(), nil)
filterS := engine.NewFilterS(cgrCfg, nil, newDM)
dc, err := newEEMetrics(utils.FirstNonEmpty(
"Local",
utils.EmptyString,
))
if err != nil {
t.Error(err)
}
httpEE, err := NewHTTPjsonMapEE(cgrCfg, 0, filterS, dc)
if err != nil {
t.Error(err)
}
cgrEv.Event = map[string]interface{}{
"test": "string",
}
cgrCfg.EEsCfg().Exporters[0].Fields = []*config.FCTemplate{
{
Path: "*exp.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field1", utils.InfieldSep),
},
{
Path: "*exp.2", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("*req.field2", utils.InfieldSep),
},
}
for _, field := range cgrCfg.EEsCfg().Exporters[0].Fields {
field.ComputePath()
}
errExpect := `Post "/var/spool/cgrates/ees": unsupported protocol scheme ""`
if err := httpEE.ExportEvent(cgrEv); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but received %q", errExpect, err)
}
cgrCfg.EEsCfg().Exporters[0].ComputeFields()
if err := httpEE.ExportEvent(cgrEv); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but received %q", errExpect, err)
}
cgrCfg.EEsCfg().Exporters[0].Fields = []*config.FCTemplate{
{
Path: "*exp.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field1", utils.InfieldSep),
Filters: []string{"*wrong-type"},
},
{
Path: "*exp.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field1", utils.InfieldSep),
Filters: []string{"*wrong-type"},
},
}
for _, field := range cgrCfg.EEsCfg().Exporters[0].Fields {
field.ComputePath()
}
cgrCfg.EEsCfg().Exporters[0].ComputeFields()
errExpect = "inline parse error for string: <*wrong-type>"
if err := httpEE.ExportEvent(cgrEv); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but received %q", errExpect, err)
}
cgrCfg.EEsCfg().Exporters[0].Fields = []*config.FCTemplate{
{
Path: "*exp.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field1", utils.InfieldSep),
},
{
Path: "*exp.2", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field2", utils.InfieldSep),
},
{
Path: "*hdr.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field2", utils.InfieldSep),
Filters: []string{"*wrong-type"},
},
}
for _, field := range cgrCfg.EEsCfg().Exporters[0].Fields {
field.ComputePath()
}
cgrCfg.EEsCfg().Exporters[0].ComputeFields()
errExpect = "inline parse error for string: <*wrong-type>"
if err := httpEE.ExportEvent(cgrEv); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but received %q", errExpect, err)
}
httpEE.OnEvicted("test", "test")
}
func TestHttpJsonMapComposeHeader(t *testing.T) {
cgrCfg := config.NewDefaultCGRConfig()
cgrCfg.EEsCfg().Exporters[0].Type = utils.MetaHTTPjson
newIDb := engine.NewInternalDB(nil, nil, true)
newDM := engine.NewDataManager(newIDb, cgrCfg.CacheCfg(), nil)
filterS := engine.NewFilterS(cgrCfg, nil, newDM)
dc, err := newEEMetrics(utils.FirstNonEmpty(
"Local",
utils.EmptyString,
))
if err != nil {
t.Error(err)
}
httpEE, err := NewHTTPjsonMapEE(cgrCfg, 0, filterS, dc)
if err != nil {
t.Error(err)
}
cgrCfg.EEsCfg().Exporters[0].Fields = []*config.FCTemplate{
{
Path: "*hdr.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("field1", utils.InfieldSep),
},
{
Path: "*hdr.2", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("field2", utils.InfieldSep),
},
}
for _, field := range cgrCfg.EEsCfg().Exporters[0].Fields {
field.ComputePath()
}
if _, err := httpEE.composeHeader(); err != nil {
t.Error(err)
}
cgrCfg.EEsCfg().Exporters[0].ComputeFields()
if _, err := httpEE.composeHeader(); err != nil {
t.Error(err)
}
cgrCfg.EEsCfg().Exporters[0].Fields = []*config.FCTemplate{
{
Path: "*hdr.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("field1", utils.InfieldSep),
Filters: []string{"*wrong-type"},
},
{
Path: "*hdr.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("field1", utils.InfieldSep),
Filters: []string{"*wrong-type"},
},
}
for _, field := range cgrCfg.EEsCfg().Exporters[0].Fields {
field.ComputePath()
}
cgrCfg.EEsCfg().Exporters[0].ComputeFields()
errExpect := "inline parse error for string: <*wrong-type>"
if _, err := httpEE.composeHeader(); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but received %q", errExpect, err)
}
}

View File

@@ -19,7 +19,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package ees
import (
"fmt"
"net/http"
"net/url"
"strings"
@@ -96,17 +95,8 @@ func (httpPost *HTTPPost) ExportEvent(cgrEv *utils.CGREvent) (err error) {
return
}
for el := eeReq.OrdNavMP[utils.MetaExp].GetFirstElement(); el != nil; el = el.Next() {
var nmIt utils.NMInterface
if nmIt, err = eeReq.OrdNavMP[utils.MetaExp].Field(el.Value); err != nil {
return
}
itm, isNMItem := nmIt.(*config.NMItem)
if !isNMItem {
return fmt.Errorf("cannot encode reply value: %s, err: not NMItems", utils.ToJSON(el.Value))
}
if itm == nil {
continue // all attributes, not writable to diameter packet
}
nmIt, _ := eeReq.OrdNavMP[utils.MetaExp].Field(el.Value)
itm := nmIt.(*config.NMItem)
urlVals.Set(strings.Join(itm.Path, utils.NestingSep), utils.IfaceAsString(itm.Data))
}
if hdr, err = httpPost.composeHeader(); err != nil {
@@ -150,18 +140,8 @@ func (httpPost *HTTPPost) composeHeader() (hdr http.Header, err error) {
return
}
for el := eeReq.OrdNavMP[utils.MetaHdr].GetFirstElement(); el != nil; el = el.Next() {
var nmIt utils.NMInterface
if nmIt, err = eeReq.OrdNavMP[utils.MetaHdr].Field(el.Value); err != nil {
return
}
itm, isNMItem := nmIt.(*config.NMItem)
if !isNMItem {
err = fmt.Errorf("cannot encode reply value: %s, err: not NMItems", utils.ToJSON(el.Value))
return
}
if itm == nil {
continue // all attributes, not writable to diameter packet
}
nmIt, _ := eeReq.OrdNavMP[utils.MetaHdr].Field(el.Value)
itm := nmIt.(*config.NMItem)
hdr.Set(strings.Join(itm.Path, utils.NestingSep), utils.IfaceAsString(itm.Data))
}
return

View File

@@ -22,6 +22,8 @@ import (
"reflect"
"testing"
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/engine"
"github.com/cgrates/cgrates/utils"
)
@@ -50,3 +52,150 @@ func TestHttpPostGetMetrics(t *testing.T) {
t.Errorf("Expected %+v \n but got %+v", utils.ToJSON(rcv), utils.ToJSON(httpPost.dc))
}
}
func TestHttpPostExportEvent(t *testing.T) {
cgrCfg := config.NewDefaultCGRConfig()
cgrCfg.EEsCfg().Exporters[0].Type = utils.MetaHTTPPost
cgrEv := new(utils.CGREvent)
newIDb := engine.NewInternalDB(nil, nil, true)
newDM := engine.NewDataManager(newIDb, cgrCfg.CacheCfg(), nil)
filterS := engine.NewFilterS(cgrCfg, nil, newDM)
dc, err := newEEMetrics(utils.FirstNonEmpty(
"Local",
utils.EmptyString,
))
if err != nil {
t.Error(err)
}
httpPost, err := NewHTTPPostEe(cgrCfg, 0, filterS, dc)
if err != nil {
t.Error(err)
}
cgrEv.Event = map[string]interface{}{
"Test1": 3,
}
cgrCfg.EEsCfg().Exporters[0].Fields = []*config.FCTemplate{
{
Path: "*exp.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field1", utils.InfieldSep),
},
{
Path: "*exp.2", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("*req.field2", utils.InfieldSep),
},
}
for _, field := range cgrCfg.EEsCfg().Exporters[0].Fields {
field.ComputePath()
}
errExpect := `Post "/var/spool/cgrates/ees": unsupported protocol scheme ""`
if err := httpPost.ExportEvent(cgrEv); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but received %q", errExpect, err)
}
cgrCfg.EEsCfg().Exporters[0].ComputeFields()
if err := httpPost.ExportEvent(cgrEv); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but received %q", errExpect, err)
}
cgrCfg.EEsCfg().Exporters[0].Fields = []*config.FCTemplate{
{
Path: "*exp.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field1", utils.InfieldSep),
Filters: []string{"*wrong-type"},
},
{
Path: "*exp.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field1", utils.InfieldSep),
Filters: []string{"*wrong-type"},
},
}
for _, field := range cgrCfg.EEsCfg().Exporters[0].Fields {
field.ComputePath()
}
cgrCfg.EEsCfg().Exporters[0].ComputeFields()
errExpect = "inline parse error for string: <*wrong-type>"
if err := httpPost.ExportEvent(cgrEv); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but received %q", errExpect, err)
}
cgrCfg.EEsCfg().Exporters[0].Fields = []*config.FCTemplate{
{
Path: "*exp.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field1", utils.InfieldSep),
},
{
Path: "*exp.2", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field2", utils.InfieldSep),
},
{
Path: "*hdr.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field2", utils.InfieldSep),
Filters: []string{"*wrong-type"},
},
}
for _, field := range cgrCfg.EEsCfg().Exporters[0].Fields {
field.ComputePath()
}
cgrCfg.EEsCfg().Exporters[0].ComputeFields()
errExpect = "inline parse error for string: <*wrong-type>"
if err := httpPost.ExportEvent(cgrEv); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but received %q", errExpect, err)
}
httpPost.OnEvicted("test", "test")
}
func TestHttpPostComposeHeader(t *testing.T) {
cgrCfg := config.NewDefaultCGRConfig()
cgrCfg.EEsCfg().Exporters[0].Type = utils.MetaHTTPPost
newIDb := engine.NewInternalDB(nil, nil, true)
newDM := engine.NewDataManager(newIDb, cgrCfg.CacheCfg(), nil)
filterS := engine.NewFilterS(cgrCfg, nil, newDM)
dc, err := newEEMetrics(utils.FirstNonEmpty(
"Local",
utils.EmptyString,
))
if err != nil {
t.Error(err)
}
httpPost, err := NewHTTPPostEe(cgrCfg, 0, filterS, dc)
if err != nil {
t.Error(err)
}
cgrCfg.EEsCfg().Exporters[0].Fields = []*config.FCTemplate{
{
Path: "*hdr.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("field1", utils.InfieldSep),
},
{
Path: "*hdr.2", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("field2", utils.InfieldSep),
},
}
for _, field := range cgrCfg.EEsCfg().Exporters[0].Fields {
field.ComputePath()
}
if _, err := httpPost.composeHeader(); err != nil {
t.Error(err)
}
cgrCfg.EEsCfg().Exporters[0].ComputeFields()
if _, err := httpPost.composeHeader(); err != nil {
t.Error(err)
}
cgrCfg.EEsCfg().Exporters[0].Fields = []*config.FCTemplate{
{
Path: "*hdr.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("field1", utils.InfieldSep),
Filters: []string{"*wrong-type"},
},
{
Path: "*hdr.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("field1", utils.InfieldSep),
Filters: []string{"*wrong-type"},
},
}
for _, field := range cgrCfg.EEsCfg().Exporters[0].Fields {
field.ComputePath()
}
cgrCfg.EEsCfg().Exporters[0].ComputeFields()
errExpect := "inline parse error for string: <*wrong-type>"
if _, err := httpPost.composeHeader(); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but received %q", errExpect, err)
}
}

View File

@@ -20,7 +20,6 @@ package ees
import (
"encoding/json"
"fmt"
"strings"
"sync"
@@ -111,18 +110,8 @@ func (pstrEE *PosterJSONMapEE) ExportEvent(cgrEv *utils.CGREvent) (err error) {
return
}
for el := eeReq.OrdNavMP[utils.MetaExp].GetFirstElement(); el != nil; el = el.Next() {
var nmIt utils.NMInterface
if nmIt, err = eeReq.OrdNavMP[utils.MetaExp].Field(el.Value); err != nil {
return
}
itm, isNMItem := nmIt.(*config.NMItem)
if !isNMItem {
err = fmt.Errorf("cannot encode reply value: %s, err: not NMItems", utils.ToJSON(el.Value))
return
}
if itm == nil {
continue // all attributes, not writable to diameter packet
}
nmIt, _ := eeReq.OrdNavMP[utils.MetaExp].Field(el.Value)
itm := nmIt.(*config.NMItem)
valMp[strings.Join(itm.Path, utils.NestingSep)] = utils.IfaceAsString(itm.Data)
}
}

View File

@@ -171,7 +171,7 @@ func TestPosterJsonMapExportEvent(t *testing.T) {
},
{
Path: "*exp.2", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field2", utils.InfieldSep),
Value: config.NewRSRParsersMustCompile("*req.field2", utils.InfieldSep),
},
}
for _, field := range cgrCfg.EEsCfg().Exporters[pstrEE.cfgIdx].Fields {
@@ -185,5 +185,25 @@ func TestPosterJsonMapExportEvent(t *testing.T) {
if err := pstrEE.ExportEvent(cgrEv); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but received %q", errExpect, err)
}
////////
cgrCfg.EEsCfg().Exporters[0].Fields = []*config.FCTemplate{
{
Path: "*exp.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field1", utils.InfieldSep),
Filters: []string{"*wrong-type"},
},
{
Path: "*exp.1", Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~*req.field1", utils.InfieldSep),
Filters: []string{"*wrong-type"},
},
}
for _, field := range cgrCfg.EEsCfg().Exporters[0].Fields {
field.ComputePath()
}
cgrCfg.EEsCfg().Exporters[0].ComputeFields()
errExpect = "inline parse error for string: <*wrong-type>"
if err := pstrEE.ExportEvent(cgrEv); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but received %q", errExpect, err)
}
pstrEE.OnEvicted("test", "test")
}

View File

@@ -115,4 +115,5 @@ func TestVirtualEeExportEvent(t *testing.T) {
if err := vEe.ExportEvent(cgrEv); err == nil || err.Error() != errExpect {
t.Errorf("Expected %q but received %q", errExpect, err)
}
vEe.OnEvicted("test", "test")
}

View File

@@ -192,3 +192,13 @@ func (onm *OrderedNavigableMap) RemoveAll() {
onm.orderIdx = NewPathItemList()
onm.orderRef = make(map[string][]*PathItemElement)
}
// OrderedFieldsAsStrings returns the elements as strings in order they were inserted
func (onm *OrderedNavigableMap) OrderedFieldsAsStrings() (flds []string) {
flds = make([]string, 0, onm.Len())
for el := onm.GetFirstElement(); el != nil; el = el.Next() {
fld, _ := onm.Field(el.Value)
flds = append(flds, IfaceAsString(fld.Interface()))
}
return
}

View File

@@ -967,4 +967,9 @@ func TestOrderedNavigableMapOrderedFields(t *testing.T) {
if !reflect.DeepEqual(exp, rcv) {
t.Errorf("Expected %+v, received %+v", exp, rcv)
}
exp2 := []string{"1003", "1004", "1006"}
rcv2 := nm.OrderedFieldsAsStrings()
if !reflect.DeepEqual(exp2, rcv2) {
t.Errorf("Expected %+v, received %+v", exp2, rcv2)
}
}