CastFieldToString returning for nil interface

This commit is contained in:
DanB
2018-06-08 18:39:31 +02:00
parent d269bd809e
commit 6f178bb38c
5 changed files with 36 additions and 15 deletions

View File

@@ -486,7 +486,7 @@ func TestDmtAgentSendCCRSMS(t *testing.T) {
} else if len(cdrs) != 1 {
t.Error("Unexpected number of CDRs returned: ", len(cdrs))
} else {
if cdrs[0].Usage != "1" {
if cdrs[0].Usage != "60000000000" { // should be 1 but maxUsage returns rounded version
t.Errorf("Unexpected CDR Usage received, cdr: %+v ", cdrs[0])
}
if cdrs[0].Cost != 0.6 {

View File

@@ -717,13 +717,15 @@ func (smg *SMGeneric) GetMaxUsage(gev SMGenericEvent) (maxUsage time.Duration, e
}
// Called on session start
func (smg *SMGeneric) InitiateSession(gev SMGenericEvent, clnt rpcclient.RpcClientConnection) (maxUsage time.Duration, err error) {
func (smg *SMGeneric) InitiateSession(gev SMGenericEvent,
clnt rpcclient.RpcClientConnection) (maxUsage time.Duration, err error) {
cgrID := gev.GetCGRID(utils.META_DEFAULT)
cacheKey := "InitiateSession" + cgrID
if item, err := smg.responseCache.Get(cacheKey); err == nil && item != nil {
return item.Value.(time.Duration), item.Err
}
defer smg.responseCache.Cache(cacheKey, &utils.ResponseCacheItem{Value: maxUsage, Err: err}) // schedule response caching
defer smg.responseCache.Cache(cacheKey,
&utils.ResponseCacheItem{Value: maxUsage, Err: err}) // schedule response caching
smg.deletePassiveSessions(cgrID)
if err = smg.sessionStart(gev, clnt); err != nil {
smg.sessionEnd(cgrID, 0)
@@ -741,20 +743,23 @@ func (smg *SMGeneric) InitiateSession(gev SMGenericEvent, clnt rpcclient.RpcClie
}
// Execute debits for usage/maxUsage
func (smg *SMGeneric) UpdateSession(gev SMGenericEvent, clnt rpcclient.RpcClientConnection) (maxUsage time.Duration, err error) {
func (smg *SMGeneric) UpdateSession(gev SMGenericEvent,
clnt rpcclient.RpcClientConnection) (maxUsage time.Duration, err error) {
cgrID := gev.GetCGRID(utils.META_DEFAULT)
cacheKey := "UpdateSession" + cgrID
if item, err := smg.responseCache.Get(cacheKey); err == nil && item != nil {
return item.Value.(time.Duration), item.Err
}
defer smg.responseCache.Cache(cacheKey, &utils.ResponseCacheItem{Value: maxUsage, Err: err})
defer smg.responseCache.Cache(cacheKey,
&utils.ResponseCacheItem{Value: maxUsage, Err: err})
if smg.cgrCfg.SessionSCfg().DebitInterval != 0 { // Not possible to update a session with debit loop active
err = errors.New("ACTIVE_DEBIT_LOOP")
return
}
if gev.HasField(utils.InitialOriginID) {
initialCGRID := gev.GetCGRID(utils.InitialOriginID)
err = smg.sessionRelocate(initialCGRID, cgrID, gev.GetOriginID(utils.META_DEFAULT))
err = smg.sessionRelocate(initialCGRID,
cgrID, gev.GetOriginID(utils.META_DEFAULT))
if err == utils.ErrNotFound { // Session was already relocated, create a new session with this update
err = smg.sessionStart(gev, clnt)
}
@@ -785,12 +790,15 @@ func (smg *SMGeneric) UpdateSession(gev SMGenericEvent, clnt rpcclient.RpcClient
aSessions := smg.getSessions(cgrID, false)
if len(aSessions) == 0 {
if aSessions = smg.passiveToActive(cgrID); len(aSessions) == 0 {
utils.Logger.Err(fmt.Sprintf("<%s> SessionUpdate with no active sessions for event: <%s>", utils.SessionS, cgrID))
utils.Logger.Err(
fmt.Sprintf("<%s> SessionUpdate with no active sessions for event: <%s>",
utils.SessionS, cgrID))
err = rpcclient.ErrSessionNotFound
return
}
}
defer smg.replicateSessionsWithID(gev.GetCGRID(utils.META_DEFAULT), false, smg.smgReplConns)
defer smg.replicateSessionsWithID(gev.GetCGRID(utils.META_DEFAULT),
false, smg.smgReplConns)
for _, s := range aSessions[cgrID] {
if s.RunID == utils.META_NONE {
maxUsage = time.Duration(-1)
@@ -807,7 +815,8 @@ func (smg *SMGeneric) UpdateSession(gev SMGenericEvent, clnt rpcclient.RpcClient
}
// Called on session end, should stop debit loop
func (smg *SMGeneric) TerminateSession(gev SMGenericEvent, clnt rpcclient.RpcClientConnection) (err error) {
func (smg *SMGeneric) TerminateSession(gev SMGenericEvent,
clnt rpcclient.RpcClientConnection) (err error) {
cgrID := gev.GetCGRID(utils.META_DEFAULT)
cacheKey := "TerminateSession" + cgrID
if item, err := smg.responseCache.Get(cacheKey); err == nil && item != nil {
@@ -816,7 +825,8 @@ func (smg *SMGeneric) TerminateSession(gev SMGenericEvent, clnt rpcclient.RpcCli
defer smg.responseCache.Cache(cacheKey, &utils.ResponseCacheItem{Err: err})
if gev.HasField(utils.InitialOriginID) {
initialCGRID := gev.GetCGRID(utils.InitialOriginID)
err = smg.sessionRelocate(initialCGRID, cgrID, gev.GetOriginID(utils.META_DEFAULT))
err = smg.sessionRelocate(initialCGRID, cgrID,
gev.GetOriginID(utils.META_DEFAULT))
if err == utils.ErrNotFound { // Session was already relocated, create a new session with this update
err = smg.sessionStart(gev, clnt)
}

View File

@@ -418,15 +418,20 @@ func (self SMGenericEvent) PassesFieldFilter(*utils.RSRField) (bool, string) {
func (self SMGenericEvent) AsCDR(cfg *config.CGRConfig, timezone string) *engine.CDR {
storCdr := engine.NewCDRWithDefaults(cfg)
storCdr.CGRID = self.GetCGRID(utils.META_DEFAULT)
storCdr.ToR = utils.FirstNonEmpty(self.GetTOR(utils.META_DEFAULT), storCdr.ToR) // Keep default if none in the event
storCdr.ToR = utils.FirstNonEmpty(self.GetTOR(utils.META_DEFAULT),
storCdr.ToR) // Keep default if none in the event
storCdr.OriginID = self.GetOriginID(utils.META_DEFAULT)
storCdr.OriginHost = self.GetOriginatorIP(utils.META_DEFAULT)
storCdr.Source = self.GetCdrSource()
storCdr.RequestType = utils.FirstNonEmpty(self.GetReqType(utils.META_DEFAULT), storCdr.RequestType)
storCdr.Tenant = utils.FirstNonEmpty(self.GetTenant(utils.META_DEFAULT), storCdr.Tenant)
storCdr.Category = utils.FirstNonEmpty(self.GetCategory(utils.META_DEFAULT), storCdr.Category)
storCdr.RequestType = utils.FirstNonEmpty(self.GetReqType(utils.META_DEFAULT),
storCdr.RequestType)
storCdr.Tenant = utils.FirstNonEmpty(self.GetTenant(utils.META_DEFAULT),
storCdr.Tenant)
storCdr.Category = utils.FirstNonEmpty(self.GetCategory(utils.META_DEFAULT),
storCdr.Category)
storCdr.Account = self.GetAccount(utils.META_DEFAULT)
storCdr.Subject = self.GetSubject(utils.META_DEFAULT)
storCdr.Subject = utils.FirstNonEmpty(self.GetSubject(utils.META_DEFAULT),
self.GetAccount(utils.META_DEFAULT))
storCdr.Destination = self.GetDestination(utils.META_DEFAULT)
storCdr.SetupTime, _ = self.GetSetupTime(utils.META_DEFAULT, timezone)
storCdr.AnswerTime, _ = self.GetAnswerTime(utils.META_DEFAULT, timezone)

View File

@@ -27,6 +27,9 @@ import (
)
func CastFieldIfToString(fld interface{}) (string, bool) {
if fld == nil {
return "", true
}
var strVal string
var converted bool
switch fld.(type) {

View File

@@ -245,6 +245,9 @@ func TestCastFieldIfToString(t *testing.T) {
} else if strVal != "1s" {
t.Errorf("received: %s", strVal)
}
if resVal, converted := CastIfToString(nil); converted || resVal != "" {
t.Errorf("received: %s", resVal)
}
}
func TestIfaceAsTime(t *testing.T) {