Make sure cdr_http field is replicable with cost and cgrid, fixes #124

This commit is contained in:
DanB
2015-07-20 21:42:24 +02:00
parent 5bfa6e1ef8
commit 0dc91e2981
3 changed files with 48 additions and 1 deletions

View File

@@ -21,6 +21,7 @@ package engine
import (
"github.com/cgrates/cgrates/utils"
"net/http"
"strconv"
)
func NewCgrCdrFromHttpReq(req *http.Request) (CgrCdr, error) {
@@ -40,6 +41,9 @@ func NewCgrCdrFromHttpReq(req *http.Request) (CgrCdr, error) {
type CgrCdr map[string]string
func (cgrCdr CgrCdr) getCgrId() string {
if cgrId, hasIt := cgrCdr[utils.CGRID]; hasIt {
return cgrId
}
setupTime, _ := utils.ParseTimeDetectLayout(cgrCdr[utils.SETUP_TIME])
return utils.Sha1(cgrCdr[utils.ACCID], setupTime.UTC().String())
}
@@ -69,10 +73,18 @@ func (cgrCdr CgrCdr) AsStoredCdr() *StoredCdr {
storCdr.Subject = cgrCdr[utils.SUBJECT]
storCdr.Destination = cgrCdr[utils.DESTINATION]
storCdr.SetupTime, _ = utils.ParseTimeDetectLayout(cgrCdr[utils.SETUP_TIME]) // Not interested to process errors, should do them if necessary in a previous step
storCdr.Pdd, _ = utils.ParseDurationWithSecs(cgrCdr[utils.PDD])
storCdr.AnswerTime, _ = utils.ParseTimeDetectLayout(cgrCdr[utils.ANSWER_TIME])
storCdr.Usage, _ = utils.ParseDurationWithSecs(cgrCdr[utils.USAGE])
storCdr.Supplier = cgrCdr[utils.SUPPLIER]
storCdr.DisconnectCause = cgrCdr[utils.DISCONNECT_CAUSE]
storCdr.ExtraFields = cgrCdr.getExtraFields()
storCdr.Cost = -1
if costStr, hasIt := cgrCdr[utils.COST]; hasIt {
storCdr.Cost, _ = strconv.ParseFloat(costStr, 64)
}
if ratedStr, hasIt := cgrCdr[utils.RATED]; hasIt {
storCdr.Rated, _ = strconv.ParseBool(ratedStr)
}
return storCdr
}

View File

@@ -50,3 +50,37 @@ func TestCgrCdrAsStoredCdr(t *testing.T) {
t.Errorf("Expecting %v, received: %v", expctRtCdr, storedCdr)
}
}
// Make sure the replicated CDR matches the expected StoredCdr
func TestReplicatedCgrCdrAsStoredCdr(t *testing.T) {
cgrCdr := CgrCdr{utils.CGRID: "164b0422fdc6a5117031b427439482c6a4f90e41", utils.TOR: utils.VOICE, utils.ACCID: "dsafdsaf", utils.CDRHOST: "192.168.1.1",
utils.CDRSOURCE: "internal_test", utils.REQTYPE: utils.META_RATED,
utils.DIRECTION: utils.OUT, utils.TENANT: "cgrates.org", utils.CATEGORY: "call",
utils.ACCOUNT: "1001", utils.SUBJECT: "1001", utils.DESTINATION: "1002", utils.SETUP_TIME: "2013-11-07T08:42:20Z", utils.PDD: "0.200", utils.ANSWER_TIME: "2013-11-07T08:42:26Z",
utils.USAGE: "10", utils.SUPPLIER: "SUPPL1", utils.DISCONNECT_CAUSE: "NORMAL_CLEARING", utils.COST: "0.12", utils.RATED: "true", "field_extr1": "val_extr1", "fieldextr2": "valextr2"}
expctRtCdr := &StoredCdr{CgrId: cgrCdr[utils.CGRID],
TOR: cgrCdr[utils.TOR],
AccId: cgrCdr[utils.ACCID],
CdrHost: cgrCdr[utils.CDRHOST],
CdrSource: cgrCdr[utils.CDRSOURCE],
ReqType: cgrCdr[utils.REQTYPE],
Direction: cgrCdr[utils.DIRECTION],
Tenant: cgrCdr[utils.TENANT],
Category: cgrCdr[utils.CATEGORY],
Account: cgrCdr[utils.ACCOUNT],
Subject: cgrCdr[utils.SUBJECT],
Destination: cgrCdr[utils.DESTINATION],
SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC),
Pdd: time.Duration(200) * time.Millisecond,
AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC),
Usage: time.Duration(10) * time.Second,
Supplier: cgrCdr[utils.SUPPLIER],
DisconnectCause: cgrCdr[utils.DISCONNECT_CAUSE],
ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"},
Cost: 0.12,
Rated: true,
}
if storedCdr := cgrCdr.AsStoredCdr(); !reflect.DeepEqual(expctRtCdr, storedCdr) {
t.Errorf("Expecting %v, received: %v", expctRtCdr, storedCdr)
}
}

View File

@@ -218,5 +218,6 @@ const (
var (
CdreCdrFormats = []string{CSV, DRYRUN, CDRE_FIXED_WIDTH}
PrimaryCdrFields = []string{TOR, ACCID, CDRHOST, CDRSOURCE, REQTYPE, DIRECTION, TENANT, CATEGORY, ACCOUNT, SUBJECT, DESTINATION, SETUP_TIME, ANSWER_TIME, USAGE, SUPPLIER}
PrimaryCdrFields = []string{CGRID, TOR, ACCID, CDRHOST, CDRSOURCE, REQTYPE, DIRECTION, TENANT, CATEGORY, ACCOUNT, SUBJECT, DESTINATION, SETUP_TIME, PDD, ANSWER_TIME, USAGE,
SUPPLIER, DISCONNECT_CAUSE, COST, RATED}
)