diff --git a/cdrc/cdrc.go b/cdrc/cdrc.go index 87510bfc0..6710dbd5f 100644 --- a/cdrc/cdrc.go +++ b/cdrc/cdrc.go @@ -26,7 +26,6 @@ import ( "io" "io/ioutil" "net/http" - "net/url" "os" "path" "strconv" @@ -118,33 +117,8 @@ func (self *Cdrc) parseFieldsConfig() error { } // Takes the record out of csv and turns it into http form which can be posted -func (self *Cdrc) cdrAsHttpForm(record []string) (url.Values, error) { - // engine.Logger.Info(fmt.Sprintf("Processing record %v", record)) - v := url.Values{} - v.Set(utils.CDRSOURCE, self.cgrCfg.CdrcSourceId) - for cfgFieldName, cfgFieldVal := range self.cfgCdrFields { - var fieldVal string - if strings.HasPrefix(cfgFieldVal, utils.STATIC_VALUE_PREFIX) { - fieldVal = cfgFieldVal[1:] - } else if utils.IsSliceMember([]string{CSV, FS_CSV}, self.cgrCfg.CdrcCdrType) { - if cfgFieldIdx, err := strconv.Atoi(cfgFieldVal); err != nil { // Should in theory never happen since we have already parsed config - return nil, err - } else if len(record) <= cfgFieldIdx { - return nil, fmt.Errorf("Ignoring record: %v - cannot extract field %s", record, cfgFieldName) - } else { - fieldVal = record[cfgFieldIdx] - } - } else { // Modify here when we add more supported cdr formats - fieldVal = "UNKNOWN" - } - v.Set(cfgFieldName, fieldVal) - } - return v, nil -} - -// Takes the record out of csv and turns it into http form which can be posted -func (self *Cdrc) cdrAsRatedCdr(record []string) (*utils.RatedCDR, error) { - ratedCdr := &utils.RatedCDR{CdrSource: self.cgrCfg.CdrcSourceId} +func (self *Cdrc) recordAsRatedCdr(record []string) (*utils.RatedCDR, error) { + ratedCdr := &utils.RatedCDR{CdrSource: self.cgrCfg.CdrcSourceId, ExtraFields: map[string]string{}, Cost: -1} var err error for cfgFieldName, cfgFieldVal := range self.cfgCdrFields { var fieldVal string @@ -254,7 +228,7 @@ func (self *Cdrc) processFile(filePath string) error { engine.Logger.Err(fmt.Sprintf(" Error in csv file: %s", err.Error())) continue // Other csv related errors, ignore } - rawCdr, err := self.cdrAsRatedCdr(record) + rawCdr, err := self.recordAsRatedCdr(record) if err != nil { engine.Logger.Err(fmt.Sprintf(" Error in csv file: %s", err.Error())) continue diff --git a/cdrc/cdrc_test.go b/cdrc/cdrc_test.go index 2ed6a9271..4678b1a74 100644 --- a/cdrc/cdrc_test.go +++ b/cdrc/cdrc_test.go @@ -21,7 +21,9 @@ package cdrc import ( "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/utils" + "reflect" "testing" + "time" ) func TestParseFieldsConfig(t *testing.T) { @@ -54,29 +56,51 @@ func TestParseFieldsConfig(t *testing.T) { } } -func TestCdrAsHttpForm(t *testing.T) { +func TestRecordAsRatedCdr(t *testing.T) { cgrConfig, _ := config.NewDefaultCGRConfig() + cgrConfig.CdrcExtraFields = []string{"supplier:10"} cdrc := &Cdrc{cgrCfg: cgrConfig} if err := cdrc.parseFieldsConfig(); err != nil { t.Error("Failed parsing default fieldIndexesFromConfig", err) } cdrRow := []string{"firstField", "secondField"} - _, err := cdrc.cdrAsHttpForm(cdrRow) + _, err := cdrc.recordAsRatedCdr(cdrRow) if err == nil { t.Error("Failed to corectly detect missing fields from record") } cdrRow = []string{"acc1", "prepaid", "*out", "cgrates.org", "call", "1001", "1001", "+4986517174963", "2013-02-03 19:54:00", "62", "supplier1", "172.16.1.1"} - cdrAsForm, err := cdrc.cdrAsHttpForm(cdrRow) + rtCdr, err := cdrc.recordAsRatedCdr(cdrRow) if err != nil { - t.Error("Failed to parse CDR in form", err) + t.Error("Failed to parse CDR in rated cdr", err) } - if cdrAsForm.Get(utils.CDRSOURCE) != cgrConfig.CdrcSourceId { - t.Error("Unexpected cdrsource received", cdrAsForm.Get(utils.CDRSOURCE)) + expectedCdr := &utils.RatedCDR{ + CgrId: utils.FSCgrId(cdrRow[0]), + AccId: cdrRow[0], + CdrSource: cgrConfig.CdrcSourceId, + ReqType: cdrRow[1], + Direction: cdrRow[2], + Tenant: cdrRow[3], + TOR: cdrRow[4], + Account: cdrRow[5], + Subject: cdrRow[6], + Destination: cdrRow[7], + AnswerTime: time.Date(2013, 2, 3, 19, 54, 0, 0, time.UTC), + Duration: time.Duration(62) * time.Second, + ExtraFields: map[string]string{"supplier": "supplier1"}, + Cost: -1, } - if cdrAsForm.Get(utils.REQTYPE) != "prepaid" { - t.Error("Unexpected CDR value received", cdrAsForm.Get(utils.REQTYPE)) + if !reflect.DeepEqual(expectedCdr, rtCdr) { + t.Errorf("Expected: \n%v, \nreceived: \n%v", expectedCdr, rtCdr) } - //if cdrAsForm.Get("supplier") != "supplier1" { - // t.Error("Unexpected CDR value received", cdrAsForm.Get("supplier")) - //} + /* + if cdrAsForm.Get(utils.CDRSOURCE) != cgrConfig.CdrcSourceId { + t.Error("Unexpected cdrsource received", cdrAsForm.Get(utils.CDRSOURCE)) + } + if cdrAsForm.Get(utils.REQTYPE) != "prepaid" { + t.Error("Unexpected CDR value received", cdrAsForm.Get(utils.REQTYPE)) + } + if cdrAsForm.Get("supplier") != "supplier1" { + t.Error("Unexpected CDR value received", cdrAsForm.Get("supplier")) + } + */ } diff --git a/utils/ratedcdr.go b/utils/ratedcdr.go index 3aeb15d2f..da4846d78 100644 --- a/utils/ratedcdr.go +++ b/utils/ratedcdr.go @@ -19,8 +19,9 @@ along with this program. If not, see package utils import ( - "time" "net/url" + "strconv" + "time" ) func NewRatedCDRFromRawCDR(rawcdr RawCDR) (*RatedCDR, error) { @@ -143,7 +144,7 @@ func (ratedCdr *RatedCDR) AsRawCdrHttpForm() url.Values { v.Set(SUBJECT, ratedCdr.Subject) v.Set(DESTINATION, ratedCdr.Destination) v.Set(ANSWER_TIME, ratedCdr.AnswerTime.String()) - //v.Set(DURATION, string(ratedCdr.Duration.Seconds())) + v.Set(DURATION, strconv.FormatFloat(ratedCdr.Duration.Seconds(), 'f', -1, 64)) for fld, val := range ratedCdr.ExtraFields { v.Set(fld, val) } diff --git a/utils/ratedcdr_test.go b/utils/ratedcdr_test.go index d3ff122e5..7802924d9 100644 --- a/utils/ratedcdr_test.go +++ b/utils/ratedcdr_test.go @@ -98,3 +98,53 @@ func TestRatedCdrFields(t *testing.T) { t.Error("Error parsing cdr: ", ratedCdr) } } + +func TestAsRawCdrHttpForm(t *testing.T) { + ratedCdr := RatedCDR{CgrId: FSCgrId("dsafdsaf"), AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: "test", ReqType: "rated", Direction: "*out", Tenant: "cgrates.org", + TOR: "call", Account: "1001", Subject: "1001", Destination: "1002", AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), + Duration: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, + } + cdrForm := ratedCdr.AsRawCdrHttpForm() + if cdrForm.Get(ACCID) != ratedCdr.AccId { + t.Errorf("Expected: %s, received: %s", ratedCdr.AccId, cdrForm.Get(ACCID)) + } + if cdrForm.Get(CDRHOST) != ratedCdr.CdrHost { + t.Errorf("Expected: %s, received: %s", ratedCdr.CdrHost, cdrForm.Get(CDRHOST)) + } + if cdrForm.Get(CDRSOURCE) != ratedCdr.CdrSource { + t.Errorf("Expected: %s, received: %s", ratedCdr.CdrSource, cdrForm.Get(CDRSOURCE)) + } + if cdrForm.Get(REQTYPE) != ratedCdr.ReqType { + t.Errorf("Expected: %s, received: %s", ratedCdr.ReqType, cdrForm.Get(REQTYPE)) + } + if cdrForm.Get(DIRECTION) != ratedCdr.Direction { + t.Errorf("Expected: %s, received: %s", ratedCdr.Direction, cdrForm.Get(DIRECTION)) + } + if cdrForm.Get(TENANT) != ratedCdr.Tenant { + t.Errorf("Expected: %s, received: %s", ratedCdr.Tenant, cdrForm.Get(TENANT)) + } + if cdrForm.Get(TOR) != ratedCdr.TOR { + t.Errorf("Expected: %s, received: %s", ratedCdr.TOR, cdrForm.Get(TOR)) + } + if cdrForm.Get(ACCOUNT) != ratedCdr.Account { + t.Errorf("Expected: %s, received: %s", ratedCdr.Account, cdrForm.Get(ACCOUNT)) + } + if cdrForm.Get(SUBJECT) != ratedCdr.Subject { + t.Errorf("Expected: %s, received: %s", ratedCdr.Subject, cdrForm.Get(SUBJECT)) + } + if cdrForm.Get(DESTINATION) != ratedCdr.Destination { + t.Errorf("Expected: %s, received: %s", ratedCdr.Destination, cdrForm.Get(DESTINATION)) + } + if cdrForm.Get(ANSWER_TIME) != "2013-11-07 08:42:26 +0000 UTC" { + t.Errorf("Expected: %s, received: %s", "2013-11-07 08:42:26 +0000 UTC", cdrForm.Get(ANSWER_TIME)) + } + if cdrForm.Get(DURATION) != "10" { + t.Errorf("Expected: %s, received: %s", "10", cdrForm.Get(DURATION)) + } + if cdrForm.Get("field_extr1") != ratedCdr.ExtraFields["field_extr1"] { + t.Errorf("Expected: %s, received: %s", ratedCdr.ExtraFields["field_extr1"], cdrForm.Get("field_extr1")) + } + if cdrForm.Get("fieldextr2") != ratedCdr.ExtraFields["fieldextr2"] { + t.Errorf("Expected: %s, received: %s", ratedCdr.ExtraFields["fieldextr2"], cdrForm.Get("fieldextr2")) + } +}