Added nil check when creating EventCost DataProvider. Fixes #2764

This commit is contained in:
Trial97
2021-03-23 13:26:13 +02:00
committed by Dan Christian Bogos
parent 8b9508c5a2
commit 99526ddde2
3 changed files with 30 additions and 25 deletions

View File

@@ -143,10 +143,7 @@ func (cdr *CDR) FormatCost(shiftDecimals, roundDecimals int) string {
// FieldAsString is used to retrieve fields as string, primary fields are const labeled
func (cdr *CDR) FieldAsString(rsrPrs *config.RSRParser) (parsed string, err error) {
parsed, err = rsrPrs.ParseDataProviderWithInterfaces(
utils.MapStorage{
utils.MetaReq: cdr.AsMapStringIface(),
utils.MetaEC: cdr.CostDetails,
})
cdr.AsMapStorage())
if err != nil {
return
}
@@ -156,10 +153,7 @@ func (cdr *CDR) FieldAsString(rsrPrs *config.RSRParser) (parsed string, err erro
// FieldsAsString concatenates values of multiple fields defined in template, used eg in CDR templates
func (cdr *CDR) FieldsAsString(rsrFlds config.RSRParsers) string {
outVal, err := rsrFlds.ParseDataProvider(
utils.MapStorage{
utils.MetaReq: cdr.AsMapStringIface(),
utils.MetaEC: cdr.CostDetails,
})
cdr.AsMapStorage())
if err != nil {
return ""
}
@@ -205,6 +199,16 @@ func (cdr *CDR) Clone() *CDR {
return cln
}
func (cdr *CDR) AsMapStorage() (mp utils.MapStorage) {
mp = utils.MapStorage{
utils.MetaReq: cdr.AsMapStringIface(),
}
if cdr.CostDetails != nil {
mp[utils.MetaEC] = cdr.CostDetails
}
return
}
func (cdr *CDR) AsMapStringIface() (mp map[string]interface{}) {
mp = make(map[string]interface{})
for fld, val := range cdr.ExtraFields {
@@ -283,10 +287,7 @@ func (cdr *CDR) combimedCdrFieldVal(cfgCdrFld *config.FCTemplate, groupCDRs []*C
if cdr.CGRID != grpCDR.CGRID {
continue // We only care about cdrs with same primary cdr behind
}
if pass, err := filterS.Pass(grpCDR.Tenant, cfgCdrFld.Filters, utils.MapStorage{
utils.MetaReq: grpCDR.AsMapStringIface(),
utils.MetaEC: grpCDR.CostDetails,
}); err != nil {
if pass, err := filterS.Pass(grpCDR.Tenant, cfgCdrFld.Filters, grpCDR.AsMapStorage()); err != nil {
return utils.EmptyString, err
} else if !pass {
continue
@@ -391,10 +392,7 @@ func (cdr *CDR) formatField(cfgFld *config.FCTemplate, groupedCDRs []*CDR,
// ExportRecord is a []string to keep it compatible with encoding/csv Writer
func (cdr *CDR) AsExportRecord(exportFields []*config.FCTemplate, groupedCDRs []*CDR,
filterS *FilterS) (expRecord []string, err error) {
nM := utils.MapStorage{
utils.MetaReq: cdr.AsMapStringIface(),
utils.MetaEC: cdr.CostDetails,
}
nM := cdr.AsMapStorage()
for _, cfgFld := range exportFields {
if !strings.HasPrefix(cfgFld.Path, utils.MetaExp+utils.NestingSep) {
continue

View File

@@ -955,9 +955,6 @@ func (ec *EventCost) Trim(atUsage time.Duration) (srplusEC *EventCost, err error
// FieldAsInterface func to implement DataProvider
func (ec *EventCost) FieldAsInterface(fldPath []string) (val interface{}, err error) {
if len(fldPath) == 0 {
return nil, utils.ErrNotFound
}
if ec.cache == nil {
ec.cache = utils.MapStorage{} // fix gob deserialization
}

View File

@@ -2655,12 +2655,6 @@ func TestInitCache(t *testing.T) {
func TestEventCostFieldAsInterface(t *testing.T) {
eventCost := &EventCost{}
eventCost.initCache()
// empty check
if rcv, err := eventCost.FieldAsInterface([]string{}); err != utils.ErrNotFound {
t.Errorf("Expecting: %+v, received: %+v", utils.ErrNotFound, err)
} else if rcv != nil {
t.Errorf("Expecting: nil, received: %+v", rcv)
}
// item found in cache
eventCost.cache = utils.MapStorage{"test": nil}
if rcv, err := eventCost.FieldAsInterface([]string{"test"}); err == nil || err != utils.ErrNotFound {
@@ -3791,3 +3785,19 @@ func TestECAsDataProvider2(t *testing.T) {
t.Errorf("Unexpected error:%v", err)
}
}
func TestECFieldAsInterfaceNilEventCost(t *testing.T) {
dft := config.NewDefaultCGRConfig()
cdr, err := NewMapEvent(map[string]interface{}{}).AsCDR(dft, "cgrates.org", "UTC")
if err != nil {
t.Fatal(err)
}
nM := cdr.AsMapStorage()
if _, err := nM.FieldAsInterface([]string{"*ec", "Charges[0]", "Increments[0]", "Accounting", "Balance", "ID"}); err == nil || err.Error() != utils.ErrNotFound.Error() {
t.Fatalf("Expected error:%s, received: %v", utils.ErrNotFound.Error(), err)
}
if _, err := nM.FieldAsInterface([]string{"*req", "CostDetails", "Charges[0]", "Increments[0]", "Accounting", "Balance", "ID"}); err == nil || err.Error() != utils.ErrNotFound.Error() {
t.Fatalf("Expected error:%s, received: %v", utils.ErrNotFound.Error(), err)
}
}