diff --git a/general_tests/a1_it_test.go b/general_tests/a1_it_test.go index 561bda185..5878bb949 100644 --- a/general_tests/a1_it_test.go +++ b/general_tests/a1_it_test.go @@ -218,8 +218,8 @@ func TestA1itDataSession1(t *testing.T) { t.Error(err) } cc = *ec.AsCallCost() - if len(cc.Timespans) != 3 { - t.Errorf("Unexpected number of timespans: %+v", len(cc.Timespans)) + if len(cc.Timespans) != 1 { + t.Errorf("Unexpected number of timespans: %+v, for %+v\n from:%+v", len(cc.Timespans), utils.ToJSON(cc.Timespans), utils.ToJSON(ec)) } if cc.RatedUsage != 2202800 { t.Errorf("RatingUsage expected: %f received %f, callcost: %+v ", 2202800.0, cc.RatedUsage, cc) diff --git a/general_tests/cdre_it_test.go b/general_tests/cdre_it_test.go index 4e9bf8679..da1ee67ab 100644 --- a/general_tests/cdre_it_test.go +++ b/general_tests/cdre_it_test.go @@ -81,9 +81,9 @@ func testCDREInitCfg(t *testing.T) { config.SetCgrConfig(cdreCfg) switch cdreConfigDIR { case "tutmongo": - cdreDelay = 4000 - default: cdreDelay = 2000 + default: + cdreDelay = 1000 } } @@ -146,7 +146,7 @@ func testCDREProcessCdr(t *testing.T) { ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}} cdr.ComputeCGRID() var reply string - if err := cdreRPC.Call("CdrsV1.ProcessCdr", cdr, &reply); err != nil { + if err := cdreRPC.Call(utils.CdrsV2ProcessCDR, cdr, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if reply != utils.OK { t.Error("Unexpected reply received: ", reply) diff --git a/general_tests/cdrs_onlexp_it_test.go b/general_tests/cdrs_onlexp_it_test.go index 82b9761cb..1fe8a081a 100644 --- a/general_tests/cdrs_onlexp_it_test.go +++ b/general_tests/cdrs_onlexp_it_test.go @@ -276,7 +276,7 @@ func TestCDRsOnExpAMQPPosterFileFailover(t *testing.T) { if readBytes, err := ioutil.ReadFile(filePath); err != nil { t.Error(err) } else if !reflect.DeepEqual(failoverContent, readBytes) { // Checking just the prefix should do since some content is dynamic - t.Errorf("Expecting: %q, received: %q", string(failoverContent), string(readBytes)) + t.Errorf("Expecting: %v, received: %v", utils.ToJSON(failoverContent), utils.ToJSON(readBytes)) } if err := os.Remove(filePath); err != nil { t.Error("Failed removing file: ", filePath) diff --git a/general_tests/oldtutorial_it_test.go b/general_tests/oldtutorial_it_test.go index 385299a67..34ef8f90f 100644 --- a/general_tests/oldtutorial_it_test.go +++ b/general_tests/oldtutorial_it_test.go @@ -1,1495 +1,1496 @@ // +build integration -/* -Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments -Copyright (C) ITsysCOM GmbH +// /* +// Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments +// Copyright (C) ITsysCOM GmbH -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program. If not, see -*/ +// You should have received a copy of the GNU General Public License +// along with this program. If not, see +// */ package general_tests -import ( - "io/ioutil" - "net/rpc" - "net/rpc/jsonrpc" - "os" - "path" - "reflect" - "testing" - "time" +// import ( +// "io/ioutil" +// "net/rpc" +// "net/rpc/jsonrpc" +// "os" +// "path" +// "reflect" +// "testing" +// "time" - "github.com/cgrates/cgrates/apier/v1" - "github.com/cgrates/cgrates/apier/v2" - "github.com/cgrates/cgrates/config" - "github.com/cgrates/cgrates/engine" - "github.com/cgrates/cgrates/utils" -) +// "github.com/cgrates/cgrates/apier/v1" +// "github.com/cgrates/cgrates/apier/v2" +// "github.com/cgrates/cgrates/config" +// "github.com/cgrates/cgrates/engine" +// "github.com/cgrates/cgrates/utils" +// ) -var tutLocalCfgPath string -var tutFsLocalCfg *config.CGRConfig -var tutLocalRpc *rpc.Client -var loadInst utils.LoadInstance // Share load information between tests +// var tutLocalCfgPath string +// var tutFsLocalCfg *config.CGRConfig +// var tutLocalRpc *rpc.Client +// var loadInst utils.LoadInstance // Share load information between tests -func TestTutITInitCfg(t *testing.T) { - tutLocalCfgPath = path.Join(*dataDir, "conf", "samples", "tutmysql") - // Init config first - var err error - tutFsLocalCfg, err = config.NewCGRConfigFromFolder(tutLocalCfgPath) - if err != nil { - t.Error(err) - } - tutFsLocalCfg.DataFolderPath = *dataDir // Share DataFolderPath through config towards StoreDb for Flush() - config.SetCgrConfig(tutFsLocalCfg) -} +// func TestTutITInitCfg(t *testing.T) { +// tutLocalCfgPath = path.Join(*dataDir, "conf", "samples", "tutmysql") +// // Init config first +// var err error +// tutFsLocalCfg, err = config.NewCGRConfigFromFolder(tutLocalCfgPath) +// if err != nil { +// t.Error(err) +// } +// tutFsLocalCfg.DataFolderPath = *dataDir // Share DataFolderPath through config towards StoreDb for Flush() +// config.SetCgrConfig(tutFsLocalCfg) +// } -// Remove data in dataDB -func TestTutITResetDataDb(t *testing.T) { - if err := engine.InitDataDb(tutFsLocalCfg); err != nil { - t.Fatal(err) - } -} +// // Remove data in dataDB +// func TestTutITResetDataDb(t *testing.T) { +// if err := engine.InitDataDb(tutFsLocalCfg); err != nil { +// t.Fatal(err) +// } +// } -// Wipe out the cdr database -func TestTutITResetStorDb(t *testing.T) { - if err := engine.InitStorDb(tutFsLocalCfg); err != nil { - t.Fatal(err) - } -} +// // Wipe out the cdr database +// func TestTutITResetStorDb(t *testing.T) { +// if err := engine.InitStorDb(tutFsLocalCfg); err != nil { +// t.Fatal(err) +// } +// } -// Start CGR Engine -func TestTutITStartEngine(t *testing.T) { - if _, err := engine.StopStartEngine(tutLocalCfgPath, *waitRater); err != nil { - t.Fatal(err) - } -} +// // Start CGR Engine +// func TestTutITStartEngine(t *testing.T) { +// if _, err := engine.StopStartEngine(tutLocalCfgPath, *waitRater); err != nil { +// t.Fatal(err) +// } +// } -// Connect rpc client to rater -func TestTutITRpcConn(t *testing.T) { - var err error - tutLocalRpc, err = jsonrpc.Dial("tcp", tutFsLocalCfg.ListenCfg().RPCJSONListen) // We connect over JSON so we can also troubleshoot if needed - if err != nil { - t.Fatal(err) - } -} +// // Connect rpc client to rater +// func TestTutITRpcConn(t *testing.T) { +// var err error +// tutLocalRpc, err = jsonrpc.Dial("tcp", tutFsLocalCfg.ListenCfg().RPCJSONListen) // We connect over JSON so we can also troubleshoot if needed +// if err != nil { +// t.Fatal(err) +// } +// } -// Load the tariff plan, creating accounts and their balances -func TestTutITLoadTariffPlanFromFolder(t *testing.T) { - attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "oldtutorial")} - if err := tutLocalRpc.Call("ApierV2.LoadTariffPlanFromFolder", attrs, &loadInst); err != nil { - t.Error(err) - } - time.Sleep(100*time.Millisecond + time.Duration(*waitRater)*time.Millisecond) // Give time for scheduler to execute topups -} +// // Load the tariff plan, creating accounts and their balances +// func TestTutITLoadTariffPlanFromFolder(t *testing.T) { +// attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "oldtutorial")} +// if err := tutLocalRpc.Call("ApierV2.LoadTariffPlanFromFolder", attrs, &loadInst); err != nil { +// t.Error(err) +// } +// time.Sleep(100*time.Millisecond + time.Duration(*waitRater)*time.Millisecond) // Give time for scheduler to execute topups +// } -// Check loaded stats -func TestTutITCacheStats(t *testing.T) { - var reply string - if err := tutLocalRpc.Call("ApierV1.LoadCache", utils.AttrReloadCache{}, &reply); err != nil { - t.Error(err) - } else if reply != "OK" { - t.Error(reply) - } - var rcvStats *utils.CacheStats - expectedStats := &utils.CacheStats{Destinations: 5, ReverseDestinations: 7, RatingPlans: 4, RatingProfiles: 10, - Actions: 9, ActionPlans: 4, AccountActionPlans: 5, SharedGroups: 1, DerivedChargers: 1, LcrProfiles: 5, - CdrStats: 6, Users: 3, Aliases: 1, ReverseAliases: 2, ResourceProfiles: 3, Resources: 3, StatQueues: 1, - StatQueueProfiles: 1, Thresholds: 7, ThresholdProfiles: 7, Filters: 16, SupplierProfiles: 3, AttributeProfiles: 1} - var args utils.AttrCacheStats - if err := tutLocalRpc.Call("ApierV1.GetCacheStats", args, &rcvStats); err != nil { - t.Error("Got error on ApierV1.GetCacheStats: ", err.Error()) - } else if !reflect.DeepEqual(expectedStats, rcvStats) { - t.Errorf("Calling ApierV1.GetCacheStats expected: %+v, received: %+v", expectedStats, rcvStats) - } - expKeys := utils.ArgsCache{ - DestinationIDs: &[]string{"DST_1003", "DST_1002", "DST_DE_MOBILE", "DST_1007", "DST_FS"}, - RatingPlanIDs: &[]string{"RP_RETAIL1", "RP_GENERIC"}, - } - var rcvKeys utils.ArgsCache - argsAPI := utils.ArgsCacheKeys{ArgsCache: utils.ArgsCache{ - DestinationIDs: &[]string{}, RatingPlanIDs: &[]string{"RP_RETAIL1", "RP_GENERIC", "NONEXISTENT"}}} - if err := tutLocalRpc.Call("ApierV1.GetCacheKeys", argsAPI, &rcvKeys); err != nil { - t.Error("Got error on ApierV1.GetCacheStats: ", err.Error()) - } else { - if rcvKeys.DestinationIDs == nil { - t.Errorf("Expecting rcvKeys.DestinationIDs to not be nil") - // rcvKeys.DestinationIDs shoud not be nil so exit function - // to avoid nil segmentation fault; - // if this happens try to run this test manualy - return - } - if len(*expKeys.DestinationIDs) != len(*rcvKeys.DestinationIDs) { - t.Errorf("Expected: %+v, received: %+v", expKeys.DestinationIDs, rcvKeys.DestinationIDs) - } - if !reflect.DeepEqual(*expKeys.RatingPlanIDs, *rcvKeys.RatingPlanIDs) { - t.Errorf("Expected: %+v, received: %+v", expKeys.RatingPlanIDs, rcvKeys.RatingPlanIDs) - } - } - if _, err := engine.StopStartEngine(tutLocalCfgPath, 1500); err != nil { - t.Fatal(err) - } - var err error - tutLocalRpc, err = jsonrpc.Dial("tcp", tutFsLocalCfg.ListenCfg().RPCJSONListen) // We connect over JSON so we can also troubleshoot if needed - if err != nil { - t.Fatal(err) - } - if err := tutLocalRpc.Call("ApierV1.GetCacheStats", args, &rcvStats); err != nil { - t.Error("Got error on ApierV1.GetCacheStats: ", err.Error()) - } else if !reflect.DeepEqual(expectedStats, rcvStats) { - t.Errorf("Calling ApierV1.GetCacheStats expected: %+v, received: %+v", expectedStats, rcvStats) - } -} +// // Check loaded stats +// func TestTutITCacheStats(t *testing.T) { +// var reply string +// if err := tutLocalRpc.Call("ApierV1.LoadCache", utils.AttrReloadCache{}, &reply); err != nil { +// t.Error(err) +// } else if reply != "OK" { +// t.Error(reply) +// } +// var rcvStats *utils.CacheStats +// expectedStats := &utils.CacheStats{Destinations: 5, ReverseDestinations: 7, RatingPlans: 4, RatingProfiles: 10, +// Actions: 9, ActionPlans: 4, AccountActionPlans: 5, SharedGroups: 1, DerivedChargers: 1, LcrProfiles: 5, +// Aliases: 1, ReverseAliases: 2, ResourceProfiles: 3, Resources: 3, StatQueues: 1, StatQueueProfiles: 1, Thresholds: 7, +// ThresholdProfiles: 7, Filters: 16, SupplierProfiles: 3, AttributeProfiles: 1, +// CdrStats: 0, Users: 0} // CdrStats and Users are 0 because deprecated. To be removed +// var args utils.AttrCacheStats +// if err := tutLocalRpc.Call("ApierV1.GetCacheStats", args, &rcvStats); err != nil { +// t.Error("Got error on ApierV1.GetCacheStats: ", err.Error()) +// } else if !reflect.DeepEqual(expectedStats, rcvStats) { +// t.Errorf("Calling ApierV1.GetCacheStats expected: %+v, received: %+v", utils.ToJSON(expectedStats), utils.ToJSON(rcvStats)) +// } +// expKeys := utils.ArgsCache{ +// DestinationIDs: &[]string{"DST_1003", "DST_1002", "DST_DE_MOBILE", "DST_1007", "DST_FS"}, +// RatingPlanIDs: &[]string{"RP_RETAIL1", "RP_GENERIC"}, +// } +// var rcvKeys utils.ArgsCache +// argsAPI := utils.ArgsCacheKeys{ArgsCache: utils.ArgsCache{ +// DestinationIDs: &[]string{}, RatingPlanIDs: &[]string{"RP_RETAIL1", "RP_GENERIC", "NONEXISTENT"}}} +// if err := tutLocalRpc.Call("ApierV1.GetCacheKeys", argsAPI, &rcvKeys); err != nil { +// t.Error("Got error on ApierV1.GetCacheStats: ", err.Error()) +// } else { +// if rcvKeys.DestinationIDs == nil { +// t.Errorf("Expecting rcvKeys.DestinationIDs to not be nil") +// // rcvKeys.DestinationIDs shoud not be nil so exit function +// // to avoid nil segmentation fault; +// // if this happens try to run this test manualy +// return +// } +// if len(*expKeys.DestinationIDs) != len(*rcvKeys.DestinationIDs) { +// t.Errorf("Expected: %+v, received: %+v", expKeys.DestinationIDs, rcvKeys.DestinationIDs) +// } +// if !reflect.DeepEqual(*expKeys.RatingPlanIDs, *rcvKeys.RatingPlanIDs) { +// t.Errorf("Expected: %+v, received: %+v", expKeys.RatingPlanIDs, rcvKeys.RatingPlanIDs) +// } +// } +// if _, err := engine.StopStartEngine(tutLocalCfgPath, 1500); err != nil { +// t.Fatal(err) +// } +// var err error +// tutLocalRpc, err = jsonrpc.Dial("tcp", tutFsLocalCfg.ListenCfg().RPCJSONListen) // We connect over JSON so we can also troubleshoot if needed +// if err != nil { +// t.Fatal(err) +// } +// if err := tutLocalRpc.Call("ApierV1.GetCacheStats", args, &rcvStats); err != nil { +// t.Error("Got error on ApierV1.GetCacheStats: ", err.Error()) +// } else if !reflect.DeepEqual(expectedStats, rcvStats) { +// t.Errorf("Calling ApierV1.GetCacheStats expected: %+v, received: %+v", expectedStats, rcvStats) +// } +// } -func TestTutITGetUsers(t *testing.T) { - var users engine.UserProfiles - if err := tutLocalRpc.Call("UsersV1.GetUsers", engine.UserProfile{}, &users); err != nil { - t.Error("Got error on UsersV1.GetUsers: ", err.Error()) - } else if len(users) != 3 { - t.Error("Calling UsersV1.GetUsers got users:", len(users)) - } -} +// // Deprecated +// // func TestTutITGetUsers(t *testing.T) { +// // var users engine.UserProfiles +// // if err := tutLocalRpc.Call("UsersV1.GetUsers", engine.UserProfile{}, &users); err != nil { +// // t.Error("Got error on UsersV1.GetUsers: ", err.Error()) +// // } else if len(users) != 3 { +// // t.Error("Calling UsersV1.GetUsers got users:", len(users)) +// // } +// // } -func TestTutITGetMatchingAlias(t *testing.T) { - args := engine.AttrMatchingAlias{ - Destination: "1005", - Direction: "*out", - Tenant: "cgrates.org", - Category: "call", - Account: "1006", - Subject: "1006", - Context: utils.MetaRating, - Target: "Account", - Original: "1006", - } - eMatchingAlias := "1002" - var matchingAlias string - if err := tutLocalRpc.Call("AliasesV1.GetMatchingAlias", args, &matchingAlias); err != nil { - t.Error(err) - } else if matchingAlias != eMatchingAlias { - t.Errorf("Expecting: %s, received: %+v", eMatchingAlias, matchingAlias) - } -} +// // func TestTutITGetMatchingAlias(t *testing.T) { +// // args := engine.AttrMatchingAlias{ +// // Destination: "1005", +// // Direction: "*out", +// // Tenant: "cgrates.org", +// // Category: "call", +// // Account: "1006", +// // Subject: "1006", +// // Context: utils.MetaRating, +// // Target: "Account", +// // Original: "1006", +// // } +// // eMatchingAlias := "1002" +// // var matchingAlias string +// // if err := tutLocalRpc.Call("AliasesV1.GetMatchingAlias", args, &matchingAlias); err != nil { +// // t.Error(err) +// // } else if matchingAlias != eMatchingAlias { +// // t.Errorf("Expecting: %s, received: %+v", eMatchingAlias, matchingAlias) +// // } +// // } -// Check call costs -func TestTutITGetCosts(t *testing.T) { - tStart, _ := utils.ParseDate("2014-08-04T13:00:00Z") - tEnd, _ := utils.ParseDate("2014-08-04T13:00:20Z") - cd := engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1001", - Account: "1001", - Destination: "1002", - DurationIndex: 0, - TimeStart: tStart, - TimeEnd: tEnd, - } - var cc engine.CallCost - if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if cc.Cost != 0.6 { - t.Errorf("Calling Responder.GetCost got callcost: %v", cc.Cost) - } - // Make sure that the same cost is returned via users aliasing - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: utils.USERS, - Subject: utils.USERS, - Account: utils.USERS, - Destination: "1002", - DurationIndex: 0, - TimeStart: tStart, - TimeEnd: tEnd, - ExtraFields: map[string]string{"Uuid": "388539dfd4f5cefee8f488b78c6c244b9e19138e"}, - } - if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if cc.Cost != 0.6 { - t.Errorf("Calling Responder.GetCost got callcost: %v", cc.Cost) - } - tStart, _ = utils.ParseDate("2014-08-04T13:00:00Z") - tEnd, _ = utils.ParseDate("2014-08-04T13:01:25Z") - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1001", - Account: "1001", - Destination: "1002", - DurationIndex: 0, - TimeStart: tStart, - TimeEnd: tEnd, - } - if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if cc.Cost != 0.6418 { // 0.01 first minute, 0.04 25 seconds with RT_20CNT - t.Errorf("Calling Responder.GetCost got callcost: %v", cc.Cost) - } - tStart, _ = utils.ParseDate("2014-08-04T13:00:00Z") - tEnd, _ = utils.ParseDate("2014-08-04T13:00:20Z") - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1001", - Account: "1001", - Destination: "1003", - DurationIndex: 0, - TimeStart: tStart, - TimeEnd: tEnd, - } - if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if cc.Cost != 1 { - t.Errorf("Calling Responder.GetCost got callcost: %v", cc.Cost) - } - tStart, _ = utils.ParseDate("2014-08-04T13:00:00Z") - tEnd, _ = utils.ParseDate("2014-08-04T13:01:25Z") - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1001", - Account: "1001", - Destination: "1003", - DurationIndex: 0, - TimeStart: tStart, - TimeEnd: tEnd, - } - if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if cc.Cost != 1.3 { - t.Errorf("Calling Responder.GetCost got callcost: %v", cc.Cost) - } - tStart, _ = utils.ParseDate("2014-08-04T13:00:00Z") - tEnd, _ = utils.ParseDate("2014-08-04T13:00:20Z") - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1001", - Account: "1001", - Destination: "1004", - DurationIndex: 0, - TimeStart: tStart, - TimeEnd: tEnd, - } - if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if cc.Cost != 1 { - t.Errorf("Calling Responder.GetCost got callcost: %v", cc.Cost) - } - tStart, _ = utils.ParseDate("2014-08-04T13:00:00Z") - tEnd, _ = utils.ParseDate("2014-08-04T13:01:25Z") - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1001", - Account: "1001", - Destination: "1004", - DurationIndex: 0, - TimeStart: tStart, - TimeEnd: tEnd, - } - if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if cc.Cost != 1.3 { - t.Errorf("Calling Responder.GetCost got callcost: %v", cc.Cost) - } - tStart = time.Date(2014, 8, 4, 13, 0, 0, 0, time.UTC) - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1001", - Account: "1001", - Destination: "1007", - TimeStart: tStart, - TimeEnd: tStart.Add(time.Duration(50) * time.Second), - } - if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if cc.Cost != 0.5 { - t.Errorf("Calling Responder.GetCost got callcost: %s", cc.AsJSON()) - } - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1001", - Account: "1001", - Destination: "1007", - TimeStart: tStart, - TimeEnd: tStart.Add(time.Duration(70) * time.Second), - } - if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if cc.Cost != 0.62 { - t.Errorf("Calling Responder.GetCost got callcost: %v", cc.Cost) - } - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1002", - Account: "1002", - Destination: "1007", - TimeStart: tStart, - TimeEnd: tStart.Add(time.Duration(50) * time.Second), - } - if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if cc.Cost != 0.5 { - t.Errorf("Calling Responder.GetCost got callcost: %s", cc.AsJSON()) - } - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1002", - Account: "1002", - Destination: "1007", - TimeStart: tStart, - TimeEnd: tStart.Add(time.Duration(70) * time.Second), - } - if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if cc.Cost != 0.7 { // In case of *disconnect strategy, it will not be applied so we can go on negative costs - t.Errorf("Calling Responder.GetCost got callcost: %s", cc.AsJSON()) - } - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1001", - Account: "1001", - Destination: "1004", - TimeStart: time.Date(2016, 1, 6, 19, 0, 0, 0, time.UTC), - TimeEnd: time.Date(2016, 1, 6, 19, 1, 30, 0, time.UTC), - } - if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if cc.Cost != 0.3249 { // - t.Errorf("Calling Responder.GetCost got callcost: %s", cc.AsJSON()) - } - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1001", - Account: "1001", - Destination: "1004", - TimeStart: time.Date(2016, 1, 6, 18, 31, 5, 0, time.UTC), - TimeEnd: time.Date(2016, 1, 6, 18, 32, 35, 0, time.UTC), - } - if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if cc.Cost != 1.3 { // - t.Errorf("Calling Responder.GetCost got callcost: %s", cc.AsJSON()) - } - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1001", - Account: "1001", - Destination: "1002", - TimeStart: time.Date(2014, 12, 7, 8, 42, 26, 0, time.UTC), - TimeEnd: time.Date(2014, 12, 7, 8, 44, 26, 0, time.UTC), - } - if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if cc.Cost != 0.3498 { // - t.Errorf("Calling Responder.GetCost got callcost: %s", cc.AsJSON()) - } -} +// // Check call costs +// func TestTutITGetCosts(t *testing.T) { +// tStart, _ := utils.ParseDate("2014-08-04T13:00:00Z") +// tEnd, _ := utils.ParseDate("2014-08-04T13:00:20Z") +// cd := engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1001", +// Account: "1001", +// Destination: "1002", +// DurationIndex: 0, +// TimeStart: tStart, +// TimeEnd: tEnd, +// } +// var cc engine.CallCost +// if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if cc.Cost != 0.6 { +// t.Errorf("Calling Responder.GetCost got callcost: %v", cc.Cost) +// } +// // Make sure that the same cost is returned via users aliasing +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: utils.USERS, +// Subject: utils.USERS, +// Account: utils.USERS, +// Destination: "1002", +// DurationIndex: 0, +// TimeStart: tStart, +// TimeEnd: tEnd, +// ExtraFields: map[string]string{"Uuid": "388539dfd4f5cefee8f488b78c6c244b9e19138e"}, +// } +// if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if cc.Cost != 0.6 { +// t.Errorf("Calling Responder.GetCost got callcost: %v", cc.Cost) +// } +// tStart, _ = utils.ParseDate("2014-08-04T13:00:00Z") +// tEnd, _ = utils.ParseDate("2014-08-04T13:01:25Z") +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1001", +// Account: "1001", +// Destination: "1002", +// DurationIndex: 0, +// TimeStart: tStart, +// TimeEnd: tEnd, +// } +// if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if cc.Cost != 0.6418 { // 0.01 first minute, 0.04 25 seconds with RT_20CNT +// t.Errorf("Calling Responder.GetCost got callcost: %v", cc.Cost) +// } +// tStart, _ = utils.ParseDate("2014-08-04T13:00:00Z") +// tEnd, _ = utils.ParseDate("2014-08-04T13:00:20Z") +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1001", +// Account: "1001", +// Destination: "1003", +// DurationIndex: 0, +// TimeStart: tStart, +// TimeEnd: tEnd, +// } +// if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if cc.Cost != 1 { +// t.Errorf("Calling Responder.GetCost got callcost: %v", cc.Cost) +// } +// tStart, _ = utils.ParseDate("2014-08-04T13:00:00Z") +// tEnd, _ = utils.ParseDate("2014-08-04T13:01:25Z") +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1001", +// Account: "1001", +// Destination: "1003", +// DurationIndex: 0, +// TimeStart: tStart, +// TimeEnd: tEnd, +// } +// if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if cc.Cost != 1.3 { +// t.Errorf("Calling Responder.GetCost got callcost: %v", cc.Cost) +// } +// tStart, _ = utils.ParseDate("2014-08-04T13:00:00Z") +// tEnd, _ = utils.ParseDate("2014-08-04T13:00:20Z") +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1001", +// Account: "1001", +// Destination: "1004", +// DurationIndex: 0, +// TimeStart: tStart, +// TimeEnd: tEnd, +// } +// if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if cc.Cost != 1 { +// t.Errorf("Calling Responder.GetCost got callcost: %v", cc.Cost) +// } +// tStart, _ = utils.ParseDate("2014-08-04T13:00:00Z") +// tEnd, _ = utils.ParseDate("2014-08-04T13:01:25Z") +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1001", +// Account: "1001", +// Destination: "1004", +// DurationIndex: 0, +// TimeStart: tStart, +// TimeEnd: tEnd, +// } +// if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if cc.Cost != 1.3 { +// t.Errorf("Calling Responder.GetCost got callcost: %v", cc.Cost) +// } +// tStart = time.Date(2014, 8, 4, 13, 0, 0, 0, time.UTC) +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1001", +// Account: "1001", +// Destination: "1007", +// TimeStart: tStart, +// TimeEnd: tStart.Add(time.Duration(50) * time.Second), +// } +// if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if cc.Cost != 0.5 { +// t.Errorf("Calling Responder.GetCost got callcost: %s", cc.AsJSON()) +// } +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1001", +// Account: "1001", +// Destination: "1007", +// TimeStart: tStart, +// TimeEnd: tStart.Add(time.Duration(70) * time.Second), +// } +// if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if cc.Cost != 0.62 { +// t.Errorf("Calling Responder.GetCost got callcost: %v", cc.Cost) +// } +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1002", +// Account: "1002", +// Destination: "1007", +// TimeStart: tStart, +// TimeEnd: tStart.Add(time.Duration(50) * time.Second), +// } +// if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if cc.Cost != 0.5 { +// t.Errorf("Calling Responder.GetCost got callcost: %s", cc.AsJSON()) +// } +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1002", +// Account: "1002", +// Destination: "1007", +// TimeStart: tStart, +// TimeEnd: tStart.Add(time.Duration(70) * time.Second), +// } +// if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if cc.Cost != 0.7 { // In case of *disconnect strategy, it will not be applied so we can go on negative costs +// t.Errorf("Calling Responder.GetCost got callcost: %s", cc.AsJSON()) +// } +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1001", +// Account: "1001", +// Destination: "1004", +// TimeStart: time.Date(2016, 1, 6, 19, 0, 0, 0, time.UTC), +// TimeEnd: time.Date(2016, 1, 6, 19, 1, 30, 0, time.UTC), +// } +// if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if cc.Cost != 0.3249 { // +// t.Errorf("Calling Responder.GetCost got callcost: %s", cc.AsJSON()) +// } +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1001", +// Account: "1001", +// Destination: "1004", +// TimeStart: time.Date(2016, 1, 6, 18, 31, 5, 0, time.UTC), +// TimeEnd: time.Date(2016, 1, 6, 18, 32, 35, 0, time.UTC), +// } +// if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if cc.Cost != 1.3 { // +// t.Errorf("Calling Responder.GetCost got callcost: %s", cc.AsJSON()) +// } +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1001", +// Account: "1001", +// Destination: "1002", +// TimeStart: time.Date(2014, 12, 7, 8, 42, 26, 0, time.UTC), +// TimeEnd: time.Date(2014, 12, 7, 8, 44, 26, 0, time.UTC), +// } +// if err := tutLocalRpc.Call("Responder.GetCost", cd, &cc); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if cc.Cost != 0.3498 { // +// t.Errorf("Calling Responder.GetCost got callcost: %s", cc.AsJSON()) +// } +// } -// Check call costs -func TestTutITMaxDebit(t *testing.T) { - tStart := time.Date(2014, 8, 4, 13, 0, 0, 0, time.UTC) - cd := engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1001", - Account: "1001", - Destination: "1002", - DurationIndex: 0, - TimeStart: tStart, - TimeEnd: tStart.Add(time.Duration(20) * time.Second), - } - var cc engine.CallCost - if err := tutLocalRpc.Call("Responder.MaxDebit", cd, &cc); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if cc.GetDuration() == 20 { - t.Errorf("Calling Responder.MaxDebit got callcost: %v", cc.GetDuration()) - } - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1001", - Account: "1001", - Destination: "1003", - DurationIndex: 0, - TimeStart: tStart, - TimeEnd: tStart.Add(time.Duration(200) * time.Second), - } - if err := tutLocalRpc.Call("Responder.MaxDebit", cd, &cc); err != nil { - t.Error("Got error on Responder.MaxDebit: ", err.Error()) - } else if cc.GetDuration() == 200 { - t.Errorf("Calling Responder.MaxDebit got duration: %v", cc.GetDuration()) - } - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1001", - Account: "1001", - Destination: "1007", - DurationIndex: 0, - TimeStart: tStart, - TimeEnd: tStart.Add(time.Duration(120) * time.Second), - } - cd.CgrID = "1" - if err := tutLocalRpc.Call("Responder.MaxDebit", cd, &cc); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if cc.GetDuration() == 120 { - t.Errorf("Calling Responder.MaxDebit got callcost: %v", cc.GetDuration()) - } - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1004", - Account: "1004", - Destination: "1007", - DurationIndex: 0, - TimeStart: tStart, - TimeEnd: tStart.Add(time.Duration(120) * time.Second), - } - cd.CgrID = "2" - if err := tutLocalRpc.Call("Responder.MaxDebit", cd, &cc); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if cc.GetDuration() != time.Duration(62)*time.Second { // We have as strategy *dsconnect - t.Errorf("Calling Responder.MaxDebit got callcost: %v", cc.GetDuration()) - } - var maxTime float64 - if err := tutLocalRpc.Call("Responder.GetMaxSessionTime", cd, &maxTime); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if maxTime != 62000000000 { // We have as strategy *dsconnect - t.Errorf("Calling Responder.GetMaxSessionTime got maxTime: %f", maxTime) - } -} +// // Check call costs +// func TestTutITMaxDebit(t *testing.T) { +// tStart := time.Date(2014, 8, 4, 13, 0, 0, 0, time.UTC) +// cd := engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1001", +// Account: "1001", +// Destination: "1002", +// DurationIndex: 0, +// TimeStart: tStart, +// TimeEnd: tStart.Add(time.Duration(20) * time.Second), +// } +// var cc engine.CallCost +// if err := tutLocalRpc.Call("Responder.MaxDebit", cd, &cc); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if cc.GetDuration() == 20 { +// t.Errorf("Calling Responder.MaxDebit got callcost: %v", cc.GetDuration()) +// } +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1001", +// Account: "1001", +// Destination: "1003", +// DurationIndex: 0, +// TimeStart: tStart, +// TimeEnd: tStart.Add(time.Duration(200) * time.Second), +// } +// if err := tutLocalRpc.Call("Responder.MaxDebit", cd, &cc); err != nil { +// t.Error("Got error on Responder.MaxDebit: ", err.Error()) +// } else if cc.GetDuration() == 200 { +// t.Errorf("Calling Responder.MaxDebit got duration: %v", cc.GetDuration()) +// } +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1001", +// Account: "1001", +// Destination: "1007", +// DurationIndex: 0, +// TimeStart: tStart, +// TimeEnd: tStart.Add(time.Duration(120) * time.Second), +// } +// cd.CgrID = "1" +// if err := tutLocalRpc.Call("Responder.MaxDebit", cd, &cc); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if cc.GetDuration() == 120 { +// t.Errorf("Calling Responder.MaxDebit got callcost: %v", cc.GetDuration()) +// } +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1004", +// Account: "1004", +// Destination: "1007", +// DurationIndex: 0, +// TimeStart: tStart, +// TimeEnd: tStart.Add(time.Duration(120) * time.Second), +// } +// cd.CgrID = "2" +// if err := tutLocalRpc.Call("Responder.MaxDebit", cd, &cc); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if cc.GetDuration() != time.Duration(62)*time.Second { // We have as strategy *dsconnect +// t.Errorf("Calling Responder.MaxDebit got callcost: %v", cc.GetDuration()) +// } +// var maxTime float64 +// if err := tutLocalRpc.Call("Responder.GetMaxSessionTime", cd, &maxTime); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if maxTime != 62000000000 { // We have as strategy *dsconnect +// t.Errorf("Calling Responder.GetMaxSessionTime got maxTime: %f", maxTime) +// } +// } -// Check call costs -func TestTutITDerivedMaxSessionTime(t *testing.T) { - tStart := time.Date(2014, 8, 4, 13, 0, 0, 0, time.UTC) - ev := engine.CDR{ - CGRID: utils.Sha1("testevent1", tStart.String()), - ToR: utils.VOICE, - OriginID: "testevent1", - OriginHost: "127.0.0.1", - RequestType: utils.META_PREPAID, - Tenant: "cgrates.org", - Category: "call", - Account: "1004", - Subject: "1004", - Destination: "1007", - SetupTime: tStart, - AnswerTime: tStart, - Usage: time.Duration(120) * time.Second, - Cost: -1, - } - var maxTime float64 - if err := tutLocalRpc.Call("Responder.GetDerivedMaxSessionTime", ev, &maxTime); err != nil { - t.Error("Got error on Responder.GetCost: ", err.Error()) - } else if maxTime != 62000000000 { // We have as strategy *dsconnect - t.Errorf("Calling Responder.GetMaxSessionTime got maxTime: %f", maxTime) - } -} +// // Check call costs +// func TestTutITDerivedMaxSessionTime(t *testing.T) { +// tStart := time.Date(2014, 8, 4, 13, 0, 0, 0, time.UTC) +// ev := engine.CDR{ +// CGRID: utils.Sha1("testevent1", tStart.String()), +// ToR: utils.VOICE, +// OriginID: "testevent1", +// OriginHost: "127.0.0.1", +// RequestType: utils.META_PREPAID, +// Tenant: "cgrates.org", +// Category: "call", +// Account: "1004", +// Subject: "1004", +// Destination: "1007", +// SetupTime: tStart, +// AnswerTime: tStart, +// Usage: time.Duration(120) * time.Second, +// Cost: -1, +// } +// var maxTime float64 +// if err := tutLocalRpc.Call("Responder.GetDerivedMaxSessionTime", ev, &maxTime); err != nil { +// t.Error("Got error on Responder.GetCost: ", err.Error()) +// } else if maxTime != 62000000000 { // We have as strategy *dsconnect +// t.Errorf("Calling Responder.GetMaxSessionTime got maxTime: %f", maxTime) +// } +// } -// Check MaxUsage -func TestTutITMaxUsage(t *testing.T) { - setupReq := &engine.UsageRecord{ToR: utils.VOICE, - RequestType: utils.META_PREPAID, Tenant: "cgrates.org", Category: "call", - Account: "1003", Subject: "1003", Destination: "1001", - SetupTime: "2014-08-04T13:00:00Z", Usage: "1s", - } - var maxTime float64 - if err := tutLocalRpc.Call("ApierV2.GetMaxUsage", setupReq, &maxTime); err != nil { - t.Error(err) - } else if maxTime != 1 { - t.Errorf("Calling ApierV2.MaxUsage got maxTime: %f", maxTime) - } - setupReq = &engine.UsageRecord{ToR: utils.VOICE, RequestType: utils.META_RATED, Tenant: "cgrates.org", Category: "call", - Account: "test_max_usage", Destination: "1001", - SetupTime: "2014-08-04T13:00:00Z", - } - if err := tutLocalRpc.Call("ApierV2.GetMaxUsage", setupReq, &maxTime); err != nil { - t.Error(err) - } else if maxTime != -1 { - t.Errorf("Calling ApierV2.MaxUsage got maxTime: %f", maxTime) - } -} +// // Check MaxUsage +// func TestTutITMaxUsage(t *testing.T) { +// setupReq := &engine.UsageRecord{ToR: utils.VOICE, +// RequestType: utils.META_PREPAID, Tenant: "cgrates.org", Category: "call", +// Account: "1003", Subject: "1003", Destination: "1001", +// SetupTime: "2014-08-04T13:00:00Z", Usage: "1s", +// } +// var maxTime float64 +// if err := tutLocalRpc.Call("ApierV2.GetMaxUsage", setupReq, &maxTime); err != nil { +// t.Error(err) +// } else if maxTime != 1 { +// t.Errorf("Calling ApierV2.MaxUsage got maxTime: %f", maxTime) +// } +// setupReq = &engine.UsageRecord{ToR: utils.VOICE, RequestType: utils.META_RATED, Tenant: "cgrates.org", Category: "call", +// Account: "test_max_usage", Destination: "1001", +// SetupTime: "2014-08-04T13:00:00Z", +// } +// if err := tutLocalRpc.Call("ApierV2.GetMaxUsage", setupReq, &maxTime); err != nil { +// t.Error(err) +// } else if maxTime != -1 { +// t.Errorf("Calling ApierV2.MaxUsage got maxTime: %f", maxTime) +// } +// } -// Check DebitUsage -func TestTutITDebitUsage(t *testing.T) { - setupReq := &engine.UsageRecord{ToR: utils.VOICE, RequestType: utils.META_PREPAID, Tenant: "cgrates.org", Category: "call", - Account: "1003", Subject: "1003", Destination: "1001", - AnswerTime: "2014-08-04T13:00:00Z", Usage: "1", - } - var reply string - if err := tutLocalRpc.Call("ApierV2.DebitUsage", setupReq, &reply); err != nil { - t.Error(err) - } else if reply != utils.OK { - t.Error("Calling ApierV2.DebitUsage reply: ", reply) - } -} +// // Check DebitUsage +// func TestTutITDebitUsage(t *testing.T) { +// setupReq := &engine.UsageRecord{ToR: utils.VOICE, RequestType: utils.META_PREPAID, Tenant: "cgrates.org", Category: "call", +// Account: "1003", Subject: "1003", Destination: "1001", +// AnswerTime: "2014-08-04T13:00:00Z", Usage: "1", +// } +// var reply string +// if err := tutLocalRpc.Call("ApierV2.DebitUsage", setupReq, &reply); err != nil { +// t.Error(err) +// } else if reply != utils.OK { +// t.Error("Calling ApierV2.DebitUsage reply: ", reply) +// } +// } -// Test CDR from external sources -func TestTutITProcessExternalCdr(t *testing.T) { - cdr := &engine.ExternalCDR{ToR: utils.VOICE, - OriginID: "testextcdr1", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, RequestType: utils.META_RATED, - Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1001", - SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", - Usage: "1", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - } - var reply string - if err := tutLocalRpc.Call("CdrsV1.ProcessExternalCdr", cdr, &reply); err != nil { - t.Error("Unexpected error: ", err.Error()) - } else if reply != utils.OK { - t.Error("Unexpected reply received: ", reply) - } -} +// // Test CDR from external sources +// func TestTutITProcessExternalCdr(t *testing.T) { +// cdr := &engine.ExternalCDR{ToR: utils.VOICE, +// OriginID: "testextcdr1", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, RequestType: utils.META_RATED, +// Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1001", +// SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", +// Usage: "1", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, +// } +// var reply string +// if err := tutLocalRpc.Call("CdrsV1.ProcessExternalCdr", cdr, &reply); err != nil { +// t.Error("Unexpected error: ", err.Error()) +// } else if reply != utils.OK { +// t.Error("Unexpected reply received: ", reply) +// } +// } -// Test CDR involving UserProfile -func TestTutITProcessExternalCdrUP(t *testing.T) { - cdr := &engine.ExternalCDR{ToR: utils.VOICE, - OriginID: "testextcdr2", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, - RequestType: utils.USERS, Tenant: utils.USERS, Account: utils.USERS, Destination: "1001", - SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", Usage: "2s", - ExtraFields: map[string]string{"Cli": "+4986517174964", "fieldextr2": "valextr2", "SysUserName": utils.USERS}, - } - var reply string - if err := tutLocalRpc.Call("CdrsV1.ProcessExternalCdr", 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) - eCdr := &engine.ExternalCDR{CGRID: "63a8d2bfeca2cfb790826c3ec461696d6574cfde", OrderID: 2, - ToR: utils.VOICE, - OriginID: "testextcdr2", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, RequestType: utils.META_RATED, - Tenant: "cgrates.org", Category: "call", Account: "1004", Subject: "1004", Destination: "1001", - SetupTime: time.Date(2014, 8, 4, 13, 0, 0, 0, time.UTC).Local().Format(time.RFC3339), - AnswerTime: time.Date(2014, 8, 4, 13, 0, 7, 0, time.UTC).Local().Format(time.RFC3339), Usage: "2s", - ExtraFields: map[string]string{"Cli": "+4986517174964", "fieldextr2": "valextr2", "SysUserName": "danb4"}, - RunID: utils.DEFAULT_RUNID, Cost: 1} - var cdrs []*engine.ExternalCDR - req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, - Accounts: []string{"1004"}, DestinationPrefixes: []string{"1001"}} - if err := tutLocalRpc.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].CGRID != eCdr.CGRID { - t.Errorf("Unexpected CGRID for CDR: %+v", cdrs[0]) - } - if cdrs[0].ToR != eCdr.ToR { - t.Errorf("Unexpected TOR for CDR: %+v", cdrs[0]) - } - if cdrs[0].Source != eCdr.Source { - t.Errorf("Unexpected Source for CDR: %+v", cdrs[0]) - } - if cdrs[0].RequestType != eCdr.RequestType { - t.Errorf("Unexpected RequestType for CDR: %+v", cdrs[0]) - } - if cdrs[0].Tenant != eCdr.Tenant { - t.Errorf("Unexpected Tenant for CDR: %+v", cdrs[0]) - } - if cdrs[0].Category != eCdr.Category { - t.Errorf("Unexpected Category for CDR: %+v", cdrs[0]) - } - if cdrs[0].Account != eCdr.Account { - t.Errorf("Unexpected Account for CDR: %+v", cdrs[0]) - } - if cdrs[0].Subject != eCdr.Subject { - t.Errorf("Unexpected Subject for CDR: %+v", cdrs[0]) - } - if cdrs[0].Destination != eCdr.Destination { - t.Errorf("Unexpected Destination for CDR: %+v", cdrs[0]) - } - if cdrs[0].SetupTime != eCdr.SetupTime { - t.Errorf("Unexpected SetupTime for CDR: %+v", cdrs[0]) - } - if cdrs[0].AnswerTime != eCdr.AnswerTime { - t.Errorf("Unexpected AnswerTime for CDR: %+v", cdrs[0]) - } - if cdrs[0].Usage != eCdr.Usage { - t.Errorf("Unexpected Usage for CDR: %+v", cdrs[0]) - } - } -} +// // Test CDR involving UserProfile +// func TestTutITProcessExternalCdrUP(t *testing.T) { +// cdr := &engine.ExternalCDR{ToR: utils.VOICE, +// OriginID: "testextcdr2", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, +// RequestType: utils.USERS, Tenant: utils.USERS, Account: utils.USERS, Destination: "1001", +// SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", Usage: "2s", +// ExtraFields: map[string]string{"Cli": "+4986517174964", "fieldextr2": "valextr2", "SysUserName": utils.USERS}, +// } +// var reply string +// if err := tutLocalRpc.Call("CdrsV1.ProcessExternalCdr", 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) +// eCdr := &engine.ExternalCDR{CGRID: "63a8d2bfeca2cfb790826c3ec461696d6574cfde", OrderID: 2, +// ToR: utils.VOICE, +// OriginID: "testextcdr2", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, RequestType: utils.META_RATED, +// Tenant: "cgrates.org", Category: "call", Account: "1004", Subject: "1004", Destination: "1001", +// SetupTime: time.Date(2014, 8, 4, 13, 0, 0, 0, time.UTC).Local().Format(time.RFC3339), +// AnswerTime: time.Date(2014, 8, 4, 13, 0, 7, 0, time.UTC).Local().Format(time.RFC3339), Usage: "2s", +// ExtraFields: map[string]string{"Cli": "+4986517174964", "fieldextr2": "valextr2", "SysUserName": "danb4"}, +// RunID: utils.DEFAULT_RUNID, Cost: 1} +// var cdrs []*engine.ExternalCDR +// req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, +// Accounts: []string{"1004"}, DestinationPrefixes: []string{"1001"}} +// if err := tutLocalRpc.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].CGRID != eCdr.CGRID { +// t.Errorf("Unexpected CGRID for CDR: %+v", cdrs[0]) +// } +// if cdrs[0].ToR != eCdr.ToR { +// t.Errorf("Unexpected TOR for CDR: %+v", cdrs[0]) +// } +// if cdrs[0].Source != eCdr.Source { +// t.Errorf("Unexpected Source for CDR: %+v", cdrs[0]) +// } +// if cdrs[0].RequestType != eCdr.RequestType { +// t.Errorf("Unexpected RequestType for CDR: %+v", cdrs[0]) +// } +// if cdrs[0].Tenant != eCdr.Tenant { +// t.Errorf("Unexpected Tenant for CDR: %+v", cdrs[0]) +// } +// if cdrs[0].Category != eCdr.Category { +// t.Errorf("Unexpected Category for CDR: %+v", cdrs[0]) +// } +// if cdrs[0].Account != eCdr.Account { +// t.Errorf("Unexpected Account for CDR: %+v", cdrs[0]) +// } +// if cdrs[0].Subject != eCdr.Subject { +// t.Errorf("Unexpected Subject for CDR: %+v", cdrs[0]) +// } +// if cdrs[0].Destination != eCdr.Destination { +// t.Errorf("Unexpected Destination for CDR: %+v", cdrs[0]) +// } +// if cdrs[0].SetupTime != eCdr.SetupTime { +// t.Errorf("Unexpected SetupTime for CDR: %+v", cdrs[0]) +// } +// if cdrs[0].AnswerTime != eCdr.AnswerTime { +// t.Errorf("Unexpected AnswerTime for CDR: %+v", cdrs[0]) +// } +// if cdrs[0].Usage != eCdr.Usage { +// t.Errorf("Unexpected Usage for CDR: %+v", cdrs[0]) +// } +// } +// } -func TestTutITCostErrors(t *testing.T) { - cdr := &engine.ExternalCDR{ToR: utils.VOICE, - OriginID: "TestTutIT_1", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, RequestType: utils.META_RATED, - Tenant: "cgrates.org", Category: "fake", Account: "2001", Subject: "2001", Destination: "1001", - SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", - Usage: "1", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - } - var reply string - if err := tutLocalRpc.Call("CdrsV1.ProcessExternalCdr", 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) - var cdrs []*engine.ExternalCDR - req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, Accounts: []string{cdr.Account}, DestinationPrefixes: []string{cdr.Destination}} - if err := tutLocalRpc.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].OriginID != cdr.OriginID { - t.Errorf("Unexpected OriginID for Cdr received: %+v", cdrs[0]) - } - if cdrs[0].Cost != -1 { - t.Errorf("Unexpected Cost for Cdr received: %+v", cdrs[0]) - } - } - cdr2 := &engine.ExternalCDR{ToR: utils.VOICE, - OriginID: "TestTutIT_2", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, RequestType: utils.META_POSTPAID, - Tenant: "cgrates.org", Category: "fake", Account: "2002", Subject: "2002", Destination: "1001", - SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", - Usage: "1", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - } - if err := tutLocalRpc.Call("CdrsV1.ProcessExternalCdr", cdr2, &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) // Give time for CDR to be processed - req = utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, Accounts: []string{cdr2.Account}, DestinationPrefixes: []string{cdr2.Destination}} - if err := tutLocalRpc.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].OriginID != cdr2.OriginID { - t.Errorf("Unexpected OriginID for Cdr received: %+v", cdrs[0]) - } - if cdrs[0].Cost != -1 { - t.Errorf("Unexpected Cost for Cdr received: %+v", cdrs[0]) - } - } - cdr3 := &engine.ExternalCDR{ToR: utils.VOICE, - OriginID: "TestTutIT_3", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, RequestType: utils.META_POSTPAID, - Tenant: "cgrates.org", Category: "fake", Account: "1001", Subject: "1001", Destination: "2002", - SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", - Usage: "1", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - } - if err := tutLocalRpc.Call("CdrsV1.ProcessExternalCdr", cdr3, &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) // Give time for CDR to be processed - req = utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, Accounts: []string{cdr3.Account}, DestinationPrefixes: []string{cdr3.Destination}} - if err := tutLocalRpc.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].OriginID != cdr3.OriginID { - t.Errorf("Unexpected OriginID for Cdr received: %+v", cdrs[0]) - } - if cdrs[0].Cost != -1 { - t.Errorf("Unexpected Cost for Cdr received: %+v", cdrs[0]) - } - } -} +// func TestTutITCostErrors(t *testing.T) { +// cdr := &engine.ExternalCDR{ToR: utils.VOICE, +// OriginID: "TestTutIT_1", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, RequestType: utils.META_RATED, +// Tenant: "cgrates.org", Category: "fake", Account: "2001", Subject: "2001", Destination: "1001", +// SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", +// Usage: "1", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, +// } +// var reply string +// if err := tutLocalRpc.Call("CdrsV1.ProcessExternalCdr", 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) +// var cdrs []*engine.ExternalCDR +// req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, Accounts: []string{cdr.Account}, DestinationPrefixes: []string{cdr.Destination}} +// if err := tutLocalRpc.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].OriginID != cdr.OriginID { +// t.Errorf("Unexpected OriginID for Cdr received: %+v", cdrs[0]) +// } +// if cdrs[0].Cost != -1 { +// t.Errorf("Unexpected Cost for Cdr received: %+v", cdrs[0]) +// } +// } +// cdr2 := &engine.ExternalCDR{ToR: utils.VOICE, +// OriginID: "TestTutIT_2", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, RequestType: utils.META_POSTPAID, +// Tenant: "cgrates.org", Category: "fake", Account: "2002", Subject: "2002", Destination: "1001", +// SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", +// Usage: "1", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, +// } +// if err := tutLocalRpc.Call("CdrsV1.ProcessExternalCdr", cdr2, &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) // Give time for CDR to be processed +// req = utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, Accounts: []string{cdr2.Account}, DestinationPrefixes: []string{cdr2.Destination}} +// if err := tutLocalRpc.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].OriginID != cdr2.OriginID { +// t.Errorf("Unexpected OriginID for Cdr received: %+v", cdrs[0]) +// } +// if cdrs[0].Cost != -1 { +// t.Errorf("Unexpected Cost for Cdr received: %+v", cdrs[0]) +// } +// } +// cdr3 := &engine.ExternalCDR{ToR: utils.VOICE, +// OriginID: "TestTutIT_3", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, RequestType: utils.META_POSTPAID, +// Tenant: "cgrates.org", Category: "fake", Account: "1001", Subject: "1001", Destination: "2002", +// SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", +// Usage: "1", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, +// } +// if err := tutLocalRpc.Call("CdrsV1.ProcessExternalCdr", cdr3, &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) // Give time for CDR to be processed +// req = utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, Accounts: []string{cdr3.Account}, DestinationPrefixes: []string{cdr3.Destination}} +// if err := tutLocalRpc.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].OriginID != cdr3.OriginID { +// t.Errorf("Unexpected OriginID for Cdr received: %+v", cdrs[0]) +// } +// if cdrs[0].Cost != -1 { +// t.Errorf("Unexpected Cost for Cdr received: %+v", cdrs[0]) +// } +// } +// } -// Make sure queueids were created -func TestTutITCdrStats(t *testing.T) { - var queueIds []string - eQueueIds := []string{"CDRST1", "CDRST_1001", "CDRST_1002", "CDRST_1003", "STATS_SUPPL1", "STATS_SUPPL2"} - if err := tutLocalRpc.Call("CDRStatsV1.GetQueueIds", "", &queueIds); err != nil { - t.Error("Calling CDRStatsV1.GetQueueIds, got error: ", err.Error()) - } else if len(eQueueIds) != len(queueIds) { - t.Errorf("Expecting: %v, received: %v", eQueueIds, queueIds) - } -} +// // Make sure queueids were created +// func TestTutITCdrStats(t *testing.T) { +// var queueIds []string +// eQueueIds := []string{"CDRST1", "CDRST_1001", "CDRST_1002", "CDRST_1003", "STATS_SUPPL1", "STATS_SUPPL2"} +// if err := tutLocalRpc.Call("CDRStatsV1.GetQueueIds", "", &queueIds); err != nil { +// t.Error("Calling CDRStatsV1.GetQueueIds, got error: ", err.Error()) +// } else if len(eQueueIds) != len(queueIds) { +// t.Errorf("Expecting: %v, received: %v", eQueueIds, queueIds) +// } +// } -func TestTutITLeastCost(t *testing.T) { - tStart, _ := utils.ParseDate("2014-08-04T13:00:00Z") - tEnd, _ := utils.ParseDate("2014-08-04T13:01:00Z") - cd := engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1005", - Account: "1005", - Destination: "1002", - TimeStart: tStart, - TimeEnd: tEnd, - } - eStLcr := &engine.LCRCost{ - Entry: &engine.LCREntry{DestinationId: "DST_1002", RPCategory: "lcr_profile2", Strategy: engine.LCR_STRATEGY_LOWEST, StrategyParams: "", Weight: 10.0}, - SupplierCosts: []*engine.LCRSupplierCost{ - {Supplier: "*out:cgrates.org:lcr_profile2:suppl3", Cost: 0.01, Duration: 60 * time.Second}, - {Supplier: "*out:cgrates.org:lcr_profile2:suppl1", Cost: 0.6, Duration: 60 * time.Second}, - {Supplier: "*out:cgrates.org:lcr_profile2:suppl2", Cost: 1.2, Duration: 60 * time.Second}, - }, - } - var lcr engine.LCRCost - cd.CgrID = "10" - cd.RunID = "10" - if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { - t.Error(err) - } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { - t.Errorf("Expecting: %+v, received: %+v", eStLcr.Entry, lcr.Entry) - } else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) { - t.Errorf("Expecting: %+v, received: %+v", eStLcr.SupplierCosts, lcr.SupplierCosts) - } - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1005", - Account: "1005", - Destination: "1003", - TimeStart: tStart, - TimeEnd: tEnd, - } - eStLcr = &engine.LCRCost{ - Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_LOWEST, StrategyParams: "", Weight: 10.0}, - SupplierCosts: []*engine.LCRSupplierCost{ - {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second}, - {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 1.2, Duration: 60 * time.Second}, - }, - } - eStLcr2 := &engine.LCRCost{ - Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_LOWEST, StrategyParams: "", Weight: 10.0}, - SupplierCosts: []*engine.LCRSupplierCost{ - {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 1.2, Duration: 60 * time.Second}, - {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second}, - }, - } - cd.CgrID = "11" - cd.RunID = "11" - if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { - t.Error(err) - } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { - t.Errorf("Expecting: %+v, received: %+v", eStLcr.Entry, lcr.Entry) - } else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) && !reflect.DeepEqual(eStLcr2.SupplierCosts, lcr.SupplierCosts) { - t.Errorf("Expecting: %+v, received: %+v", eStLcr.SupplierCosts[0], lcr.SupplierCosts[0]) - } -} +// func TestTutITLeastCost(t *testing.T) { +// tStart, _ := utils.ParseDate("2014-08-04T13:00:00Z") +// tEnd, _ := utils.ParseDate("2014-08-04T13:01:00Z") +// cd := engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1005", +// Account: "1005", +// Destination: "1002", +// TimeStart: tStart, +// TimeEnd: tEnd, +// } +// eStLcr := &engine.LCRCost{ +// Entry: &engine.LCREntry{DestinationId: "DST_1002", RPCategory: "lcr_profile2", Strategy: engine.LCR_STRATEGY_LOWEST, StrategyParams: "", Weight: 10.0}, +// SupplierCosts: []*engine.LCRSupplierCost{ +// {Supplier: "*out:cgrates.org:lcr_profile2:suppl3", Cost: 0.01, Duration: 60 * time.Second}, +// {Supplier: "*out:cgrates.org:lcr_profile2:suppl1", Cost: 0.6, Duration: 60 * time.Second}, +// {Supplier: "*out:cgrates.org:lcr_profile2:suppl2", Cost: 1.2, Duration: 60 * time.Second}, +// }, +// } +// var lcr engine.LCRCost +// cd.CgrID = "10" +// cd.RunID = "10" +// if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { +// t.Error(err) +// } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { +// t.Errorf("Expecting: %+v, received: %+v", eStLcr.Entry, lcr.Entry) +// } else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) { +// t.Errorf("Expecting: %+v, received: %+v", eStLcr.SupplierCosts, lcr.SupplierCosts) +// } +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1005", +// Account: "1005", +// Destination: "1003", +// TimeStart: tStart, +// TimeEnd: tEnd, +// } +// eStLcr = &engine.LCRCost{ +// Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_LOWEST, StrategyParams: "", Weight: 10.0}, +// SupplierCosts: []*engine.LCRSupplierCost{ +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second}, +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 1.2, Duration: 60 * time.Second}, +// }, +// } +// eStLcr2 := &engine.LCRCost{ +// Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_LOWEST, StrategyParams: "", Weight: 10.0}, +// SupplierCosts: []*engine.LCRSupplierCost{ +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 1.2, Duration: 60 * time.Second}, +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second}, +// }, +// } +// cd.CgrID = "11" +// cd.RunID = "11" +// if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { +// t.Error(err) +// } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { +// t.Errorf("Expecting: %+v, received: %+v", eStLcr.Entry, lcr.Entry) +// } else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) && !reflect.DeepEqual(eStLcr2.SupplierCosts, lcr.SupplierCosts) { +// t.Errorf("Expecting: %+v, received: %+v", eStLcr.SupplierCosts[0], lcr.SupplierCosts[0]) +// } +// } -// Check LCR -func TestTutITLcrStatic(t *testing.T) { - tStart, _ := utils.ParseDate("2014-08-04T13:00:00Z") - tEnd, _ := utils.ParseDate("2014-08-04T13:01:00Z") - cd := engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1001", - Account: "1001", - Destination: "1002", - TimeStart: tStart, - TimeEnd: tEnd, - } - eStLcr := &engine.LCRCost{ - Entry: &engine.LCREntry{DestinationId: "DST_1002", RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_STATIC, StrategyParams: "suppl2;suppl1", Weight: 10.0}, - SupplierCosts: []*engine.LCRSupplierCost{ - {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 0.6, Duration: 60 * time.Second}, - {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second}, - }, - } - var lcr engine.LCRCost - cd.CgrID = "1" - cd.RunID = "1" - if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { - t.Error(err) - } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { - t.Errorf("Expecting: %+v, received: %+v", eStLcr.Entry, lcr.Entry) - } else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) { - t.Errorf("Expecting: %+v, received: %+v", eStLcr.SupplierCosts[0], lcr.SupplierCosts[0]) - } - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1001", - Account: "1001", - Destination: "1003", - TimeStart: tStart, - TimeEnd: tEnd, - } - eStLcr = &engine.LCRCost{ - Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_STATIC, StrategyParams: "suppl1;suppl2", Weight: 10.0}, - SupplierCosts: []*engine.LCRSupplierCost{ - {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second}, - {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 1.2, Duration: 60 * time.Second}, - }, - } - cd.CgrID = "2" - cd.RunID = "2" - if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { - t.Error(err) - } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { - t.Errorf("Expecting: %+v, received: %+v", eStLcr.Entry, lcr.Entry) - } else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) { - t.Errorf("Expecting: %+v, received: %+v", eStLcr.SupplierCosts[0], lcr.SupplierCosts[0]) - } -} +// // Check LCR +// func TestTutITLcrStatic(t *testing.T) { +// tStart, _ := utils.ParseDate("2014-08-04T13:00:00Z") +// tEnd, _ := utils.ParseDate("2014-08-04T13:01:00Z") +// cd := engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1001", +// Account: "1001", +// Destination: "1002", +// TimeStart: tStart, +// TimeEnd: tEnd, +// } +// eStLcr := &engine.LCRCost{ +// Entry: &engine.LCREntry{DestinationId: "DST_1002", RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_STATIC, StrategyParams: "suppl2;suppl1", Weight: 10.0}, +// SupplierCosts: []*engine.LCRSupplierCost{ +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 0.6, Duration: 60 * time.Second}, +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second}, +// }, +// } +// var lcr engine.LCRCost +// cd.CgrID = "1" +// cd.RunID = "1" +// if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { +// t.Error(err) +// } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { +// t.Errorf("Expecting: %+v, received: %+v", eStLcr.Entry, lcr.Entry) +// } else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) { +// t.Errorf("Expecting: %+v, received: %+v", eStLcr.SupplierCosts[0], lcr.SupplierCosts[0]) +// } +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1001", +// Account: "1001", +// Destination: "1003", +// TimeStart: tStart, +// TimeEnd: tEnd, +// } +// eStLcr = &engine.LCRCost{ +// Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_STATIC, StrategyParams: "suppl1;suppl2", Weight: 10.0}, +// SupplierCosts: []*engine.LCRSupplierCost{ +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second}, +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 1.2, Duration: 60 * time.Second}, +// }, +// } +// cd.CgrID = "2" +// cd.RunID = "2" +// if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { +// t.Error(err) +// } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { +// t.Errorf("Expecting: %+v, received: %+v", eStLcr.Entry, lcr.Entry) +// } else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) { +// t.Errorf("Expecting: %+v, received: %+v", eStLcr.SupplierCosts[0], lcr.SupplierCosts[0]) +// } +// } -func TestTutITLcrHighestCost(t *testing.T) { - tStart, _ := utils.ParseDate("2014-08-04T13:00:00Z") - tEnd, _ := utils.ParseDate("2014-08-04T13:01:00Z") - cd := engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1002", - Account: "1002", - Destination: "1002", - TimeStart: tStart, - TimeEnd: tEnd, - } - eStLcr := &engine.LCRCost{ - Entry: &engine.LCREntry{DestinationId: "DST_1002", RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_HIGHEST, StrategyParams: "", Weight: 10.0}, - SupplierCosts: []*engine.LCRSupplierCost{ - {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second}, - {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 0.6, Duration: 60 * time.Second}, - }, - } - var lcr engine.LCRCost - if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { - t.Error(err) - } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { - t.Errorf("Expecting: %+v, received: %+v", eStLcr.Entry, lcr.Entry) - } else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) { - t.Errorf("Expecting: %+v, received: %+v", eStLcr.SupplierCosts[0], lcr.SupplierCosts[0]) - } - // LCR with Alias - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1006", - Account: "1006", - Destination: "1002", - TimeStart: tStart, - TimeEnd: tEnd, - } - if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { - t.Error(err) - } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { - t.Errorf("Expecting: %+v, received: %+v", eStLcr.Entry, lcr.Entry) - } else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) { - t.Errorf("Expecting: %+v, received: %+v", eStLcr.SupplierCosts[0], lcr.SupplierCosts[0]) - } -} +// func TestTutITLcrHighestCost(t *testing.T) { +// tStart, _ := utils.ParseDate("2014-08-04T13:00:00Z") +// tEnd, _ := utils.ParseDate("2014-08-04T13:01:00Z") +// cd := engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1002", +// Account: "1002", +// Destination: "1002", +// TimeStart: tStart, +// TimeEnd: tEnd, +// } +// eStLcr := &engine.LCRCost{ +// Entry: &engine.LCREntry{DestinationId: "DST_1002", RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_HIGHEST, StrategyParams: "", Weight: 10.0}, +// SupplierCosts: []*engine.LCRSupplierCost{ +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second}, +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 0.6, Duration: 60 * time.Second}, +// }, +// } +// var lcr engine.LCRCost +// if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { +// t.Error(err) +// } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { +// t.Errorf("Expecting: %+v, received: %+v", eStLcr.Entry, lcr.Entry) +// } else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) { +// t.Errorf("Expecting: %+v, received: %+v", eStLcr.SupplierCosts[0], lcr.SupplierCosts[0]) +// } +// // LCR with Alias +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1006", +// Account: "1006", +// Destination: "1002", +// TimeStart: tStart, +// TimeEnd: tEnd, +// } +// if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { +// t.Error(err) +// } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { +// t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(eStLcr.Entry), utils.ToJSON(lcr.Entry)) +// } else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) { +// t.Errorf("Expecting: %+v, received: %+v", eStLcr.SupplierCosts[0], lcr.SupplierCosts[0]) +// } +// } -func TestTutITLcrQos(t *testing.T) { - tStart, _ := utils.ParseDate("2014-08-04T13:00:00Z") - tEnd, _ := utils.ParseDate("2014-08-04T13:01:00Z") - cd := engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1002", - Account: "1002", - Destination: "1003", - TimeStart: tStart, - TimeEnd: tEnd, - } - eStLcr := &engine.LCRCost{ - Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", - Strategy: engine.LCR_STRATEGY_QOS, StrategyParams: "", Weight: 10.0}, - SupplierCosts: []*engine.LCRSupplierCost{ - {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", - Cost: 1.2, Duration: 60 * time.Second, - QOS: map[string]float64{engine.TCD: -1, engine.ACC: -1, engine.TCC: -1, - engine.ASR: -1, engine.ACD: -1, engine.DDC: -1}}, - {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", - Cost: 1.2, Duration: 60 * time.Second, - QOS: map[string]float64{engine.TCD: -1, engine.ACC: -1, engine.TCC: -1, - engine.ASR: -1, engine.ACD: -1, engine.DDC: -1}}, - }, - } - /* - eStLcr2 := &engine.LCRCost{ - Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", - Strategy: engine.LCR_STRATEGY_QOS, StrategyParams: "", Weight: 10.0}, - SupplierCosts: []*engine.LCRSupplierCost{ - &engine.LCRSupplierCost{Supplier: "*out:cgrates.org:lcr_profile1:suppl2", - Cost: 1.2, Duration: 60 * time.Second, - QOS: map[string]float64{engine.TCD: -1, engine.ACC: -1, engine.TCC: -1, - engine.ASR: -1, engine.ACD: -1, engine.DDC: -1}}, - &engine.LCRSupplierCost{Supplier: "*out:cgrates.org:lcr_profile1:suppl1", - Cost: 1.2, Duration: 60 * time.Second, - QOS: map[string]float64{engine.TCD: -1, engine.ACC: -1, engine.TCC: -1, - engine.ASR: -1, engine.ACD: -1, engine.DDC: -1}}, - }, - } - */ - var lcr engine.LCRCost - // Since there is no real quality difference, the suppliers will come in random order here - cd.CgrID = "3" - cd.RunID = "3" - /* - if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { - t.Error(err) - } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { - t.Errorf("Expecting: %+v, received: %+v", eStLcr.Entry, lcr.Entry) - } else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) && - !reflect.DeepEqual(eStLcr2.SupplierCosts, lcr.SupplierCosts) { - t.Errorf("Expecting: %+v, received: %+v", eStLcr.SupplierCosts[0], lcr.SupplierCosts[0]) - } - */ - // Post some CDRs to influence stats - testCdr1 := &engine.CDR{CGRID: utils.Sha1("testcdr1", - time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), - ToR: utils.VOICE, OriginID: "testcdr1", OriginHost: "192.168.1.1", - Source: "TEST_QOS_LCR", RequestType: utils.META_RATED, - Tenant: "cgrates.org", Category: "call", Account: "1001", - Subject: "1001", Destination: "1002", - SetupTime: time.Date(2014, 12, 7, 8, 42, 24, 0, time.UTC), - AnswerTime: time.Date(2014, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(2) * time.Minute, - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}} - testCdr2 := &engine.CDR{CGRID: utils.Sha1("testcdr2", - time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), - ToR: utils.VOICE, OriginID: "testcdr2", OriginHost: "192.168.1.1", - Source: "TEST_QOS_LCR", RequestType: utils.META_RATED, - Tenant: "cgrates.org", Category: "call", Account: "1002", - Subject: "1002", Destination: "1003", - SetupTime: time.Date(2014, 12, 7, 8, 42, 24, 0, time.UTC), - AnswerTime: time.Date(2014, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(90) * time.Second, - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}} - var reply string - for _, cdr := range []*engine.CDR{testCdr1, testCdr2} { - if err := tutLocalRpc.Call("CdrsV1.ProcessCdr", cdr, &reply); err != nil { - t.Error("Unexpected error: ", err.Error()) - } else if reply != utils.OK { - t.Error("Unexpected reply received: ", reply) - } - } - // Based on stats, supplier1 should always be better since he has a higer ACD - eStLcr = &engine.LCRCost{ - Entry: &engine.LCREntry{DestinationId: utils.ANY, - RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_QOS, - StrategyParams: "", Weight: 10.0}, - SupplierCosts: []*engine.LCRSupplierCost{ - { - Supplier: "*out:cgrates.org:lcr_profile1:suppl1", - Cost: 1.2, Duration: 60 * time.Second, - QOS: map[string]float64{engine.TCD: 240, engine.ACC: 0.35, - engine.TCC: 0.7, engine.ASR: 100, engine.ACD: 120}}, - { - Supplier: "*out:cgrates.org:lcr_profile1:suppl2", - Cost: 1.2, Duration: 60 * time.Second, - QOS: map[string]float64{engine.TCD: 90, engine.ACC: 0.325, - engine.TCC: 0.325, engine.ASR: 100, engine.ACD: 90}}, - }, - } - cd.CgrID = "4" - cd.RunID = "4" - if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { - t.Error(err) - } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { - t.Errorf("Expecting: %+v, received: %+v", eStLcr.Entry, lcr.Entry) - //} else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) && !reflect.DeepEqual(eStLcr2.SupplierCosts, lcr.SupplierCosts) { - // t.Errorf("Expecting: %+v, %+v, received: %+v, %+v", eStLcr.SupplierCosts[0], eStLcr.SupplierCosts[1], lcr.SupplierCosts[0], lcr.SupplierCosts[1]) - } - testCdr3 := &engine.CDR{CGRID: utils.Sha1("testcdr3", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), - ToR: utils.VOICE, OriginID: "testcdr3", OriginHost: "192.168.1.1", Source: "TEST_QOS_LCR", RequestType: utils.META_RATED, - Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1004", - SetupTime: time.Date(2014, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2014, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(180) * time.Second} - if err := tutLocalRpc.Call("CdrsV1.ProcessCdr", testCdr3, &reply); err != nil { - t.Error("Unexpected error: ", err.Error()) - } else if reply != utils.OK { - t.Error("Unexpected reply received: ", reply) - } - // Since ACD has considerably increased for supplier2, we should have it as first prio now - eStLcr = &engine.LCRCost{ - Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_QOS, StrategyParams: "", Weight: 10.0}, - SupplierCosts: []*engine.LCRSupplierCost{ - {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 1.2, Duration: 60 * time.Second, - QOS: map[string]float64{engine.TCD: 270, engine.ACC: 0.3625, engine.TCC: 0.725, engine.ASR: 100, engine.ACD: 135}}, - {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second, - QOS: map[string]float64{engine.TCD: 240, engine.ACC: 0.35, engine.TCC: 0.7, engine.ASR: 100, engine.ACD: 120}}, - }, - } - cd.CgrID = "5" - cd.RunID = "5" - if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { - t.Error(err) - } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { - t.Errorf("Expecting: %+v, received: %+v", eStLcr.Entry, lcr.Entry) - //} else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) && !reflect.DeepEqual(eStLcr2.SupplierCosts, lcr.SupplierCosts) { - // t.Errorf("Expecting: %+v, %+v, received: %+v, %+v", eStLcr.SupplierCosts[0], eStLcr.SupplierCosts[1], lcr.SupplierCosts[0], lcr.SupplierCosts[1]) - } -} +// func TestTutITLcrQos(t *testing.T) { +// tStart, _ := utils.ParseDate("2014-08-04T13:00:00Z") +// tEnd, _ := utils.ParseDate("2014-08-04T13:01:00Z") +// cd := engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1002", +// Account: "1002", +// Destination: "1003", +// TimeStart: tStart, +// TimeEnd: tEnd, +// } +// eStLcr := &engine.LCRCost{ +// Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", +// Strategy: engine.LCR_STRATEGY_QOS, StrategyParams: "", Weight: 10.0}, +// SupplierCosts: []*engine.LCRSupplierCost{ +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", +// Cost: 1.2, Duration: 60 * time.Second, +// QOS: map[string]float64{engine.TCD: -1, engine.ACC: -1, engine.TCC: -1, +// engine.ASR: -1, engine.ACD: -1, engine.DDC: -1}}, +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", +// Cost: 1.2, Duration: 60 * time.Second, +// QOS: map[string]float64{engine.TCD: -1, engine.ACC: -1, engine.TCC: -1, +// engine.ASR: -1, engine.ACD: -1, engine.DDC: -1}}, +// }, +// } +// /* +// eStLcr2 := &engine.LCRCost{ +// Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", +// Strategy: engine.LCR_STRATEGY_QOS, StrategyParams: "", Weight: 10.0}, +// SupplierCosts: []*engine.LCRSupplierCost{ +// &engine.LCRSupplierCost{Supplier: "*out:cgrates.org:lcr_profile1:suppl2", +// Cost: 1.2, Duration: 60 * time.Second, +// QOS: map[string]float64{engine.TCD: -1, engine.ACC: -1, engine.TCC: -1, +// engine.ASR: -1, engine.ACD: -1, engine.DDC: -1}}, +// &engine.LCRSupplierCost{Supplier: "*out:cgrates.org:lcr_profile1:suppl1", +// Cost: 1.2, Duration: 60 * time.Second, +// QOS: map[string]float64{engine.TCD: -1, engine.ACC: -1, engine.TCC: -1, +// engine.ASR: -1, engine.ACD: -1, engine.DDC: -1}}, +// }, +// } +// */ +// var lcr engine.LCRCost +// // Since there is no real quality difference, the suppliers will come in random order here +// cd.CgrID = "3" +// cd.RunID = "3" +// /* +// if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { +// t.Error(err) +// } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { +// t.Errorf("Expecting: %+v, received: %+v", eStLcr.Entry, lcr.Entry) +// } else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) && +// !reflect.DeepEqual(eStLcr2.SupplierCosts, lcr.SupplierCosts) { +// t.Errorf("Expecting: %+v, received: %+v", eStLcr.SupplierCosts[0], lcr.SupplierCosts[0]) +// } +// */ +// // Post some CDRs to influence stats +// testCdr1 := &engine.CDR{CGRID: utils.Sha1("testcdr1", +// time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), +// ToR: utils.VOICE, OriginID: "testcdr1", OriginHost: "192.168.1.1", +// Source: "TEST_QOS_LCR", RequestType: utils.META_RATED, +// Tenant: "cgrates.org", Category: "call", Account: "1001", +// Subject: "1001", Destination: "1002", +// SetupTime: time.Date(2014, 12, 7, 8, 42, 24, 0, time.UTC), +// AnswerTime: time.Date(2014, 12, 7, 8, 42, 26, 0, time.UTC), +// Usage: time.Duration(2) * time.Minute, +// ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}} +// testCdr2 := &engine.CDR{CGRID: utils.Sha1("testcdr2", +// time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), +// ToR: utils.VOICE, OriginID: "testcdr2", OriginHost: "192.168.1.1", +// Source: "TEST_QOS_LCR", RequestType: utils.META_RATED, +// Tenant: "cgrates.org", Category: "call", Account: "1002", +// Subject: "1002", Destination: "1003", +// SetupTime: time.Date(2014, 12, 7, 8, 42, 24, 0, time.UTC), +// AnswerTime: time.Date(2014, 12, 7, 8, 42, 26, 0, time.UTC), +// Usage: time.Duration(90) * time.Second, +// ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}} +// var reply string +// for _, cdr := range []*engine.CDR{testCdr1, testCdr2} { +// if err := tutLocalRpc.Call("CdrsV1.ProcessCdr", cdr, &reply); err != nil { +// t.Error("Unexpected error: ", err.Error()) +// } else if reply != utils.OK { +// t.Error("Unexpected reply received: ", reply) +// } +// } +// // Based on stats, supplier1 should always be better since he has a higer ACD +// eStLcr = &engine.LCRCost{ +// Entry: &engine.LCREntry{DestinationId: utils.ANY, +// RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_QOS, +// StrategyParams: "", Weight: 10.0}, +// SupplierCosts: []*engine.LCRSupplierCost{ +// { +// Supplier: "*out:cgrates.org:lcr_profile1:suppl1", +// Cost: 1.2, Duration: 60 * time.Second, +// QOS: map[string]float64{engine.TCD: 240, engine.ACC: 0.35, +// engine.TCC: 0.7, engine.ASR: 100, engine.ACD: 120}}, +// { +// Supplier: "*out:cgrates.org:lcr_profile1:suppl2", +// Cost: 1.2, Duration: 60 * time.Second, +// QOS: map[string]float64{engine.TCD: 90, engine.ACC: 0.325, +// engine.TCC: 0.325, engine.ASR: 100, engine.ACD: 90}}, +// }, +// } +// cd.CgrID = "4" +// cd.RunID = "4" +// if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { +// t.Error(err) +// } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { +// t.Errorf("Expecting: %+v, received: %+v", eStLcr.Entry, lcr.Entry) +// //} else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) && !reflect.DeepEqual(eStLcr2.SupplierCosts, lcr.SupplierCosts) { +// // t.Errorf("Expecting: %+v, %+v, received: %+v, %+v", eStLcr.SupplierCosts[0], eStLcr.SupplierCosts[1], lcr.SupplierCosts[0], lcr.SupplierCosts[1]) +// } +// testCdr3 := &engine.CDR{CGRID: utils.Sha1("testcdr3", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), +// ToR: utils.VOICE, OriginID: "testcdr3", OriginHost: "192.168.1.1", Source: "TEST_QOS_LCR", RequestType: utils.META_RATED, +// Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1004", +// SetupTime: time.Date(2014, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2014, 12, 7, 8, 42, 26, 0, time.UTC), +// Usage: time.Duration(180) * time.Second} +// if err := tutLocalRpc.Call("CdrsV1.ProcessCdr", testCdr3, &reply); err != nil { +// t.Error("Unexpected error: ", err.Error()) +// } else if reply != utils.OK { +// t.Error("Unexpected reply received: ", reply) +// } +// // Since ACD has considerably increased for supplier2, we should have it as first prio now +// eStLcr = &engine.LCRCost{ +// Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_QOS, StrategyParams: "", Weight: 10.0}, +// SupplierCosts: []*engine.LCRSupplierCost{ +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 1.2, Duration: 60 * time.Second, +// QOS: map[string]float64{engine.TCD: 270, engine.ACC: 0.3625, engine.TCC: 0.725, engine.ASR: 100, engine.ACD: 135}}, +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second, +// QOS: map[string]float64{engine.TCD: 240, engine.ACC: 0.35, engine.TCC: 0.7, engine.ASR: 100, engine.ACD: 120}}, +// }, +// } +// cd.CgrID = "5" +// cd.RunID = "5" +// if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { +// t.Error(err) +// } else if !reflect.DeepEqual(eStLcr.Entry, lcr.Entry) { +// t.Errorf("Expecting: %+v, received: %+v", eStLcr.Entry, lcr.Entry) +// //} else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) && !reflect.DeepEqual(eStLcr2.SupplierCosts, lcr.SupplierCosts) { +// // t.Errorf("Expecting: %+v, %+v, received: %+v, %+v", eStLcr.SupplierCosts[0], eStLcr.SupplierCosts[1], lcr.SupplierCosts[0], lcr.SupplierCosts[1]) +// } +// } -func TestTutITLcrQosThreshold(t *testing.T) { - tStart, _ := utils.ParseDate("2014-08-04T13:00:00Z") - tEnd, _ := utils.ParseDate("2014-08-04T13:01:00Z") - cd := engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1003", - Account: "1003", - Destination: "1002", - TimeStart: tStart, - TimeEnd: tEnd, - } - eLcr := &engine.LCRCost{ - Entry: &engine.LCREntry{DestinationId: "DST_1002", RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_QOS_THRESHOLD, StrategyParams: "20;;;;2m;;;;;;;", Weight: 10.0}, - SupplierCosts: []*engine.LCRSupplierCost{ - {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 0.6, Duration: 60 * time.Second, - QOS: map[string]float64{engine.TCD: 270, engine.ACC: 0.3625, engine.TCC: 0.725, engine.ASR: 100, engine.ACD: 135}}, - {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second, - QOS: map[string]float64{engine.TCD: 240, engine.ACC: 0.35, engine.TCC: 0.7, engine.ASR: 100, engine.ACD: 120}}, - }, - } - var lcr engine.LCRCost - cd.CgrID = "6" - cd.RunID = "6" - if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { - t.Error(err) - } else if !reflect.DeepEqual(eLcr.Entry, lcr.Entry) { - t.Errorf("Expecting: %+v, received: %+v", eLcr.Entry, lcr.Entry) - //} else if !reflect.DeepEqual(eLcr.SupplierCosts, lcr.SupplierCosts) { - // t.Errorf("Expecting: %+v, %+v received: %+v, %+v", eLcr.SupplierCosts[0], eLcr.SupplierCosts[1], lcr.SupplierCosts[0], lcr.SupplierCosts[1]) - } - testCdr4 := &engine.CDR{CGRID: utils.Sha1("testcdr4", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), - ToR: utils.VOICE, OriginID: "testcdr4", OriginHost: "192.168.1.1", Source: "TEST_QOS_LCR", RequestType: utils.META_RATED, - Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1004", - SetupTime: time.Date(2014, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2014, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(60) * time.Second} - var reply string - if err := tutLocalRpc.Call("CdrsV1.ProcessCdr", testCdr4, &reply); err != nil { // Should drop ACD under the 2m required by threshold, removing suppl2 from lcr - t.Error("Unexpected error: ", err.Error()) - } else if reply != utils.OK { - t.Error("Unexpected reply received: ", reply) - } - eLcr = &engine.LCRCost{ - Entry: &engine.LCREntry{DestinationId: "DST_1002", RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_QOS_THRESHOLD, StrategyParams: "20;;;;2m;;;;;;;", Weight: 10.0}, - SupplierCosts: []*engine.LCRSupplierCost{ - {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second, - QOS: map[string]float64{engine.TCD: 240, engine.ACC: 0.35, engine.TCC: 0.7, engine.ASR: 100, engine.ACD: 120}}, - }, - } - cd.CgrID = "7" - cd.RunID = "7" - if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { - t.Error(err) - } else if !reflect.DeepEqual(eLcr.Entry, lcr.Entry) { - t.Errorf("Expecting: %+v, received: %+v", eLcr.Entry, lcr.Entry) - //} else if !reflect.DeepEqual(eLcr.SupplierCosts, lcr.SupplierCosts) { - // t.Errorf("Expecting: %+v, received: %+v", eLcr.SupplierCosts[0], lcr.SupplierCosts[0]) - } - cd = engine.CallDescriptor{ - Direction: "*out", - Category: "call", - Tenant: "cgrates.org", - Subject: "1003", - Account: "1003", - Destination: "1004", - TimeStart: tStart, - TimeEnd: tEnd, - } - eLcr = &engine.LCRCost{ - Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_QOS_THRESHOLD, StrategyParams: "40;;;;90s;;;;;;;", Weight: 10.0}, - SupplierCosts: []*engine.LCRSupplierCost{ - {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second, - QOS: map[string]float64{engine.TCD: 240, engine.ACC: 0.35, engine.TCC: 0.7, engine.ASR: 100, engine.ACD: 120}}, - {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 1.2, Duration: 60 * time.Second, - QOS: map[string]float64{engine.TCD: 330, engine.ACC: 0.3416666667, engine.TCC: 1.025, engine.ASR: 100, engine.ACD: 110}}, - }, - } - /*eLcr2 := &engine.LCRCost{ - Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_QOS_THRESHOLD, StrategyParams: "40;;90s;;;;;;;", Weight: 10.0}, - SupplierCosts: []*engine.LCRSupplierCost{ - &engine.LCRSupplierCost{Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 1.2, Duration: 60 * time.Second, - QOS: map[string]float64{engine.TCD: 330, engine.ACC: 0.3416666667, engine.TCC: 1.025, engine.ASR: 100, engine.ACD: 110}}, - &engine.LCRSupplierCost{Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second, - QOS: map[string]float64{engine.TCD: 240, engine.ACC: 0.35, engine.TCC: 0.7, engine.ASR: 100, engine.ACD: 120}}, - }, - } - */ - cd.CgrID = "8" - cd.RunID = "8" - if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { - t.Error(err) - } else if !reflect.DeepEqual(eLcr.Entry, lcr.Entry) { - t.Errorf("Expecting: %+v, received: %+v", eLcr.Entry, lcr.Entry) - //} else if !reflect.DeepEqual(eLcr.SupplierCosts, lcr.SupplierCosts) && !reflect.DeepEqual(eLcr2.SupplierCosts, lcr.SupplierCosts) { - // t.Errorf("Expecting: %+v, received: %+v", eLcr.SupplierCosts[1], lcr.SupplierCosts[1]) - } - testCdr5 := &engine.CDR{CGRID: utils.Sha1("testcdr5", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), - ToR: utils.VOICE, OriginID: "testcdr5", OriginHost: "192.168.1.1", Source: "TEST_QOS_LCR", RequestType: utils.META_RATED, - Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1004", - SetupTime: time.Date(2014, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2014, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(1) * time.Second} - if err := tutLocalRpc.Call("CdrsV1.ProcessCdr", testCdr5, &reply); err != nil { // Should drop ACD under the 1m required by threshold, removing suppl2 from lcr - t.Error("Unexpected error: ", err.Error()) - } else if reply != utils.OK { - t.Error("Unexpected reply received: ", reply) - } - eLcr = &engine.LCRCost{ - Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_QOS_THRESHOLD, StrategyParams: "40;;;;90s;;;;;;;", Weight: 10.0}, - SupplierCosts: []*engine.LCRSupplierCost{ - {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second, - QOS: map[string]float64{engine.TCD: 240, engine.ACC: 0.35, engine.TCC: 0.7, engine.ASR: 100, engine.ACD: 120}}, - }, - } - cd.CgrID = "9" - cd.RunID = "9" - if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { - t.Error(err) - } else if !reflect.DeepEqual(eLcr.Entry, lcr.Entry) { - t.Errorf("Expecting: %+v, received: %+v", eLcr.Entry, lcr.Entry) - //} else if !reflect.DeepEqual(eLcr.SupplierCosts, lcr.SupplierCosts) { - // t.Errorf("Expecting: %+v, received: %+v", eLcr.SupplierCosts[0], lcr.SupplierCosts[0]) - } -} +// func TestTutITLcrQosThreshold(t *testing.T) { +// tStart, _ := utils.ParseDate("2014-08-04T13:00:00Z") +// tEnd, _ := utils.ParseDate("2014-08-04T13:01:00Z") +// cd := engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1003", +// Account: "1003", +// Destination: "1002", +// TimeStart: tStart, +// TimeEnd: tEnd, +// } +// eLcr := &engine.LCRCost{ +// Entry: &engine.LCREntry{DestinationId: "DST_1002", RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_QOS_THRESHOLD, StrategyParams: "20;;;;2m;;;;;;;", Weight: 10.0}, +// SupplierCosts: []*engine.LCRSupplierCost{ +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 0.6, Duration: 60 * time.Second, +// QOS: map[string]float64{engine.TCD: 270, engine.ACC: 0.3625, engine.TCC: 0.725, engine.ASR: 100, engine.ACD: 135}}, +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second, +// QOS: map[string]float64{engine.TCD: 240, engine.ACC: 0.35, engine.TCC: 0.7, engine.ASR: 100, engine.ACD: 120}}, +// }, +// } +// var lcr engine.LCRCost +// cd.CgrID = "6" +// cd.RunID = "6" +// if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { +// t.Error(err) +// } else if !reflect.DeepEqual(eLcr.Entry, lcr.Entry) { +// t.Errorf("Expecting: %+v, received: %+v", eLcr.Entry, lcr.Entry) +// //} else if !reflect.DeepEqual(eLcr.SupplierCosts, lcr.SupplierCosts) { +// // t.Errorf("Expecting: %+v, %+v received: %+v, %+v", eLcr.SupplierCosts[0], eLcr.SupplierCosts[1], lcr.SupplierCosts[0], lcr.SupplierCosts[1]) +// } +// testCdr4 := &engine.CDR{CGRID: utils.Sha1("testcdr4", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), +// ToR: utils.VOICE, OriginID: "testcdr4", OriginHost: "192.168.1.1", Source: "TEST_QOS_LCR", RequestType: utils.META_RATED, +// Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1004", +// SetupTime: time.Date(2014, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2014, 12, 7, 8, 42, 26, 0, time.UTC), +// Usage: time.Duration(60) * time.Second} +// var reply string +// if err := tutLocalRpc.Call("CdrsV1.ProcessCdr", testCdr4, &reply); err != nil { // Should drop ACD under the 2m required by threshold, removing suppl2 from lcr +// t.Error("Unexpected error: ", err.Error()) +// } else if reply != utils.OK { +// t.Error("Unexpected reply received: ", reply) +// } +// eLcr = &engine.LCRCost{ +// Entry: &engine.LCREntry{DestinationId: "DST_1002", RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_QOS_THRESHOLD, StrategyParams: "20;;;;2m;;;;;;;", Weight: 10.0}, +// SupplierCosts: []*engine.LCRSupplierCost{ +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second, +// QOS: map[string]float64{engine.TCD: 240, engine.ACC: 0.35, engine.TCC: 0.7, engine.ASR: 100, engine.ACD: 120}}, +// }, +// } +// cd.CgrID = "7" +// cd.RunID = "7" +// if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { +// t.Error(err) +// } else if !reflect.DeepEqual(eLcr.Entry, lcr.Entry) { +// t.Errorf("Expecting: %+v, received: %+v", eLcr.Entry, lcr.Entry) +// //} else if !reflect.DeepEqual(eLcr.SupplierCosts, lcr.SupplierCosts) { +// // t.Errorf("Expecting: %+v, received: %+v", eLcr.SupplierCosts[0], lcr.SupplierCosts[0]) +// } +// cd = engine.CallDescriptor{ +// Direction: "*out", +// Category: "call", +// Tenant: "cgrates.org", +// Subject: "1003", +// Account: "1003", +// Destination: "1004", +// TimeStart: tStart, +// TimeEnd: tEnd, +// } +// eLcr = &engine.LCRCost{ +// Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_QOS_THRESHOLD, StrategyParams: "40;;;;90s;;;;;;;", Weight: 10.0}, +// SupplierCosts: []*engine.LCRSupplierCost{ +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second, +// QOS: map[string]float64{engine.TCD: 240, engine.ACC: 0.35, engine.TCC: 0.7, engine.ASR: 100, engine.ACD: 120}}, +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 1.2, Duration: 60 * time.Second, +// QOS: map[string]float64{engine.TCD: 330, engine.ACC: 0.3416666667, engine.TCC: 1.025, engine.ASR: 100, engine.ACD: 110}}, +// }, +// } +// /*eLcr2 := &engine.LCRCost{ +// Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_QOS_THRESHOLD, StrategyParams: "40;;90s;;;;;;;", Weight: 10.0}, +// SupplierCosts: []*engine.LCRSupplierCost{ +// &engine.LCRSupplierCost{Supplier: "*out:cgrates.org:lcr_profile1:suppl2", Cost: 1.2, Duration: 60 * time.Second, +// QOS: map[string]float64{engine.TCD: 330, engine.ACC: 0.3416666667, engine.TCC: 1.025, engine.ASR: 100, engine.ACD: 110}}, +// &engine.LCRSupplierCost{Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second, +// QOS: map[string]float64{engine.TCD: 240, engine.ACC: 0.35, engine.TCC: 0.7, engine.ASR: 100, engine.ACD: 120}}, +// }, +// } +// */ +// cd.CgrID = "8" +// cd.RunID = "8" +// if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { +// t.Error(err) +// } else if !reflect.DeepEqual(eLcr.Entry, lcr.Entry) { +// t.Errorf("Expecting: %+v, received: %+v", eLcr.Entry, lcr.Entry) +// //} else if !reflect.DeepEqual(eLcr.SupplierCosts, lcr.SupplierCosts) && !reflect.DeepEqual(eLcr2.SupplierCosts, lcr.SupplierCosts) { +// // t.Errorf("Expecting: %+v, received: %+v", eLcr.SupplierCosts[1], lcr.SupplierCosts[1]) +// } +// testCdr5 := &engine.CDR{CGRID: utils.Sha1("testcdr5", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), +// ToR: utils.VOICE, OriginID: "testcdr5", OriginHost: "192.168.1.1", Source: "TEST_QOS_LCR", RequestType: utils.META_RATED, +// Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1004", +// SetupTime: time.Date(2014, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2014, 12, 7, 8, 42, 26, 0, time.UTC), +// Usage: time.Duration(1) * time.Second} +// if err := tutLocalRpc.Call("CdrsV1.ProcessCdr", testCdr5, &reply); err != nil { // Should drop ACD under the 1m required by threshold, removing suppl2 from lcr +// t.Error("Unexpected error: ", err.Error()) +// } else if reply != utils.OK { +// t.Error("Unexpected reply received: ", reply) +// } +// eLcr = &engine.LCRCost{ +// Entry: &engine.LCREntry{DestinationId: utils.ANY, RPCategory: "lcr_profile1", Strategy: engine.LCR_STRATEGY_QOS_THRESHOLD, StrategyParams: "40;;;;90s;;;;;;;", Weight: 10.0}, +// SupplierCosts: []*engine.LCRSupplierCost{ +// {Supplier: "*out:cgrates.org:lcr_profile1:suppl1", Cost: 1.2, Duration: 60 * time.Second, +// QOS: map[string]float64{engine.TCD: 240, engine.ACC: 0.35, engine.TCC: 0.7, engine.ASR: 100, engine.ACD: 120}}, +// }, +// } +// cd.CgrID = "9" +// cd.RunID = "9" +// if err := tutLocalRpc.Call("Responder.GetLCR", cd, &lcr); err != nil { +// t.Error(err) +// } else if !reflect.DeepEqual(eLcr.Entry, lcr.Entry) { +// t.Errorf("Expecting: %+v, received: %+v", eLcr.Entry, lcr.Entry) +// //} else if !reflect.DeepEqual(eLcr.SupplierCosts, lcr.SupplierCosts) { +// // t.Errorf("Expecting: %+v, received: %+v", eLcr.SupplierCosts[0], lcr.SupplierCosts[0]) +// } +// } -// Test adding the account via API, using the data previously devined in .csv -func TestTutITSetAccount(t *testing.T) { - var reply string - attrs := &v2.AttrSetAccount{Tenant: "cgrates.org", Account: "tutacnt1", ActionPlanIDs: &[]string{"PACKAGE_10"}, ActionTriggerIDs: &[]string{"STANDARD_TRIGGERS"}, ReloadScheduler: true} - if err := tutLocalRpc.Call("ApierV2.SetAccount", attrs, &reply); err != nil { - t.Error("Got error on ApierV2.SetAccount: ", err.Error()) - } else if reply != "OK" { - t.Errorf("Calling ApierV2.SetAccount received: %s", reply) - } - type AttrGetAccounts struct { - Tenant string - Direction string - AccountIds []string - Offset int // Set the item offset - Limit int // Limit number of items retrieved - } - time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for scheduler to execute topups - var acnts []*engine.Account - if err := tutLocalRpc.Call("ApierV2.GetAccounts", utils.AttrGetAccounts{Tenant: attrs.Tenant, AccountIds: []string{attrs.Account}}, &acnts); err != nil { - t.Error(err) - } else if len(acnts) != 1 { - t.Errorf("Accounts received: %+v", acnts) - } else { - acnt := acnts[0] - dta, _ := utils.NewTAFromAccountKey(acnt.ID) - if dta.Tenant != attrs.Tenant || dta.Account != attrs.Account { - t.Error("Unexpected account id received: ", acnt.ID) - } - if balances := acnt.BalanceMap["*monetary"]; len(balances) != 1 { - t.Errorf("Unexpected balances found: %+v", balances) - } - if len(acnt.ActionTriggers) != 4 { - t.Errorf("Unexpected action triggers for account: %+v", acnt.ActionTriggers) - } - if acnt.AllowNegative { - t.Error("AllowNegative should not be set") - } - if acnt.Disabled { - t.Error("Disabled should not be set") - } - } - attrs = &v2.AttrSetAccount{Tenant: "cgrates.org", Account: "tutacnt1", ActionPlanIDs: &[]string{"PACKAGE_10"}, ActionTriggerIDs: &[]string{"STANDARD_TRIGGERS"}, AllowNegative: utils.BoolPointer(true), Disabled: utils.BoolPointer(true), ReloadScheduler: true} +// // Test adding the account via API, using the data previously devined in .csv +// func TestTutITSetAccount(t *testing.T) { +// var reply string +// attrs := &v2.AttrSetAccount{Tenant: "cgrates.org", Account: "tutacnt1", ActionPlanIDs: &[]string{"PACKAGE_10"}, ActionTriggerIDs: &[]string{"STANDARD_TRIGGERS"}, ReloadScheduler: true} +// if err := tutLocalRpc.Call("ApierV2.SetAccount", attrs, &reply); err != nil { +// t.Error("Got error on ApierV2.SetAccount: ", err.Error()) +// } else if reply != "OK" { +// t.Errorf("Calling ApierV2.SetAccount received: %s", reply) +// } +// type AttrGetAccounts struct { +// Tenant string +// Direction string +// AccountIds []string +// Offset int // Set the item offset +// Limit int // Limit number of items retrieved +// } +// time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for scheduler to execute topups +// var acnts []*engine.Account +// if err := tutLocalRpc.Call("ApierV2.GetAccounts", utils.AttrGetAccounts{Tenant: attrs.Tenant, AccountIds: []string{attrs.Account}}, &acnts); err != nil { +// t.Error(err) +// } else if len(acnts) != 1 { +// t.Errorf("Accounts received: %+v", acnts) +// } else { +// acnt := acnts[0] +// dta, _ := utils.NewTAFromAccountKey(acnt.ID) +// if dta.Tenant != attrs.Tenant || dta.Account != attrs.Account { +// t.Error("Unexpected account id received: ", acnt.ID) +// } +// if balances := acnt.BalanceMap["*monetary"]; len(balances) != 1 { +// t.Errorf("Unexpected balances found: %+v", balances) +// } +// if len(acnt.ActionTriggers) != 4 { +// t.Errorf("Unexpected action triggers for account: %+v", acnt.ActionTriggers) +// } +// if acnt.AllowNegative { +// t.Error("AllowNegative should not be set") +// } +// if acnt.Disabled { +// t.Error("Disabled should not be set") +// } +// } +// attrs = &v2.AttrSetAccount{Tenant: "cgrates.org", Account: "tutacnt1", ActionPlanIDs: &[]string{"PACKAGE_10"}, ActionTriggerIDs: &[]string{"STANDARD_TRIGGERS"}, AllowNegative: utils.BoolPointer(true), Disabled: utils.BoolPointer(true), ReloadScheduler: true} - if err := tutLocalRpc.Call("ApierV2.SetAccount", attrs, &reply); err != nil { - t.Error("Got error on ApierV2.SetAccount: ", err.Error()) - } else if reply != "OK" { - t.Errorf("Calling ApierV2.SetAccount received: %s", reply) - } - if err := tutLocalRpc.Call("ApierV2.GetAccounts", utils.AttrGetAccounts{Tenant: attrs.Tenant, AccountIds: []string{attrs.Account}}, &acnts); err != nil { - t.Error(err) - } else if len(acnts) != 1 { - t.Errorf("Accounts received: %+v", acnts) - } else { - acnt := acnts[0] - dta, _ := utils.NewTAFromAccountKey(acnt.ID) - if dta.Tenant != attrs.Tenant || dta.Account != attrs.Account { - t.Error("Unexpected account id received: ", acnt.ID) - } - if balances := acnt.BalanceMap["*monetary"]; len(balances) != 1 { - t.Errorf("Unexpected balances found: %+v", balances) - } - if len(acnt.ActionTriggers) != 4 { - t.Errorf("Unexpected action triggers for account: %+v", acnt.ActionTriggers) - } - if !acnt.AllowNegative { - t.Error("AllowNegative should be set") - } - if !acnt.Disabled { - t.Error("Disabled should be set") - } - } - attrs = &v2.AttrSetAccount{Tenant: "cgrates.org", Account: "tutacnt1", ActionPlanIDs: &[]string{"PACKAGE_1001"}, ActionTriggerIDs: &[]string{"CDRST1_WARN"}, AllowNegative: utils.BoolPointer(true), Disabled: utils.BoolPointer(true), ReloadScheduler: true} +// if err := tutLocalRpc.Call("ApierV2.SetAccount", attrs, &reply); err != nil { +// t.Error("Got error on ApierV2.SetAccount: ", err.Error()) +// } else if reply != "OK" { +// t.Errorf("Calling ApierV2.SetAccount received: %s", reply) +// } +// if err := tutLocalRpc.Call("ApierV2.GetAccounts", utils.AttrGetAccounts{Tenant: attrs.Tenant, AccountIds: []string{attrs.Account}}, &acnts); err != nil { +// t.Error(err) +// } else if len(acnts) != 1 { +// t.Errorf("Accounts received: %+v", acnts) +// } else { +// acnt := acnts[0] +// dta, _ := utils.NewTAFromAccountKey(acnt.ID) +// if dta.Tenant != attrs.Tenant || dta.Account != attrs.Account { +// t.Error("Unexpected account id received: ", acnt.ID) +// } +// if balances := acnt.BalanceMap["*monetary"]; len(balances) != 1 { +// t.Errorf("Unexpected balances found: %+v", balances) +// } +// if len(acnt.ActionTriggers) != 4 { +// t.Errorf("Unexpected action triggers for account: %+v", acnt.ActionTriggers) +// } +// if !acnt.AllowNegative { +// t.Error("AllowNegative should be set") +// } +// if !acnt.Disabled { +// t.Error("Disabled should be set") +// } +// } +// attrs = &v2.AttrSetAccount{Tenant: "cgrates.org", Account: "tutacnt1", ActionPlanIDs: &[]string{"PACKAGE_1001"}, ActionTriggerIDs: &[]string{"CDRST1_WARN"}, AllowNegative: utils.BoolPointer(true), Disabled: utils.BoolPointer(true), ReloadScheduler: true} - if err := tutLocalRpc.Call("ApierV2.SetAccount", attrs, &reply); err != nil { - t.Error("Got error on ApierV2.SetAccount: ", err.Error()) - } else if reply != "OK" { - t.Errorf("Calling ApierV2.SetAccount received: %s", reply) - } - time.Sleep(100*time.Millisecond + time.Duration(*waitRater)*time.Millisecond) // Give time for scheduler to execute topups - if err := tutLocalRpc.Call("ApierV2.GetAccounts", utils.AttrGetAccounts{Tenant: attrs.Tenant, AccountIds: []string{attrs.Account}}, &acnts); err != nil { - t.Error(err) - } else if len(acnts) != 1 { - t.Errorf("Accounts received: %+v", acnts) - } else { - acnt := acnts[0] - dta, _ := utils.NewTAFromAccountKey(acnt.ID) - if dta.Tenant != attrs.Tenant || dta.Account != attrs.Account { - t.Error("Unexpected account id received: ", acnt.ID) - } - if balances := acnt.BalanceMap["*monetary"]; len(balances) != 3 { - t.Errorf("Unexpected balances found: %+v", balances) - } - if len(acnt.ActionTriggers) != 7 { - t.Errorf("Unexpected action triggers for account: %+v", acnt.ActionTriggers) - } - if !acnt.AllowNegative { - t.Error("AllowNegative should be set") - } - if !acnt.Disabled { - t.Error("Disabled should be set") - } - } -} +// if err := tutLocalRpc.Call("ApierV2.SetAccount", attrs, &reply); err != nil { +// t.Error("Got error on ApierV2.SetAccount: ", err.Error()) +// } else if reply != "OK" { +// t.Errorf("Calling ApierV2.SetAccount received: %s", reply) +// } +// time.Sleep(100*time.Millisecond + time.Duration(*waitRater)*time.Millisecond) // Give time for scheduler to execute topups +// if err := tutLocalRpc.Call("ApierV2.GetAccounts", utils.AttrGetAccounts{Tenant: attrs.Tenant, AccountIds: []string{attrs.Account}}, &acnts); err != nil { +// t.Error(err) +// } else if len(acnts) != 1 { +// t.Errorf("Accounts received: %+v", acnts) +// } else { +// acnt := acnts[0] +// dta, _ := utils.NewTAFromAccountKey(acnt.ID) +// if dta.Tenant != attrs.Tenant || dta.Account != attrs.Account { +// t.Error("Unexpected account id received: ", acnt.ID) +// } +// if balances := acnt.BalanceMap["*monetary"]; len(balances) != 3 { +// t.Errorf("Unexpected balances found: %+v", balances) +// } +// if len(acnt.ActionTriggers) != 7 { +// t.Errorf("Unexpected action triggers for account: %+v", acnt.ActionTriggers) +// } +// if !acnt.AllowNegative { +// t.Error("AllowNegative should be set") +// } +// if !acnt.Disabled { +// t.Error("Disabled should be set") +// } +// } +// } -/* -// Make sure all stats queues were updated -func TestTutITCdrStatsAfter(t *testing.T) { - var statMetrics map[string]float64 - eMetrics := map[string]float64{engine.ACD: 90.2, engine.ASR: 100, engine.TCC: 1.675, engine.TCD: 451, engine.ACC: 0.335} - if err := tutLocalRpc.Call("CDRStatsV1.GetMetrics", v1.AttrGetMetrics{StatsQueueId: "CDRST1"}, &statMetrics); err != nil { - t.Error("Calling CDRStatsV1.GetMetrics, got error: ", err.Error()) - } else if !reflect.DeepEqual(eMetrics, statMetrics) { - t.Errorf("Expecting: %v, received: %v", eMetrics, statMetrics) - } - eMetrics = map[string]float64{engine.ACC: 0.35, engine.ACD: 120, engine.ASR: 100, engine.TCC: 1.675, engine.TCD: 451} - if err := tutLocalRpc.Call("CDRStatsV1.GetMetrics", v1.AttrGetMetrics{StatsQueueId: "CDRST_1001"}, &statMetrics); err != nil { - t.Error("Calling CDRStatsV1.GetMetrics, got error: ", err.Error()) - } else if !reflect.DeepEqual(eMetrics, statMetrics) { - t.Errorf("Expecting: %v, received: %v", eMetrics, statMetrics) - } - eMetrics = map[string]float64{engine.TCD: 451, engine.ACC: 0.325, engine.ACD: 90, engine.ASR: 100, engine.TCC: 1.675} - if err := tutLocalRpc.Call("CDRStatsV1.GetMetrics", v1.AttrGetMetrics{StatsQueueId: "CDRST_1002"}, &statMetrics); err != nil { - t.Error("Calling CDRStatsV1.GetMetrics, got error: ", err.Error()) - } else if !reflect.DeepEqual(eMetrics, statMetrics) { - t.Errorf("Expecting: %v, received: %v", eMetrics, statMetrics) - } - eMetrics = map[string]float64{engine.TCC: 1.675, engine.TCD: 451, engine.ACC: 0.325, engine.ACD: 90, engine.ASR: 100} - if err := tutLocalRpc.Call("CDRStatsV1.GetMetrics", v1.AttrGetMetrics{StatsQueueId: "CDRST_1003"}, &statMetrics); err != nil { - t.Error("Calling CDRStatsV1.GetMetrics, got error: ", err.Error()) - } else if !reflect.DeepEqual(eMetrics, statMetrics) { - t.Errorf("Expecting: %v, received: %v", eMetrics, statMetrics) - } - eMetrics = map[string]float64{engine.TCC: 0.7, engine.TCD: 240, engine.ACC: 0.35, engine.ACD: 120, engine.ASR: 100} - if err := tutLocalRpc.Call("CDRStatsV1.GetMetrics", v1.AttrGetMetrics{StatsQueueId: "STATS_SUPPL1"}, &statMetrics); err != nil { - t.Error("Calling CDRStatsV1.GetMetrics, got error: ", err.Error()) - //} else if !reflect.DeepEqual(eMetrics, statMetrics) { - // t.Errorf("Expecting: %v, received: %v", eMetrics, statMetrics) - } - eMetrics = map[string]float64{engine.TCD: 331, engine.ACC: 0.33125, engine.ACD: 82.75, engine.ASR: 100, engine.TCC: 1.325} - if err := tutLocalRpc.Call("CDRStatsV1.GetMetrics", v1.AttrGetMetrics{StatsQueueId: "STATS_SUPPL2"}, &statMetrics); err != nil { - t.Error("Calling CDRStatsV1.GetMetrics, got error: ", err.Error()) - } else if !reflect.DeepEqual(eMetrics, statMetrics) { - t.Errorf("Expecting: %v, received: %v", eMetrics, statMetrics) - } -} -*/ +// /* +// // Make sure all stats queues were updated +// func TestTutITCdrStatsAfter(t *testing.T) { +// var statMetrics map[string]float64 +// eMetrics := map[string]float64{engine.ACD: 90.2, engine.ASR: 100, engine.TCC: 1.675, engine.TCD: 451, engine.ACC: 0.335} +// if err := tutLocalRpc.Call("CDRStatsV1.GetMetrics", v1.AttrGetMetrics{StatsQueueId: "CDRST1"}, &statMetrics); err != nil { +// t.Error("Calling CDRStatsV1.GetMetrics, got error: ", err.Error()) +// } else if !reflect.DeepEqual(eMetrics, statMetrics) { +// t.Errorf("Expecting: %v, received: %v", eMetrics, statMetrics) +// } +// eMetrics = map[string]float64{engine.ACC: 0.35, engine.ACD: 120, engine.ASR: 100, engine.TCC: 1.675, engine.TCD: 451} +// if err := tutLocalRpc.Call("CDRStatsV1.GetMetrics", v1.AttrGetMetrics{StatsQueueId: "CDRST_1001"}, &statMetrics); err != nil { +// t.Error("Calling CDRStatsV1.GetMetrics, got error: ", err.Error()) +// } else if !reflect.DeepEqual(eMetrics, statMetrics) { +// t.Errorf("Expecting: %v, received: %v", eMetrics, statMetrics) +// } +// eMetrics = map[string]float64{engine.TCD: 451, engine.ACC: 0.325, engine.ACD: 90, engine.ASR: 100, engine.TCC: 1.675} +// if err := tutLocalRpc.Call("CDRStatsV1.GetMetrics", v1.AttrGetMetrics{StatsQueueId: "CDRST_1002"}, &statMetrics); err != nil { +// t.Error("Calling CDRStatsV1.GetMetrics, got error: ", err.Error()) +// } else if !reflect.DeepEqual(eMetrics, statMetrics) { +// t.Errorf("Expecting: %v, received: %v", eMetrics, statMetrics) +// } +// eMetrics = map[string]float64{engine.TCC: 1.675, engine.TCD: 451, engine.ACC: 0.325, engine.ACD: 90, engine.ASR: 100} +// if err := tutLocalRpc.Call("CDRStatsV1.GetMetrics", v1.AttrGetMetrics{StatsQueueId: "CDRST_1003"}, &statMetrics); err != nil { +// t.Error("Calling CDRStatsV1.GetMetrics, got error: ", err.Error()) +// } else if !reflect.DeepEqual(eMetrics, statMetrics) { +// t.Errorf("Expecting: %v, received: %v", eMetrics, statMetrics) +// } +// eMetrics = map[string]float64{engine.TCC: 0.7, engine.TCD: 240, engine.ACC: 0.35, engine.ACD: 120, engine.ASR: 100} +// if err := tutLocalRpc.Call("CDRStatsV1.GetMetrics", v1.AttrGetMetrics{StatsQueueId: "STATS_SUPPL1"}, &statMetrics); err != nil { +// t.Error("Calling CDRStatsV1.GetMetrics, got error: ", err.Error()) +// //} else if !reflect.DeepEqual(eMetrics, statMetrics) { +// // t.Errorf("Expecting: %v, received: %v", eMetrics, statMetrics) +// } +// eMetrics = map[string]float64{engine.TCD: 331, engine.ACC: 0.33125, engine.ACD: 82.75, engine.ASR: 100, engine.TCC: 1.325} +// if err := tutLocalRpc.Call("CDRStatsV1.GetMetrics", v1.AttrGetMetrics{StatsQueueId: "STATS_SUPPL2"}, &statMetrics); err != nil { +// t.Error("Calling CDRStatsV1.GetMetrics, got error: ", err.Error()) +// } else if !reflect.DeepEqual(eMetrics, statMetrics) { +// t.Errorf("Expecting: %v, received: %v", eMetrics, statMetrics) +// } +// } +// */ -/* FixMe : In CallCost (Timespans) Increments is not populated so does not convert properly CallCost to Event +// /* FixMe : In CallCost (Timespans) Increments is not populated so does not convert properly CallCost to Event -func TestTutITPrepaidCDRWithSMCost(t *testing.T) { - cdr := &engine.CDR{CGRID: utils.Sha1("testprepaid1", time.Date(2016, 4, 6, 13, 29, 24, 0, time.UTC).String()), - ToR: utils.VOICE, OriginID: "testprepaid1", OriginHost: "192.168.1.1", - Source: "TEST_PREPAID_CDR_SMCOST1", RequestType: utils.META_PREPAID, Tenant: "cgrates.org", - RunID: utils.META_DEFAULT, - Category: "call", Account: "1001", Subject: "1001", Destination: "1003", - SetupTime: time.Date(2016, 4, 6, 13, 29, 24, 0, time.UTC), - AnswerTime: time.Date(2016, 4, 6, 13, 30, 0, 0, time.UTC), - Usage: time.Duration(90) * time.Second, - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}} +// func TestTutITPrepaidCDRWithSMCost(t *testing.T) { +// cdr := &engine.CDR{CGRID: utils.Sha1("testprepaid1", time.Date(2016, 4, 6, 13, 29, 24, 0, time.UTC).String()), +// ToR: utils.VOICE, OriginID: "testprepaid1", OriginHost: "192.168.1.1", +// Source: "TEST_PREPAID_CDR_SMCOST1", RequestType: utils.META_PREPAID, Tenant: "cgrates.org", +// RunID: utils.META_DEFAULT, +// Category: "call", Account: "1001", Subject: "1001", Destination: "1003", +// SetupTime: time.Date(2016, 4, 6, 13, 29, 24, 0, time.UTC), +// AnswerTime: time.Date(2016, 4, 6, 13, 30, 0, 0, time.UTC), +// Usage: time.Duration(90) * time.Second, +// ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}} +// cc := &engine.CallCost{ +// Category: "call", +// Account: "1001", +// Subject: "1001", +// Tenant: "cgrates.org", +// Direction: utils.OUT, +// Destination: "1003", +// Timespans: []*engine.TimeSpan{ +// &engine.TimeSpan{ +// TimeStart: time.Date(2016, 4, 6, 13, 30, 0, 0, time.UTC), +// TimeEnd: time.Date(2016, 4, 6, 13, 31, 30, 0, time.UTC), +// DurationIndex: 0, +// RateInterval: &engine.RateInterval{ +// Rating: &engine.RIRate{ +// Rates: engine.RateGroups{ +// &engine.Rate{ +// GroupIntervalStart: 0, +// Value: 0.01, +// RateIncrement: 10 * time.Second, +// RateUnit: time.Second}}}}, +// }, +// }, +// TOR: utils.VOICE} +// smCost := &engine.SMCost{CGRID: cdr.CGRID, +// RunID: utils.META_DEFAULT, +// OriginHost: cdr.OriginHost, +// OriginID: cdr.OriginID, +// CostSource: "TestTutITPrepaidCDRWithSMCost", +// Usage: cdr.Usage, +// CostDetails: engine.NewEventCostFromCallCost(cc, cdr.CGRID, utils.META_DEFAULT), +// } +// var reply string +// if err := tutLocalRpc.Call("CdrsV1.StoreSMCost", &engine.AttrCDRSStoreSMCost{Cost: smCost}, &reply); err != nil { +// t.Error("Unexpected error: ", err.Error()) +// } else if reply != utils.OK { +// t.Error("Unexpected reply received: ", reply) +// } +// if err := tutLocalRpc.Call("CdrsV1.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) // Give time for CDR to be processed +// var cdrs []*engine.ExternalCDR +// req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, CGRIDs: []string{cdr.CGRID}} +// if err := tutLocalRpc.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].OriginID != cdr.OriginID { +// t.Errorf("Unexpected OriginID for Cdr received: %+v", cdrs[0].OriginID) +// } +// if cdrs[0].Cost != 0.9 { +// t.Errorf("Unexpected Cost for Cdr received: %+v", utils.ToJSON(cdrs[0].Cost)) +// } +// } +// } +// */ - cc := &engine.CallCost{ - Category: "call", - Account: "1001", - Subject: "1001", - Tenant: "cgrates.org", - Direction: utils.OUT, - Destination: "1003", - Timespans: []*engine.TimeSpan{ - &engine.TimeSpan{ - TimeStart: time.Date(2016, 4, 6, 13, 30, 0, 0, time.UTC), - TimeEnd: time.Date(2016, 4, 6, 13, 31, 30, 0, time.UTC), - DurationIndex: 0, - RateInterval: &engine.RateInterval{ - Rating: &engine.RIRate{ - Rates: engine.RateGroups{ - &engine.Rate{ - GroupIntervalStart: 0, - Value: 0.01, - RateIncrement: 10 * time.Second, - RateUnit: time.Second}}}}, - }, - }, - TOR: utils.VOICE} - smCost := &engine.SMCost{CGRID: cdr.CGRID, - RunID: utils.META_DEFAULT, - OriginHost: cdr.OriginHost, - OriginID: cdr.OriginID, - CostSource: "TestTutITPrepaidCDRWithSMCost", - Usage: cdr.Usage, - CostDetails: engine.NewEventCostFromCallCost(cc, cdr.CGRID, utils.META_DEFAULT), - } - var reply string - if err := tutLocalRpc.Call("CdrsV1.StoreSMCost", &engine.AttrCDRSStoreSMCost{Cost: smCost}, &reply); err != nil { - t.Error("Unexpected error: ", err.Error()) - } else if reply != utils.OK { - t.Error("Unexpected reply received: ", reply) - } - if err := tutLocalRpc.Call("CdrsV1.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) // Give time for CDR to be processed - var cdrs []*engine.ExternalCDR - req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, CGRIDs: []string{cdr.CGRID}} - if err := tutLocalRpc.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].OriginID != cdr.OriginID { - t.Errorf("Unexpected OriginID for Cdr received: %+v", cdrs[0].OriginID) - } - if cdrs[0].Cost != 0.9 { - t.Errorf("Unexpected Cost for Cdr received: %+v", utils.ToJSON(cdrs[0].Cost)) - } - } -} -*/ +// func TestTutITPrepaidCDRWithoutSMCost(t *testing.T) { +// cdr := &engine.CDR{CGRID: utils.Sha1("testprepaid2", time.Date(2016, 4, 6, 13, 29, 24, 0, time.UTC).String()), +// ToR: utils.VOICE, OriginID: "testprepaid2", OriginHost: "192.168.1.1", Source: "TEST_PREPAID_CDR_NO_SMCOST1", RequestType: utils.META_PREPAID, +// Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1003", +// SetupTime: time.Date(2016, 4, 6, 13, 29, 24, 0, time.UTC), AnswerTime: time.Date(2016, 4, 6, 13, 30, 0, 0, time.UTC), +// Usage: time.Duration(90) * time.Second, +// ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}} +// var reply string +// if err := tutLocalRpc.Call("CdrsV1.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(7000) * time.Millisecond) // Give time for CDR to be processed +// var cdrs []*engine.ExternalCDR +// req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, CGRIDs: []string{cdr.CGRID}} +// if err := tutLocalRpc.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].OriginID != cdr.OriginID { +// t.Errorf("Unexpected OriginID for Cdr received: %+v", cdrs[0]) +// } +// if cdrs[0].Cost != 0.9 { +// t.Errorf("Unexpected Cost for Cdr received: %+v", cdrs[0]) +// } +// } +// */ +// } -func TestTutITPrepaidCDRWithoutSMCost(t *testing.T) { - cdr := &engine.CDR{CGRID: utils.Sha1("testprepaid2", time.Date(2016, 4, 6, 13, 29, 24, 0, time.UTC).String()), - ToR: utils.VOICE, OriginID: "testprepaid2", OriginHost: "192.168.1.1", Source: "TEST_PREPAID_CDR_NO_SMCOST1", RequestType: utils.META_PREPAID, - Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1003", - SetupTime: time.Date(2016, 4, 6, 13, 29, 24, 0, time.UTC), AnswerTime: time.Date(2016, 4, 6, 13, 30, 0, 0, time.UTC), - Usage: time.Duration(90) * time.Second, - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}} - var reply string - if err := tutLocalRpc.Call("CdrsV1.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(7000) * time.Millisecond) // Give time for CDR to be processed - var cdrs []*engine.ExternalCDR - req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, CGRIDs: []string{cdr.CGRID}} - if err := tutLocalRpc.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].OriginID != cdr.OriginID { - t.Errorf("Unexpected OriginID for Cdr received: %+v", cdrs[0]) - } - if cdrs[0].Cost != 0.9 { - t.Errorf("Unexpected Cost for Cdr received: %+v", cdrs[0]) - } - } - */ -} +// func TestTutITExportCDR(t *testing.T) { +// cdr := &engine.CDR{ToR: utils.VOICE, OriginID: "testexportcdr1", OriginHost: "192.168.1.1", Source: "TestTutITExportCDR", RequestType: utils.META_RATED, +// Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1003", +// SetupTime: time.Date(2016, 11, 30, 17, 5, 24, 0, time.UTC), AnswerTime: time.Date(2016, 11, 30, 17, 6, 4, 0, time.UTC), +// Usage: time.Duration(98) * time.Second, +// ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}} +// cdr.ComputeCGRID() +// var reply string +// if err := tutLocalRpc.Call("CdrsV1.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(50) * time.Millisecond) // Give time for CDR to be processed +// var cdrs []*engine.ExternalCDR +// req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, CGRIDs: []string{cdr.CGRID}} +// if err := tutLocalRpc.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].OriginID != cdr.OriginID { +// t.Errorf("Unexpected OriginID for Cdr received: %+v", cdrs[0]) +// } +// if cdrs[0].Cost != 1.3334 { +// t.Errorf("Unexpected Cost for Cdr received: %+v", cdrs[0]) +// } +// } +// var replyExport v1.RplExportedCDRs +// exportArgs := v1.ArgExportCDRs{ +// ExportPath: utils.StringPointer("/tmp"), +// ExportFileName: utils.StringPointer("TestTutITExportCDR.csv"), +// ExportTemplate: utils.StringPointer("TestTutITExportCDR"), +// RPCCDRsFilter: utils.RPCCDRsFilter{CGRIDs: []string{cdr.CGRID}, NotRunIDs: []string{utils.MetaRaw}}} +// if err := tutLocalRpc.Call("ApierV1.ExportCDRs", exportArgs, &replyExport); err != nil { +// t.Error(err) +// } +// eExportContent := `f0a92222a7d21b4d9f72744aabe82daef52e20d8,*default,testexportcdr1,*rated,cgrates.org,call,1001,1003,2016-11-30T18:06:04+01:00,98,1.33340,RETA +// f0a92222a7d21b4d9f72744aabe82daef52e20d8,derived_run1,testexportcdr1,*rated,cgrates.org,call,1001,1003,2016-11-30T18:06:04+01:00,98,1.33340,RETA +// ` +// eExportContent2 := `f0a92222a7d21b4d9f72744aabe82daef52e20d8,derived_run1,testexportcdr1,*rated,cgrates.org,call,1001,1003,2016-11-30T18:06:04+01:00,98,1.33340,RETA +// f0a92222a7d21b4d9f72744aabe82daef52e20d8,*default,testexportcdr1,*rated,cgrates.org,call,1001,1003,2016-11-30T18:06:04+01:00,98,1.33340,RETA +// ` +// expFilePath := path.Join(*exportArgs.ExportPath, *exportArgs.ExportFileName) +// if expContent, err := ioutil.ReadFile(expFilePath); err != nil { +// t.Error(err) +// } else if eExportContent != string(expContent) && eExportContent2 != string(expContent) { // CDRs are showing up randomly so we cannot predict order of export +// t.Errorf("Expecting: <%q> or <%q> received: <%q>", eExportContent, eExportContent2, string(expContent)) +// } +// if err := os.Remove(expFilePath); err != nil { +// t.Error(err) +// } -func TestTutITExportCDR(t *testing.T) { - cdr := &engine.CDR{ToR: utils.VOICE, OriginID: "testexportcdr1", OriginHost: "192.168.1.1", Source: "TestTutITExportCDR", RequestType: utils.META_RATED, - Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1003", - SetupTime: time.Date(2016, 11, 30, 17, 5, 24, 0, time.UTC), AnswerTime: time.Date(2016, 11, 30, 17, 6, 4, 0, time.UTC), - Usage: time.Duration(98) * time.Second, - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}} - cdr.ComputeCGRID() - var reply string - if err := tutLocalRpc.Call("CdrsV1.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(50) * time.Millisecond) // Give time for CDR to be processed - var cdrs []*engine.ExternalCDR - req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, CGRIDs: []string{cdr.CGRID}} - if err := tutLocalRpc.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].OriginID != cdr.OriginID { - t.Errorf("Unexpected OriginID for Cdr received: %+v", cdrs[0]) - } - if cdrs[0].Cost != 1.3334 { - t.Errorf("Unexpected Cost for Cdr received: %+v", cdrs[0]) - } - } - var replyExport v1.RplExportedCDRs - exportArgs := v1.ArgExportCDRs{ - ExportPath: utils.StringPointer("/tmp"), - ExportFileName: utils.StringPointer("TestTutITExportCDR.csv"), - ExportTemplate: utils.StringPointer("TestTutITExportCDR"), - RPCCDRsFilter: utils.RPCCDRsFilter{CGRIDs: []string{cdr.CGRID}, NotRunIDs: []string{utils.MetaRaw}}} - if err := tutLocalRpc.Call("ApierV1.ExportCDRs", exportArgs, &replyExport); err != nil { - t.Error(err) - } - eExportContent := `f0a92222a7d21b4d9f72744aabe82daef52e20d8,*default,testexportcdr1,*rated,cgrates.org,call,1001,1003,2016-11-30T18:06:04+01:00,98,1.33340,RETA -f0a92222a7d21b4d9f72744aabe82daef52e20d8,derived_run1,testexportcdr1,*rated,cgrates.org,call,1001,1003,2016-11-30T18:06:04+01:00,98,1.33340,RETA -` - eExportContent2 := `f0a92222a7d21b4d9f72744aabe82daef52e20d8,derived_run1,testexportcdr1,*rated,cgrates.org,call,1001,1003,2016-11-30T18:06:04+01:00,98,1.33340,RETA -f0a92222a7d21b4d9f72744aabe82daef52e20d8,*default,testexportcdr1,*rated,cgrates.org,call,1001,1003,2016-11-30T18:06:04+01:00,98,1.33340,RETA -` - expFilePath := path.Join(*exportArgs.ExportPath, *exportArgs.ExportFileName) - if expContent, err := ioutil.ReadFile(expFilePath); err != nil { - t.Error(err) - } else if eExportContent != string(expContent) && eExportContent2 != string(expContent) { // CDRs are showing up randomly so we cannot predict order of export - t.Errorf("Expecting: <%q> or <%q> received: <%q>", eExportContent, eExportContent2, string(expContent)) - } - if err := os.Remove(expFilePath); err != nil { - t.Error(err) - } +// } -} - -func TestTutITStopCgrEngine(t *testing.T) { - if err := engine.KillEngine(1000); err != nil { - t.Error(err) - } -} +// func TestTutITStopCgrEngine(t *testing.T) { +// if err := engine.KillEngine(1000); err != nil { +// t.Error(err) +// } +// } diff --git a/general_tests/tp_it_test.go b/general_tests/tp_it_test.go index 4d1f95415..bfcf463ea 100644 --- a/general_tests/tp_it_test.go +++ b/general_tests/tp_it_test.go @@ -257,21 +257,22 @@ func TestTpExecuteActionCgrRpcAcc(t *testing.T) { } } -func TestTpExecuteActionCgrRpcCdrStats(t *testing.T) { - var reply string - if err := tpRPC.Call("ApierV2.ExecuteAction", utils.AttrExecuteAction{ - ActionsId: "RPC_CDRSTATS", - }, &reply); err != nil { - t.Error("Got error on ApierV2.ExecuteAction: ", err.Error()) - } else if reply != utils.OK { - t.Errorf("Calling ExecuteAction got reply: %s", reply) - } - var queue engine.CDRStatsQueue - time.Sleep(20 * time.Millisecond) - if err := tpRPC.Call("CDRStatsV1.GetQueue", "qtest", &queue); err != nil { - t.Error("Got error on CDRStatsV1.GetQueue: ", err.Error()) - } -} +// Deprecated +// func TestTpExecuteActionCgrRpcCdrStats(t *testing.T) { +// var reply string +// if err := tpRPC.Call("ApierV2.ExecuteAction", utils.AttrExecuteAction{ +// ActionsId: "RPC_CDRSTATS", +// }, &reply); err != nil { +// t.Error("Got error on ApierV2.ExecuteAction: ", err.Error()) +// } else if reply != utils.OK { +// t.Errorf("Calling ExecuteAction got reply: %s", reply) +// } +// var queue engine.CDRStatsQueue +// time.Sleep(20 * time.Millisecond) +// if err := tpRPC.Call("CDRStatsV1.GetQueue", "qtest", &queue); err != nil { +// t.Error("Got error on CDRStatsV1.GetQueue: ", err.Error()) +// } +// } func TestTpCreateExecuteActionMatch(t *testing.T) { var reply string