mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
Updated integration tests in apier
This commit is contained in:
@@ -42,7 +42,7 @@ var (
|
||||
dataDir = flag.String("data_dir", "/usr/share/cgrates", "CGR data dir path here")
|
||||
interations = flag.Int("iterations", 1, "Number of iterations to do for dry run simulation")
|
||||
replyTimeout = flag.String("reply_timeout", "1s", "Maximum duration to wait for a reply")
|
||||
encoding = flag.String("rpc", utils.MetaJSON, "what encoding whould be uused for rpc comunication")
|
||||
encoding = flag.String("rpc", utils.MetaJSON, "what encoding whould be used for rpc comunication")
|
||||
|
||||
daCfgPath, diamConfigDIR string
|
||||
daCfg *config.CGRConfig
|
||||
|
||||
@@ -32,13 +32,14 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
accExist bool
|
||||
accCfgPath string
|
||||
accCfg *config.CGRConfig
|
||||
accRPC *rpc.Client
|
||||
accAcount = "refundAcc"
|
||||
accTenant = "cgrates.org"
|
||||
accBallID = "Balance1"
|
||||
accExist bool
|
||||
accCfgPath string
|
||||
accCfg *config.CGRConfig
|
||||
accRPC *rpc.Client
|
||||
accAcount = "refundAcc"
|
||||
accTenant = "cgrates.org"
|
||||
accBallID = "Balance1"
|
||||
accTestsConfig string //run tests for specific configuration
|
||||
|
||||
accTests = []func(t *testing.T){
|
||||
testAccITLoadConfig,
|
||||
@@ -61,25 +62,47 @@ var (
|
||||
)
|
||||
|
||||
func TestAccITWithRemove(t *testing.T) {
|
||||
if *encoding == utils.MetaJSON {
|
||||
accCfgPath = path.Join(*dataDir, "conf", "samples", "tutmongo")
|
||||
} else if *encoding == utils.MetaGOB {
|
||||
accCfgPath = path.Join(*dataDir, "conf", "samples", "tutmongo_gob")
|
||||
|
||||
switch *dbType {
|
||||
case utils.MetaInternal:
|
||||
accTestsConfig = "tutinternal"
|
||||
case utils.MetaSQL:
|
||||
accTestsConfig = "tutmysql"
|
||||
case utils.MetaMongo:
|
||||
accTestsConfig = "tutmongo"
|
||||
default:
|
||||
t.Fatal("Unknown Database type")
|
||||
}
|
||||
for _, test := range accTests {
|
||||
t.Run("TestAccIT", test)
|
||||
if *encoding == utils.MetaGOB {
|
||||
accTestsConfig += "_gob"
|
||||
}
|
||||
accCfgPath = path.Join(*dataDir, "conf", "samples", accTestsConfig)
|
||||
|
||||
for _, stest := range accTests {
|
||||
t.Run(accTestsConfig, stest)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAccITWithoutRemove(t *testing.T) {
|
||||
if *encoding == utils.MetaJSON {
|
||||
accCfgPath = path.Join(*dataDir, "conf", "samples", "acc_balance_keep")
|
||||
} else if *encoding == utils.MetaGOB {
|
||||
accCfgPath = path.Join(*dataDir, "conf", "samples", "acc_balance_keep_gob")
|
||||
|
||||
switch *dbType {
|
||||
case utils.MetaInternal:
|
||||
accTestsConfig = "acc_balance_keep_internal"
|
||||
case utils.MetaSQL:
|
||||
accTestsConfig = "acc_balance_keep_mysql"
|
||||
case utils.MetaMongo:
|
||||
accTestsConfig = "acc_balance_keep_mongo"
|
||||
default:
|
||||
t.Fatal("Unknown Database type")
|
||||
}
|
||||
if *encoding == utils.MetaGOB {
|
||||
accTestsConfig += "_gob"
|
||||
}
|
||||
accCfgPath = path.Join(*dataDir, "conf", "samples", accTestsConfig)
|
||||
|
||||
accExist = true
|
||||
for _, test := range accTests {
|
||||
t.Run("TestAccIT", test)
|
||||
for _, stest := range accTests {
|
||||
t.Run(accTestsConfig, stest)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -324,7 +347,7 @@ func testAccITSetBalanceWithExtraData(t *testing.T) {
|
||||
attrs := &utils.AttrSetBalance{
|
||||
Tenant: "cgrates.org",
|
||||
Account: "testAccITSetBalanceWithExtraData",
|
||||
BalanceType: "*monetary",
|
||||
BalanceType: utils.MONETARY,
|
||||
Value: 1.5,
|
||||
Balance: map[string]interface{}{
|
||||
utils.ID: "testAccITSetBalanceWithExtraData",
|
||||
@@ -359,7 +382,7 @@ func testAccITSetBalanceWithExtraData2(t *testing.T) {
|
||||
attrs := &utils.AttrSetBalance{
|
||||
Tenant: "cgrates.org",
|
||||
Account: "testAccITSetBalanceWithExtraData2",
|
||||
BalanceType: "*monetary",
|
||||
BalanceType: utils.MONETARY,
|
||||
Value: 1.5,
|
||||
Balance: map[string]interface{}{
|
||||
utils.ID: "testAccITSetBalanceWithExtraData2",
|
||||
@@ -403,7 +426,7 @@ func testAccITAddBalanceWithNegative(t *testing.T) {
|
||||
attrs := &AttrAddBalance{
|
||||
Tenant: "cgrates.org",
|
||||
Account: "AddBalanceWithNegative",
|
||||
BalanceType: "*monetary",
|
||||
BalanceType: utils.MONETARY,
|
||||
Value: -3.5,
|
||||
}
|
||||
if err := accRPC.Call(utils.ApierV1AddBalance, attrs, &reply); err != nil {
|
||||
|
||||
@@ -35,43 +35,53 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
apierCfgPath string
|
||||
apierCfg *config.CGRConfig
|
||||
apierRPC *rpc.Client
|
||||
apierConfigDIR string //run tests for specific configuration
|
||||
apierCfgPath string
|
||||
apierCfg *config.CGRConfig
|
||||
apierRPC *rpc.Client
|
||||
apierv2ConfigDIR string //run tests for specific configuration
|
||||
|
||||
sTestsAPIer = []func(t *testing.T){
|
||||
testAPIerInitCfg,
|
||||
testAPIerInitDataDb,
|
||||
testAPIerResetStorDb,
|
||||
testAPIerStartEngine,
|
||||
testAPIerRPCConn,
|
||||
testAPIerLoadFromFolder,
|
||||
testAPIerVerifyAttributesAfterLoad,
|
||||
testAPIerRemoveTPFromFolder,
|
||||
testAPIerAfterDelete,
|
||||
testAPIerVerifyAttributesAfterDelete,
|
||||
testAPIerLoadFromFolder,
|
||||
testAPIerGetRatingPlanCost,
|
||||
testAPIerGetRatingPlanCost2,
|
||||
testAPIerGetRatingPlanCost3,
|
||||
testAPIerGetActionPlanIDs,
|
||||
testAPIerGetRatingPlanIDs,
|
||||
testAPIerKillEngine,
|
||||
}
|
||||
)
|
||||
|
||||
var sTestsAPIer = []func(t *testing.T){
|
||||
testAPIerInitCfg,
|
||||
testAPIerInitDataDb,
|
||||
testAPIerResetStorDb,
|
||||
testAPIerStartEngine,
|
||||
testAPIerRPCConn,
|
||||
testAPIerLoadFromFolder,
|
||||
testAPIerVerifyAttributesAfterLoad,
|
||||
testAPIerRemoveTPFromFolder,
|
||||
testAPIerAfterDelete,
|
||||
testAPIerVerifyAttributesAfterDelete,
|
||||
testAPIerLoadFromFolder,
|
||||
testAPIerGetRatingPlanCost,
|
||||
testAPIerGetRatingPlanCost2,
|
||||
testAPIerGetRatingPlanCost3,
|
||||
testAPIerGetActionPlanIDs,
|
||||
testAPIerGetRatingPlanIDs,
|
||||
testAPIerKillEngine,
|
||||
}
|
||||
|
||||
//Test start here
|
||||
func TestAPIerIT(t *testing.T) {
|
||||
apierConfigDIR = "tutmysql" // no need for a new config with *gob transport in this case
|
||||
func TestApierIT2(t *testing.T) {
|
||||
// no need for a new config with *gob transport in this case
|
||||
switch *dbType {
|
||||
case utils.MetaInternal:
|
||||
apierv2ConfigDIR = "tutinternal"
|
||||
case utils.MetaSQL:
|
||||
apierv2ConfigDIR = "tutmysql"
|
||||
case utils.MetaMongo:
|
||||
apierv2ConfigDIR = "tutmongo"
|
||||
default:
|
||||
t.Fatal("Unknown Database type")
|
||||
}
|
||||
for _, stest := range sTestsAPIer {
|
||||
t.Run(apierConfigDIR, stest)
|
||||
t.Run(apierv2ConfigDIR, stest)
|
||||
}
|
||||
}
|
||||
|
||||
func testAPIerInitCfg(t *testing.T) {
|
||||
var err error
|
||||
apierCfgPath = path.Join(costDataDir, "conf", "samples", apierConfigDIR)
|
||||
apierCfgPath = path.Join(costDataDir, "conf", "samples", apierv2ConfigDIR)
|
||||
apierCfg, err = config.NewCGRConfigFromPath(apierCfgPath)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
|
||||
@@ -21,13 +21,10 @@ package v1
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/rpc"
|
||||
"net/rpc/jsonrpc"
|
||||
"net/url"
|
||||
"os"
|
||||
"path"
|
||||
@@ -61,35 +58,114 @@ README:
|
||||
* Connect rpc client depending on encoding defined in configuration.
|
||||
* Execute remote Apis and test their replies(follow testtp scenario so we can test load in dataDb also).
|
||||
*/
|
||||
var (
|
||||
cfgPath string
|
||||
cfg *config.CGRConfig
|
||||
rater *rpc.Client
|
||||
apierv1ConfigDIR string
|
||||
|
||||
var cfgPath string
|
||||
var cfg *config.CGRConfig
|
||||
var rater *rpc.Client
|
||||
apierTests = []func(t *testing.T){
|
||||
testApierLoadConfig,
|
||||
testApierCreateDirs,
|
||||
testApierInitDataDb,
|
||||
testApierInitStorDb,
|
||||
testApierStartEngine,
|
||||
testApierRpcConn,
|
||||
testApierTPTiming,
|
||||
testApierTPDestination,
|
||||
testApierTPRate,
|
||||
testApierTPDestinationRate,
|
||||
testApierTPRatingPlan,
|
||||
testApierTPRatingProfile,
|
||||
testApierTPActions,
|
||||
testApierTPActionPlan,
|
||||
testApierTPActionTriggers,
|
||||
testApierTPAccountActions,
|
||||
testApierLoadRatingPlan,
|
||||
testApierLoadRatingProfile,
|
||||
testApierLoadAccountActions,
|
||||
testApierReloadScheduler,
|
||||
testApierSetRatingProfile,
|
||||
testApierV1GetRatingProfile,
|
||||
testApierReloadCache,
|
||||
testApierGetDestination,
|
||||
testApierGetRatingPlan,
|
||||
testApierRemoveRatingPlan,
|
||||
testApierAddBalance,
|
||||
testApierExecuteAction,
|
||||
testApierSetActions,
|
||||
testApierGetActions,
|
||||
testApierSetActionPlan,
|
||||
testApierAddTriggeredAction,
|
||||
testApierGetAccountActionTriggers,
|
||||
testApierAddTriggeredAction2,
|
||||
testApierGetAccountActionTriggers2,
|
||||
testApierSetAccountActionTriggers,
|
||||
testApierRemAccountActionTriggers,
|
||||
testApierSetAccount,
|
||||
testApierGetAccountActionPlan,
|
||||
testApierITGetScheduledActionsForAccount,
|
||||
testApierRemUniqueIDActionTiming,
|
||||
testApierGetAccount,
|
||||
testApierTriggersExecute,
|
||||
testApierResetDataBeforeLoadFromFolder,
|
||||
testApierLoadTariffPlanFromFolder,
|
||||
testApierComputeReverse,
|
||||
testApierResetDataAfterLoadFromFolder,
|
||||
testApierSetChargerS,
|
||||
testApierGetAccountAfterLoad,
|
||||
testApierResponderGetCost,
|
||||
testApierMaxDebitInexistentAcnt,
|
||||
testApierCdrServer,
|
||||
testApierITGetCdrs,
|
||||
testApierITProcessCdr,
|
||||
testApierGetCallCostLog,
|
||||
testApierITSetDestination,
|
||||
testApierITGetScheduledActions,
|
||||
testApierITGetDataCost,
|
||||
testApierITGetCost,
|
||||
testApierInitDataDb2,
|
||||
testApierInitStorDb2,
|
||||
testApierReloadCache2,
|
||||
testApierReloadScheduler2,
|
||||
testApierImportTPFromFolderPath,
|
||||
testApierLoadTariffPlanFromStorDbDryRun,
|
||||
testApierGetCacheStats2,
|
||||
testApierLoadTariffPlanFromStorDb,
|
||||
testApierStartStopServiceStatus,
|
||||
testApierReplayFailedPosts,
|
||||
testApierGetDataDBVesions,
|
||||
testApierGetStorDBVesions,
|
||||
testApierStopEngine,
|
||||
}
|
||||
)
|
||||
|
||||
var dataDir = flag.String("data_dir", "/usr/share/cgrates", "CGR data dir path here")
|
||||
var waitRater = flag.Int("wait_rater", 500, "Number of miliseconds to wait for rater to start and cache")
|
||||
var encoding = flag.String("rpc", utils.MetaJSON, "what encoding whould be uused for rpc comunication")
|
||||
|
||||
func newRPCClient(cfg *config.ListenCfg) (c *rpc.Client, err error) {
|
||||
switch *encoding {
|
||||
case utils.MetaJSON:
|
||||
return jsonrpc.Dial(utils.TCP, cfg.RPCJSONListen)
|
||||
case utils.MetaGOB:
|
||||
return rpc.Dial(utils.TCP, cfg.RPCGOBListen)
|
||||
func TestApierIT(t *testing.T) {
|
||||
switch *dbType {
|
||||
case utils.MetaInternal:
|
||||
apierv1ConfigDIR = "apier_internal"
|
||||
case utils.MetaSQL:
|
||||
apierv1ConfigDIR = "apier_mysql"
|
||||
case utils.MetaMongo:
|
||||
apierv1ConfigDIR = "apier_mongo"
|
||||
default:
|
||||
return nil, errors.New("UNSUPPORTED_RPC")
|
||||
t.Fatal("Unknown Database type")
|
||||
}
|
||||
|
||||
for _, stest := range apierTests {
|
||||
t.Run(apierv1ConfigDIR, stest)
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierLoadConfig(t *testing.T) {
|
||||
func testApierLoadConfig(t *testing.T) {
|
||||
var err error
|
||||
cfgPath = path.Join(*dataDir, "conf", "samples", "apier") // no need for a new config with *gob transport in this case
|
||||
cfgPath = path.Join(*dataDir, "conf", "samples", apierv1ConfigDIR) // no need for a new config with *gob transport in this case
|
||||
if cfg, err = config.NewCGRConfigFromPath(cfgPath); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierCreateDirs(t *testing.T) {
|
||||
func testApierCreateDirs(t *testing.T) {
|
||||
for _, pathDir := range []string{cfg.CdreProfiles[utils.MetaDefault].ExportPath, "/var/log/cgrates/cdrc/in", "/var/log/cgrates/cdrc/out"} {
|
||||
if err := os.RemoveAll(pathDir); err != nil {
|
||||
t.Fatal("Error removing folder: ", pathDir, err)
|
||||
@@ -100,28 +176,28 @@ func TestApierCreateDirs(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierInitDataDb(t *testing.T) {
|
||||
func testApierInitDataDb(t *testing.T) {
|
||||
if err := engine.InitDataDb(cfg); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
// Empty tables before using them
|
||||
func TestApierInitStorDb(t *testing.T) {
|
||||
func testApierInitStorDb(t *testing.T) {
|
||||
if err := engine.InitStorDb(cfg); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
// Start engine
|
||||
func TestApierStartEngine(t *testing.T) {
|
||||
func testApierStartEngine(t *testing.T) {
|
||||
if _, err := engine.StopStartEngine(cfgPath, *waitRater); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
// Connect rpc client to rater
|
||||
func TestApierRpcConn(t *testing.T) {
|
||||
func testApierRpcConn(t *testing.T) {
|
||||
var err error
|
||||
rater, err = newRPCClient(cfg.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed
|
||||
if err != nil {
|
||||
@@ -130,14 +206,14 @@ func TestApierRpcConn(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here TPTiming APIs
|
||||
func TestApierTPTiming(t *testing.T) {
|
||||
func testApierTPTiming(t *testing.T) {
|
||||
// ALWAYS,*any,*any,*any,*any,00:00:00
|
||||
tmAlways := &utils.ApierTPTiming{TPid: utils.TEST_SQL,
|
||||
ID: "ALWAYS",
|
||||
Years: "*any",
|
||||
Months: "*any",
|
||||
MonthDays: "*any",
|
||||
WeekDays: "*any",
|
||||
Years: utils.META_ANY,
|
||||
Months: utils.META_ANY,
|
||||
MonthDays: utils.META_ANY,
|
||||
WeekDays: utils.META_ANY,
|
||||
Time: "00:00:00",
|
||||
}
|
||||
tmAlways2 := new(utils.ApierTPTiming)
|
||||
@@ -146,13 +222,13 @@ func TestApierTPTiming(t *testing.T) {
|
||||
tmAsap := &utils.ApierTPTiming{
|
||||
TPid: utils.TEST_SQL,
|
||||
ID: "ASAP",
|
||||
Years: "*any",
|
||||
Months: "*any",
|
||||
MonthDays: "*any",
|
||||
WeekDays: "*any",
|
||||
Years: utils.META_ANY,
|
||||
Months: utils.META_ANY,
|
||||
MonthDays: utils.META_ANY,
|
||||
WeekDays: utils.META_ANY,
|
||||
Time: "*asap",
|
||||
}
|
||||
reply := ""
|
||||
var reply string
|
||||
for _, tm := range []*utils.ApierTPTiming{tmAlways, tmAsap, tmAlways2} {
|
||||
if err := rater.Call(utils.ApierV1SetTPTiming, tm, &reply); err != nil {
|
||||
t.Error("Got error on ApierV1.SetTPTiming: ", err.Error())
|
||||
@@ -196,8 +272,8 @@ func TestApierTPTiming(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here TPTiming APIs
|
||||
func TestApierTPDestination(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierTPDestination(t *testing.T) {
|
||||
var reply string
|
||||
dstDe := &utils.TPDestination{TPid: utils.TEST_SQL, ID: "GERMANY", Prefixes: []string{"+49"}}
|
||||
dstDeMobile := &utils.TPDestination{TPid: utils.TEST_SQL, ID: "GERMANY_MOBILE", Prefixes: []string{"+4915", "+4916", "+4917"}}
|
||||
dstFs := &utils.TPDestination{TPid: utils.TEST_SQL, ID: "FS_USERS", Prefixes: []string{"10"}}
|
||||
@@ -247,8 +323,8 @@ func TestApierTPDestination(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here TPRate APIs
|
||||
func TestApierTPRate(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierTPRate(t *testing.T) {
|
||||
var reply string
|
||||
rt := &utils.TPRate{TPid: utils.TEST_SQL, ID: "RT_FS_USERS", RateSlots: []*utils.RateSlot{
|
||||
{ConnectFee: 0, Rate: 0, RateUnit: "60s", RateIncrement: "60s", GroupIntervalStart: "0s"},
|
||||
}}
|
||||
@@ -298,8 +374,8 @@ func TestApierTPRate(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here TPDestinationRate APIs
|
||||
func TestApierTPDestinationRate(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierTPDestinationRate(t *testing.T) {
|
||||
var reply string
|
||||
dr := &utils.TPDestinationRate{TPid: utils.TEST_SQL, ID: "DR_FREESWITCH_USERS", DestinationRates: []*utils.DestinationRate{
|
||||
{DestinationId: "FS_USERS", RateId: "RT_FS_USERS", RoundingMethod: "*up", RoundingDecimals: 2},
|
||||
}}
|
||||
@@ -352,8 +428,8 @@ func TestApierTPDestinationRate(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here TPRatingPlan APIs
|
||||
func TestApierTPRatingPlan(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierTPRatingPlan(t *testing.T) {
|
||||
var reply string
|
||||
rp := &utils.TPRatingPlan{TPid: utils.TEST_SQL, ID: "RETAIL1", RatingPlanBindings: []*utils.TPRatingPlanBinding{
|
||||
{DestinationRatesId: "DR_FREESWITCH_USERS", TimingId: "ALWAYS", Weight: 10},
|
||||
}}
|
||||
@@ -403,12 +479,12 @@ func TestApierTPRatingPlan(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here TPRatingPlan APIs
|
||||
func TestApierTPRatingProfile(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierTPRatingProfile(t *testing.T) {
|
||||
var reply string
|
||||
rpf := &utils.TPRatingProfile{TPid: utils.TEST_SQL, LoadId: utils.TEST_SQL,
|
||||
Tenant: "cgrates.org", Category: "call", Subject: "*any",
|
||||
Tenant: "cgrates.org", Category: "call", Subject: utils.META_ANY,
|
||||
RatingPlanActivations: []*utils.TPRatingActivation{
|
||||
{ActivationTime: "2012-01-01T00:00:00Z", RatingPlanId: "RETAIL1", FallbackSubjects: ""},
|
||||
{ActivationTime: "2012-01-01T00:00:00Z", RatingPlanId: "RETAIL1", FallbackSubjects: utils.EmptyString},
|
||||
}}
|
||||
rpfTst := new(utils.TPRatingProfile)
|
||||
*rpfTst = *rpf
|
||||
@@ -455,13 +531,13 @@ func TestApierTPRatingProfile(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierTPActions(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierTPActions(t *testing.T) {
|
||||
var reply string
|
||||
act := &utils.TPActions{TPid: utils.TEST_SQL,
|
||||
ID: "PREPAID_10", Actions: []*utils.TPAction{
|
||||
{Identifier: "*topup_reset", BalanceType: "*monetary",
|
||||
{Identifier: "*topup_reset", BalanceType: utils.MONETARY,
|
||||
Units: "10", ExpiryTime: "*unlimited",
|
||||
DestinationIds: "*any", BalanceWeight: "10", Weight: 10},
|
||||
DestinationIds: utils.META_ANY, BalanceWeight: "10", Weight: 10},
|
||||
}}
|
||||
actWarn := &utils.TPActions{TPid: utils.TEST_SQL, ID: "WARN_VIA_HTTP", Actions: []*utils.TPAction{
|
||||
{Identifier: "*call_url", ExtraParameters: "http://localhost:8000", Weight: 10},
|
||||
@@ -514,8 +590,8 @@ func TestApierTPActions(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierTPActionPlan(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierTPActionPlan(t *testing.T) {
|
||||
var reply string
|
||||
at := &utils.TPActionPlan{TPid: utils.TEST_SQL, ID: "PREPAID_10", ActionPlan: []*utils.TPActionTiming{
|
||||
{ActionsId: "PREPAID_10", TimingId: "ASAP", Weight: 10},
|
||||
}}
|
||||
@@ -564,14 +640,14 @@ func TestApierTPActionPlan(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierTPActionTriggers(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierTPActionTriggers(t *testing.T) {
|
||||
var reply string
|
||||
at := &utils.TPActionTriggers{
|
||||
TPid: utils.TEST_SQL,
|
||||
ID: "STANDARD_TRIGGERS",
|
||||
ActionTriggers: []*utils.TPActionTrigger{
|
||||
{Id: "STANDARD_TRIGGERS", UniqueID: "MYFIRSTTRIGGER",
|
||||
BalanceType: "*monetary", ThresholdType: "*min_balance",
|
||||
BalanceType: utils.MONETARY, ThresholdType: "*min_balance",
|
||||
ThresholdValue: 2, ActionsId: "LOG_BALANCE", Weight: 10},
|
||||
}}
|
||||
atTst := new(utils.TPActionTriggers)
|
||||
@@ -621,8 +697,8 @@ func TestApierTPActionTriggers(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here TPAccountActions APIs
|
||||
func TestApierTPAccountActions(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierTPAccountActions(t *testing.T) {
|
||||
var reply string
|
||||
aa1 := &utils.TPAccountActions{TPid: utils.TEST_SQL, LoadId: utils.TEST_SQL, Tenant: "cgrates.org",
|
||||
Account: "1001", ActionPlanId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"}
|
||||
aa2 := &utils.TPAccountActions{TPid: utils.TEST_SQL, LoadId: utils.TEST_SQL, Tenant: "cgrates.org",
|
||||
@@ -679,8 +755,8 @@ func TestApierTPAccountActions(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here LoadRatingPlan
|
||||
func TestApierLoadRatingPlan(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierLoadRatingPlan(t *testing.T) {
|
||||
var reply string
|
||||
if err := rater.Call(utils.ApierV1LoadRatingPlan, AttrLoadRatingPlan{TPid: utils.TEST_SQL, RatingPlanId: "RETAIL1"}, &reply); err != nil {
|
||||
t.Error("Got error on ApierV1.LoadRatingPlan: ", err.Error())
|
||||
} else if reply != "OK" {
|
||||
@@ -689,8 +765,8 @@ func TestApierLoadRatingPlan(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here LoadRatingProfile
|
||||
func TestApierLoadRatingProfile(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierLoadRatingProfile(t *testing.T) {
|
||||
var reply string
|
||||
rpf := &utils.TPRatingProfile{
|
||||
TPid: utils.TEST_SQL, LoadId: utils.TEST_SQL,
|
||||
Tenant: "cgrates.org", Category: "call", Subject: "*any"}
|
||||
@@ -702,7 +778,7 @@ func TestApierLoadRatingProfile(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here LoadAccountActions
|
||||
func TestApierLoadAccountActions(t *testing.T) {
|
||||
func testApierLoadAccountActions(t *testing.T) {
|
||||
var rcvStats map[string]*ltcache.CacheStats
|
||||
expectedStats := engine.GetDefaultEmptyCacheStats() // Make sure nothing in cache so far
|
||||
if err := rater.Call(utils.CacheSv1GetCacheStats, new(utils.AttrCacheIDsWithArgDispatcher), &rcvStats); err != nil {
|
||||
@@ -710,7 +786,7 @@ func TestApierLoadAccountActions(t *testing.T) {
|
||||
} else if !reflect.DeepEqual(expectedStats, rcvStats) {
|
||||
t.Errorf("Calling CacheSv1.GetCacheStats expected: %+v, received: %+v", utils.ToJSON(expectedStats), utils.ToJSON(rcvStats))
|
||||
}
|
||||
reply := ""
|
||||
var reply string
|
||||
aa1 := &utils.TPAccountActions{TPid: utils.TEST_SQL, LoadId: utils.TEST_SQL, Tenant: "cgrates.org", Account: "1001"}
|
||||
if err := rater.Call(utils.ApierV1LoadAccountActions, aa1, &reply); err != nil {
|
||||
t.Error("Got error on ApierV1.LoadAccountActions: ", err.Error())
|
||||
@@ -729,8 +805,8 @@ func TestApierLoadAccountActions(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here ReloadScheduler
|
||||
func TestApierReloadScheduler(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierReloadScheduler(t *testing.T) {
|
||||
var reply string
|
||||
// Simple test that command is executed without errors
|
||||
if err := rater.Call(utils.SchedulerSv1Reload, dispatchers.StringWithApiKey{}, &reply); err != nil {
|
||||
t.Error("Got error on SchedulerSv1.Reload: ", err.Error())
|
||||
@@ -740,8 +816,8 @@ func TestApierReloadScheduler(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here SetRatingProfile
|
||||
func TestApierSetRatingProfile(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierSetRatingProfile(t *testing.T) {
|
||||
var reply string
|
||||
rpa := &utils.TPRatingActivation{ActivationTime: "2012-01-01T00:00:00Z", RatingPlanId: "RETAIL1", FallbackSubjects: "dan2"}
|
||||
rpf := &utils.AttrSetRatingProfile{Tenant: "cgrates.org", Category: "call",
|
||||
Subject: "dan", RatingPlanActivations: []*utils.TPRatingActivation{rpa}}
|
||||
@@ -767,8 +843,8 @@ func TestApierSetRatingProfile(t *testing.T) {
|
||||
}
|
||||
// Make sure rates were loaded for account dan
|
||||
// Test here ResponderGetCost
|
||||
tStart, _ := utils.ParseTimeDetectLayout("2013-08-07T17:30:00Z", "")
|
||||
tEnd, _ := utils.ParseTimeDetectLayout("2013-08-07T17:31:30Z", "")
|
||||
tStart, _ := utils.ParseTimeDetectLayout("2013-08-07T17:30:00Z", utils.EmptyString)
|
||||
tEnd, _ := utils.ParseTimeDetectLayout("2013-08-07T17:31:30Z", utils.EmptyString)
|
||||
cd := &engine.CallDescriptorWithArgDispatcher{
|
||||
CallDescriptor: &engine.CallDescriptor{
|
||||
Category: "call",
|
||||
@@ -797,11 +873,11 @@ func TestApierSetRatingProfile(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierV1GetRatingProfile(t *testing.T) {
|
||||
func testApierV1GetRatingProfile(t *testing.T) {
|
||||
var rpl engine.RatingProfile
|
||||
attrGetRatingPlan := &utils.AttrGetRatingProfile{
|
||||
Tenant: "cgrates.org", Category: "call", Subject: "dan"}
|
||||
actTime, err := utils.ParseTimeDetectLayout("2012-01-01T00:00:00Z", "")
|
||||
actTime, err := utils.ParseTimeDetectLayout("2012-01-01T00:00:00Z", utils.EmptyString)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
@@ -825,7 +901,7 @@ func TestApierV1GetRatingProfile(t *testing.T) {
|
||||
} else if !reflect.DeepEqual(expected, rpl) {
|
||||
t.Errorf("Calling ApierV1.GetRatingProfile expected: %+v, received: %+v", utils.ToJSON(expected), utils.ToJSON(rpl))
|
||||
}
|
||||
attrGetRatingPlan.Subject = ""
|
||||
attrGetRatingPlan.Subject = utils.EmptyString
|
||||
if err := rater.Call(utils.ApierV1GetRatingProfile, attrGetRatingPlan, &rpl); err == nil {
|
||||
t.Errorf("Expected error on ApierV1.GetRatingProfile, recived : %+v", rpl)
|
||||
}
|
||||
@@ -845,8 +921,8 @@ func TestApierV1GetRatingProfile(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here ReloadCache
|
||||
func TestApierReloadCache(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierReloadCache(t *testing.T) {
|
||||
var reply string
|
||||
arc := new(utils.AttrReloadCache)
|
||||
// Simple test that command is executed without errors
|
||||
if err := rater.Call(utils.CacheSv1ReloadCache, arc, &reply); err != nil {
|
||||
@@ -871,7 +947,7 @@ func TestApierReloadCache(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here GetDestination
|
||||
func TestApierGetDestination(t *testing.T) {
|
||||
func testApierGetDestination(t *testing.T) {
|
||||
reply := new(engine.Destination)
|
||||
dstId := "GERMANY_MOBILE"
|
||||
expectedReply := &engine.Destination{Id: dstId, Prefixes: []string{"+4915", "+4916", "+4917"}}
|
||||
@@ -883,7 +959,7 @@ func TestApierGetDestination(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here GetRatingPlan
|
||||
func TestApierGetRatingPlan(t *testing.T) {
|
||||
func testApierGetRatingPlan(t *testing.T) {
|
||||
reply := new(engine.RatingPlan)
|
||||
rplnId := "RETAIL1"
|
||||
if err := rater.Call(utils.ApierV1GetRatingPlan, rplnId, reply); err != nil {
|
||||
@@ -908,7 +984,7 @@ func TestApierGetRatingPlan(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierRemoveRatingPlan(t *testing.T) {
|
||||
func testApierRemoveRatingPlan(t *testing.T) {
|
||||
rplnId := "RETAIL1"
|
||||
var reply string
|
||||
|
||||
@@ -928,45 +1004,45 @@ func TestApierRemoveRatingPlan(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here AddBalance
|
||||
func TestApierAddBalance(t *testing.T) {
|
||||
reply := ""
|
||||
attrs := &AttrAddBalance{Tenant: "cgrates.org", Account: "1001", BalanceType: "*monetary", Value: 1.5}
|
||||
func testApierAddBalance(t *testing.T) {
|
||||
var reply string
|
||||
attrs := &AttrAddBalance{Tenant: "cgrates.org", Account: "1001", BalanceType: utils.MONETARY, Value: 1.5}
|
||||
if err := rater.Call(utils.ApierV1AddBalance, attrs, &reply); err != nil {
|
||||
t.Error("Got error on ApierV1.AddBalance: ", err.Error())
|
||||
} else if reply != "OK" {
|
||||
t.Errorf("Calling ApierV1.AddBalance received: %s", reply)
|
||||
}
|
||||
attrs = &AttrAddBalance{Tenant: "cgrates.org", Account: "dan", BalanceType: "*monetary", Value: 1.5}
|
||||
attrs = &AttrAddBalance{Tenant: "cgrates.org", Account: "dan", BalanceType: utils.MONETARY, Value: 1.5}
|
||||
if err := rater.Call(utils.ApierV1AddBalance, attrs, &reply); err != nil {
|
||||
t.Error("Got error on ApierV1.AddBalance: ", err.Error())
|
||||
} else if reply != "OK" {
|
||||
t.Errorf("Calling ApierV1.AddBalance received: %s", reply)
|
||||
}
|
||||
attrs = &AttrAddBalance{Tenant: "cgrates.org", Account: "dan2", BalanceType: "*monetary", Value: 1.5}
|
||||
attrs = &AttrAddBalance{Tenant: "cgrates.org", Account: "dan2", BalanceType: utils.MONETARY, Value: 1.5}
|
||||
if err := rater.Call(utils.ApierV1AddBalance, attrs, &reply); err != nil {
|
||||
t.Error("Got error on ApierV1.AddBalance: ", err.Error())
|
||||
} else if reply != "OK" {
|
||||
t.Errorf("Calling ApierV1.AddBalance received: %s", reply)
|
||||
}
|
||||
attrs = &AttrAddBalance{Tenant: "cgrates.org", Account: "dan3", BalanceType: "*monetary", Value: 1.5}
|
||||
attrs = &AttrAddBalance{Tenant: "cgrates.org", Account: "dan3", BalanceType: utils.MONETARY, Value: 1.5}
|
||||
if err := rater.Call(utils.ApierV1AddBalance, attrs, &reply); err != nil {
|
||||
t.Error("Got error on ApierV1.AddBalance: ", err.Error())
|
||||
} else if reply != "OK" {
|
||||
t.Errorf("Calling ApierV1.AddBalance received: %s", reply)
|
||||
}
|
||||
attrs = &AttrAddBalance{Tenant: "cgrates.org", Account: "dan3", BalanceType: "*monetary", Value: 2.1}
|
||||
attrs = &AttrAddBalance{Tenant: "cgrates.org", Account: "dan3", BalanceType: utils.MONETARY, Value: 2.1}
|
||||
if err := rater.Call(utils.ApierV1AddBalance, attrs, &reply); err != nil {
|
||||
t.Error("Got error on ApierV1.AddBalance: ", err.Error())
|
||||
} else if reply != "OK" {
|
||||
t.Errorf("Calling ApierV1.AddBalance received: %s", reply)
|
||||
}
|
||||
attrs = &AttrAddBalance{Tenant: "cgrates.org", Account: "dan6", BalanceType: "*monetary", Value: 2.1}
|
||||
attrs = &AttrAddBalance{Tenant: "cgrates.org", Account: "dan6", BalanceType: utils.MONETARY, Value: 2.1}
|
||||
if err := rater.Call(utils.ApierV1AddBalance, attrs, &reply); err != nil {
|
||||
t.Error("Got error on ApierV1.AddBalance: ", err.Error())
|
||||
} else if reply != "OK" {
|
||||
t.Errorf("Calling ApierV1.AddBalance received: %s", reply)
|
||||
}
|
||||
attrs = &AttrAddBalance{Tenant: "cgrates.org", Account: "dan6", BalanceType: "*monetary", Value: 1, Overwrite: true}
|
||||
attrs = &AttrAddBalance{Tenant: "cgrates.org", Account: "dan6", BalanceType: utils.MONETARY, Value: 1, Overwrite: true}
|
||||
if err := rater.Call(utils.ApierV1AddBalance, attrs, &reply); err != nil {
|
||||
t.Error("Got error on ApierV1.AddBalance: ", err.Error())
|
||||
} else if reply != "OK" {
|
||||
@@ -976,8 +1052,8 @@ func TestApierAddBalance(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here ExecuteAction
|
||||
func TestApierExecuteAction(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierExecuteAction(t *testing.T) {
|
||||
var reply string
|
||||
// Add balance to a previously known account
|
||||
attrs := utils.AttrExecuteAction{Tenant: "cgrates.org", Account: "dan2", ActionsId: "PREPAID_10"}
|
||||
if err := rater.Call(utils.ApierV1ExecuteAction, attrs, &reply); err != nil {
|
||||
@@ -985,7 +1061,7 @@ func TestApierExecuteAction(t *testing.T) {
|
||||
} else if reply != "OK" {
|
||||
t.Errorf("Calling ApierV1.ExecuteAction received: %s", reply)
|
||||
}
|
||||
reply2 := ""
|
||||
reply2 := utils.EmptyString
|
||||
// Add balance to an account which does n exist
|
||||
attrs = utils.AttrExecuteAction{Tenant: "cgrates.org", Account: "dan2", ActionsId: "DUMMY_ACTION"}
|
||||
if err := rater.Call(utils.ApierV1ExecuteAction, attrs, &reply2); err == nil || reply2 == "OK" {
|
||||
@@ -993,10 +1069,10 @@ func TestApierExecuteAction(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierSetActions(t *testing.T) {
|
||||
func testApierSetActions(t *testing.T) {
|
||||
act1 := &V1TPAction{Identifier: utils.TOPUP_RESET, BalanceType: utils.MONETARY, Directions: utils.META_OUT, Units: 75.0, ExpiryTime: utils.UNLIMITED, Weight: 20.0}
|
||||
attrs1 := &V1AttrSetActions{ActionsId: "ACTS_1", Actions: []*V1TPAction{act1}}
|
||||
reply1 := ""
|
||||
reply1 := utils.EmptyString
|
||||
if err := rater.Call(utils.ApierV1SetActions, attrs1, &reply1); err != nil {
|
||||
t.Error("Got error on ApierV1.SetActions: ", err.Error())
|
||||
} else if reply1 != "OK" {
|
||||
@@ -1008,7 +1084,7 @@ func TestApierSetActions(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierGetActions(t *testing.T) {
|
||||
func testApierGetActions(t *testing.T) {
|
||||
expectActs := []*utils.TPAction{
|
||||
{Identifier: utils.TOPUP_RESET, BalanceType: utils.MONETARY,
|
||||
Units: "75", BalanceWeight: "0", BalanceBlocker: "false",
|
||||
@@ -1022,10 +1098,10 @@ func TestApierGetActions(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierSetActionPlan(t *testing.T) {
|
||||
func testApierSetActionPlan(t *testing.T) {
|
||||
atm1 := &AttrActionPlan{ActionsId: "ACTS_1", MonthDays: "1", Time: "00:00:00", Weight: 20.0}
|
||||
atms1 := &AttrSetActionPlan{Id: "ATMS_1", ActionPlan: []*AttrActionPlan{atm1}}
|
||||
reply1 := ""
|
||||
reply1 := utils.EmptyString
|
||||
if err := rater.Call(utils.ApierV1SetActionPlan, atms1, &reply1); err != nil {
|
||||
t.Error("Got error on ApierV1.SetActionPlan: ", err.Error())
|
||||
} else if reply1 != "OK" {
|
||||
@@ -1038,23 +1114,23 @@ func TestApierSetActionPlan(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here AddTriggeredAction
|
||||
func TestApierAddTriggeredAction(t *testing.T) {
|
||||
func testApierAddTriggeredAction(t *testing.T) {
|
||||
var reply string
|
||||
attrs := &AttrAddBalance{Tenant: "cgrates.org", Account: "dan32", BalanceType: "*monetary", Value: 1.5}
|
||||
attrs := &AttrAddBalance{Tenant: "cgrates.org", Account: "dan32", BalanceType: utils.MONETARY, Value: 1.5}
|
||||
if err := rater.Call(utils.ApierV1AddBalance, attrs, &reply); err != nil {
|
||||
t.Error("Got error on ApierV1.AddBalance: ", err.Error())
|
||||
} else if reply != "OK" {
|
||||
t.Errorf("Calling ApierV1.AddBalance received: %s", reply)
|
||||
}
|
||||
// Add balance to a previously known account
|
||||
attrsAddTrigger := &AttrAddActionTrigger{Tenant: "cgrates.org", Account: "dan32", BalanceDirection: "*out", BalanceType: "*monetary",
|
||||
ThresholdType: "*min_balance", ThresholdValue: 2, BalanceDestinationIds: "*any", Weight: 10, ActionsId: "WARN_VIA_HTTP"}
|
||||
attrsAddTrigger := &AttrAddActionTrigger{Tenant: "cgrates.org", Account: "dan32", BalanceDirection: "*out", BalanceType: utils.MONETARY,
|
||||
ThresholdType: "*min_balance", ThresholdValue: 2, BalanceDestinationIds: utils.META_ANY, Weight: 10, ActionsId: "WARN_VIA_HTTP"}
|
||||
if err := rater.Call(utils.ApierV1AddTriggeredAction, attrsAddTrigger, &reply); err != nil {
|
||||
t.Error("Got error on ApierV1.AddTriggeredAction: ", err.Error())
|
||||
} else if reply != "OK" {
|
||||
t.Errorf("Calling ApierV1.AddTriggeredAction received: %s", reply)
|
||||
}
|
||||
reply2 := ""
|
||||
reply2 := utils.EmptyString
|
||||
attrs2 := new(AttrAddActionTrigger)
|
||||
*attrs2 = *attrsAddTrigger
|
||||
attrs2.Account = "dan10" // Does not exist so it should error when adding triggers on it
|
||||
@@ -1065,7 +1141,7 @@ func TestApierAddTriggeredAction(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here GetAccountActionTriggers
|
||||
func TestApierGetAccountActionTriggers(t *testing.T) {
|
||||
func testApierGetAccountActionTriggers(t *testing.T) {
|
||||
var reply engine.ActionTriggers
|
||||
req := utils.TenantAccount{Tenant: "cgrates.org", Account: "dan32"}
|
||||
if err := rater.Call(utils.ApierV1GetAccountActionTriggers, req, &reply); err != nil {
|
||||
@@ -1075,8 +1151,8 @@ func TestApierGetAccountActionTriggers(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierAddTriggeredAction2(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierAddTriggeredAction2(t *testing.T) {
|
||||
var reply string
|
||||
// Add balance to a previously known account
|
||||
attrs := &AttrAddAccountActionTriggers{ActionTriggerIDs: []string{"STANDARD_TRIGGERS"}, Tenant: "cgrates.org", Account: "dan2"}
|
||||
if err := rater.Call(utils.ApierV1AddAccountActionTriggers, attrs, &reply); err != nil {
|
||||
@@ -1084,7 +1160,7 @@ func TestApierAddTriggeredAction2(t *testing.T) {
|
||||
} else if reply != "OK" {
|
||||
t.Errorf("Calling ApierV1.AddAccountActionTriggers received: %s", reply)
|
||||
}
|
||||
reply2 := ""
|
||||
reply2 := utils.EmptyString
|
||||
attrs2 := new(AttrAddAccountActionTriggers)
|
||||
*attrs2 = *attrs
|
||||
attrs2.Account = "dan10" // Does not exist so it should error when adding triggers on it
|
||||
@@ -1095,7 +1171,7 @@ func TestApierAddTriggeredAction2(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here GetAccountActionTriggers
|
||||
func TestApierGetAccountActionTriggers2(t *testing.T) {
|
||||
func testApierGetAccountActionTriggers2(t *testing.T) {
|
||||
var reply engine.ActionTriggers
|
||||
req := utils.TenantAccount{Tenant: "cgrates.org", Account: "dan2"}
|
||||
if err := rater.Call(utils.ApierV1GetAccountActionTriggers, req, &reply); err != nil {
|
||||
@@ -1106,7 +1182,7 @@ func TestApierGetAccountActionTriggers2(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here SetAccountActionTriggers
|
||||
func TestApierSetAccountActionTriggers(t *testing.T) {
|
||||
func testApierSetAccountActionTriggers(t *testing.T) {
|
||||
// Test first get so we can steal the id which we need to remove
|
||||
var reply engine.ActionTriggers
|
||||
req := utils.TenantAccount{Tenant: "cgrates.org", Account: "dan2"}
|
||||
@@ -1147,7 +1223,7 @@ func TestApierSetAccountActionTriggers(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here RemAccountActionTriggers
|
||||
func TestApierRemAccountActionTriggers(t *testing.T) {
|
||||
func testApierRemAccountActionTriggers(t *testing.T) {
|
||||
// Test first get so we can steal the id which we need to remove
|
||||
var reply engine.ActionTriggers
|
||||
req := utils.TenantAccount{Tenant: "cgrates.org", Account: "dan2"}
|
||||
@@ -1179,15 +1255,15 @@ func TestApierRemAccountActionTriggers(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here SetAccount
|
||||
func TestApierSetAccount(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierSetAccount(t *testing.T) {
|
||||
var reply string
|
||||
attrs := &utils.AttrSetAccount{Tenant: "cgrates.org", Account: "dan7", ActionPlanID: "ATMS_1", ReloadScheduler: true}
|
||||
if err := rater.Call(utils.ApierV1SetAccount, attrs, &reply); err != nil {
|
||||
t.Error("Got error on ApierV1.SetAccount: ", err.Error())
|
||||
} else if reply != "OK" {
|
||||
t.Errorf("Calling ApierV1.SetAccount received: %s", reply)
|
||||
}
|
||||
reply2 := ""
|
||||
reply2 := utils.EmptyString
|
||||
attrs2 := new(utils.AttrSetAccount)
|
||||
*attrs2 = *attrs
|
||||
attrs2.ActionPlanID = "DUMMY_DATA" // Does not exist so it should error when adding triggers on it
|
||||
@@ -1198,7 +1274,7 @@ func TestApierSetAccount(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here GetAccountActionTimings
|
||||
func TestApierGetAccountActionPlan(t *testing.T) {
|
||||
func testApierGetAccountActionPlan(t *testing.T) {
|
||||
var reply []*AccountActionTiming
|
||||
req := utils.TenantAccount{Tenant: "cgrates.org", Account: "dan7"}
|
||||
if err := rater.Call(utils.ApierV1GetAccountActionPlan, req, &reply); err != nil {
|
||||
@@ -1213,7 +1289,7 @@ func TestApierGetAccountActionPlan(t *testing.T) {
|
||||
}
|
||||
|
||||
// Make sure we have scheduled actions
|
||||
func TestApierITGetScheduledActionsForAccount(t *testing.T) {
|
||||
func testApierITGetScheduledActionsForAccount(t *testing.T) {
|
||||
var rply []*scheduler.ScheduledAction
|
||||
if err := rater.Call(utils.ApierV1GetScheduledActions,
|
||||
scheduler.ArgsGetScheduledActions{
|
||||
@@ -1226,7 +1302,7 @@ func TestApierITGetScheduledActionsForAccount(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here RemoveActionTiming
|
||||
func TestApierRemUniqueIDActionTiming(t *testing.T) {
|
||||
func testApierRemUniqueIDActionTiming(t *testing.T) {
|
||||
var rmReply string
|
||||
rmReq := AttrRemoveActionTiming{ActionPlanId: "ATMS_1", Tenant: "cgrates.org", Account: "dan4"}
|
||||
if err := rater.Call(utils.ApierV1RemoveActionTiming, rmReq, &rmReply); err != nil {
|
||||
@@ -1244,7 +1320,7 @@ func TestApierRemUniqueIDActionTiming(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here GetAccount
|
||||
func TestApierGetAccount(t *testing.T) {
|
||||
func testApierGetAccount(t *testing.T) {
|
||||
var reply *engine.Account
|
||||
attrs := &utils.AttrGetAccount{Tenant: "cgrates.org", Account: "1001"}
|
||||
if err := rater.Call(utils.ApierV2GetAccount, attrs, &reply); err != nil {
|
||||
@@ -1280,15 +1356,15 @@ func TestApierGetAccount(t *testing.T) {
|
||||
}
|
||||
|
||||
// Start with initial balance, top-up to test max_balance
|
||||
func TestApierTriggersExecute(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierTriggersExecute(t *testing.T) {
|
||||
var reply string
|
||||
attrs := &utils.AttrSetAccount{Tenant: "cgrates.org", Account: "dan8", ReloadScheduler: true}
|
||||
if err := rater.Call(utils.ApierV1SetAccount, attrs, &reply); err != nil {
|
||||
t.Error("Got error on ApierV1.SetAccount: ", err.Error())
|
||||
} else if reply != "OK" {
|
||||
t.Errorf("Calling ApierV1.SetAccount received: %s", reply)
|
||||
}
|
||||
attrAddBlnc := &AttrAddBalance{Tenant: "cgrates.org", Account: "1008", BalanceType: "*monetary", Value: 2}
|
||||
attrAddBlnc := &AttrAddBalance{Tenant: "cgrates.org", Account: "1008", BalanceType: utils.MONETARY, Value: 2}
|
||||
if err := rater.Call(utils.ApierV1AddBalance, attrAddBlnc, &reply); err != nil {
|
||||
t.Error("Got error on ApierV1.AddBalance: ", err.Error())
|
||||
} else if reply != "OK" {
|
||||
@@ -1297,8 +1373,8 @@ func TestApierTriggersExecute(t *testing.T) {
|
||||
}
|
||||
|
||||
// Start fresh before loading from folder
|
||||
func TestApierResetDataBeforeLoadFromFolder(t *testing.T) {
|
||||
TestApierInitDataDb(t)
|
||||
func testApierResetDataBeforeLoadFromFolder(t *testing.T) {
|
||||
testApierInitDataDb(t)
|
||||
var reply string
|
||||
// Simple test that command is executed without errors
|
||||
if err := rater.Call(utils.CacheSv1FlushCache, utils.AttrReloadCache{FlushAll: true}, &reply); err != nil {
|
||||
@@ -1317,9 +1393,9 @@ func TestApierResetDataBeforeLoadFromFolder(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here LoadTariffPlanFromFolder
|
||||
func TestApierLoadTariffPlanFromFolder(t *testing.T) {
|
||||
reply := ""
|
||||
attrs := &utils.AttrLoadTpFromFolder{FolderPath: ""}
|
||||
func testApierLoadTariffPlanFromFolder(t *testing.T) {
|
||||
var reply string
|
||||
attrs := &utils.AttrLoadTpFromFolder{FolderPath: utils.EmptyString}
|
||||
if err := rater.Call(utils.ApierV1LoadTariffPlanFromFolder, attrs, &reply); err == nil || !strings.HasPrefix(err.Error(), utils.ErrMandatoryIeMissing.Error()) {
|
||||
t.Error(err)
|
||||
}
|
||||
@@ -1338,21 +1414,21 @@ func TestApierLoadTariffPlanFromFolder(t *testing.T) {
|
||||
}
|
||||
|
||||
// For now just test that they execute without errors
|
||||
func TestApierComputeReverse(t *testing.T) {
|
||||
func testApierComputeReverse(t *testing.T) {
|
||||
var reply string
|
||||
if err := rater.Call(utils.ApierV1ComputeReverseDestinations, "", &reply); err != nil {
|
||||
if err := rater.Call(utils.ApierV1ComputeReverseDestinations, utils.EmptyString, &reply); err != nil {
|
||||
t.Error(err)
|
||||
} else if reply != utils.OK {
|
||||
t.Error("Received: ", reply)
|
||||
}
|
||||
if err := rater.Call(utils.ApierV1ComputeAccountActionPlans, "", &reply); err != nil {
|
||||
if err := rater.Call(utils.ApierV1ComputeAccountActionPlans, utils.EmptyString, &reply); err != nil {
|
||||
t.Error(err)
|
||||
} else if reply != utils.OK {
|
||||
t.Error("Received: ", reply)
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierResetDataAfterLoadFromFolder(t *testing.T) {
|
||||
func testApierResetDataAfterLoadFromFolder(t *testing.T) {
|
||||
time.Sleep(10 * time.Millisecond)
|
||||
var rcvStats map[string]*ltcache.CacheStats
|
||||
expStats := engine.GetDefaultEmptyCacheStats()
|
||||
@@ -1367,7 +1443,7 @@ func TestApierResetDataAfterLoadFromFolder(t *testing.T) {
|
||||
} else if !reflect.DeepEqual(expStats, rcvStats) {
|
||||
t.Errorf("Expecting: %+v,\n received: %+v", utils.ToJSON(expStats), utils.ToJSON(rcvStats))
|
||||
}
|
||||
reply := ""
|
||||
var reply string
|
||||
// Simple test that command is executed without errors
|
||||
if err := rater.Call(utils.CacheSv1LoadCache, utils.AttrReloadCache{}, &reply); err != nil {
|
||||
t.Error(err)
|
||||
@@ -1397,7 +1473,7 @@ func TestApierResetDataAfterLoadFromFolder(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierSetChargerS(t *testing.T) {
|
||||
func testApierSetChargerS(t *testing.T) {
|
||||
//add a default charger
|
||||
chargerProfile := &ChargerWithCache{
|
||||
ChargerProfile: &engine.ChargerProfile{
|
||||
@@ -1418,7 +1494,7 @@ func TestApierSetChargerS(t *testing.T) {
|
||||
|
||||
// Make sure balance was topped-up
|
||||
// Bug reported by DigiDaz over IRC
|
||||
func TestApierGetAccountAfterLoad(t *testing.T) {
|
||||
func testApierGetAccountAfterLoad(t *testing.T) {
|
||||
var reply *engine.Account
|
||||
attrs := &utils.AttrGetAccount{Tenant: "cgrates.org", Account: "1001"}
|
||||
if err := rater.Call(utils.ApierV2GetAccount, attrs, &reply); err != nil {
|
||||
@@ -1429,9 +1505,9 @@ func TestApierGetAccountAfterLoad(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here ResponderGetCost
|
||||
func TestApierResponderGetCost(t *testing.T) {
|
||||
tStart, _ := utils.ParseTimeDetectLayout("2013-08-07T17:30:00Z", "")
|
||||
tEnd, _ := utils.ParseTimeDetectLayout("2013-08-07T17:31:30Z", "")
|
||||
func testApierResponderGetCost(t *testing.T) {
|
||||
tStart, _ := utils.ParseTimeDetectLayout("2013-08-07T17:30:00Z", utils.EmptyString)
|
||||
tEnd, _ := utils.ParseTimeDetectLayout("2013-08-07T17:31:30Z", utils.EmptyString)
|
||||
cd := &engine.CallDescriptorWithArgDispatcher{
|
||||
CallDescriptor: &engine.CallDescriptor{
|
||||
Category: "call",
|
||||
@@ -1453,7 +1529,7 @@ func TestApierResponderGetCost(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierMaxDebitInexistentAcnt(t *testing.T) {
|
||||
func testApierMaxDebitInexistentAcnt(t *testing.T) {
|
||||
cc := &engine.CallCost{}
|
||||
cd := &engine.CallDescriptorWithArgDispatcher{
|
||||
CallDescriptor: &engine.CallDescriptor{
|
||||
@@ -1474,7 +1550,7 @@ func TestApierMaxDebitInexistentAcnt(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierCdrServer(t *testing.T) {
|
||||
func testApierCdrServer(t *testing.T) {
|
||||
httpClient := new(http.Client)
|
||||
cdrForm1 := url.Values{utils.OriginID: []string{"dsafdsaf"}, utils.OriginHost: []string{"192.168.1.1"}, utils.RequestType: []string{utils.META_RATED},
|
||||
utils.Tenant: []string{"cgrates.org"}, utils.Category: []string{"call"}, utils.Account: []string{"1001"}, utils.Subject: []string{"1001"}, utils.Destination: []string{"1002"},
|
||||
@@ -1493,7 +1569,7 @@ func TestApierCdrServer(t *testing.T) {
|
||||
time.Sleep(time.Duration(*waitRater) * time.Millisecond)
|
||||
}
|
||||
|
||||
func TestApierITGetCdrs(t *testing.T) {
|
||||
func testApierITGetCdrs(t *testing.T) {
|
||||
var reply []*engine.ExternalCDR
|
||||
req := utils.AttrGetCdrs{MediationRunIds: []string{utils.MetaDefault}}
|
||||
if err := rater.Call(utils.ApierV1GetCDRs, req, &reply); err != nil {
|
||||
@@ -1503,7 +1579,7 @@ func TestApierITGetCdrs(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierITProcessCdr(t *testing.T) {
|
||||
func testApierITProcessCdr(t *testing.T) {
|
||||
var reply string
|
||||
cdr := &engine.CDRWithArgDispatcher{
|
||||
CDR: &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, ToR: utils.VOICE, OriginID: "dsafdsaf",
|
||||
@@ -1528,7 +1604,7 @@ func TestApierITProcessCdr(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test here ResponderGetCost
|
||||
func TestApierGetCallCostLog(t *testing.T) {
|
||||
func testApierGetCallCostLog(t *testing.T) {
|
||||
var cc engine.EventCost
|
||||
var attrs utils.AttrGetCallCost
|
||||
// Simple test that command is executed without errors
|
||||
@@ -1577,7 +1653,7 @@ func TestApierGetCallCostLog(t *testing.T) {
|
||||
Usage: utils.DurationPointer(0),
|
||||
Cost: utils.Float64Pointer(0),
|
||||
Charges: []*engine.ChargingInterval{{
|
||||
RatingID: "",
|
||||
RatingID: utils.EmptyString,
|
||||
Increments: nil,
|
||||
CompressFactor: 0,
|
||||
}},
|
||||
@@ -1593,7 +1669,7 @@ func TestApierGetCallCostLog(t *testing.T) {
|
||||
expected.Cost = nil
|
||||
}
|
||||
attrs.CgrId = "Cdr1"
|
||||
attrs.RunId = ""
|
||||
attrs.RunId = utils.EmptyString
|
||||
if err := rater.Call(utils.ApierV1GetEventCost, attrs, &cc); err != nil {
|
||||
t.Error(err)
|
||||
} else if !reflect.DeepEqual(expected, cc) {
|
||||
@@ -1601,7 +1677,7 @@ func TestApierGetCallCostLog(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierITSetDestination(t *testing.T) {
|
||||
func testApierITSetDestination(t *testing.T) {
|
||||
attrs := utils.AttrSetDestination{Id: "TEST_SET_DESTINATION", Prefixes: []string{"+4986517174963", "+4986517174960"}}
|
||||
var reply string
|
||||
if err := rater.Call(utils.ApierV1SetDestination, attrs, &reply); err != nil {
|
||||
@@ -1634,16 +1710,16 @@ func TestApierITSetDestination(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierITGetScheduledActions(t *testing.T) {
|
||||
func testApierITGetScheduledActions(t *testing.T) {
|
||||
var rply []*scheduler.ScheduledAction
|
||||
if err := rater.Call(utils.ApierV1GetScheduledActions, scheduler.ArgsGetScheduledActions{}, &rply); err != nil {
|
||||
t.Error("Unexpected error: ", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierITGetDataCost(t *testing.T) {
|
||||
func testApierITGetDataCost(t *testing.T) {
|
||||
attrs := AttrGetDataCost{Category: "data", Tenant: "cgrates.org",
|
||||
Subject: "1001", AnswerTime: "*now", Usage: 640113}
|
||||
Subject: "1001", AnswerTime: utils.MetaNow, Usage: 640113}
|
||||
var rply *engine.DataCost
|
||||
if err := rater.Call(utils.ApierV1GetDataCost, attrs, &rply); err != nil {
|
||||
t.Error("Unexpected nil error received: ", err.Error())
|
||||
@@ -1652,9 +1728,9 @@ func TestApierITGetDataCost(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierITGetCost(t *testing.T) {
|
||||
func testApierITGetCost(t *testing.T) {
|
||||
attrs := AttrGetCost{Category: "data", Tenant: "cgrates.org",
|
||||
Subject: "1001", AnswerTime: "*now", Usage: "640113"}
|
||||
Subject: "1001", AnswerTime: utils.MetaNow, Usage: "640113"}
|
||||
var rply *engine.EventCost
|
||||
if err := rater.Call(utils.ApierV1GetCost, attrs, &rply); err != nil {
|
||||
t.Error("Unexpected nil error received: ", err.Error())
|
||||
@@ -1664,20 +1740,20 @@ func TestApierITGetCost(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test LoadTPFromStorDb
|
||||
func TestApierInitDataDb2(t *testing.T) {
|
||||
func testApierInitDataDb2(t *testing.T) {
|
||||
if err := engine.InitDataDb(cfg); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierInitStorDb2(t *testing.T) {
|
||||
func testApierInitStorDb2(t *testing.T) {
|
||||
if err := engine.InitStorDb(cfg); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierReloadCache2(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierReloadCache2(t *testing.T) {
|
||||
var reply string
|
||||
// Simple test that command is executed without errors
|
||||
if err := rater.Call(utils.CacheSv1FlushCache, utils.AttrReloadCache{FlushAll: true}, &reply); err != nil {
|
||||
t.Error("Got error on CacheSv1.ReloadCache: ", err.Error())
|
||||
@@ -1686,8 +1762,8 @@ func TestApierReloadCache2(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierReloadScheduler2(t *testing.T) {
|
||||
reply := ""
|
||||
func testApierReloadScheduler2(t *testing.T) {
|
||||
var reply string
|
||||
// Simple test that command is executed without errors
|
||||
if err := rater.Call(utils.SchedulerSv1Reload, dispatchers.StringWithApiKey{}, &reply); err != nil {
|
||||
t.Error("Got error on SchedulerSv1.Reload: ", err.Error())
|
||||
@@ -1696,7 +1772,7 @@ func TestApierReloadScheduler2(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierImportTPFromFolderPath(t *testing.T) {
|
||||
func testApierImportTPFromFolderPath(t *testing.T) {
|
||||
var reply string
|
||||
if err := rater.Call(utils.ApierV1ImportTariffPlanFromFolder,
|
||||
utils.AttrImportTPFromFolder{TPid: "TEST_TPID2",
|
||||
@@ -1708,7 +1784,7 @@ func TestApierImportTPFromFolderPath(t *testing.T) {
|
||||
time.Sleep(500 * time.Millisecond)
|
||||
}
|
||||
|
||||
func TestApierLoadTariffPlanFromStorDbDryRun(t *testing.T) {
|
||||
func testApierLoadTariffPlanFromStorDbDryRun(t *testing.T) {
|
||||
var reply string
|
||||
if err := rater.Call(utils.ApierV1LoadTariffPlanFromStorDb,
|
||||
AttrLoadTpFromStorDb{TPid: "TEST_TPID2", DryRun: true}, &reply); err != nil {
|
||||
@@ -1718,7 +1794,7 @@ func TestApierLoadTariffPlanFromStorDbDryRun(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierGetCacheStats2(t *testing.T) {
|
||||
func testApierGetCacheStats2(t *testing.T) {
|
||||
var rcvStats map[string]*ltcache.CacheStats
|
||||
expectedStats := engine.GetDefaultEmptyCacheStats()
|
||||
err := rater.Call(utils.CacheSv1GetCacheStats, new(utils.AttrCacheIDsWithArgDispatcher), &rcvStats)
|
||||
@@ -1729,7 +1805,7 @@ func TestApierGetCacheStats2(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierLoadTariffPlanFromStorDb(t *testing.T) {
|
||||
func testApierLoadTariffPlanFromStorDb(t *testing.T) {
|
||||
var reply string
|
||||
if err := rater.Call(utils.ApierV1LoadTariffPlanFromStorDb,
|
||||
AttrLoadTpFromStorDb{TPid: "TEST_TPID2"}, &reply); err != nil {
|
||||
@@ -1739,7 +1815,7 @@ func TestApierLoadTariffPlanFromStorDb(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierStartStopServiceStatus(t *testing.T) {
|
||||
func testApierStartStopServiceStatus(t *testing.T) {
|
||||
var reply string
|
||||
if err := rater.Call(utils.ServiceManagerV1ServiceStatus, dispatchers.ArgStartServiceWithApiKey{ArgStartService: servmanager.ArgStartService{ServiceID: utils.MetaScheduler}},
|
||||
&reply); err != nil {
|
||||
@@ -1782,7 +1858,7 @@ func TestApierStartStopServiceStatus(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierReplayFailedPosts(t *testing.T) {
|
||||
func testApierReplayFailedPosts(t *testing.T) {
|
||||
fileName := "act>*call_url|*http_json|http%3A%2F%2Flocalhost%3A2081|63bed4ea-615e-4096-b1f4-499f64f29b28.json"
|
||||
fileContent := []byte(`{"ID":"cgrates.org:1007","BalanceMap":{"*monetary":[{"Uuid":"367be35a-96ee-40a5-b609-9130661f5f12","ID":"","Value":0,"Directions":{"*out":true},"ExpirationDate":"0001-01-01T00:00:00Z","Weight":10,"DestinationIDs":{},"RatingSubject":"","Categories":{},"SharedGroups":{"SHARED_A":true},"Timings":null,"TimingIDs":{},"Disabled":false,"Factor":null,"Blocker":false}]},"UnitCounters":{"*monetary":[{"CounterType":"*event","Counters":[{"Value":0,"Filter":{"Uuid":null,"ID":"b8531413-10d5-47ad-81ad-2bc272e8f0ca","Type":"*monetary","Value":null,"Directions":{"*out":true},"ExpirationDate":null,"Weight":null,"DestinationIDs":{"FS_USERS":true},"RatingSubject":null,"Categories":null,"SharedGroups":null,"TimingIDs":null,"Timings":null,"Disabled":null,"Factor":null,"Blocker":null}}]}]},"ActionTriggers":[{"ID":"STANDARD_TRIGGERS","UniqueID":"46ac7b8c-685d-4555-bf73-fa6cfbc2fa21","ThresholdType":"*min_balance","ThresholdValue":2,"Recurrent":false,"MinSleep":0,"ExpirationDate":"0001-01-01T00:00:00Z","ActivationDate":"0001-01-01T00:00:00Z","Balance":{"Uuid":null,"ID":null,"Type":"*monetary","Value":null,"Directions":{"*out":true},"ExpirationDate":null,"Weight":null,"DestinationIDs":null,"RatingSubject":null,"Categories":null,"SharedGroups":null,"TimingIDs":null,"Timings":null,"Disabled":null,"Factor":null,"Blocker":null},"Weight":10,"ActionsID":"LOG_WARNING","MinQueuedItems":0,"Executed":true,"LastExecutionTime":"2017-01-31T14:03:57.961651647+01:00"},{"ID":"STANDARD_TRIGGERS","UniqueID":"b8531413-10d5-47ad-81ad-2bc272e8f0ca","ThresholdType":"*max_event_counter","ThresholdValue":5,"Recurrent":false,"MinSleep":0,"ExpirationDate":"0001-01-01T00:00:00Z","ActivationDate":"0001-01-01T00:00:00Z","Balance":{"Uuid":null,"ID":null,"Type":"*monetary","Value":null,"Directions":{"*out":true},"ExpirationDate":null,"Weight":null,"DestinationIDs":{"FS_USERS":true},"RatingSubject":null,"Categories":null,"SharedGroups":null,"TimingIDs":null,"Timings":null,"Disabled":null,"Factor":null,"Blocker":null},"Weight":10,"ActionsID":"LOG_WARNING","MinQueuedItems":0,"Executed":false,"LastExecutionTime":"0001-01-01T00:00:00Z"},{"ID":"STANDARD_TRIGGERS","UniqueID":"8b424186-7a31-4aef-99c5-35e12e6fed41","ThresholdType":"*max_balance","ThresholdValue":20,"Recurrent":false,"MinSleep":0,"ExpirationDate":"0001-01-01T00:00:00Z","ActivationDate":"0001-01-01T00:00:00Z","Balance":{"Uuid":null,"ID":null,"Type":"*monetary","Value":null,"Directions":{"*out":true},"ExpirationDate":null,"Weight":null,"DestinationIDs":null,"RatingSubject":null,"Categories":null,"SharedGroups":null,"TimingIDs":null,"Timings":null,"Disabled":null,"Factor":null,"Blocker":null},"Weight":10,"ActionsID":"LOG_WARNING","MinQueuedItems":0,"Executed":false,"LastExecutionTime":"0001-01-01T00:00:00Z"},{"ID":"STANDARD_TRIGGERS","UniqueID":"28557f3b-139c-4a27-9d17-bda1f54b7c19","ThresholdType":"*max_balance","ThresholdValue":100,"Recurrent":false,"MinSleep":0,"ExpirationDate":"0001-01-01T00:00:00Z","ActivationDate":"0001-01-01T00:00:00Z","Balance":{"Uuid":null,"ID":null,"Type":"*monetary","Value":null,"Directions":{"*out":true},"ExpirationDate":null,"Weight":null,"DestinationIDs":null,"RatingSubject":null,"Categories":null,"SharedGroups":null,"TimingIDs":null,"Timings":null,"Disabled":null,"Factor":null,"Blocker":null},"Weight":10,"ActionsID":"DISABLE_AND_LOG","MinQueuedItems":0,"Executed":false,"LastExecutionTime":"0001-01-01T00:00:00Z"}],"AllowNegative":false,"Disabled":false}"`)
|
||||
args := ArgsReplyFailedPosts{
|
||||
@@ -1854,7 +1930,7 @@ func TestApierReplayFailedPosts(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
msgs, err := ch.Consume(q.Name, "", true, false, false, false, nil)
|
||||
msgs, err := ch.Consume(q.Name, utils.EmptyString, true, false, false, false, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -1877,18 +1953,18 @@ func TestApierReplayFailedPosts(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierGetDataDBVesions(t *testing.T) {
|
||||
func testApierGetDataDBVesions(t *testing.T) {
|
||||
var reply *engine.Versions
|
||||
if err := rater.Call(utils.ApierV1GetDataDBVersions, "", &reply); err != nil {
|
||||
if err := rater.Call(utils.ApierV1GetDataDBVersions, utils.EmptyString, &reply); err != nil {
|
||||
t.Error(err)
|
||||
} else if !reflect.DeepEqual(engine.CurrentDataDBVersions(), *reply) {
|
||||
t.Errorf("Expecting : %+v, received: %+v", engine.CurrentDataDBVersions(), *reply)
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierGetStorDBVesions(t *testing.T) {
|
||||
func testApierGetStorDBVesions(t *testing.T) {
|
||||
var reply *engine.Versions
|
||||
if err := rater.Call(utils.ApierV1GetStorDBVersions, "", &reply); err != nil {
|
||||
if err := rater.Call(utils.ApierV1GetStorDBVersions, utils.EmptyString, &reply); err != nil {
|
||||
t.Error(err)
|
||||
} else if !reflect.DeepEqual(engine.CurrentStorDBVersions(), *reply) {
|
||||
t.Errorf("Expecting : %+v, received: %+v", engine.CurrentStorDBVersions(), *reply)
|
||||
@@ -1896,7 +1972,7 @@ func TestApierGetStorDBVesions(t *testing.T) {
|
||||
}
|
||||
|
||||
// Simply kill the engine after we are done with tests within this file
|
||||
func TestApierStopEngine(t *testing.T) {
|
||||
func testApierStopEngine(t *testing.T) {
|
||||
if err := engine.KillEngine(100); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
@@ -40,70 +40,67 @@ var (
|
||||
alsPrfDataDir = "/usr/share/cgrates"
|
||||
alsPrf *AttributeWithCache
|
||||
alsPrfConfigDIR string //run tests for specific configuration
|
||||
|
||||
sTestsAlsPrf = []func(t *testing.T){
|
||||
testAttributeSInitCfg,
|
||||
testAttributeSInitDataDb,
|
||||
testAttributeSResetStorDb,
|
||||
testAttributeSStartEngine,
|
||||
testAttributeSRPCConn,
|
||||
testAttributeSLoadFromFolder,
|
||||
testAttributeSGetAttributeForEvent,
|
||||
testAttributeSGetAttributeForEventNotFound,
|
||||
testAttributeSGetAttributeForEventWithMetaAnyContext,
|
||||
testAttributeSProcessEvent,
|
||||
testAttributeSProcessEventNotFound,
|
||||
testAttributeSProcessEventMissing,
|
||||
testAttributeSProcessEventWithNoneSubstitute,
|
||||
testAttributeSProcessEventWithNoneSubstitute2,
|
||||
testAttributeSProcessEventWithNoneSubstitute3,
|
||||
testAttributeSProcessEventWithHeader,
|
||||
testAttributeSGetAttPrfIDs,
|
||||
testAttributeSGetAlsPrfBeforeSet,
|
||||
testAttributeSSetAlsPrf,
|
||||
testAttributeSUpdateAlsPrf,
|
||||
testAttributeSRemAlsPrf,
|
||||
testAttributeSSetAlsPrf2,
|
||||
testAttributeSSetAlsPrf3,
|
||||
testAttributeSSetAlsPrf4,
|
||||
testAttributeSPing,
|
||||
testAttributeSProcessEventWithSearchAndReplace,
|
||||
testAttributeSProcessWithMultipleRuns,
|
||||
testAttributeSProcessWithMultipleRuns2,
|
||||
testAttributeSKillEngine,
|
||||
//start test for cache options
|
||||
testAttributeSInitCfg,
|
||||
testAttributeSInitDataDb,
|
||||
testAttributeSResetStorDb,
|
||||
testAttributeSStartEngine,
|
||||
testAttributeSRPCConn,
|
||||
testAttributeSCachingMetaNone,
|
||||
testAttributeSCachingMetaLoad,
|
||||
testAttributeSCachingMetaReload1,
|
||||
testAttributeSCachingMetaReload2,
|
||||
testAttributeSCachingMetaRemove,
|
||||
testAttributeSKillEngine,
|
||||
}
|
||||
)
|
||||
|
||||
var sTestsAlsPrf = []func(t *testing.T){
|
||||
testAttributeSInitCfg,
|
||||
testAttributeSInitDataDb,
|
||||
testAttributeSResetStorDb,
|
||||
testAttributeSStartEngine,
|
||||
testAttributeSRPCConn,
|
||||
testAttributeSLoadFromFolder,
|
||||
testAttributeSGetAttributeForEvent,
|
||||
testAttributeSGetAttributeForEventNotFound,
|
||||
testAttributeSGetAttributeForEventWithMetaAnyContext,
|
||||
testAttributeSProcessEvent,
|
||||
testAttributeSProcessEventNotFound,
|
||||
testAttributeSProcessEventMissing,
|
||||
testAttributeSProcessEventWithNoneSubstitute,
|
||||
testAttributeSProcessEventWithNoneSubstitute2,
|
||||
testAttributeSProcessEventWithNoneSubstitute3,
|
||||
testAttributeSProcessEventWithHeader,
|
||||
testAttributeSGetAttPrfIDs,
|
||||
testAttributeSGetAlsPrfBeforeSet,
|
||||
testAttributeSSetAlsPrf,
|
||||
testAttributeSUpdateAlsPrf,
|
||||
testAttributeSRemAlsPrf,
|
||||
testAttributeSSetAlsPrf2,
|
||||
testAttributeSSetAlsPrf3,
|
||||
testAttributeSSetAlsPrf4,
|
||||
testAttributeSPing,
|
||||
testAttributeSProcessEventWithSearchAndReplace,
|
||||
testAttributeSProcessWithMultipleRuns,
|
||||
testAttributeSProcessWithMultipleRuns2,
|
||||
testAttributeSKillEngine,
|
||||
//start test for cache options
|
||||
testAttributeSInitCfg,
|
||||
testAttributeSInitDataDb,
|
||||
testAttributeSResetStorDb,
|
||||
testAttributeSStartEngine,
|
||||
testAttributeSRPCConn,
|
||||
testAttributeSCachingMetaNone,
|
||||
testAttributeSCachingMetaLoad,
|
||||
testAttributeSCachingMetaReload1,
|
||||
testAttributeSCachingMetaReload2,
|
||||
testAttributeSCachingMetaRemove,
|
||||
testAttributeSKillEngine,
|
||||
}
|
||||
|
||||
//Test start here
|
||||
func TestAttributeSITMySql(t *testing.T) {
|
||||
alsPrfConfigDIR = "tutmysql"
|
||||
for _, stest := range sTestsAlsPrf {
|
||||
t.Run(alsPrfConfigDIR, stest)
|
||||
func TestAttributeSIT(t *testing.T) {
|
||||
attrsTests := sTestsAlsPrf
|
||||
switch *dbType {
|
||||
case utils.MetaInternal:
|
||||
attrsTests = sTestsAlsPrf[:29]
|
||||
alsPrfConfigDIR = "tutinternal"
|
||||
case utils.MetaSQL:
|
||||
alsPrfConfigDIR = "tutmysql"
|
||||
case utils.MetaMongo:
|
||||
alsPrfConfigDIR = "tutmongo"
|
||||
default:
|
||||
t.Fatal("Unknown Database type")
|
||||
}
|
||||
}
|
||||
|
||||
func TestAttributeSITMongo(t *testing.T) {
|
||||
alsPrfConfigDIR = "tutmongo"
|
||||
for _, stest := range sTestsAlsPrf {
|
||||
t.Run(alsPrfConfigDIR, stest)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAttributeSITInternal(t *testing.T) {
|
||||
alsPrfConfigDIR = "tutinternal"
|
||||
for _, stest := range sTestsAlsPrf[:29] {
|
||||
for _, stest := range attrsTests {
|
||||
t.Run(alsPrfConfigDIR, stest)
|
||||
}
|
||||
}
|
||||
|
||||
47
apier/v1/libtest.go
Normal file
47
apier/v1/libtest.go
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
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 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 <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
package v1
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"flag"
|
||||
"net/rpc"
|
||||
"net/rpc/jsonrpc"
|
||||
|
||||
"github.com/cgrates/cgrates/config"
|
||||
"github.com/cgrates/cgrates/utils"
|
||||
)
|
||||
|
||||
var (
|
||||
dataDir = flag.String("data_dir", "/usr/share/cgrates", "CGR data dir path here")
|
||||
waitRater = flag.Int("wait_rater", 500, "Number of miliseconds to wait for rater to start and cache")
|
||||
encoding = flag.String("rpc", utils.MetaJSON, "what encoding whould be uused for rpc comunication")
|
||||
dbType = flag.String("dbtype", utils.MetaInternal, "The type of DataBase (Internal/Mongo/mySql)")
|
||||
)
|
||||
|
||||
func newRPCClient(cfg *config.ListenCfg) (c *rpc.Client, err error) {
|
||||
switch *encoding {
|
||||
case utils.MetaJSON:
|
||||
return jsonrpc.Dial(utils.TCP, cfg.RPCJSONListen)
|
||||
case utils.MetaGOB:
|
||||
return rpc.Dial(utils.TCP, cfg.RPCGOBListen)
|
||||
default:
|
||||
return nil, errors.New("UNSUPPORTED_RPC")
|
||||
}
|
||||
}
|
||||
@@ -92,7 +92,7 @@ func (rsv1 *RALsV1) GetRatingPlansCost(arg *utils.RatingPlanCostArg, reply *disp
|
||||
}
|
||||
continue
|
||||
}
|
||||
ec := engine.NewEventCostFromCallCost(cc, "", "")
|
||||
ec := engine.NewEventCostFromCallCost(cc, utils.EmptyString, utils.EmptyString)
|
||||
ec.Compute()
|
||||
*reply = dispatchers.RatingPlanCost{
|
||||
EventCost: ec,
|
||||
|
||||
125
data/conf/samples/acc_balance_keep_internal/cgrates.json
Normal file
125
data/conf/samples/acc_balance_keep_internal/cgrates.json
Normal file
@@ -0,0 +1,125 @@
|
||||
{
|
||||
// CGRateS Configuration file
|
||||
|
||||
|
||||
"general": {
|
||||
"log_level": 7,
|
||||
"reply_timeout": "30s",
|
||||
},
|
||||
|
||||
|
||||
"listen": {
|
||||
"rpc_json": ":2012",
|
||||
"rpc_gob": ":2013",
|
||||
"http": ":2080",
|
||||
},
|
||||
|
||||
|
||||
"data_db": {
|
||||
"db_type": "*internal",
|
||||
},
|
||||
|
||||
|
||||
"stor_db": {
|
||||
"db_type": "*internal",
|
||||
},
|
||||
|
||||
|
||||
|
||||
"rals": {
|
||||
"enabled": true,
|
||||
"thresholds_conns": ["*internal"],
|
||||
"remove_expired":false,
|
||||
},
|
||||
|
||||
|
||||
"schedulers": {
|
||||
"enabled": true,
|
||||
"cdrs_conns": ["*localhost"],
|
||||
},
|
||||
|
||||
|
||||
"cdrs": {
|
||||
"enabled": true,
|
||||
"chargers_conns":["*localhost"],
|
||||
},
|
||||
|
||||
|
||||
"cdre": {
|
||||
"TestTutITExportCDR": {
|
||||
"content_fields": [
|
||||
{"tag": "CGRID", "type": "*composed", "value": "~CGRID"},
|
||||
{"tag": "RunID", "type": "*composed", "value": "~RunID"},
|
||||
{"tag":"OriginID", "type": "*composed", "value": "~OriginID"},
|
||||
{"tag":"RequestType", "type": "*composed", "value": "~RequestType"},
|
||||
{"tag":"Tenant", "type": "*composed", "value": "~Tenant"},
|
||||
{"tag":"Category", "type": "*composed", "value": "~Category"},
|
||||
{"tag":"Account", "type": "*composed", "value": "~Account"},
|
||||
{"tag":"Destination", "type": "*composed", "value": "~Destination"},
|
||||
{"tag":"AnswerTime", "type": "*composed", "value": "~AnswerTime", "layout": "2006-01-02T15:04:05Z07:00"},
|
||||
{"tag":"Usage", "type": "*composed", "value": "~Usage"},
|
||||
{"tag":"Cost", "type": "*composed", "value": "~Cost", "rounding_decimals": 4},
|
||||
{"tag":"MatchedDestinationID", "type": "*composed", "value": "~CostDetails:s/\"MatchedDestId\":.*_(\\w{4})/${1}/:s/\"MatchedDestId\":\"INTERNAL\"/ON010/"},
|
||||
],
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
"chargers": {
|
||||
"enabled": true,
|
||||
"attributes_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"resources": {
|
||||
"enabled": true,
|
||||
"store_interval": "-1",
|
||||
"thresholds_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"stats": {
|
||||
"enabled": true,
|
||||
"store_interval": "-1",
|
||||
"thresholds_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"thresholds": {
|
||||
"enabled": true,
|
||||
"store_interval": "-1",
|
||||
},
|
||||
|
||||
|
||||
"suppliers": {
|
||||
"enabled": true,
|
||||
"stats_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"attributes": { // Attribute service
|
||||
"enabled": true, // starts Attribute service: <true|false>.
|
||||
},
|
||||
|
||||
|
||||
"sessions": {
|
||||
"enabled": true,
|
||||
},
|
||||
|
||||
|
||||
"migrator": {
|
||||
"out_datadb_type": "mongo",
|
||||
"out_datadb_port": "27017",
|
||||
"out_datadb_name": "10",
|
||||
"out_stordb_type": "mongo",
|
||||
"out_stordb_port": "27017",
|
||||
"out_stordb_name": "cgrates",
|
||||
},
|
||||
|
||||
|
||||
"apier": {
|
||||
"scheduler_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
}
|
||||
131
data/conf/samples/acc_balance_keep_internal_gob/cgrates.json
Normal file
131
data/conf/samples/acc_balance_keep_internal_gob/cgrates.json
Normal file
@@ -0,0 +1,131 @@
|
||||
{
|
||||
// CGRateS Configuration file
|
||||
|
||||
|
||||
"general": {
|
||||
"log_level": 7,
|
||||
"reply_timeout": "30s",
|
||||
},
|
||||
|
||||
"rpc_conns": {
|
||||
"conn1": {
|
||||
"strategy": "*first",
|
||||
"conns": [{"address": "127.0.0.1:2013", "transport":"*gob"}],
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
"listen": {
|
||||
"rpc_json": ":2012",
|
||||
"rpc_gob": ":2013",
|
||||
"http": ":2080",
|
||||
},
|
||||
|
||||
|
||||
"data_db": {
|
||||
"db_type": "*internal",
|
||||
},
|
||||
|
||||
|
||||
"stor_db": {
|
||||
"db_type": "*internal",
|
||||
},
|
||||
|
||||
|
||||
"rals": {
|
||||
"enabled": true,
|
||||
"thresholds_conns": ["*internal"],
|
||||
"remove_expired":false,
|
||||
},
|
||||
|
||||
|
||||
"schedulers": {
|
||||
"enabled": true,
|
||||
"cdrs_conns": ["conn1"],
|
||||
},
|
||||
|
||||
|
||||
"cdrs": {
|
||||
"enabled": true,
|
||||
"chargers_conns":["conn1"],
|
||||
},
|
||||
|
||||
|
||||
"cdre": {
|
||||
"TestTutITExportCDR": {
|
||||
"content_fields": [
|
||||
{"tag": "CGRID", "type": "*composed", "value": "~CGRID"},
|
||||
{"tag": "RunID", "type": "*composed", "value": "~RunID"},
|
||||
{"tag":"OriginID", "type": "*composed", "value": "~OriginID"},
|
||||
{"tag":"RequestType", "type": "*composed", "value": "~RequestType"},
|
||||
{"tag":"Tenant", "type": "*composed", "value": "~Tenant"},
|
||||
{"tag":"Category", "type": "*composed", "value": "~Category"},
|
||||
{"tag":"Account", "type": "*composed", "value": "~Account"},
|
||||
{"tag":"Destination", "type": "*composed", "value": "~Destination"},
|
||||
{"tag":"AnswerTime", "type": "*composed", "value": "~AnswerTime", "layout": "2006-01-02T15:04:05Z07:00"},
|
||||
{"tag":"Usage", "type": "*composed", "value": "~Usage"},
|
||||
{"tag":"Cost", "type": "*composed", "value": "~Cost", "rounding_decimals": 4},
|
||||
{"tag":"MatchedDestinationID", "type": "*composed", "value": "~CostDetails:s/\"MatchedDestId\":.*_(\\w{4})/${1}/:s/\"MatchedDestId\":\"INTERNAL\"/ON010/"},
|
||||
],
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
"chargers": {
|
||||
"enabled": true,
|
||||
"attributes_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"resources": {
|
||||
"enabled": true,
|
||||
"store_interval": "-1",
|
||||
"thresholds_conns": ["*internal"]
|
||||
},
|
||||
|
||||
|
||||
"stats": {
|
||||
"enabled": true,
|
||||
"store_interval": "-1",
|
||||
"thresholds_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"thresholds": {
|
||||
"enabled": true,
|
||||
"store_interval": "-1",
|
||||
},
|
||||
|
||||
|
||||
"suppliers": {
|
||||
"enabled": true,
|
||||
"stats_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"attributes": { // Attribute service
|
||||
"enabled": true, // starts Attribute service: <true|false>.
|
||||
},
|
||||
|
||||
|
||||
"sessions": {
|
||||
"enabled": true,
|
||||
},
|
||||
|
||||
|
||||
"migrator": {
|
||||
"out_datadb_type": "mongo",
|
||||
"out_datadb_port": "27017",
|
||||
"out_datadb_name": "10",
|
||||
"out_stordb_type": "mongo",
|
||||
"out_stordb_port": "27017",
|
||||
"out_stordb_name": "cgrates",
|
||||
},
|
||||
|
||||
|
||||
"apier": {
|
||||
"scheduler_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
}
|
||||
126
data/conf/samples/acc_balance_keep_mongo/cgrates.json
Normal file
126
data/conf/samples/acc_balance_keep_mongo/cgrates.json
Normal file
@@ -0,0 +1,126 @@
|
||||
{
|
||||
// CGRateS Configuration file
|
||||
|
||||
|
||||
"general": {
|
||||
"log_level": 7,
|
||||
"reply_timeout": "30s",
|
||||
},
|
||||
|
||||
|
||||
"listen": {
|
||||
"rpc_json": ":2012",
|
||||
"rpc_gob": ":2013",
|
||||
"http": ":2080",
|
||||
},
|
||||
|
||||
"data_db": {
|
||||
"db_type": "mongo",
|
||||
"db_name": "10",
|
||||
"db_port": 27017,
|
||||
},
|
||||
|
||||
|
||||
"stor_db": {
|
||||
"db_type": "mongo",
|
||||
"db_name": "cgrates",
|
||||
"db_port": 27017,
|
||||
},
|
||||
|
||||
"rals": {
|
||||
"enabled": true,
|
||||
"thresholds_conns": ["*internal"],
|
||||
"remove_expired":false,
|
||||
},
|
||||
|
||||
|
||||
"schedulers": {
|
||||
"enabled": true,
|
||||
"cdrs_conns": ["*localhost"],
|
||||
},
|
||||
|
||||
|
||||
"cdrs": {
|
||||
"enabled": true,
|
||||
"chargers_conns":["*localhost"],
|
||||
},
|
||||
|
||||
|
||||
"cdre": {
|
||||
"TestTutITExportCDR": {
|
||||
"content_fields": [
|
||||
{"tag": "CGRID", "type": "*composed", "value": "~CGRID"},
|
||||
{"tag": "RunID", "type": "*composed", "value": "~RunID"},
|
||||
{"tag":"OriginID", "type": "*composed", "value": "~OriginID"},
|
||||
{"tag":"RequestType", "type": "*composed", "value": "~RequestType"},
|
||||
{"tag":"Tenant", "type": "*composed", "value": "~Tenant"},
|
||||
{"tag":"Category", "type": "*composed", "value": "~Category"},
|
||||
{"tag":"Account", "type": "*composed", "value": "~Account"},
|
||||
{"tag":"Destination", "type": "*composed", "value": "~Destination"},
|
||||
{"tag":"AnswerTime", "type": "*composed", "value": "~AnswerTime", "layout": "2006-01-02T15:04:05Z07:00"},
|
||||
{"tag":"Usage", "type": "*composed", "value": "~Usage"},
|
||||
{"tag":"Cost", "type": "*composed", "value": "~Cost", "rounding_decimals": 4},
|
||||
{"tag":"MatchedDestinationID", "type": "*composed", "value": "~CostDetails:s/\"MatchedDestId\":.*_(\\w{4})/${1}/:s/\"MatchedDestId\":\"INTERNAL\"/ON010/"},
|
||||
],
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
"chargers": {
|
||||
"enabled": true,
|
||||
"attributes_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"resources": {
|
||||
"enabled": true,
|
||||
"store_interval": "-1",
|
||||
"thresholds_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"stats": {
|
||||
"enabled": true,
|
||||
"store_interval": "-1",
|
||||
"thresholds_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"thresholds": {
|
||||
"enabled": true,
|
||||
"store_interval": "-1",
|
||||
},
|
||||
|
||||
|
||||
"suppliers": {
|
||||
"enabled": true,
|
||||
"stats_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"attributes": { // Attribute service
|
||||
"enabled": true, // starts Attribute service: <true|false>.
|
||||
},
|
||||
|
||||
|
||||
"sessions": {
|
||||
"enabled": true,
|
||||
},
|
||||
|
||||
|
||||
"migrator": {
|
||||
"out_datadb_type": "mongo",
|
||||
"out_datadb_port": "27017",
|
||||
"out_datadb_name": "10",
|
||||
"out_stordb_type": "mongo",
|
||||
"out_stordb_port": "27017",
|
||||
"out_stordb_name": "cgrates",
|
||||
},
|
||||
|
||||
|
||||
"apier": {
|
||||
"scheduler_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
}
|
||||
125
data/conf/samples/acc_balance_keep_mysql/cgrates.json
Normal file
125
data/conf/samples/acc_balance_keep_mysql/cgrates.json
Normal file
@@ -0,0 +1,125 @@
|
||||
{
|
||||
// CGRateS Configuration file
|
||||
|
||||
|
||||
"general": {
|
||||
"log_level": 7,
|
||||
"reply_timeout": "30s",
|
||||
},
|
||||
|
||||
|
||||
"listen": {
|
||||
"rpc_json": ":2012",
|
||||
"rpc_gob": ":2013",
|
||||
"http": ":2080",
|
||||
},
|
||||
|
||||
|
||||
"data_db": {
|
||||
"db_type": "redis",
|
||||
"db_port": 6379,
|
||||
"db_name": "10",
|
||||
},
|
||||
|
||||
"stor_db": {
|
||||
"db_password": "CGRateS.org",
|
||||
},
|
||||
|
||||
|
||||
"rals": {
|
||||
"enabled": true,
|
||||
"thresholds_conns": ["*internal"],
|
||||
"remove_expired":false,
|
||||
},
|
||||
|
||||
|
||||
"schedulers": {
|
||||
"enabled": true,
|
||||
"cdrs_conns": ["*localhost"],
|
||||
},
|
||||
|
||||
|
||||
"cdrs": {
|
||||
"enabled": true,
|
||||
"chargers_conns":["*localhost"],
|
||||
},
|
||||
|
||||
|
||||
"cdre": {
|
||||
"TestTutITExportCDR": {
|
||||
"content_fields": [
|
||||
{"tag": "CGRID", "type": "*composed", "value": "~CGRID"},
|
||||
{"tag": "RunID", "type": "*composed", "value": "~RunID"},
|
||||
{"tag":"OriginID", "type": "*composed", "value": "~OriginID"},
|
||||
{"tag":"RequestType", "type": "*composed", "value": "~RequestType"},
|
||||
{"tag":"Tenant", "type": "*composed", "value": "~Tenant"},
|
||||
{"tag":"Category", "type": "*composed", "value": "~Category"},
|
||||
{"tag":"Account", "type": "*composed", "value": "~Account"},
|
||||
{"tag":"Destination", "type": "*composed", "value": "~Destination"},
|
||||
{"tag":"AnswerTime", "type": "*composed", "value": "~AnswerTime", "layout": "2006-01-02T15:04:05Z07:00"},
|
||||
{"tag":"Usage", "type": "*composed", "value": "~Usage"},
|
||||
{"tag":"Cost", "type": "*composed", "value": "~Cost", "rounding_decimals": 4},
|
||||
{"tag":"MatchedDestinationID", "type": "*composed", "value": "~CostDetails:s/\"MatchedDestId\":.*_(\\w{4})/${1}/:s/\"MatchedDestId\":\"INTERNAL\"/ON010/"},
|
||||
],
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
"chargers": {
|
||||
"enabled": true,
|
||||
"attributes_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"resources": {
|
||||
"enabled": true,
|
||||
"store_interval": "1s",
|
||||
"thresholds_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"stats": {
|
||||
"enabled": true,
|
||||
"store_interval": "1s",
|
||||
"thresholds_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"thresholds": {
|
||||
"enabled": true,
|
||||
"store_interval": "1s",
|
||||
},
|
||||
|
||||
|
||||
"suppliers": {
|
||||
"enabled": true,
|
||||
"stats_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"attributes": { // Attribute service
|
||||
"enabled": true, // starts Attribute service: <true|false>.
|
||||
},
|
||||
|
||||
|
||||
"sessions": {
|
||||
"enabled": true,
|
||||
},
|
||||
|
||||
|
||||
"migrator": {
|
||||
"out_datadb_type": "mongo",
|
||||
"out_datadb_port": "27017",
|
||||
"out_datadb_name": "10",
|
||||
"out_stordb_type": "mongo",
|
||||
"out_stordb_port": "27017",
|
||||
"out_stordb_name": "cgrates",
|
||||
},
|
||||
|
||||
|
||||
"apier": {
|
||||
"scheduler_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
}
|
||||
132
data/conf/samples/acc_balance_keep_mysql_gob/cgrates.json
Normal file
132
data/conf/samples/acc_balance_keep_mysql_gob/cgrates.json
Normal file
@@ -0,0 +1,132 @@
|
||||
{
|
||||
// CGRateS Configuration file
|
||||
|
||||
|
||||
"general": {
|
||||
"log_level": 7,
|
||||
"reply_timeout": "30s",
|
||||
},
|
||||
|
||||
"rpc_conns": {
|
||||
"conn1": {
|
||||
"strategy": "*first",
|
||||
"conns": [{"address": "127.0.0.1:2013", "transport":"*gob"}],
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
"listen": {
|
||||
"rpc_json": ":2012",
|
||||
"rpc_gob": ":2013",
|
||||
"http": ":2080",
|
||||
},
|
||||
|
||||
|
||||
"data_db": {
|
||||
"db_type": "redis",
|
||||
"db_port": 6379,
|
||||
"db_name": "10",
|
||||
},
|
||||
|
||||
"stor_db": {
|
||||
"db_password": "CGRateS.org",
|
||||
},
|
||||
|
||||
|
||||
"rals": {
|
||||
"enabled": true,
|
||||
"thresholds_conns": ["*internal"],
|
||||
"remove_expired":false,
|
||||
},
|
||||
|
||||
|
||||
"schedulers": {
|
||||
"enabled": true,
|
||||
"cdrs_conns": ["conn1"],
|
||||
},
|
||||
|
||||
|
||||
"cdrs": {
|
||||
"enabled": true,
|
||||
"chargers_conns":["conn1"],
|
||||
},
|
||||
|
||||
|
||||
"cdre": {
|
||||
"TestTutITExportCDR": {
|
||||
"content_fields": [
|
||||
{"tag": "CGRID", "type": "*composed", "value": "~CGRID"},
|
||||
{"tag": "RunID", "type": "*composed", "value": "~RunID"},
|
||||
{"tag":"OriginID", "type": "*composed", "value": "~OriginID"},
|
||||
{"tag":"RequestType", "type": "*composed", "value": "~RequestType"},
|
||||
{"tag":"Tenant", "type": "*composed", "value": "~Tenant"},
|
||||
{"tag":"Category", "type": "*composed", "value": "~Category"},
|
||||
{"tag":"Account", "type": "*composed", "value": "~Account"},
|
||||
{"tag":"Destination", "type": "*composed", "value": "~Destination"},
|
||||
{"tag":"AnswerTime", "type": "*composed", "value": "~AnswerTime", "layout": "2006-01-02T15:04:05Z07:00"},
|
||||
{"tag":"Usage", "type": "*composed", "value": "~Usage"},
|
||||
{"tag":"Cost", "type": "*composed", "value": "~Cost", "rounding_decimals": 4},
|
||||
{"tag":"MatchedDestinationID", "type": "*composed", "value": "~CostDetails:s/\"MatchedDestId\":.*_(\\w{4})/${1}/:s/\"MatchedDestId\":\"INTERNAL\"/ON010/"},
|
||||
],
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
"chargers": {
|
||||
"enabled": true,
|
||||
"attributes_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"resources": {
|
||||
"enabled": true,
|
||||
"store_interval": "1s",
|
||||
"thresholds_conns": ["*internal"]
|
||||
},
|
||||
|
||||
|
||||
"stats": {
|
||||
"enabled": true,
|
||||
"store_interval": "1s",
|
||||
"thresholds_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"thresholds": {
|
||||
"enabled": true,
|
||||
"store_interval": "1s",
|
||||
},
|
||||
|
||||
|
||||
"suppliers": {
|
||||
"enabled": true,
|
||||
"stats_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"attributes": { // Attribute service
|
||||
"enabled": true, // starts Attribute service: <true|false>.
|
||||
},
|
||||
|
||||
|
||||
"sessions": {
|
||||
"enabled": true,
|
||||
},
|
||||
|
||||
|
||||
"migrator": {
|
||||
"out_datadb_type": "mongo",
|
||||
"out_datadb_port": "27017",
|
||||
"out_datadb_name": "10",
|
||||
"out_stordb_type": "mongo",
|
||||
"out_stordb_port": "27017",
|
||||
"out_stordb_name": "cgrates",
|
||||
},
|
||||
|
||||
|
||||
"apier": {
|
||||
"scheduler_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
}
|
||||
93
data/conf/samples/apier_mongo/apier.json
Normal file
93
data/conf/samples/apier_mongo/apier.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
// CGRateS Configuration file
|
||||
//
|
||||
// Used in apier_local_tests
|
||||
// Starts rater, cdrs and mediator connecting over internal channel
|
||||
|
||||
"general": {
|
||||
"log_level": 7,
|
||||
"poster_attempts": 1,
|
||||
},
|
||||
|
||||
|
||||
"listen": {
|
||||
"rpc_json": ":2012", // RPC JSON listening address
|
||||
"rpc_gob": ":2013", // RPC GOB listening address
|
||||
"http": ":2080", // HTTP listening address
|
||||
},
|
||||
|
||||
|
||||
"data_db": {
|
||||
"db_type": "mongo",
|
||||
"db_name": "10",
|
||||
"db_port": 27017,
|
||||
},
|
||||
|
||||
|
||||
"stor_db": {
|
||||
"db_type": "mongo",
|
||||
"db_name": "cgrates",
|
||||
"db_port": 27017,
|
||||
},
|
||||
|
||||
|
||||
"rals": {
|
||||
"enabled": true, // enable Rater service: <true|false>
|
||||
|
||||
},
|
||||
|
||||
|
||||
"schedulers": {
|
||||
"enabled": true, // start Scheduler service: <true|false>
|
||||
},
|
||||
|
||||
|
||||
"cdrs": {
|
||||
"enabled": true, // start the CDR Server service: <true|false>
|
||||
"chargers_conns":["*internal"],
|
||||
"rals_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"attributes": { // Attribute service
|
||||
"enabled": true, // starts Attribute service: <true|false>.
|
||||
},
|
||||
|
||||
|
||||
"resources": {
|
||||
"enabled": true,
|
||||
},
|
||||
|
||||
|
||||
"stats": {
|
||||
"enabled": true,
|
||||
},
|
||||
|
||||
|
||||
"thresholds": {
|
||||
"enabled": true,
|
||||
},
|
||||
|
||||
|
||||
"chargers": {
|
||||
"enabled": true,
|
||||
},
|
||||
|
||||
|
||||
"suppliers": {
|
||||
"enabled": true,
|
||||
},
|
||||
|
||||
|
||||
"cdre": {
|
||||
"*default": {
|
||||
"export_path": "/tmp/cgrates/cdr/cdrexport/csv", // path where the exported CDRs will be placed
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
"apier": {
|
||||
"scheduler_conns": ["*internal"],
|
||||
},
|
||||
|
||||
}
|
||||
90
data/conf/samples/apier_mysql/apier.json
Normal file
90
data/conf/samples/apier_mysql/apier.json
Normal file
@@ -0,0 +1,90 @@
|
||||
{
|
||||
// CGRateS Configuration file
|
||||
//
|
||||
// Used in apier_local_tests
|
||||
// Starts rater, cdrs and mediator connecting over internal channel
|
||||
|
||||
"general": {
|
||||
"log_level": 7,
|
||||
"poster_attempts": 1,
|
||||
},
|
||||
|
||||
|
||||
"listen": {
|
||||
"rpc_json": ":2012", // RPC JSON listening address
|
||||
"rpc_gob": ":2013", // RPC GOB listening address
|
||||
"http": ":2080", // HTTP listening address
|
||||
},
|
||||
|
||||
|
||||
"data_db": {
|
||||
"db_type": "redis",
|
||||
"db_port": 6379,
|
||||
"db_name": "10",
|
||||
},
|
||||
|
||||
"stor_db": {
|
||||
"db_password": "CGRateS.org",
|
||||
},
|
||||
|
||||
|
||||
"rals": {
|
||||
"enabled": true, // enable Rater service: <true|false>
|
||||
|
||||
},
|
||||
|
||||
|
||||
"schedulers": {
|
||||
"enabled": true, // start Scheduler service: <true|false>
|
||||
},
|
||||
|
||||
|
||||
"cdrs": {
|
||||
"enabled": true, // start the CDR Server service: <true|false>
|
||||
"chargers_conns":["*internal"],
|
||||
"rals_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
"attributes": { // Attribute service
|
||||
"enabled": true, // starts Attribute service: <true|false>.
|
||||
},
|
||||
|
||||
|
||||
"resources": {
|
||||
"enabled": true,
|
||||
},
|
||||
|
||||
|
||||
"stats": {
|
||||
"enabled": true,
|
||||
},
|
||||
|
||||
|
||||
"thresholds": {
|
||||
"enabled": true,
|
||||
},
|
||||
|
||||
|
||||
"chargers": {
|
||||
"enabled": true,
|
||||
},
|
||||
|
||||
|
||||
"suppliers": {
|
||||
"enabled": true,
|
||||
},
|
||||
|
||||
|
||||
"cdre": {
|
||||
"*default": {
|
||||
"export_path": "/tmp/cgrates/cdr/cdrexport/csv", // path where the exported CDRs will be placed
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
"apier": {
|
||||
"scheduler_conns": ["*internal"],
|
||||
},
|
||||
|
||||
}
|
||||
108
data/conf/samples/tutinternal_gob/cgrates.json
Normal file
108
data/conf/samples/tutinternal_gob/cgrates.json
Normal file
@@ -0,0 +1,108 @@
|
||||
{
|
||||
// CGRateS Configuration file
|
||||
//
|
||||
|
||||
|
||||
"general": {
|
||||
"log_level": 7,
|
||||
"reply_timeout": "50s",
|
||||
},
|
||||
|
||||
"rpc_conns": {
|
||||
"conn1": {
|
||||
"strategy": "*first",
|
||||
"conns": [{"address": "127.0.0.1:2013", "transport":"*gob"}],
|
||||
},
|
||||
},
|
||||
|
||||
"listen": {
|
||||
"rpc_json": ":2012",
|
||||
"rpc_gob": ":2013",
|
||||
"http": ":2080",
|
||||
},
|
||||
|
||||
|
||||
"data_db": {
|
||||
"db_type": "*internal",
|
||||
},
|
||||
|
||||
|
||||
"stor_db": {
|
||||
"db_type": "*internal",
|
||||
},
|
||||
|
||||
|
||||
"rals": {
|
||||
"enabled": true,
|
||||
"thresholds_conns": ["conn1"],
|
||||
"max_increments":3000000,
|
||||
},
|
||||
|
||||
|
||||
"schedulers": {
|
||||
"enabled": true,
|
||||
"cdrs_conns": ["conn1"],
|
||||
},
|
||||
|
||||
|
||||
"cdrs": {
|
||||
"enabled": true,
|
||||
"chargers_conns":["conn1"],
|
||||
},
|
||||
|
||||
|
||||
"attributes": {
|
||||
"enabled": true,
|
||||
},
|
||||
|
||||
|
||||
"chargers": {
|
||||
"enabled": true,
|
||||
"attributes_conns": ["conn1"],
|
||||
},
|
||||
|
||||
|
||||
"resources": {
|
||||
"enabled": true,
|
||||
"store_interval": "-1",
|
||||
"thresholds_conns": ["conn1"]
|
||||
},
|
||||
|
||||
|
||||
"stats": {
|
||||
"enabled": true,
|
||||
"store_interval": "-1",
|
||||
"thresholds_conns": ["conn1"],
|
||||
},
|
||||
|
||||
"thresholds": {
|
||||
"enabled": true,
|
||||
"store_interval": "-1",
|
||||
},
|
||||
|
||||
|
||||
"suppliers": {
|
||||
"enabled": true,
|
||||
"prefix_indexed_fields":["Destination"],
|
||||
"stats_conns": ["conn1"],
|
||||
"resources_conns": ["conn1"],
|
||||
},
|
||||
|
||||
|
||||
"sessions": {
|
||||
"enabled": true,
|
||||
"suppliers_conns": ["conn1"],
|
||||
"resources_conns": ["conn1"],
|
||||
"attributes_conns": ["conn1"],
|
||||
"rals_conns": ["conn1"],
|
||||
"cdrs_conns": ["conn1"],
|
||||
"chargers_conns": ["conn1"],
|
||||
},
|
||||
|
||||
|
||||
"apier": {
|
||||
"scheduler_conns": ["conn1"],
|
||||
},
|
||||
|
||||
|
||||
}
|
||||
@@ -2,9 +2,18 @@
|
||||
go clean --cache
|
||||
./test.sh
|
||||
gen=$?
|
||||
echo 'go test github.com/cgrates/cgrates/apier/v1 -tags=integration'
|
||||
go test github.com/cgrates/cgrates/apier/v1 -tags=integration
|
||||
ap1=$?
|
||||
|
||||
# echo 'go test github.com/cgrates/cgrates/apier/v1 -tags=integration -dbtype=*internal'
|
||||
# go test github.com/cgrates/cgrates/apier/v1 -tags=integration -dbtype=*internal
|
||||
# ap1_internal=$?
|
||||
echo 'go test github.com/cgrates/cgrates/apier/v1 -tags=integration -dbtype=*sql'
|
||||
go test github.com/cgrates/cgrates/apier/v1 -tags=integration -dbtype=*sql
|
||||
ap1_sql=$?
|
||||
echo 'go test github.com/cgrates/cgrates/apier/v1 -tags=integration -dbtype=*mongo'
|
||||
go test github.com/cgrates/cgrates/apier/v1 -tags=integration -dbtype=*mongo
|
||||
ap1_mongo=$?
|
||||
|
||||
|
||||
echo 'go test github.com/cgrates/cgrates/apier/v2 -tags=integration'
|
||||
go test github.com/cgrates/cgrates/apier/v2 -tags=integration
|
||||
ap2=$?
|
||||
@@ -47,5 +56,5 @@ srv=$?
|
||||
echo 'go test github.com/cgrates/cgrates/apier/v1 -tags=offline'
|
||||
go test github.com/cgrates/cgrates/apier/v1 -tags=offline
|
||||
offline=$?
|
||||
|
||||
exit $gen && $ap1 && $ap2 && $en && $cdrc && $cfg && $utl && $gnr && $agts && $smg && $mgr && $dis && $lds && $ers && $srv && $offline
|
||||
# to do: add '&& $ap1_internal'
|
||||
exit $gen && $ap1_sql && $ap1_mongo && $ap2 && $en && $cdrc && $cfg && $utl && $gnr && $agts && $smg && $mgr && $dis && $lds && $ers && $srv && $offline
|
||||
|
||||
@@ -238,6 +238,7 @@ const (
|
||||
MetaPartialCSV = "*partial_csv"
|
||||
DRYRUN = "dry_run"
|
||||
META_COMBIMED = "*combimed"
|
||||
MetaMongo = "*mongo"
|
||||
MetaInternal = "*internal"
|
||||
MetaLocalHost = "*localhost"
|
||||
ZERO_RATING_SUBJECT_PREFIX = "*zero"
|
||||
|
||||
Reference in New Issue
Block a user