From fbe369833e1ed6f3e30ff04c54d5e75d6ab5e072 Mon Sep 17 00:00:00 2001 From: DanB Date: Tue, 29 Dec 2015 13:00:10 +0100 Subject: [PATCH] More compact engine.CDRStorage testing, apier/v2/cdrs_mongo_local_test updates --- apier/v2/cdrs_mongo_local_test.go | 208 ++++++++++++------- engine/storage_cdrs_it_test.go | 331 +++++++++++++++++++++++++++--- 2 files changed, 443 insertions(+), 96 deletions(-) diff --git a/apier/v2/cdrs_mongo_local_test.go b/apier/v2/cdrs_mongo_local_test.go index 8cc7fd7b2..1358da9f3 100644 --- a/apier/v2/cdrs_mongo_local_test.go +++ b/apier/v2/cdrs_mongo_local_test.go @@ -19,6 +19,7 @@ along with this program. If not, see package v2 import ( + "fmt" "net/rpc" "net/rpc/jsonrpc" "path" @@ -68,18 +69,18 @@ func TestV2CdrsMongoInjectUnratedCdr(t *testing.T) { if !*testLocal { return } - mysqlDb, err := engine.NewMongoStorage(cdrsMongoCfg.StorDBHost, cdrsMongoCfg.StorDBPort, cdrsMongoCfg.StorDBName, cdrsMongoCfg.StorDBUser, cdrsMongoCfg.StorDBPass) + mongoDb, err := engine.NewMongoStorage(cdrsMongoCfg.StorDBHost, cdrsMongoCfg.StorDBPort, cdrsMongoCfg.StorDBName, cdrsMongoCfg.StorDBUser, cdrsMongoCfg.StorDBPass) if err != nil { t.Error("Error on opening database connection: ", err) return } - strCdr1 := &engine.CDR{CGRID: utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), - ToR: utils.VOICE, OriginID: "bbb1", OriginHost: "192.168.1.1", Source: "UNKNOWN", RequestType: utils.META_RATED, + strCdr1 := &engine.CDR{CGRID: utils.Sha1("bbb1", time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC).String()), RunID: utils.MetaRaw, + ToR: utils.VOICE, OriginID: "bbb1", OriginHost: "192.168.1.1", Source: "TestV2CdrsMongoInjectUnratedCdr", RequestType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", - SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), + SetupTime: time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC), AnswerTime: time.Date(2015, 11, 21, 10, 47, 26, 0, time.UTC), Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - RunID: utils.DEFAULT_RUNID, Cost: 1.201} - if err := mysqlDb.SetCDR(strCdr1, false); err != nil { + Cost: -1} + if err := mongoDb.SetCDR(strCdr1, false); err != nil { t.Error(err.Error()) } } @@ -105,40 +106,46 @@ func TestV2CdrsMongoRpcConn(t *testing.T) { } } -// Insert some CDRs -func TestV2CdrsMongoProcessCdr(t *testing.T) { +func TestV2CdrsMongoProcessCdrRated(t *testing.T) { if !*testLocal { return } + cdr := &engine.CDR{ + CGRID: utils.Sha1("dsafdsaf", time.Date(2015, 12, 13, 18, 15, 26, 0, time.UTC).String()), RunID: utils.DEFAULT_RUNID, + OrderID: 123, ToR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "TestV2CdrsMongoProcessCdrRated", RequestType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", + Account: "1001", Subject: "1001", Destination: "1002", + SetupTime: time.Date(2015, 12, 13, 18, 15, 26, 0, time.UTC), AnswerTime: time.Date(2015, 12, 13, 18, 15, 26, 0, time.UTC), + Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + Cost: 1.01, CostSource: "TestV2CdrsMongoProcessCdrRated", Rated: true, + } var reply string - cdrs := []*engine.CDR{ - &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, ToR: utils.VOICE, OriginID: "dsafdsaf", - OriginHost: "192.168.1.1", Source: "test", RequestType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", - Subject: "1001", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, - Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - Rated: true, - }, - &engine.CDR{CGRID: utils.Sha1("abcdeftg", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, ToR: utils.VOICE, OriginID: "dsafdsaf", - OriginHost: "192.168.1.1", Source: "test", RequestType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1002", - Subject: "1002", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, - Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - }, - &engine.CDR{CGRID: utils.Sha1("aererfddf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, ToR: utils.VOICE, OriginID: "dsafdsaf", - OriginHost: "192.168.1.1", Source: "test", RequestType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1003", - Subject: "1003", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, - Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - }, + if err := cdrsMongoRpc.Call("CdrsV2.ProcessCdr", cdr, &reply); err != nil { + t.Error("Unexpected error: ", err.Error()) + } else if reply != utils.OK { + t.Error("Unexpected reply received: ", reply) } - for _, cdr := range cdrs { - if err := cdrsMongoRpc.Call("CdrsV2.ProcessCdr", cdr, &reply); err != nil { - t.Error("Unexpected error: ", err.Error()) - } else if reply != utils.OK { - t.Error("Unexpected reply received: ", reply) - } +} + +func TestV2CdrsMongoProcessCdrRaw(t *testing.T) { + if !*testLocal { + return } + cdr := &engine.CDR{ + CGRID: utils.Sha1("abcdeftg", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, RunID: utils.MetaRaw, + ToR: utils.VOICE, OriginID: "abcdeftg", + OriginHost: "192.168.1.1", Source: "TestV2CdrsMongoProcessCdrRaw", RequestType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", + Account: "1002", Subject: "1002", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), + Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + } + var reply string + if err := cdrsMongoRpc.Call("CdrsV2.ProcessCdr", cdr, &reply); err != nil { + t.Error("Unexpected error: ", err.Error()) + } else if reply != utils.OK { + t.Error("Unexpected reply received: ", reply) + } + time.Sleep(time.Duration(*waitRater) * time.Millisecond) } func TestV2CdrsMongoGetCdrs(t *testing.T) { @@ -146,50 +153,38 @@ func TestV2CdrsMongoGetCdrs(t *testing.T) { return } var reply []*engine.ExternalCDR - req := utils.RPCCDRsFilter{NotSources: []string{"CDRS"}} + req := utils.RPCCDRsFilter{} if err := cdrsMongoRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) - } else if len(reply) != 4 { - for _, cdr := range reply { - t.Logf("CDR: %s %s %s", cdr.CGRID, cdr.Source, cdr.RunID) - } + } else if len(reply) != 4 { // 1 injected, 1 rated, 1 *raw and it's pair in *default run t.Error("Unexpected number of CDRs returned: ", len(reply)) } - // CDRs with errors - req = utils.RPCCDRsFilter{NotSources: []string{"CDRS"}, MinCost: utils.Float64Pointer(-1.0), MaxCost: utils.Float64Pointer(0.0)} + // CDRs with rating errors + req = utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, MinCost: utils.Float64Pointer(-1.0), MaxCost: utils.Float64Pointer(0.0)} if err := cdrsMongoRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) - } else if len(reply) != 2 { + } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", reply) } // CDRs Rated - req = utils.RPCCDRsFilter{NotSources: []string{"CDRS"}, MinCost: utils.Float64Pointer(-1.0)} - if err := cdrsMongoRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { - t.Error("Unexpected error: ", err.Error()) - } else if len(reply) != 4 { - for _, cdr := range reply { - t.Logf("CDR: %s %s %s %f", cdr.CGRID, cdr.Source, cdr.RunID, cdr.Cost) - } - t.Error("Unexpected number of CDRs returned: ", reply) - } - // CDRs non rated OR SkipRated - req = utils.RPCCDRsFilter{NotSources: []string{"CDRS"}, MaxCost: utils.Float64Pointer(-1.0)} - if err := cdrsMongoRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { - t.Error("Unexpected error: ", err.Error()) - } else if len(reply) != 0 { - for _, cdr := range reply { - t.Logf("CDR: %s %s %s %f", cdr.CGRID, cdr.Source, cdr.RunID, cdr.Cost) - } - t.Error("Unexpected number of CDRs returned: ", reply) - } - // Skip Errors - req = utils.RPCCDRsFilter{NotSources: []string{"CDRS"}, MinCost: utils.Float64Pointer(0.0), MaxCost: utils.Float64Pointer(-1.0)} + req = utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}} if err := cdrsMongoRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { - for _, cdr := range reply { - t.Logf("CDR: %s %s %s %f", cdr.CGRID, cdr.Source, cdr.RunID, cdr.Cost) - } + t.Error("Unexpected number of CDRs returned: ", reply) + } + // Raw CDRs + req = utils.RPCCDRsFilter{RunIDs: []string{utils.MetaRaw}} + if err := cdrsMongoRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { + t.Error("Unexpected error: ", err.Error()) + } else if len(reply) != 2 { + t.Error("Unexpected number of CDRs returned: ", reply) + } + // Skip Errors + req = utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, MinCost: utils.Float64Pointer(0.0), MaxCost: utils.Float64Pointer(-1.0)} + if err := cdrsMongoRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { + t.Error("Unexpected error: ", err.Error()) + } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", reply) } } @@ -199,7 +194,7 @@ func TestV2CdrsMongoCountCdrs(t *testing.T) { return } var reply int64 - req := utils.AttrGetCdrs{CdrSources: []string{"test", "UNKNOWN"}} + req := utils.AttrGetCdrs{} if err := cdrsMongoRpc.Call("ApierV2.CountCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if reply != 4 { @@ -207,7 +202,7 @@ func TestV2CdrsMongoCountCdrs(t *testing.T) { } } -// Test Prepaid CDRs without previous costs being calculated +// Make sure *prepaid does not block until finding previous costs func TestV2CdrsMongoProcessPrepaidCdr(t *testing.T) { if !*testLocal { return @@ -215,17 +210,20 @@ func TestV2CdrsMongoProcessPrepaidCdr(t *testing.T) { var reply string cdrs := []*engine.CDR{ &engine.CDR{CGRID: utils.Sha1("dsafdsaf2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, ToR: utils.VOICE, OriginID: "dsafdsaf", - OriginHost: "192.168.1.1", Source: "test", RequestType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", + OriginHost: "192.168.1.1", Source: "TestV2CdrsMongoProcessPrepaidCdr1", RequestType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", + Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, Rated: true, }, &engine.CDR{CGRID: utils.Sha1("abcdeftg2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, ToR: utils.VOICE, OriginID: "dsafdsaf", - OriginHost: "192.168.1.1", Source: "test", RequestType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1002", Subject: "1002", Destination: "1002", + OriginHost: "192.168.1.1", Source: "TestV2CdrsMongoProcessPrepaidCdr2", RequestType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", + Category: "call", Account: "1002", Subject: "1002", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, }, &engine.CDR{CGRID: utils.Sha1("aererfddf2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, ToR: utils.VOICE, OriginID: "dsafdsaf", - OriginHost: "192.168.1.1", Source: "test", RequestType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1002", + OriginHost: "192.168.1.1", Source: "TestV2CdrsMongoProcessPrepaidCdr3", RequestType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", + Category: "call", Account: "1003", Subject: "1003", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, }, @@ -243,6 +241,74 @@ func TestV2CdrsMongoProcessPrepaidCdr(t *testing.T) { } } +func TestV2CdrsMongoRateWithoutTP(t *testing.T) { + if !*testLocal { + return + } + rawCdrCGRID := utils.Sha1("bbb1", time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC).String()) + fmt.Printf("RawCdrCGRID: %s\n", rawCdrCGRID) + // Rate the injected CDR, should not rate it since we have no TP loaded + attrs := utils.AttrRateCdrs{CgrIds: []string{rawCdrCGRID}} + var reply string + if err := cdrsMongoRpc.Call("CdrsV2.RateCdrs", attrs, &reply); err != nil { + t.Error("Unexpected error: ", err.Error()) + } else if reply != utils.OK { + t.Error("Unexpected reply received: ", reply) + } + time.Sleep(time.Duration(*waitRater) * time.Millisecond) + var cdrs []*engine.ExternalCDR + req := utils.RPCCDRsFilter{CGRIDs: []string{rawCdrCGRID}, RunIDs: []string{utils.META_DEFAULT}} + if err := cdrsMongoRpc.Call("ApierV2.GetCdrs", req, &cdrs); err != nil { + t.Error("Unexpected error: ", err.Error()) + } else if len(cdrs) != 1 { // Injected CDR did not have a charging run + t.Error("Unexpected number of CDRs returned: ", len(cdrs)) + } else { + if cdrs[0].Cost != -1 { + t.Errorf("Unexpected CDR returned: %+v", cdrs[0]) + } + } +} + +func TestV2CdrsMongoLoadTariffPlanFromFolder(t *testing.T) { + if !*testLocal { + return + } + var loadInst engine.LoadInstance + attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "tutorial")} + if err := cdrsMongoRpc.Call("ApierV2.LoadTariffPlanFromFolder", attrs, &loadInst); err != nil { + t.Error(err) + } else if loadInst.LoadId == "" { + t.Error("Empty loadId received, loadInstance: ", loadInst) + } + time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for scheduler to execute topups +} + +func TestV2CdrsMongoRateWithTP(t *testing.T) { + if !*testLocal { + return + } + rawCdrCGRID := utils.Sha1("bbb1", time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC).String()) + attrs := utils.AttrRateCdrs{CgrIds: []string{rawCdrCGRID}} + var reply string + if err := cdrsMongoRpc.Call("CdrsV2.RateCdrs", attrs, &reply); err != nil { + t.Error("Unexpected error: ", err.Error()) + } else if reply != utils.OK { + t.Error("Unexpected reply received: ", reply) + } + time.Sleep(time.Duration(*waitRater) * time.Millisecond) + var cdrs []*engine.ExternalCDR + req := utils.RPCCDRsFilter{CGRIDs: []string{rawCdrCGRID}, RunIDs: []string{utils.META_DEFAULT}} + if err := cdrsMongoRpc.Call("ApierV2.GetCdrs", req, &cdrs); err != nil { + t.Error("Unexpected error: ", err.Error()) + } else if len(cdrs) != 1 { + t.Error("Unexpected number of CDRs returned: ", len(cdrs)) + } else { + if cdrs[0].Cost != 0.3 { + t.Errorf("Unexpected CDR returned: %+v", cdrs[0]) + } + } +} + func TestV2CdrsMongoKillEngine(t *testing.T) { if !*testLocal { return diff --git a/engine/storage_cdrs_it_test.go b/engine/storage_cdrs_it_test.go index c9f613622..8b22c668b 100644 --- a/engine/storage_cdrs_it_test.go +++ b/engine/storage_cdrs_it_test.go @@ -40,18 +40,13 @@ func TestITCDRsMySQL(t *testing.T) { if err != nil { t.Error(err) } - if err := InitStorDb(cfg); err != nil { + if err := testGetCDRs(cfg); err != nil { t.Error(err) } - mysqlDb, err := NewMySQLStorage(cfg.StorDBHost, cfg.StorDBPort, cfg.StorDBName, cfg.StorDBUser, cfg.StorDBPass, - cfg.StorDBMaxOpenConns, cfg.StorDBMaxIdleConns) - if err != nil { - t.Error("Error on opening database connection: ", err) - } - if err := testSetCDR(mysqlDb); err != nil { + if err := testSetCDR(cfg); err != nil { t.Error(err) } - if err := testSMCosts(mysqlDb); err != nil { + if err := testSMCosts(cfg); err != nil { t.Error(err) } } @@ -64,18 +59,13 @@ func TestITCDRsPSQL(t *testing.T) { if err != nil { t.Error(err) } - if err := InitStorDb(cfg); err != nil { + if err := testGetCDRs(cfg); err != nil { t.Error(err) } - psqlDb, err := NewPostgresStorage(cfg.StorDBHost, cfg.StorDBPort, cfg.StorDBName, cfg.StorDBUser, cfg.StorDBPass, - cfg.StorDBMaxOpenConns, cfg.StorDBMaxIdleConns) - if err != nil { - t.Error("Error on opening database connection: ", err) - } - if err := testSetCDR(psqlDb); err != nil { + if err := testSetCDR(cfg); err != nil { t.Error(err) } - if err := testSMCosts(psqlDb); err != nil { + if err := testSMCosts(cfg); err != nil { t.Error(err) } } @@ -88,23 +78,27 @@ func TestITCDRsMongo(t *testing.T) { if err != nil { t.Error(err) } - if err := InitStorDb(cfg); err != nil { + if err := testGetCDRs(cfg); err != nil { t.Error(err) } - mongoDb, err := NewMongoStorage(cfg.StorDBHost, cfg.StorDBPort, cfg.StorDBName, cfg.StorDBUser, cfg.StorDBPass) - if err != nil { - t.Error("Error on opening database connection: ", err) - } - if err := testSetCDR(mongoDb); err != nil { + if err := testSetCDR(cfg); err != nil { t.Error(err) } - if err := testSMCosts(mongoDb); err != nil { + if err := testSMCosts(cfg); err != nil { t.Error(err) } } // helper function to populate CDRs and check if they were stored in storDb -func testSetCDR(cdrStorage CdrStorage) error { +func testSetCDR(cfg *config.CGRConfig) error { + if err := InitStorDb(cfg); err != nil { + return err + } + cdrStorage, err := ConfigureCdrStorage(cfg.StorDBType, cfg.StorDBHost, cfg.StorDBPort, cfg.StorDBName, cfg.StorDBUser, cfg.StorDBPass, + cfg.StorDBMaxOpenConns, cfg.StorDBMaxIdleConns) + if err != nil { + return err + } rawCDR := &CDR{ CGRID: utils.Sha1("testevent1", time.Date(2015, 12, 12, 14, 52, 0, 0, time.UTC).String()), RunID: utils.MetaRaw, @@ -205,7 +199,15 @@ func testSetCDR(cdrStorage CdrStorage) error { return nil } -func testSMCosts(cdrStorage CdrStorage) error { +func testSMCosts(cfg *config.CGRConfig) error { + if err := InitStorDb(cfg); err != nil { + return err + } + cdrStorage, err := ConfigureCdrStorage(cfg.StorDBType, cfg.StorDBHost, cfg.StorDBPort, cfg.StorDBName, cfg.StorDBUser, cfg.StorDBPass, + cfg.StorDBMaxOpenConns, cfg.StorDBMaxIdleConns) + if err != nil { + return err + } cc := &CallCost{ Direction: utils.OUT, Destination: "+4986517174963", @@ -229,3 +231,282 @@ func testSMCosts(cdrStorage CdrStorage) error { } return nil } + +func testGetCDRs(cfg *config.CGRConfig) error { + if err := InitStorDb(cfg); err != nil { + return err + } + cdrStorage, err := ConfigureCdrStorage(cfg.StorDBType, cfg.StorDBHost, cfg.StorDBPort, cfg.StorDBName, cfg.StorDBUser, cfg.StorDBPass, + cfg.StorDBMaxOpenConns, cfg.StorDBMaxIdleConns) + if err != nil { + return err + } + // All CDRs, no filter + if storedCdrs, _, err := cdrStorage.GetCDRs(new(utils.CDRsFilter)); err != nil { + return err + } else if len(storedCdrs) != 0 { + return fmt.Errorf("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + /* + // Count ALL + if storedCdrs, count, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Count: true}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 0 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } else if count != 8 { + t.Error("Unexpected count of StoredCdrs returned: ", count) + } + // Limit 5 + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(5), Offset: utils.IntPointer(0)}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 5 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Offset 5 + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(5), Offset: utils.IntPointer(0)}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 5 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Offset with limit 2 + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(2), Offset: utils.IntPointer(5)}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 2 { + t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } + // Filter on cgrids + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{CgrIds: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String())}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 2 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Count on CGRIDS + if _, count, err := cdrStorage.GetCDRs(&utils.CDRsFilter{CgrIds: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String())}, Count: true}); err != nil { + t.Error(err.Error()) + } else if count != 2 { + t.Error("Unexpected count of StoredCdrs returned: ", count) + } + // Filter on cgrids plus reqType + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{CgrIds: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String())}, ReqTypes: []string{utils.META_PREPAID}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 1 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Count on multiple filter + if _, count, err := cdrStorage.GetCDRs(&utils.CDRsFilter{CgrIds: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String())}, ReqTypes: []string{utils.META_PREPAID}, Count: true}); err != nil { + t.Error(err.Error()) + } else if count != 1 { + t.Error("Unexpected count of StoredCdrs returned: ", count) + } + // Filter on runId + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{RunIds: []string{utils.DEFAULT_RUNID}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 2 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on TOR + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Tors: []string{utils.SMS}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 0 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on multiple TOR + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Tors: []string{utils.SMS, utils.VOICE}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 8 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on cdrHost + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{CdrHosts: []string{"192.168.1.2"}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 3 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on multiple cdrHost + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{CdrHosts: []string{"192.168.1.1", "192.168.1.2"}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 8 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on cdrSource + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{CdrSources: []string{"UNKNOWN"}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 1 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on multiple cdrSource + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{CdrSources: []string{"UNKNOWN", "UNKNOWN2"}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 2 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on reqType + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{ReqTypes: []string{utils.META_PREPAID}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 2 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on multiple reqType + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{ReqTypes: []string{utils.META_PREPAID, utils.META_PSEUDOPREPAID}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 3 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on direction + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Directions: []string{"*out"}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 8 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on tenant + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Tenants: []string{"itsyscom.com"}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 3 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on multiple tenants + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Tenants: []string{"itsyscom.com", "cgrates.org"}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 8 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on category + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Categories: []string{"premium_call"}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 1 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on multiple categories + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Categories: []string{"premium_call", "call"}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 8 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on account + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Accounts: []string{"1002"}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 3 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on multiple account + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Accounts: []string{"1001", "1002"}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 8 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on subject + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Subjects: []string{"1000"}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 1 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on multiple subject + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Subjects: []string{"1000", "1002"}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 3 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on destPrefix + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{DestPrefixes: []string{"+498651"}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 3 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on multiple destPrefixes + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{DestPrefixes: []string{"1001", "+498651"}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 4 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on ratedAccount + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{RatedAccounts: []string{"8001"}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 1 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on ratedSubject + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{RatedSubjects: []string{"91001"}}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 1 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on ignoreRated + var orderIdStart, orderIdEnd int64 // Capture also orderIds for the next test + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{MaxCost: utils.Float64Pointer(0.0)}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 5 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } else { + for _, cdr := range storedCdrs { + if cdr.OrderId < orderIdStart { + orderIdStart = cdr.OrderId + } + if cdr.OrderId > orderIdEnd { + orderIdEnd = cdr.OrderId + } + } + } + // Filter on orderIdStart + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{OrderIdStart: orderIdStart}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 8 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on orderIdStart and orderIdEnd + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{OrderIdStart: orderIdStart, OrderIdEnd: orderIdEnd}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 4 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + var timeStart, timeEnd time.Time + // Filter on timeStart + timeStart = time.Date(2013, 11, 8, 8, 0, 0, 0, time.UTC) + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{AnswerTimeStart: &timeStart}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 5 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on timeStart and timeEnd + timeEnd = time.Date(2013, 12, 1, 8, 0, 0, 0, time.UTC) + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 2 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on minPdd + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{MinPdd: utils.Float64Pointer(3)}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 7 { + t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } + // Filter on maxPdd + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{MaxPdd: utils.Float64Pointer(3)}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 1 { + t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } + // Filter on minPdd, maxPdd + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{MinPdd: utils.Float64Pointer(3), MaxPdd: utils.Float64Pointer(5)}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 5 { + t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } + // Combined filter + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{ReqTypes: []string{utils.META_RATED}, AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 1 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on ignoreDerived + if storedCdrs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, FilterOnRated: true}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 0 { // ToDo: Recheck this value + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + */ + return nil +}