tests passing on hapool with response_ttl > 0

This commit is contained in:
Radu Ioan Fericean
2016-05-03 15:17:40 +03:00
parent 83b6c9be65
commit 3db05157ac
14 changed files with 129 additions and 87 deletions

View File

@@ -32,6 +32,7 @@ func NewResponseCache(ttl time.Duration) *ResponseCache {
}
func (rc *ResponseCache) Cache(key string, item *CacheItem) {
//utils.Logger.Info("key: " + key)
if rc.ttl == 0 {
return
}
@@ -58,6 +59,7 @@ func (rc *ResponseCache) Get(key string) (*CacheItem, error) {
item, ok := rc.cache[key]
rc.mu.RUnlock()
if ok {
//utils.Logger.Info(",,,,,,,,,,,,,,,,,,,,,Found key: " + key)
return item, nil
}
rc.wait(key) // wait for other goroutine processsing this key
@@ -67,6 +69,7 @@ func (rc *ResponseCache) Get(key string) (*CacheItem, error) {
if !ok {
return nil, ErrNotFound
}
//utils.Logger.Info("............................Found key: " + key)
return item, nil
}

View File

@@ -4,6 +4,10 @@
// Used for cgradmin
// Starts rater, scheduler
"general": {
"response_cache_ttl": "1s",
},
"listen": {
"rpc_json": ":2012", // RPC JSON listening address
"rpc_gob": ":2013", // RPC GOB listening address

View File

@@ -10,4 +10,4 @@ cgrates.org,1011,TEST_VOICE,,,
cgrates.org,1012,PREPAID_10,,,
cgrates.org,1013,TEST_NEG,,,
cgrates.org,1014,TEST_RPC,,,
cgrates.org,1015,,,,
cgrates.org,1015,TEST_DID,,,
1 #Tenant Account ActionPlanId ActionTriggersId AllowNegative Disabled
10 cgrates.org 1012 PREPAID_10
11 cgrates.org 1013 TEST_NEG
12 cgrates.org 1014 TEST_RPC
13 cgrates.org 1015 TEST_DID

View File

@@ -5,4 +5,5 @@ TEST_EXE,TOPUP_EXE,ALWAYS,10
TEST_DATA_r,TOPUP_DATA_r,ASAP,10
TEST_VOICE,TOPUP_VOICE,ASAP,10
TEST_NEG,TOPUP_NEG,ASAP,10
TEST_RPC,RPC,ALWAYS,10
TEST_RPC,RPC,ALWAYS,10
TEST_DID,DID,ALWAYS,10
1 #Tag ActionsTag TimingTag Weight
5 TEST_DATA_r TOPUP_DATA_r ASAP 10
6 TEST_VOICE TOPUP_VOICE ASAP 10
7 TEST_NEG TOPUP_NEG ASAP 10
8 TEST_RPC RPC ALWAYS 10
9 TEST_DID DID ALWAYS 10

View File

@@ -2233,7 +2233,9 @@ func TestValueFormulaDebit(t *testing.T) {
}
at.Execute()
afterUb, err := accountingStorage.GetAccount("cgrates.org:vf")
if err != nil || afterUb.BalanceMap[utils.MONETARY].GetTotalValue() != -0.333334 {
// not an exact value, depends of month
v := afterUb.BalanceMap[utils.MONETARY].GetTotalValue()
if err != nil || v > -0.30 || v < -0.35 {
t.Error("error debiting account: ", err, utils.ToIJSON(afterUb))
}
}

View File

@@ -933,6 +933,8 @@ func (cd *CallDescriptor) Clone() *CallDescriptor {
ForceDuration: cd.ForceDuration,
PerformRounding: cd.PerformRounding,
DryRun: cd.DryRun,
CgrID: cd.CgrID,
RunID: cd.RunID,
}
}

View File

@@ -147,7 +147,8 @@ func (rs *Responder) Debit(arg *CallDescriptor, reply *CallCost) (err error) {
}
func (rs *Responder) MaxDebit(arg *CallDescriptor, reply *CallCost) (err error) {
if item, err := rs.getCache().Get(utils.MAX_DEBIT_CACHE_PREFIX + arg.CgrID + arg.RunID); err == nil && item != nil {
cacheKey := utils.MAX_DEBIT_CACHE_PREFIX + arg.CgrID + arg.RunID + arg.DurationIndex.String()
if item, err := rs.getCache().Get(cacheKey); err == nil && item != nil {
*reply = *(item.Value.(*CallCost))
return item.Err
}
@@ -178,7 +179,7 @@ func (rs *Responder) MaxDebit(arg *CallDescriptor, reply *CallCost) (err error)
} else {
r, e := arg.MaxDebit()
if e != nil {
rs.getCache().Cache(utils.MAX_DEBIT_CACHE_PREFIX+arg.CgrID+arg.RunID, &cache2go.CacheItem{
rs.getCache().Cache(cacheKey, &cache2go.CacheItem{
Err: e,
})
return e
@@ -186,7 +187,7 @@ func (rs *Responder) MaxDebit(arg *CallDescriptor, reply *CallCost) (err error)
*reply = *r
}
}
rs.getCache().Cache(utils.MAX_DEBIT_CACHE_PREFIX+arg.CgrID+arg.RunID, &cache2go.CacheItem{
rs.getCache().Cache(cacheKey, &cache2go.CacheItem{
Value: reply,
Err: err,
})
@@ -194,7 +195,8 @@ func (rs *Responder) MaxDebit(arg *CallDescriptor, reply *CallCost) (err error)
}
func (rs *Responder) RefundIncrements(arg *CallDescriptor, reply *float64) (err error) {
if item, err := rs.getCache().Get(utils.REFUND_INCR_CACHE_PREFIX + arg.CgrID + arg.RunID); err == nil && item != nil {
cacheKey := utils.REFUND_INCR_CACHE_PREFIX + arg.CgrID + arg.RunID
if item, err := rs.getCache().Get(cacheKey); err == nil && item != nil {
*reply = *(item.Value.(*float64))
return item.Err
}
@@ -216,6 +218,9 @@ func (rs *Responder) RefundIncrements(arg *CallDescriptor, reply *float64) (err
Subject: arg.Subject,
Context: utils.ALIAS_CONTEXT_RATING,
}, arg, utils.EXTRA_FIELDS); err != nil && err != utils.ErrNotFound {
rs.getCache().Cache(cacheKey, &cache2go.CacheItem{
Err: err,
})
return err
}
@@ -224,7 +229,7 @@ func (rs *Responder) RefundIncrements(arg *CallDescriptor, reply *float64) (err
} else {
err = arg.RefundIncrements()
}
rs.getCache().Cache(utils.REFUND_INCR_CACHE_PREFIX+arg.CgrID+arg.RunID, &cache2go.CacheItem{
rs.getCache().Cache(cacheKey, &cache2go.CacheItem{
Value: reply,
Err: err,
})
@@ -232,7 +237,8 @@ func (rs *Responder) RefundIncrements(arg *CallDescriptor, reply *float64) (err
}
func (rs *Responder) RefundRounding(arg *CallDescriptor, reply *float64) (err error) {
if item, err := rs.getCache().Get(utils.REFUND_ROUND_CACHE_PREFIX + arg.CgrID + arg.RunID); err == nil && item != nil {
cacheKey := utils.REFUND_ROUND_CACHE_PREFIX + arg.CgrID + arg.RunID + arg.DurationIndex.String()
if item, err := rs.getCache().Get(cacheKey); err == nil && item != nil {
*reply = *(item.Value.(*float64))
return item.Err
}
@@ -254,6 +260,9 @@ func (rs *Responder) RefundRounding(arg *CallDescriptor, reply *float64) (err er
Subject: arg.Subject,
Context: utils.ALIAS_CONTEXT_RATING,
}, arg, utils.EXTRA_FIELDS); err != nil && err != utils.ErrNotFound {
rs.getCache().Cache(cacheKey, &cache2go.CacheItem{
Err: err,
})
return err
}
@@ -262,7 +271,7 @@ func (rs *Responder) RefundRounding(arg *CallDescriptor, reply *float64) (err er
} else {
err = arg.RefundRounding()
}
rs.getCache().Cache(utils.REFUND_ROUND_CACHE_PREFIX+arg.CgrID+arg.RunID, &cache2go.CacheItem{
rs.getCache().Cache(cacheKey, &cache2go.CacheItem{
Value: reply,
Err: err,
})
@@ -305,11 +314,17 @@ func (rs *Responder) GetDerivedMaxSessionTime(ev *CDR, reply *float64) error {
if rs.Bal != nil {
return errors.New("unsupported method on the balancer")
}
cacheKey := utils.GET_DERIV_MAX_SESS_TIME + ev.CGRID + ev.RunID
if item, err := rs.getCache().Get(cacheKey); err == nil && item != nil {
*reply = *(item.Value.(*float64))
return item.Err
}
if ev.Subject == "" {
ev.Subject = ev.Account
}
// replace user profile fields
if err := LoadUserProfile(ev, utils.EXTRA_FIELDS); err != nil {
rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Err: err})
return err
}
// replace aliases
@@ -323,6 +338,7 @@ func (rs *Responder) GetDerivedMaxSessionTime(ev *CDR, reply *float64) error {
Subject: ev.Subject,
Context: utils.ALIAS_CONTEXT_RATING,
}, ev, utils.EXTRA_FIELDS); err != nil && err != utils.ErrNotFound {
rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Err: err})
return err
}
@@ -331,6 +347,7 @@ func (rs *Responder) GetDerivedMaxSessionTime(ev *CDR, reply *float64) error {
Account: ev.GetAccount(utils.META_DEFAULT), Subject: ev.GetSubject(utils.META_DEFAULT)}
dcs := &utils.DerivedChargers{}
if err := rs.GetDerivedChargers(attrsDC, dcs); err != nil {
rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Err: err})
return err
}
dcs, _ = dcs.AppendDefaultRun()
@@ -351,10 +368,12 @@ func (rs *Responder) GetDerivedMaxSessionTime(ev *CDR, reply *float64) error {
}
startTime, err := ev.GetSetupTime(utils.META_DEFAULT, rs.Timezone)
if err != nil {
rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Err: err})
return err
}
usage, err := ev.GetDuration(utils.META_DEFAULT)
if err != nil {
rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Err: err})
return err
}
if usage == 0 {
@@ -362,7 +381,7 @@ func (rs *Responder) GetDerivedMaxSessionTime(ev *CDR, reply *float64) error {
}
cd := &CallDescriptor{
CgrID: ev.GetCgrId(rs.Timezone),
RunID: ev.RunID,
RunID: dc.RunID,
TOR: ev.ToR,
Direction: ev.GetDirection(dc.DirectionField),
Tenant: ev.GetTenant(dc.TenantField),
@@ -377,6 +396,7 @@ func (rs *Responder) GetDerivedMaxSessionTime(ev *CDR, reply *float64) error {
err = rs.GetMaxSessionTime(cd, &remainingDuration)
if err != nil {
*reply = 0
rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Err: err})
return err
}
if utils.IsSliceMember([]string{utils.META_POSTPAID, utils.POSTPAID}, ev.GetReqType(dc.RequestTypeField)) {
@@ -390,6 +410,7 @@ func (rs *Responder) GetDerivedMaxSessionTime(ev *CDR, reply *float64) error {
maxCallDuration = remainingDuration
}
}
rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Value: maxCallDuration})
*reply = maxCallDuration
return nil
}
@@ -399,6 +420,11 @@ func (rs *Responder) GetSessionRuns(ev *CDR, sRuns *[]*SessionRun) error {
if rs.Bal != nil {
return errors.New("Unsupported method on the balancer")
}
cacheKey := utils.GET_SESS_RUNS_CACHE_PREFIX + ev.CGRID
if item, err := rs.getCache().Get(cacheKey); err == nil && item != nil {
*sRuns = *(item.Value.(*[]*SessionRun))
return item.Err
}
if ev.Subject == "" {
ev.Subject = ev.Account
}
@@ -427,7 +453,7 @@ func (rs *Responder) GetSessionRuns(ev *CDR, sRuns *[]*SessionRun) error {
//utils.Logger.Info(fmt.Sprintf("Derived chargers for: %+v", attrsDC))
dcs := &utils.DerivedChargers{}
if err := rs.GetDerivedChargers(attrsDC, dcs); err != nil {
rs.getCache().Cache(utils.GET_SESS_RUNS_CACHE_PREFIX+ev.CGRID, &cache2go.CacheItem{
rs.getCache().Cache(cacheKey, &cache2go.CacheItem{
Err: err,
})
return err
@@ -441,22 +467,18 @@ func (rs *Responder) GetSessionRuns(ev *CDR, sRuns *[]*SessionRun) error {
}
startTime, err := ev.GetAnswerTime(dc.AnswerTimeField, rs.Timezone)
if err != nil {
rs.getCache().Cache(utils.GET_SESS_RUNS_CACHE_PREFIX+ev.CGRID, &cache2go.CacheItem{
Err: err,
})
rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Err: err})
return errors.New("Error parsing answer event start time")
}
endTime, err := ev.GetEndTime("", rs.Timezone)
if err != nil {
rs.getCache().Cache(utils.GET_SESS_RUNS_CACHE_PREFIX+ev.CGRID, &cache2go.CacheItem{
Err: err,
})
rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Err: err})
return errors.New("Error parsing answer event end time")
}
extraFields := ev.GetExtraFields()
cd := &CallDescriptor{
CgrID: ev.GetCgrId(rs.Timezone),
RunID: ev.RunID,
RunID: dc.RunID,
TOR: ev.ToR,
Direction: ev.GetDirection(dc.DirectionField),
Tenant: ev.GetTenant(dc.TenantField),
@@ -477,9 +499,7 @@ func (rs *Responder) GetSessionRuns(ev *CDR, sRuns *[]*SessionRun) error {
}
//utils.Logger.Info(fmt.Sprintf("RUNS: %v", len(sesRuns)))
*sRuns = sesRuns
rs.getCache().Cache(utils.GET_SESS_RUNS_CACHE_PREFIX+ev.CGRID, &cache2go.CacheItem{
Value: sRuns,
})
rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Value: sRuns})
return nil
}
@@ -497,6 +517,10 @@ func (rs *Responder) GetDerivedChargers(attrs *utils.AttrDerivedChargers, dcs *u
func (rs *Responder) GetLCR(attrs *AttrGetLcr, reply *LCRCost) error {
cacheKey := utils.LCRCachePrefix + attrs.CgrID + attrs.RunID
if item, err := rs.getCache().Get(cacheKey); err == nil && item != nil {
*reply = *(item.Value.(*LCRCost))
return item.Err
}
if attrs.CallDescriptor.Subject == "" {
attrs.CallDescriptor.Subject = attrs.CallDescriptor.Account
}

View File

@@ -153,10 +153,10 @@ func TestResponderGetSessionRuns(t *testing.T) {
sesRuns := make([]*SessionRun, 0)
eSRuns := []*SessionRun{
&SessionRun{DerivedCharger: extra1DC,
CallDescriptor: &CallDescriptor{CgrID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), RunID: "*default", Direction: "*out", Category: "0",
CallDescriptor: &CallDescriptor{CgrID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), RunID: "extra1", Direction: "*out", Category: "0",
Tenant: "vdf", Subject: "rif", Account: "minitsboy", Destination: "0256", TimeStart: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), TimeEnd: time.Date(2013, 11, 7, 8, 42, 36, 0, time.UTC), TOR: utils.VOICE, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}}},
&SessionRun{DerivedCharger: extra2DC,
CallDescriptor: &CallDescriptor{CgrID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), RunID: "*default", Direction: "*out", Category: "call",
CallDescriptor: &CallDescriptor{CgrID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), RunID: "extra2", Direction: "*out", Category: "call",
Tenant: "vdf", Subject: "ivo", Account: "ivo", Destination: "1002", TimeStart: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), TimeEnd: time.Date(2013, 11, 7, 8, 42, 36, 0, time.UTC), TOR: utils.VOICE, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}}},
&SessionRun{DerivedCharger: dfDC,
CallDescriptor: &CallDescriptor{CgrID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), RunID: "*default", Direction: "*out", Category: "call",
@@ -165,7 +165,7 @@ func TestResponderGetSessionRuns(t *testing.T) {
t.Error(err)
} else if !reflect.DeepEqual(eSRuns, sesRuns) {
for _, sr := range sesRuns {
t.Logf("sr cd: %+v", sr.CallDescriptor)
t.Logf("sr cd: %s", utils.ToIJSON(sr.CallDescriptor))
}
t.Errorf("Expecting: %+v, received: %+v", eSRuns, sesRuns)
}

View File

@@ -341,6 +341,9 @@ func TestTpRemActionsRefenced(t *testing.T) {
if !*testIntegration {
return
}
// no more reference check for sake of speed!
actionsMap := make(map[string]engine.Actions)
if err := tpRPC.Call("ApierV2.GetActions", v2.AttrGetActions{
ActionIDs: []string{"TOPUP_VOICE"},
@@ -352,16 +355,14 @@ func TestTpRemActionsRefenced(t *testing.T) {
var reply string
if err := tpRPC.Call("ApierV2.RemActions", v1.AttrRemActions{
ActionIDs: []string{"TOPUP_VOICE"},
}, &reply); err == nil {
t.Error("No error on ApierV2.RemActions: ", err.Error())
} else if reply == utils.OK {
}, &reply); err != nil {
t.Error("Error on ApierV2.RemActions: ", err.Error())
} else if reply != utils.OK {
t.Errorf("Calling ApierV2.RemActions got reply: %s", reply)
}
if err := tpRPC.Call("ApierV2.GetActions", v2.AttrGetActions{
ActionIDs: []string{"TOPUP_VOICE"},
}, &actionsMap); err != nil {
t.Error("Got error on ApierV2.GetActions: ", err.Error())
} else if len(actionsMap) != 1 {
t.Errorf("Calling ApierV2.GetActions got reply: %s", utils.ToIJSON(actionsMap))
ActionIDs: []string{"PAYMENT_2056bd2fe137082970f97102b64e42fd"},
}, &actionsMap); err == nil {
t.Error("no error on ApierV2.GetActions: ", err)
}
}

View File

@@ -96,7 +96,7 @@ func TestSMGDataLastUsedData(t *testing.T) {
smgEv := SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123491",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -104,7 +104,7 @@ func TestSMGDataLastUsedData(t *testing.T) {
utils.CATEGORY: "data",
utils.TENANT: "cgrates.org",
utils.REQTYPE: utils.META_PREPAID,
utils.SETUP_TIME: "2016-01-05 18:30:49",
utils.SETUP_TIME: "2016-01-05 18:30:59",
utils.ANSWER_TIME: "2016-01-05 18:31:05",
utils.USAGE: "1048576",
}
@@ -124,7 +124,7 @@ func TestSMGDataLastUsedData(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123491",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -132,6 +132,8 @@ func TestSMGDataLastUsedData(t *testing.T) {
utils.CATEGORY: "data",
utils.TENANT: "cgrates.org",
utils.REQTYPE: utils.META_PREPAID,
utils.SETUP_TIME: "2016-01-05 18:30:59",
utils.ANSWER_TIME: "2016-01-05 18:31:05",
utils.USAGE: "1048576",
utils.LastUsed: "20000",
}
@@ -150,7 +152,7 @@ func TestSMGDataLastUsedData(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123491",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -158,6 +160,8 @@ func TestSMGDataLastUsedData(t *testing.T) {
utils.CATEGORY: "data",
utils.TENANT: "cgrates.org",
utils.REQTYPE: utils.META_PREPAID,
utils.SETUP_TIME: "2016-01-05 18:30:59",
utils.ANSWER_TIME: "2016-01-05 18:31:05",
utils.LastUsed: "0",
}
var rpl string
@@ -187,7 +191,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) {
smgEv := SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123492",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -195,7 +199,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) {
utils.CATEGORY: "data",
utils.TENANT: "cgrates.org",
utils.REQTYPE: utils.META_PREPAID,
utils.SETUP_TIME: "2016-01-05 18:30:49",
utils.SETUP_TIME: "2016-01-05 18:30:50",
utils.ANSWER_TIME: "2016-01-05 18:31:05",
utils.USAGE: "1048576",
}
@@ -221,7 +225,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123492",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -252,7 +256,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123492",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -283,7 +287,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123492",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -314,7 +318,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123492",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -345,7 +349,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123492",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -387,7 +391,7 @@ func TestSMGDataDerivedChargingNoCredit(t *testing.T) {
smgEv := SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.VOICE,
utils.ACCID: "12349",
utils.ACCID: "1234967",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1011",
utils.SUBJECT: "1011",
@@ -403,6 +407,8 @@ func TestSMGDataDerivedChargingNoCredit(t *testing.T) {
if err := smgRPC.Call("SMGenericV1.SessionStart", smgEv, &maxUsage); err != nil {
t.Error(err)
}
// the second derived charging run has no credit
if maxUsage != 0 {
t.Error("Bad max usage: ", maxUsage)
}
@@ -429,7 +435,7 @@ func TestSMGDataTTLExpired(t *testing.T) {
smgEv := SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123494",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -437,7 +443,7 @@ func TestSMGDataTTLExpired(t *testing.T) {
utils.CATEGORY: "data",
utils.TENANT: "cgrates.org",
utils.REQTYPE: utils.META_PREPAID,
utils.SETUP_TIME: "2016-01-05 18:30:49",
utils.SETUP_TIME: "2016-01-05 18:30:52",
utils.ANSWER_TIME: "2016-01-05 18:31:05",
utils.USAGE: "1048576",
}
@@ -478,7 +484,7 @@ func TestSMGDataTTLExpiredMultiUpdates(t *testing.T) {
smgEv := SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123495",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -486,7 +492,7 @@ func TestSMGDataTTLExpiredMultiUpdates(t *testing.T) {
utils.CATEGORY: "data",
utils.TENANT: "cgrates.org",
utils.REQTYPE: utils.META_PREPAID,
utils.SETUP_TIME: "2016-01-05 18:30:49",
utils.SETUP_TIME: "2016-01-05 18:30:53",
utils.ANSWER_TIME: "2016-01-05 18:31:05",
utils.USAGE: "1048576",
}
@@ -513,7 +519,7 @@ func TestSMGDataTTLExpiredMultiUpdates(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123495",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -566,7 +572,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) {
smgEv := SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123496",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -574,7 +580,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) {
utils.CATEGORY: "data",
utils.TENANT: "cgrates.org",
utils.REQTYPE: utils.META_PREPAID,
utils.SETUP_TIME: "2016-01-05 18:30:49",
utils.SETUP_TIME: "2016-01-05 18:30:54",
utils.ANSWER_TIME: "2016-01-05 18:31:05",
utils.USAGE: "1048576",
}
@@ -600,7 +606,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123496",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -631,7 +637,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123496",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -662,7 +668,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123496",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -693,7 +699,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123496",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -724,7 +730,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123496",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -766,7 +772,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) {
smgEv := SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123497",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -774,7 +780,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) {
utils.CATEGORY: "data",
utils.TENANT: "cgrates.org",
utils.REQTYPE: utils.META_PREPAID,
utils.SETUP_TIME: "2016-01-05 18:30:49",
utils.SETUP_TIME: "2016-01-05 18:30:55",
utils.ANSWER_TIME: "2016-01-05 18:31:05",
utils.USAGE: "1048576",
}
@@ -801,7 +807,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123497",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -832,7 +838,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123497",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -863,7 +869,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123497",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -894,7 +900,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123497",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",
@@ -925,7 +931,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.DATA,
utils.ACCID: "12349",
utils.ACCID: "123497",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1010",
utils.SUBJECT: "1010",

View File

@@ -117,7 +117,7 @@ func TestSMGVoiceMonetaryRefund(t *testing.T) {
smgEv := SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.VOICE,
utils.ACCID: "12345",
utils.ACCID: "123451",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1001",
utils.SUBJECT: "1001",
@@ -147,7 +147,7 @@ func TestSMGVoiceMonetaryRefund(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.VOICE,
utils.ACCID: "12345",
utils.ACCID: "123451",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1001",
utils.SUBJECT: "1001",
@@ -178,7 +178,7 @@ func TestSMGVoiceVoiceRefund(t *testing.T) {
smgEv := SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.VOICE,
utils.ACCID: "12345",
utils.ACCID: "123452",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1001",
utils.SUBJECT: "1001",
@@ -208,7 +208,7 @@ func TestSMGVoiceVoiceRefund(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.VOICE,
utils.ACCID: "12345",
utils.ACCID: "123452",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1001",
utils.SUBJECT: "1001",
@@ -246,7 +246,7 @@ func TestSMGVoiceMixedRefund(t *testing.T) {
smgEv := SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.VOICE,
utils.ACCID: "12345",
utils.ACCID: "123453",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1001",
utils.SUBJECT: "1001",
@@ -278,7 +278,7 @@ func TestSMGVoiceMixedRefund(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.VOICE,
utils.ACCID: "12345",
utils.ACCID: "123453",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1001",
utils.SUBJECT: "1001",
@@ -438,7 +438,7 @@ func TestSMGVoiceLastUsedEnd(t *testing.T) {
smgEv := SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.VOICE,
utils.ACCID: "12349",
utils.ACCID: "1234911",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1001",
utils.SUBJECT: "1001",
@@ -466,7 +466,7 @@ func TestSMGVoiceLastUsedEnd(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.VOICE,
utils.ACCID: "12349",
utils.ACCID: "1234911",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1001",
utils.SUBJECT: "1001",
@@ -492,7 +492,7 @@ func TestSMGVoiceLastUsedEnd(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.VOICE,
utils.ACCID: "12349",
utils.ACCID: "1234911",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1001",
utils.SUBJECT: "1001",
@@ -529,7 +529,7 @@ func TestSMGVoiceLastUsedNotFixed(t *testing.T) {
smgEv := SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.VOICE,
utils.ACCID: "12349",
utils.ACCID: "1234922",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1001",
utils.SUBJECT: "1001",
@@ -557,7 +557,7 @@ func TestSMGVoiceLastUsedNotFixed(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.VOICE,
utils.ACCID: "12349",
utils.ACCID: "1234922",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1001",
utils.SUBJECT: "1001",
@@ -583,7 +583,7 @@ func TestSMGVoiceLastUsedNotFixed(t *testing.T) {
smgEv = SMGenericEvent{
utils.EVENT_NAME: "TEST_EVENT",
utils.TOR: utils.VOICE,
utils.ACCID: "12349",
utils.ACCID: "1234922",
utils.DIRECTION: utils.OUT,
utils.ACCOUNT: "1001",
utils.SUBJECT: "1001",

View File

@@ -192,8 +192,10 @@ func (self *SMGSession) refund(refundDuration time.Duration) error {
if len(refundIncrements) > 0 {
cd := firstCC.CreateCallDescriptor()
cd.Increments = refundIncrements
cd.CgrID = self.cd.CgrID
cd.RunID = self.cd.RunID
cd.Increments.Compress()
utils.Logger.Info(fmt.Sprintf("Refunding duration %v with cd: %s", initialRefundDuration, utils.ToJSON(cd)))
utils.Logger.Info(fmt.Sprintf("Refunding %s duration %v with incerements: %s", cd.CgrID, initialRefundDuration, utils.ToJSON(cd.Increments)))
var response float64
err := self.rater.Call("Responder.RefundIncrements", cd, &response)
if err != nil {
@@ -253,6 +255,8 @@ func (self *SMGSession) saveOperations(originID string) error {
roundIncrements := firstCC.GetRoundIncrements()
if len(roundIncrements) != 0 {
cd := firstCC.CreateCallDescriptor()
cd.CgrID = self.cd.CgrID
cd.RunID = self.cd.RunID
cd.Increments = roundIncrements
var response float64
if err := self.rater.Call("Responder.RefundRounding", cd, &response); err != nil {

View File

@@ -423,16 +423,10 @@ func (self *SMGeneric) ChargeEvent(gev SMGenericEvent, clnt *rpc2.Client) (maxDu
}
// refund cc
if len(refundIncrements) > 0 {
cd := &engine.CallDescriptor{
Direction: cc.Direction,
Tenant: cc.Tenant,
Category: cc.Category,
Subject: cc.Subject,
Account: cc.Account,
Destination: cc.Destination,
TOR: cc.TOR,
Increments: refundIncrements,
}
cd := cc.CreateCallDescriptor()
cd.Increments = refundIncrements
cd.CgrID = sR.CallDescriptor.CgrID
cd.RunID = sR.CallDescriptor.RunID
cd.Increments.Compress()
utils.Logger.Info(fmt.Sprintf("Refunding session run callcost: %s", utils.ToJSON(cd)))
var response float64

View File

@@ -242,6 +242,7 @@ const (
REFUND_INCR_CACHE_PREFIX = "REFUND_INCR_"
REFUND_ROUND_CACHE_PREFIX = "REFUND_ROUND_"
GET_SESS_RUNS_CACHE_PREFIX = "GET_SESS_RUNS_"
GET_DERIV_MAX_SESS_TIME = "GET_DERIV_MAX_SESS_TIME_"
LOG_CALL_COST_CACHE_PREFIX = "LOG_CALL_COSTS_"
LCRCachePrefix = "LCR_"
ALIAS_CONTEXT_RATING = "*rating"