From aebb5edcb0741e30d7dcdf50ad63bd606eb3fb6c Mon Sep 17 00:00:00 2001 From: gezimbll Date: Mon, 21 Nov 2022 10:03:45 -0500 Subject: [PATCH] coverage tests at engine --- engine/attributes_test.go | 82 ++++++++++-------- engine/cdrs_test.go | 176 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 222 insertions(+), 36 deletions(-) diff --git a/engine/attributes_test.go b/engine/attributes_test.go index 96c6810cf..cf9d14b7d 100644 --- a/engine/attributes_test.go +++ b/engine/attributes_test.go @@ -999,41 +999,51 @@ func TestAttributesParseAttributeSIPCID(t *testing.T) { "cid": "12345", }, } - if _, err := ParseAttribute(dp, utils.MetaSIPCID, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. + if val, err := ParseAttribute(dp, utils.MetaSIPCID, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err != utils.ErrNotFound { t.Errorf("Expected <%+v>, received <%+v>", utils.ErrNotFound, err) + } else if val != "12345" { + t.Errorf("received %+v", val) } - if _, err := ParseAttribute(dp, utils.MetaNone, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. + if val, err := ParseAttribute(dp, utils.MetaNone, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err != nil { t.Errorf("received <%+v>", err) - } else if _, err = ParseAttribute(dp, utils.MetaUsageDifference, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. + } else if val != nil { + t.Errorf("received %+v", val) + } + + if _, err := ParseAttribute(dp, utils.MetaUsageDifference, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { - t.Errorf("received <%+v>", err) - } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaSum, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. - InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { - t.Errorf("received <%+v>", err) - } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaDifference, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. - InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { - t.Errorf("received <%+v>", err) + t.Errorf(",received <%+v>", err) + } + + if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaSum, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil || err != utils.ErrNotFound { + t.Errorf("expected <%+v>received <%+v>", utils.ErrNotFound, err) + } + + if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaDifference, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil || err != utils.ErrNotFound { + t.Errorf("expected <%+v>received <%+v>", utils.ErrNotFound, err) } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaMultiply, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. - InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { - t.Errorf("received <%+v>", err) + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil || err != utils.ErrNotFound { + t.Errorf("expected <%+v>received <%+v>", utils.ErrNotFound, err) } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaDivide, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. - InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { - t.Errorf("received <%+v>", err) + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil || err != utils.ErrNotFound { + t.Errorf("expected <%+v>received <%+v>", utils.ErrNotFound, err) } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaUnixTimestamp, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. - InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { - t.Errorf("received <%+v>", err) + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil || err != utils.ErrNotFound { + t.Errorf("expected <%+v>received <%+v>", utils.ErrNotFound, err) } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaDateTime, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. - InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { - t.Errorf("received <%+v>", err) + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil || err != utils.ErrNotFound { + t.Errorf("expected <%+v>received <%+v>", utils.ErrNotFound, err) } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaPrefix, "`val", config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. - InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { - t.Errorf("received <%+v>", err) + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil || err.Error() != "Unclosed unspilit syntax" { + t.Errorf("expected <%+v>received <%+v>", "Unclosed unspilit syntax", err) } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaSuffix, "`val", config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. - InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { - t.Errorf("received <%+v>", err) + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil || err.Error() != "Unclosed unspilit syntax" { + t.Errorf("expected <%+v>received <%+v>", "Unclosed unspilit syntax", err) } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaCCUsage, "`val", config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { t.Errorf("received <%+v>", err) @@ -1043,32 +1053,32 @@ func TestAttributesParseAttributeSIPCID(t *testing.T) { } else if _, err = ParseAttribute(utils.MapStorage{}, "default", utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra", utils. InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { t.Errorf("received <%+v>", err) - } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "12345"}}, utils.MetaUsageDifference, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra", utils.InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { - t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "12345"}}, utils.MetaUsageDifference, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra", utils.InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil || err != utils.ErrNotFound { + t.Errorf("expected <%+v>received <%+v>", utils.ErrNotFound, err) } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "12345", "extra": "1003"}}, utils.MetaUsageDifference, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra", utils. - InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { - t.Errorf("received <%+v>", err) + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil || err.Error() != "Unsupported time format" { + t.Errorf("expected <%+v>received <%+v>", "Unsupported time format", err) } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "0", "extra": "1003"}}, utils.MetaUsageDifference, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra", utils. - InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { - t.Errorf("received <%+v>", err) + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil || err.Error() != "Unsupported time format" { + t.Errorf("expected <%+v>received <%+v>", "Unsupported time format", err) } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{}}, utils.MetaUsageDifference, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra", utils. - InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { - t.Errorf("received <%+v>", err) + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil || err != utils.ErrNotFound { + t.Errorf("expected <%+v>received <%+v>", utils.ErrNotFound, err) } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"extra": "1003", "to": "1001"}}, utils.MetaCCUsage, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to", utils. - InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { - t.Errorf("received <%+v>", err) + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil || err != utils.ErrNotFound { + t.Errorf("expected <%+v>received <%+v>", utils.ErrNotFound, err) } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "val", "extra": "1003", "to": "1001"}}, utils.MetaCCUsage, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to", utils. InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { t.Errorf("received <%+v>", err) } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "12233", "to": "1001"}}, utils.MetaCCUsage, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to", utils. - InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { - t.Errorf("received <%+v>", err) + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil || err != utils.ErrNotFound { + t.Errorf("expected <%+v>received <%+v>", utils.ErrNotFound, err) } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "12232", "extra": "val", "to": "1001"}}, utils.MetaCCUsage, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to", utils. InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { t.Errorf("received <%+v>", err) } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "12233", "extra": "1001"}}, utils.MetaCCUsage, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to", utils. - InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { - t.Errorf("received <%+v>", err) + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil || err != utils.ErrNotFound { + t.Errorf("expected <%+v>received <%+v>", utils.ErrNotFound, err) } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "12232", "extra": "1001", "to": "val"}}, utils.MetaCCUsage, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to", utils. InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { t.Errorf("received <%+v>", err) diff --git a/engine/cdrs_test.go b/engine/cdrs_test.go index 03b69f54f..c262afd17 100644 --- a/engine/cdrs_test.go +++ b/engine/cdrs_test.go @@ -1059,3 +1059,179 @@ func TestV1StoreSessionCostSet(t *testing.T) { t.Errorf("expected %v,received %v", utils.ToJSON(exp), utils.ToJSON(rcv)) } } + +func TestV2StoreSessionCost(t *testing.T) { + Cache.Clear(nil) + cfg := config.NewDefaultCGRConfig() + ccMock := &ccMock{ + calls: map[string]func(args interface{}, reply interface{}) error{ + utils.ResponderRefundRounding: func(args, reply interface{}) error { + rpl := &Account{} + *reply.(*Account) = *rpl + return nil + }, + }, + } + clientconn := make(chan rpcclient.ClientConnector, 1) + clientconn <- ccMock + connMgr := NewConnManager(cfg, map[string]chan rpcclient.ClientConnector{ + utils.ConcatenatedKey(utils.MetaInternal, utils.RateSConnsCfg): clientconn, + }) + cfg.CacheCfg().Partitions[utils.CacheRPCResponses].Limit = 1 + cfg.CdrsCfg().RaterConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RateSConnsCfg)} + db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) + dm := NewDataManager(db, cfg.CacheCfg(), nil) + config.SetCgrConfig(cfg) + Cache = NewCacheS(cfg, dm, nil) + args := &ArgsV2CDRSStoreSMCost{ + CheckDuplicate: false, + Cost: &V2SMCost{ + CGRID: "cgrid", + RunID: "runid", + OriginHost: "host", + OriginID: "originid", + CostSource: "cgrates", + CostDetails: &EventCost{ + CGRID: "evcgrid", + RunID: "evrunid", + StartTime: time.Date(2021, 11, 1, 2, 0, 0, 0, time.UTC), + Usage: utils.DurationPointer(122), + Cost: utils.Float64Pointer(134), + Charges: []*ChargingInterval{}, + AccountSummary: &AccountSummary{}, + Rating: Rating{}, + Accounting: Accounting{}, + RatingFilters: RatingFilters{}, + Rates: ChargedRates{}, + Timings: ChargedTimings{}, + }, + }, + } + cdrS := &CDRServer{ + cgrCfg: cfg, + cdrDb: db, + dm: dm, + connMgr: connMgr, + } + reply := utils.StringPointer("reply") + + if err := cdrS.V2StoreSessionCost(args, reply); err != nil { + t.Error(err) + } + exp := &utils.CachedRPCResponse{Result: utils.StringPointer("OK"), Error: nil} + rcv, has := Cache.Get(utils.CacheRPCResponses, utils.ConcatenatedKey(utils.CDRsV1StoreSessionCost, args.Cost.CGRID, args.Cost.RunID)) + + if !has { + t.Error("has no value") + } + + if !reflect.DeepEqual(exp, rcv) { + t.Errorf("expected %+v,received %+v", utils.ToJSON(exp), utils.ToJSON(rcv)) + } +} + +func TestV2StoreSessionCostSet(t *testing.T) { + Cache.Clear(nil) + cfg := config.NewDefaultCGRConfig() + ccMock := &ccMock{ + calls: map[string]func(args interface{}, reply interface{}) error{ + utils.ResponderRefundRounding: func(args, reply interface{}) error { + rpl := &Account{} + *reply.(*Account) = *rpl + return nil + }, + }, + } + clientconn := make(chan rpcclient.ClientConnector, 1) + clientconn <- ccMock + connMgr := NewConnManager(cfg, map[string]chan rpcclient.ClientConnector{ + utils.ConcatenatedKey(utils.MetaInternal, utils.RateSConnsCfg): clientconn, + }) + cfg.CacheCfg().Partitions[utils.CacheRPCResponses].Limit = 1 + cfg.CdrsCfg().RaterConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RateSConnsCfg)} + db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) + dm := NewDataManager(db, cfg.CacheCfg(), nil) + config.SetCgrConfig(cfg) + Cache = NewCacheS(cfg, dm, nil) + args := &ArgsV2CDRSStoreSMCost{ + CheckDuplicate: false, + Cost: &V2SMCost{ + CGRID: "cgrid", + RunID: "runid", + OriginHost: "host", + OriginID: "originid", + CostSource: "cgrates", + CostDetails: &EventCost{ + CGRID: "evcgrid", + RunID: "evrunid", + StartTime: time.Date(2021, 11, 1, 2, 0, 0, 0, time.UTC), + Usage: utils.DurationPointer(122), + Cost: utils.Float64Pointer(134), + Charges: []*ChargingInterval{}, + AccountSummary: &AccountSummary{}, + Rating: Rating{}, + Accounting: Accounting{}, + RatingFilters: RatingFilters{}, + Rates: ChargedRates{}, + Timings: ChargedTimings{}, + }, + }, + } + cdrS := &CDRServer{ + cgrCfg: cfg, + cdrDb: db, + dm: dm, + connMgr: connMgr, + } + reply := utils.StringPointer("reply") + Cache.Set(utils.CacheRPCResponses, utils.ConcatenatedKey(utils.CDRsV1StoreSessionCost, args.Cost.CGRID, args.Cost.RunID), + &utils.CachedRPCResponse{Result: reply, Error: nil}, + nil, true, utils.NonTransactional) + + if err := cdrS.V2StoreSessionCost(args, reply); err != nil { + t.Error(err) + } + exp := &utils.CachedRPCResponse{Result: reply, Error: nil} + rcv, has := Cache.Get(utils.CacheRPCResponses, utils.ConcatenatedKey(utils.CDRsV1StoreSessionCost, args.Cost.CGRID, args.Cost.RunID)) + + if !has { + t.Error("has no value") + } + + if !reflect.DeepEqual(exp, rcv) { + t.Errorf("expected %+v,received %+v", utils.ToJSON(exp), utils.ToJSON(rcv)) + } +} + +func TestV1RateCDRS(t *testing.T) { + Cache.Clear(nil) + cfg := config.NewDefaultCGRConfig() + cfg.CdrsCfg().ChargerSConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.ChargerSConnsCfg)} + db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) + dm := NewDataManager(db, cfg.CacheCfg(), nil) + cdrS := &CDRServer{ + cgrCfg: cfg, + cdrDb: db, + dm: dm, + connMgr: connMgr, + } + arg := &ArgRateCDRs{ + Flags: []string{utils.MetaStore, utils.MetaExport, utils.MetaThresholds, utils.MetaStats, utils.MetaChargers, utils.MetaAttributes}, + RPCCDRsFilter: utils.RPCCDRsFilter{ + CGRIDs: []string{"id", "cgr"}, + NotRequestTypes: []string{"noreq"}, + NotCGRIDs: []string{"cgrid"}, + RunIDs: []string{"runid"}, + OriginIDs: []string{"o_id"}, + NotOriginIDs: []string{"noid"}, + }, + Tenant: "cgrates.org", + APIOpts: map[string]interface{}{}, + } + reply := utils.StringPointer("reply") + + if err := cdrS.V1RateCDRs(arg, reply); err == nil || err != utils.ErrNotFound { + t.Error(err) + } + +}