diff --git a/apier/v1/apier_local_test.go b/apier/v1/apier_local_test.go index 9a51a43bd..c2caf1116 100644 --- a/apier/v1/apier_local_test.go +++ b/apier/v1/apier_local_test.go @@ -1441,7 +1441,7 @@ func TestLocalGetCdrs(t *testing.T) { if !*testLocal { return } - var reply []*utils.StoredCdr + var reply []*utils.CgrExtCdr req := utils.AttrGetCdrs{} if err := rater.Call("ApierV1.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) @@ -1465,7 +1465,7 @@ func TestLocalProcessCdr(t *testing.T) { } else if reply != utils.OK { t.Error("Unexpected reply received: ", reply) } - var cdrs []*utils.StoredCdr + var cdrs []*utils.CgrExtCdr req := utils.AttrGetCdrs{} if err := rater.Call("ApierV1.GetCdrs", req, &cdrs); err != nil { t.Error("Unexpected error: ", err.Error()) diff --git a/apier/v1/cdrs.go b/apier/v1/cdrs.go index 5a1d1b58c..daab4e56e 100644 --- a/apier/v1/cdrs.go +++ b/apier/v1/cdrs.go @@ -46,7 +46,7 @@ func (apier *ApierV1) GetCallCostLog(attrs AttrGetCallCost, reply *engine.CallCo } // Retrieves CDRs based on the filters -func (apier *ApierV1) GetCdrs(attrs utils.AttrGetCdrs, reply *[]*utils.CgrCdrOut) error { +func (apier *ApierV1) GetCdrs(attrs utils.AttrGetCdrs, reply *[]*utils.CgrExtCdr) error { cdrsFltr, err := attrs.AsCdrsFilter() if err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) @@ -54,10 +54,10 @@ func (apier *ApierV1) GetCdrs(attrs utils.AttrGetCdrs, reply *[]*utils.CgrCdrOut if cdrs, _, err := apier.CdrDb.GetStoredCdrs(cdrsFltr); err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } else if len(cdrs) == 0 { - *reply = make([]*utils.CgrCdrOut, 0) + *reply = make([]*utils.CgrExtCdr, 0) } else { for _, cdr := range cdrs { - *reply = append(*reply, cdr.AsCgrCdrOut()) + *reply = append(*reply, cdr.AsCgrExtCdr()) } } return nil diff --git a/apier/v2/cdrs.go b/apier/v2/cdrs.go index dc014908e..68a13c617 100644 --- a/apier/v2/cdrs.go +++ b/apier/v2/cdrs.go @@ -26,7 +26,7 @@ import ( ) // Retrieves CDRs based on the filters -func (apier *ApierV2) GetCdrs(attrs utils.RpcCdrsFilter, reply *[]*utils.CgrCdrOut) error { +func (apier *ApierV2) GetCdrs(attrs utils.RpcCdrsFilter, reply *[]*utils.CgrExtCdr) error { cdrsFltr, err := attrs.AsCdrsFilter() if err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) @@ -34,10 +34,10 @@ func (apier *ApierV2) GetCdrs(attrs utils.RpcCdrsFilter, reply *[]*utils.CgrCdrO if cdrs, _, err := apier.CdrDb.GetStoredCdrs(cdrsFltr); err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } else if len(cdrs) == 0 { - *reply = make([]*utils.CgrCdrOut, 0) + *reply = make([]*utils.CgrExtCdr, 0) } else { for _, cdr := range cdrs { - *reply = append(*reply, cdr.AsCgrCdrOut()) + *reply = append(*reply, cdr.AsCgrExtCdr()) } } return nil diff --git a/apier/v2/cdrs_mysql_local_test.go b/apier/v2/cdrs_mysql_local_test.go index 2c3909e6b..2c4c357c6 100644 --- a/apier/v2/cdrs_mysql_local_test.go +++ b/apier/v2/cdrs_mysql_local_test.go @@ -155,7 +155,7 @@ func TestV2CdrsMysqlGetCdrs(t *testing.T) { if !*testLocal { return } - var reply []*utils.StoredCdr + var reply []*utils.CgrExtCdr req := utils.RpcCdrsFilter{} if err := cdrsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) diff --git a/apier/v2/cdrs_psql_local_test.go b/apier/v2/cdrs_psql_local_test.go index c06348e30..346924992 100644 --- a/apier/v2/cdrs_psql_local_test.go +++ b/apier/v2/cdrs_psql_local_test.go @@ -149,7 +149,7 @@ func TestV2CdrsPsqlGetCdrs(t *testing.T) { if !*testLocal { return } - var reply []*utils.StoredCdr + var reply []*utils.CgrExtCdr req := utils.RpcCdrsFilter{} if err := cdrsPsqlRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) diff --git a/general_tests/tutorial_fs_calls_test.go b/general_tests/tutorial_fs_calls_test.go index 54418c9bb..352cc893e 100644 --- a/general_tests/tutorial_fs_calls_test.go +++ b/general_tests/tutorial_fs_calls_test.go @@ -163,7 +163,7 @@ func TestTutFsCallsCdrs1001(t *testing.T) { if !*testCalls { return } - var reply []*utils.CgrCdrOut + var reply []*utils.CgrExtCdr req := utils.RpcCdrsFilter{Accounts: []string{"1001"}, RunIds: []string{utils.META_DEFAULT}} if err := tutFsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) @@ -176,7 +176,7 @@ func TestTutFsCallsCdrs1001(t *testing.T) { if reply[0].ReqType != utils.PREPAID { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) } - if reply[0].Usage != 67.0 { // Usage as seconds + if reply[0].Usage != "67" { // Usage as seconds t.Errorf("Unexpected Usage for CDR: %+v", reply[0]) } if reply[0].Cost != 0.0159 { @@ -192,6 +192,9 @@ func TestTutFsCallsCdrs1001(t *testing.T) { if reply[0].ReqType != utils.RATED { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) } + if reply[0].Subject != "1002" { + t.Errorf("Unexpected Subject for CDR: %+v", reply[0]) + } if reply[0].Cost != 0.3059 { t.Errorf("Unexpected Cost for CDR: %+v", reply[0]) } diff --git a/utils/storedcdr.go b/utils/storedcdr.go index f11cb024f..d281bd006 100644 --- a/utils/storedcdr.go +++ b/utils/storedcdr.go @@ -115,9 +115,9 @@ func (storedCdr *StoredCdr) FieldAsString(rsrFld *RSRField) string { case DESTINATION: return rsrFld.ParseValue(storedCdr.Destination) case SETUP_TIME: - return rsrFld.ParseValue(storedCdr.SetupTime.String()) + return rsrFld.ParseValue(storedCdr.SetupTime.Format(time.RFC3339)) case ANSWER_TIME: - return rsrFld.ParseValue(storedCdr.AnswerTime.String()) + return rsrFld.ParseValue(storedCdr.AnswerTime.Format(time.RFC3339)) case USAGE: return strconv.FormatFloat(Round(storedCdr.Usage.Seconds(), 0, ROUNDING_MIDDLE), 'f', -1, 64) case MEDI_RUNID: @@ -174,8 +174,8 @@ func (storedCdr *StoredCdr) AsHttpForm() url.Values { v.Set(ACCOUNT, storedCdr.Account) v.Set(SUBJECT, storedCdr.Subject) v.Set(DESTINATION, storedCdr.Destination) - v.Set(SETUP_TIME, storedCdr.SetupTime.String()) - v.Set(ANSWER_TIME, storedCdr.AnswerTime.String()) + v.Set(SETUP_TIME, storedCdr.SetupTime.Format(time.RFC3339)) + v.Set(ANSWER_TIME, storedCdr.AnswerTime.Format(time.RFC3339)) v.Set(USAGE, storedCdr.FormatUsage(SECONDS)) return v } @@ -305,8 +305,8 @@ func (storedCdr *StoredCdr) ForkCdr(runId string, reqTypeFld, directionFld, tena return frkStorCdr, nil } -func (storedCdr *StoredCdr) AsCgrCdrOut() *CgrCdrOut { - return &CgrCdrOut{CgrId: storedCdr.CgrId, +func (storedCdr *StoredCdr) AsCgrExtCdr() *CgrExtCdr { + return &CgrExtCdr{CgrId: storedCdr.CgrId, OrderId: storedCdr.OrderId, TOR: storedCdr.TOR, AccId: storedCdr.AccId, @@ -319,9 +319,9 @@ func (storedCdr *StoredCdr) AsCgrCdrOut() *CgrCdrOut { Account: storedCdr.Account, Subject: storedCdr.Subject, Destination: storedCdr.Destination, - SetupTime: storedCdr.SetupTime, - AnswerTime: storedCdr.AnswerTime, - Usage: storedCdr.Usage.Seconds(), + SetupTime: storedCdr.SetupTime.Format(time.RFC3339), + AnswerTime: storedCdr.AnswerTime.Format(time.RFC3339), + Usage: storedCdr.FormatUsage(SECONDS), ExtraFields: storedCdr.ExtraFields, MediationRunId: storedCdr.MediationRunId, RatedAccount: storedCdr.RatedAccount, @@ -481,7 +481,7 @@ func (storedCdr *StoredCdr) String() string { return string(mrsh) } -type CgrCdrOut struct { +type CgrExtCdr struct { CgrId string OrderId int64 TOR string @@ -495,9 +495,9 @@ type CgrCdrOut struct { Account string Subject string Destination string - SetupTime time.Time - AnswerTime time.Time - Usage float64 + SetupTime string + AnswerTime string + Usage string ExtraFields map[string]string MediationRunId string RatedAccount string diff --git a/utils/storedcdr_test.go b/utils/storedcdr_test.go index da1be973e..02c81f3a7 100644 --- a/utils/storedcdr_test.go +++ b/utils/storedcdr_test.go @@ -47,8 +47,8 @@ func TestFieldAsString(t *testing.T) { cdr.FieldAsString(&RSRField{Id: ACCOUNT}) != cdr.Account || cdr.FieldAsString(&RSRField{Id: SUBJECT}) != cdr.Subject || cdr.FieldAsString(&RSRField{Id: DESTINATION}) != cdr.Destination || - cdr.FieldAsString(&RSRField{Id: SETUP_TIME}) != cdr.SetupTime.String() || - cdr.FieldAsString(&RSRField{Id: ANSWER_TIME}) != cdr.AnswerTime.String() || + cdr.FieldAsString(&RSRField{Id: SETUP_TIME}) != cdr.SetupTime.Format(time.RFC3339) || + cdr.FieldAsString(&RSRField{Id: ANSWER_TIME}) != cdr.AnswerTime.Format(time.RFC3339) || cdr.FieldAsString(&RSRField{Id: USAGE}) != "10" || cdr.FieldAsString(&RSRField{Id: MEDI_RUNID}) != cdr.MediationRunId || cdr.FieldAsString(&RSRField{Id: COST}) != "1.01" || @@ -70,8 +70,8 @@ func TestFieldAsString(t *testing.T) { cdr.FieldAsString(&RSRField{Id: ACCOUNT}) != cdr.Account, cdr.FieldAsString(&RSRField{Id: SUBJECT}) != cdr.Subject, cdr.FieldAsString(&RSRField{Id: DESTINATION}) != cdr.Destination, - cdr.FieldAsString(&RSRField{Id: SETUP_TIME}) != cdr.SetupTime.String(), - cdr.FieldAsString(&RSRField{Id: ANSWER_TIME}) != cdr.AnswerTime.String(), + cdr.FieldAsString(&RSRField{Id: SETUP_TIME}) != cdr.SetupTime.Format(time.RFC3339), + cdr.FieldAsString(&RSRField{Id: ANSWER_TIME}) != cdr.AnswerTime.Format(time.RFC3339), cdr.FieldAsString(&RSRField{Id: USAGE}) != "10", cdr.FieldAsString(&RSRField{Id: MEDI_RUNID}) != cdr.MediationRunId, cdr.FieldAsString(&RSRField{Id: RATED_ACCOUNT}) != "dan", @@ -283,11 +283,11 @@ func TestStoredCdrAsHttpForm(t *testing.T) { if cdrForm.Get(DESTINATION) != "1002" { t.Errorf("Expected: %s, received: %s", "1002", cdrForm.Get(DESTINATION)) } - if cdrForm.Get(SETUP_TIME) != "2013-11-07 08:42:20 +0000 UTC" { - t.Errorf("Expected: %s, received: %s", "2013-11-07 08:42:20 +0000 UTC", cdrForm.Get(SETUP_TIME)) + if cdrForm.Get(SETUP_TIME) != "2013-11-07T08:42:20Z" { + t.Errorf("Expected: %s, received: %s", "2013-11-07T08:42:20Z", cdrForm.Get(SETUP_TIME)) } - 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(ANSWER_TIME) != "2013-11-07T08:42:26Z" { + t.Errorf("Expected: %s, received: %s", "2013-11-07T08:42:26Z", cdrForm.Get(ANSWER_TIME)) } if cdrForm.Get(USAGE) != "10" { t.Errorf("Expected: %s, received: %s", "10", cdrForm.Get(USAGE)) @@ -388,18 +388,18 @@ func TestStoredCdrForkCdrFromMetaDefaults(t *testing.T) { } } -func TestStoredCdrAsCgrCdrOut(t *testing.T) { +func TestStoredCdrAsCgrExtCdr(t *testing.T) { storCdr := StoredCdr{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: UNIT_TEST, ReqType: "rated", Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: DEFAULT_RUNID, Usage: time.Duration(10), ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans", } - expectOutCdr := &CgrCdrOut{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", + expectOutCdr := &CgrExtCdr{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: UNIT_TEST, ReqType: "rated", Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: DEFAULT_RUNID, - Usage: 0.00000001, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans", + SetupTime: "2013-11-07T08:42:20Z", AnswerTime: "2013-11-07T08:42:26Z", MediationRunId: DEFAULT_RUNID, + Usage: "0.00000001", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans", } - if cdrOut := storCdr.AsCgrCdrOut(); !reflect.DeepEqual(expectOutCdr, cdrOut) { + if cdrOut := storCdr.AsCgrExtCdr(); !reflect.DeepEqual(expectOutCdr, cdrOut) { t.Errorf("Expected: %+v, received: %+v", expectOutCdr, cdrOut) } } diff --git a/utils/utils_local_test.go b/utils/utils_local_test.go index e4dd9e59e..d088e8616 100644 --- a/utils/utils_local_test.go +++ b/utils/utils_local_test.go @@ -31,10 +31,10 @@ func TestHttpJsonPost(t *testing.T) { if !*testLocal { return } - cdrOut := &CgrCdrOut{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", + cdrOut := &CgrExtCdr{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: UNIT_TEST, ReqType: "rated", Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "account1", Subject: "tgooiscs0014", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: DEFAULT_RUNID, - Usage: 0.00000001, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, + SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String(), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String(), MediationRunId: DEFAULT_RUNID, + Usage: "0.00000001", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, } if _, err := HttpJsonPost("http://localhost:8000", false, cdrOut); err == nil || err.Error() != "Post http://localhost:8000: dial tcp 127.0.0.1:8000: connection refused" { t.Error(err)