diff --git a/general_tests/doubleremove_it_test.go b/general_tests/doubleremove_it_test.go index f0d357e01..4b7a59602 100644 --- a/general_tests/doubleremove_it_test.go +++ b/general_tests/doubleremove_it_test.go @@ -20,308 +20,745 @@ along with this program. If not, see */ package general_tests -// import ( -// "path" -// "reflect" -// "testing" -// "time" +import ( + "path" + "reflect" + "testing" + "time" -// "github.com/cgrates/cgrates/config" -// "github.com/cgrates/cgrates/engine" -// "github.com/cgrates/cgrates/utils" -// ) + "github.com/cgrates/birpc" + "github.com/cgrates/birpc/context" + "github.com/cgrates/cgrates/config" + "github.com/cgrates/cgrates/engine" + "github.com/cgrates/cgrates/utils" +) -// // subtests to be executed -// var ( -// doubleRemovePath string -// doubleRemoveDIR string -// doubleRemove *config.CGRConfig -// doubleRemoveAccount = "refundAcc" -// doubleRemoveTenant = "cgrates.org" +// subtests to be executed +var ( + doubleRemovePath string + doubleRemoveDIR string + doubleRemove *config.CGRConfig + doubleRemoveTenant = "cgrates.org" + doubleRemoveRPC *birpc.Client -// doubleRemoveIT = []func(t *testing.T){ -// testdoubleRemoveLoadConfig, -// testdoubleRemoveInitDataDb, -// testdoubleRemoveStartEngine, -// testdoubleRemoveRpcConn, + doubleRemoveIT = []func(t *testing.T){ + testdoubleRemoveLoadConfig, + testdoubleRemoveInitDataDb, + testdoubleRemoveStartEngine, + testdoubleRemoveRpcConn, -// testdoubleRemoveStatQueueProfile, -// testdoubleRemoveActions, -// testdoubleRemoveActionPlan, + testdoubleRemoveStatQueueProfile, + testdoubleRemoveThresholdProfile, + testdoubleRemoveRouteProfile, + testdoubleRemoveAttributeProfile, + testdoubleRemoveChargerProfile, + testdoubleRemoveResourceProfile, + testdoubleRemoveDispatcherProfile, + testdoubleRemoveDispatcherHost, + testdoubleRemoveRateProfile, + testdoubleRemoveActionProfile, -// testdoubleRemoveKillEngine, -// } -// ) + testdoubleRemoveKillEngine, + } +) -// //Test start here -// func TestDoubleRemoveIT(t *testing.T) { -// switch *dbType { -// case utils.MetaInternal: -// doubleRemoveDIR = "tutinternal" -// case utils.MetaMySQL: -// doubleRemoveDIR = "tutmysql" -// case utils.MetaMongo: -// doubleRemoveDIR = "tutmongo" -// case utils.MetaPostgres: -// t.SkipNow() -// default: -// t.Fatal("Unknown Database type") -// } +//Test starts here +func TestDoubleRemoveIT(t *testing.T) { + switch *dbType { + case utils.MetaInternal: + doubleRemoveDIR = "tutinternal" + case utils.MetaMySQL: + doubleRemoveDIR = "tutmysql" + case utils.MetaMongo: + doubleRemoveDIR = "tutmongo" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") + } -// for _, stest := range doubleRemoveIT { -// t.Run(doubleRemoveDIR, stest) -// } -// } + for _, stest := range doubleRemoveIT { + t.Run(doubleRemoveDIR, stest) + } +} -// func testdoubleRemoveLoadConfig(t *testing.T) { -// var err error -// doubleRemovePath = path.Join(*dataDir, "conf", "samples", doubleRemoveDIR) -// if doubleRemove, err = config.NewCGRConfigFromPath(doubleRemovePath); err != nil { -// t.Error(err) -// } -// } +func testdoubleRemoveLoadConfig(t *testing.T) { + var err error + doubleRemovePath = path.Join(*dataDir, "conf", "samples", doubleRemoveDIR) + if doubleRemove, err = config.NewCGRConfigFromPath(context.Background(), doubleRemovePath); err != nil { + t.Error(err) + } +} -// func testdoubleRemoveInitDataDb(t *testing.T) { -// if err := engine.InitDataDB(doubleRemove); err != nil { -// t.Fatal(err) -// } -// } +func testdoubleRemoveInitDataDb(t *testing.T) { + if err := engine.InitDataDB(doubleRemove); err != nil { + t.Fatal(err) + } +} -// func testdoubleRemoveStartEngine(t *testing.T) { -// if _, err := engine.StopStartEngine(doubleRemovePath, *waitRater); err != nil { -// t.Fatal(err) -// } -// } +func testdoubleRemoveStartEngine(t *testing.T) { + if _, err := engine.StopStartEngine(doubleRemovePath, *waitRater); err != nil { + t.Fatal(err) + } +} -// func testdoubleRemoveRpcConn(t *testing.T) { -// var err error -// sesRPC, err = newRPCClient(doubleRemove.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed -// if err != nil { -// t.Fatal("Could not connect to rater: ", err.Error()) -// } -// } +func testdoubleRemoveRpcConn(t *testing.T) { + var err error + doubleRemoveRPC, err = newRPCClient(doubleRemove.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed + if err != nil { + t.Fatal("Could not connect to rater: ", err.Error()) + } +} -// func testdoubleRemoveStatQueueProfile(t *testing.T) { -// // check -// var reply *engine.StatQueueProfile -// if err := sesRPC.Call(utils.AdminSv1GetStatQueueProfile, -// &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TEST_PROFILE1"}, &reply); err == nil || -// err.Error() != utils.ErrNotFound.Error() { -// t.Error(err) -// } -// // set -// statConfig := &engine.StatQueueProfileWithAPIOpts{ -// StatQueueProfile: &engine.StatQueueProfile{ -// Tenant: doubleRemoveTenant, -// ID: "TEST_PROFILE1", -// FilterIDs: []string{"*ai:~*req.AnswerTime:2020-04-18T14:25:00Z|2020-04-18T14:25:00Z"}, -// QueueLength: 10, -// TTL: 10 * time.Second, -// Metrics: []*engine.MetricWithFilters{ -// { -// MetricID: "*sum", -// }, -// { -// MetricID: "*acd", -// }, -// }, -// ThresholdIDs: []string{"Val1", "Val2"}, -// Blocker: true, -// Stored: true, -// Weight: 20, -// MinItems: 1, -// }, -// } -// var result string -// if err := sesRPC.Call(utils.AdminSv1SetStatQueueProfile, statConfig, &result); err != nil { -// t.Error(err) -// } else if result != utils.OK { -// t.Error("Unexpected reply returned", result) -// } -// //check -// if err := sesRPC.Call(utils.AdminSv1GetStatQueueProfile, -// &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TEST_PROFILE1"}, &reply); err != nil { -// t.Error(err) -// } else if !reflect.DeepEqual(statConfig.StatQueueProfile, reply) { -// t.Errorf("Expecting: %+v, received: %+v", statConfig.StatQueueProfile, reply) -// } +func testdoubleRemoveStatQueueProfile(t *testing.T) { + // check + var reply *engine.StatQueueProfile + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetStatQueueProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TEST_PROFILE1"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // set + statConfig := &engine.StatQueueProfileWithAPIOpts{ + StatQueueProfile: &engine.StatQueueProfile{ + Tenant: doubleRemoveTenant, + ID: "TEST_PROFILE1", + FilterIDs: []string{"*ai:~*req.AnswerTime:2020-04-18T14:25:00Z|2020-04-18T14:25:00Z"}, + QueueLength: 10, + TTL: 10 * time.Second, + Metrics: []*engine.MetricWithFilters{ + { + MetricID: "*sum", + }, + { + MetricID: "*acd", + }, + }, + ThresholdIDs: []string{"Val1", "Val2"}, + Blocker: true, + Stored: true, + Weights: utils.DynamicWeights{ + { + Weight: 20, + }, + }, + MinItems: 1, + }, + } + var result string + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1SetStatQueueProfile, statConfig, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + //check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetStatQueueProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TEST_PROFILE1"}, &reply); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(statConfig.StatQueueProfile, reply) { + t.Errorf("Expecting: %+v, received: %+v", statConfig.StatQueueProfile, reply) + } -// //remove -// if err := sesRPC.Call(utils.AdminSv1RemoveStatQueueProfile, -// &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TEST_PROFILE1"}, &result); err != nil { -// t.Error(err) -// } else if result != utils.OK { -// t.Error("Unexpected reply returned", result) -// } -// if err := sesRPC.Call(utils.AdminSv1RemoveStatQueueProfile, -// &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TEST_PROFILE1"}, &result); err == nil || -// err.Error() != utils.ErrNotFound.Error() { -// t.Error(err) -// } -// if err := sesRPC.Call(utils.AdminSv1RemoveStatQueueProfile, -// &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TEST_PROFILE1"}, &result); err == nil || -// err.Error() != utils.ErrNotFound.Error() { -// t.Error(err) -// } -// // check -// if err := sesRPC.Call(utils.AdminSv1GetStatQueueProfile, -// &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TEST_PROFILE1"}, &reply); err == nil || -// err.Error() != utils.ErrNotFound.Error() { -// t.Error(err) -// } -// } + //remove + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveStatQueueProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TEST_PROFILE1"}, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveStatQueueProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TEST_PROFILE1"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveStatQueueProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TEST_PROFILE1"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetStatQueueProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TEST_PROFILE1"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } +} -// func testdoubleRemoveActions(t *testing.T) { -// // check -// var reply1 []*utils.TPAction -// if doubleRemoveDIR != "tutinternal" { // on internal do not get so we do not cache this action with nil in cache -// if err := sesRPC.Call(utils.APIerSv1GetActions, utils.StringPointer("ACTS_1"), &reply1); err == nil || err.Error() != "SERVER_ERROR: NOT_FOUND" { -// t.Error(err) -// } -// } -// // set -// attrs1 := &v1.V1AttrSetActions{ -// ActionsId: "ACTS_1", -// Actions: []*v1.V1TPAction{ -// { -// Identifier: utils.MetaTopUpReset, -// BalanceType: utils.MetaMonetary, -// Units: 75.0, -// ExpiryTime: utils.MetaUnlimited, -// Weight: 20.0}}, -// } -// var reply string -// if err := sesRPC.Call(utils.APIerSv1SetActions, &attrs1, &reply); err != nil { -// t.Error(err) -// } else if reply != utils.OK { -// t.Errorf("Unexpected reply returned: %s", reply) -// } -// // set it again (expect EXISTS) -// if err := sesRPC.Call(utils.APIerSv1SetActions, &attrs1, &reply); err == nil || err.Error() != "EXISTS" { -// t.Error(err) -// } -// // check -// eOut := []*utils.TPAction{ -// { -// Identifier: utils.MetaTopUpReset, -// BalanceType: utils.MetaMonetary, -// Units: "75", -// BalanceWeight: "0", -// BalanceBlocker: "false", -// BalanceDisabled: "false", -// ExpiryTime: utils.MetaUnlimited, -// Weight: 20.0, -// }} -// if err := sesRPC.Call(utils.APIerSv1GetActions, utils.StringPointer("ACTS_1"), &reply1); err != nil { -// t.Error("Got error on APIerSv1.GetActions: ", err.Error()) -// } else if !reflect.DeepEqual(eOut, reply1) { -// t.Errorf("Expected: %v, received: %v", utils.ToJSON(eOut), utils.ToJSON(reply1)) -// } -// // remove -// if err := sesRPC.Call(utils.APIerSv1RemoveActions, &v1.AttrRemoveActions{ -// ActionIDs: []string{"ACTS_1"}}, &reply); err != nil { -// t.Error(err) -// } else if reply != utils.OK { -// t.Error("Unexpected reply returned", reply) -// } -// // remove it again (expect ErrNotFound) -// // if err := sesRPC.Call(utils.APIerSv1RemoveActions, &v1.AttrRemoveActions{ -// // ActionIDs: []string{"ACTS_1"}}, &reply); err == nil || -// // err.Error() != utils.ErrNotFound.Error() { -// // t.Error(err) -// // } -// // check again -// if err := sesRPC.Call(utils.APIerSv1GetActions, utils.StringPointer("ACTS_1"), &reply1); err == nil || err.Error() != "SERVER_ERROR: NOT_FOUND" { -// t.Error(err) -// } -// } +func testdoubleRemoveThresholdProfile(t *testing.T) { + // check + var reply *engine.ThresholdProfile + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetThresholdProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TH_PROFILE"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // set + thPrf := &engine.ThresholdProfileWithAPIOpts{ + ThresholdProfile: &engine.ThresholdProfile{ + Tenant: doubleRemoveTenant, + ID: "TH_PROFILE", + FilterIDs: []string{"*string:~*req.Account:1001"}, + Blocker: true, + MaxHits: 5, + MinHits: 3, + ActionProfileIDs: []string{utils.MetaNone}, + Async: true, + Weights: utils.DynamicWeights{ + { + Weight: 20, + }, + }, + }, + } + var result string + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1SetThresholdProfile, thPrf, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + //check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetThresholdProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TH_PROFILE"}, &reply); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(thPrf.ThresholdProfile, reply) { + t.Errorf("Expecting: %+v, received: %+v", thPrf.ThresholdProfile, reply) + } -// func testdoubleRemoveActionPlan(t *testing.T) { -// //set action -// var reply string -// if err := sesRPC.Call(utils.APIerSv2SetActions, &utils.AttrSetActions{ -// ActionsId: "ACTS_2", -// Actions: []*utils.TPAction{{Identifier: utils.MetaLog}}, -// }, &reply); err != nil { -// t.Error(err) -// } else if reply != utils.OK { -// t.Errorf("Calling APIerSv2.SetActions received: %s", reply) -// } -// // check action -// var reply1 []*utils.TPAction -// eOut := []*utils.TPAction{ -// { -// Identifier: "*log", -// Units: "0", -// BalanceWeight: "0", -// BalanceBlocker: "false", -// BalanceDisabled: "false", -// Weight: 0}} + //remove + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveThresholdProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TH_PROFILE"}, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveThresholdProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TH_PROFILE"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveThresholdProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TH_PROFILE"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetThresholdProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "TH_PROFILE"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } +} -// if err := sesRPC.Call(utils.APIerSv1GetActions, utils.StringPointer("ACTS_2"), &reply1); err != nil { -// t.Error("Got error on APIerSv1.GetActions: ", err.Error()) -// } else if !reflect.DeepEqual(eOut, reply1) { -// t.Errorf("Expected: %v, received: %v", utils.ToJSON(eOut), utils.ToJSON(reply1)) -// } -// // check ActionPlan -// var aps []*engine.ActionPlan -// /* -// should return ErrNotFound, right now it returns nil and an empty slice, -// needs to be reviewed +func testdoubleRemoveRouteProfile(t *testing.T) { + // check + var reply *engine.RouteProfile + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetRouteProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ROUTE_PROFILE"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // set + routePrf := &engine.RouteProfileWithAPIOpts{ + RouteProfile: &engine.RouteProfile{ + Tenant: doubleRemoveTenant, + ID: "ROUTE_PROFILE", + FilterIDs: []string{"*string:~*req.Account:1001"}, + Sorting: utils.MetaWeight, + Routes: []*engine.Route{ + { + ID: "ROUTE", + }, + }, + Weights: utils.DynamicWeights{ + { + Weight: 20, + }, + }, + }, + } + var result string + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1SetRouteProfile, routePrf, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + //check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetRouteProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ROUTE_PROFILE"}, &reply); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(routePrf.RouteProfile, reply) { + t.Errorf("Expecting: %+v, received: %+v", routePrf.RouteProfile, reply) + } -// if err := sesRPC.Call(utils.APIerSv1GetActionPlan, -// v1.AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() { -// t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps)) -// } -// */ -// // set ActionPlan -// atms1 := &v1.AttrSetActionPlan{ -// Id: "ATMS_1", -// ActionPlan: []*v1.AttrActionPlan{ -// { -// ActionsId: "ACTS_2", -// Time: utils.MetaASAP, -// Weight: 20.0}, -// }, -// } -// if err := sesRPC.Call(utils.APIerSv1SetActionPlan, &atms1, &reply); err != nil { -// t.Error("Got error on APIerSv1.SetActionPlan: ", err.Error()) -// } else if reply != utils.OK { -// t.Errorf("Unexpected reply returned: %s", reply) -// } -// // set it again (expect EXISTS) -// if err := sesRPC.Call(utils.APIerSv1SetActionPlan, &atms1, &reply); err == nil || err.Error() != "EXISTS" { -// t.Error(err) -// } -// // check -// if err := sesRPC.Call(utils.APIerSv1GetActionPlan, -// &v1.AttrGetActionPlan{ID: "ATMS_1"}, &aps); err != nil { -// t.Error(err) -// } else if len(aps) != 1 { -// t.Errorf("Expected: %v,\n received: %v", 1, len(aps)) -// } else if aps[0].Id != "ATMS_1" { -// // remove -// if err := sesRPC.Call(utils.APIerSv1RemoveActionPlan, &v1.AttrGetActionPlan{ -// ID: "ATMS_1"}, &reply); err != nil { -// t.Error(err) -// } else if reply != utils.OK { -// t.Error("Unexpected reply returned", reply) -// } -// //check again -// /* -// this should return ErrNotFound, right now it returns nil and an empty slice, -// needs to be reviewed. + //remove + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveRouteProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ROUTE_PROFILE"}, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveRouteProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ROUTE_PROFILE"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveRouteProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ROUTE_PROFILE"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetRouteProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ROUTE_PROFILE"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } +} -// if err := sesRPC.Call(utils.APIerSv1GetActionPlan, -// v1.AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() { -// t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps)) -// } -// */ -// } -// } +func testdoubleRemoveAttributeProfile(t *testing.T) { + // check + var reply *engine.APIAttributeProfile + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetAttributeProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ATTR_PROFILE"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // set + attrPrf := &engine.APIAttributeProfileWithAPIOpts{ + APIAttributeProfile: &engine.APIAttributeProfile{ + Tenant: doubleRemoveTenant, + ID: "ATTR_PROFILE", + FilterIDs: []string{"*string:~*req.Account:1001"}, + Blocker: false, + Attributes: []*engine.ExternalAttribute{ + { + Path: "*req.Destination", + Type: utils.MetaConstant, + Value: "12018209998", + }, + }, + Weights: utils.DynamicWeights{ + { + Weight: 20, + }, + }, + }, + } + var result string + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1SetAttributeProfile, attrPrf, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + //check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetAttributeProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ATTR_PROFILE"}, &reply); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(attrPrf.APIAttributeProfile, reply) { + t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(attrPrf.APIAttributeProfile), utils.ToJSON(reply)) + } -// func testdoubleRemoveKillEngine(t *testing.T) { -// if err := engine.KillEngine(100); err != nil { -// t.Error(err) -// } -// } + //remove + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveAttributeProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ATTR_PROFILE"}, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveAttributeProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ATTR_PROFILE"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveAttributeProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ATTR_PROFILE"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetAttributeProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ATTR_PROFILE"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } +} + +func testdoubleRemoveChargerProfile(t *testing.T) { + // check + var reply *engine.ChargerProfile + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetChargerProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "CHARGER_PROFILE"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // set + chrgPrf := &engine.ChargerProfileWithAPIOpts{ + ChargerProfile: &engine.ChargerProfile{ + Tenant: doubleRemoveTenant, + ID: "CHARGER_PROFILE", + FilterIDs: []string{"*string:~*req.Account:1001"}, + Weights: utils.DynamicWeights{ + { + Weight: 20, + }, + }, + }, + } + var result string + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1SetChargerProfile, chrgPrf, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + //check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetChargerProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "CHARGER_PROFILE"}, &reply); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(chrgPrf.ChargerProfile, reply) { + t.Errorf("Expecting: %+v, received: %+v", chrgPrf.ChargerProfile, reply) + } + + //remove + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveChargerProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "CHARGER_PROFILE"}, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveChargerProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "CHARGER_PROFILE"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveChargerProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "CHARGER_PROFILE"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetChargerProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "CHARGER_PROFILE"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } +} + +func testdoubleRemoveResourceProfile(t *testing.T) { + // check + var reply *engine.ResourceProfile + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetResourceProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "RESOURCE_PROFILE"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // set + resPrf := &engine.ResourceProfileWithAPIOpts{ + ResourceProfile: &engine.ResourceProfile{ + Tenant: doubleRemoveTenant, + ID: "RESOURCE_PROFILE", + FilterIDs: []string{"*string:~*req.Account:1001"}, + Blocker: true, + Weights: utils.DynamicWeights{ + { + Weight: 20, + }, + }, + }, + } + var result string + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1SetResourceProfile, resPrf, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + //check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetResourceProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "RESOURCE_PROFILE"}, &reply); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(resPrf.ResourceProfile, reply) { + t.Errorf("Expecting: %+v, received: %+v", resPrf.ResourceProfile, reply) + } + + //remove + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveResourceProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "RESOURCE_PROFILE"}, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveResourceProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "RESOURCE_PROFILE"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveResourceProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "RESOURCE_PROFILE"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetResourceProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "RESOURCE_PROFILE"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } +} + +func testdoubleRemoveDispatcherProfile(t *testing.T) { + // check + var reply *engine.DispatcherProfile + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetDispatcherProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "DSP_PRF"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // set + dspPrf := &engine.DispatcherProfileWithAPIOpts{ + DispatcherProfile: &engine.DispatcherProfile{ + Tenant: doubleRemoveTenant, + ID: "DSP_PRF", + FilterIDs: []string{"*string:~*req.Account:1001"}, + }, + } + var result string + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1SetDispatcherProfile, dspPrf, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + //check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetDispatcherProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "DSP_PRF"}, &reply); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(dspPrf.DispatcherProfile, reply) { + t.Errorf("Expecting: %+v, received: %+v", dspPrf.DispatcherProfile, reply) + } + + //remove + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveDispatcherProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "DSP_PRF"}, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveDispatcherProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "DSP_PRF"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveDispatcherProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "DSP_PRF"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetDispatcherProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "DSP_PRF"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } +} + +func testdoubleRemoveDispatcherHost(t *testing.T) { + // check + var reply *engine.DispatcherHost + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetDispatcherHost, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "DSP_HOST"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // set + dspHost := &engine.DispatcherHostWithAPIOpts{ + DispatcherHost: &engine.DispatcherHost{ + Tenant: doubleRemoveTenant, + RemoteHost: &config.RemoteHost{ + ID: "DSP_HOST", + }, + }, + } + var result string + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1SetDispatcherHost, dspHost, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + //check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetDispatcherHost, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "DSP_HOST"}, &reply); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(dspHost.DispatcherHost, reply) { + t.Errorf("Expecting: %+v, received: %+v", dspHost.DispatcherHost, reply) + } + + //remove + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveDispatcherHost, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "DSP_HOST"}, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveDispatcherHost, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "DSP_HOST"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveDispatcherHost, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "DSP_HOST"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetDispatcherHost, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "DSP_HOST"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } +} + +func testdoubleRemoveRateProfile(t *testing.T) { + // check + var reply *utils.RateProfile + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetRateProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "RATE_PROFILE"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // set + thPrf := &utils.RateProfileWithAPIOpts{ + RateProfile: &utils.RateProfile{ + Tenant: doubleRemoveTenant, + ID: "RATE_PROFILE", + FilterIDs: []string{"*string:~*req.Account:1001"}, + Weights: utils.DynamicWeights{ + { + Weight: 20, + }, + }, + Rates: map[string]*utils.Rate{ + "RATE1": { + ID: "RATE1", + Weights: utils.DynamicWeights{ + { + Weight: 0, + }, + }, + ActivationTimes: "* * * * *", + IntervalRates: []*utils.IntervalRate{ + { + IntervalStart: utils.NewDecimal(0, 0), + RecurrentFee: utils.NewDecimal(2, 1), + }, + }, + }, + }, + }, + } + var result string + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1SetRateProfile, thPrf, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + //check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetRateProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "RATE_PROFILE"}, &reply); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(thPrf.RateProfile, reply) { + t.Errorf("Expecting: %+v, received: %+v", thPrf.RateProfile, reply) + } + + //remove + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveRateProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "RATE_PROFILE"}, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveRateProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "RATE_PROFILE"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveRateProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "RATE_PROFILE"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetRateProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "RATE_PROFILE"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } +} + +func testdoubleRemoveActionProfile(t *testing.T) { + // check + var reply *engine.ActionProfile + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetActionProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ACTION_PROFILE"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // set + thPrf := &engine.ActionProfileWithAPIOpts{ + ActionProfile: &engine.ActionProfile{ + Tenant: doubleRemoveTenant, + ID: "ACTION_PROFILE", + FilterIDs: []string{"*string:~*req.Account:1001"}, + Weights: utils.DynamicWeights{ + { + Weight: 20, + }, + }, + Actions: []*engine.APAction{ + { + ID: "ACTION", + }, + }, + }, + } + var result string + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1SetActionProfile, thPrf, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + //check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetActionProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ACTION_PROFILE"}, &reply); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(thPrf.ActionProfile, reply) { + t.Errorf("Expecting: %+v, received: %+v", thPrf.ActionProfile, reply) + } + + //remove + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveActionProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ACTION_PROFILE"}, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveActionProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ACTION_PROFILE"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1RemoveActionProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ACTION_PROFILE"}, &result); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + // check + if err := doubleRemoveRPC.Call(context.Background(), utils.AdminSv1GetActionProfile, + &utils.TenantID{Tenant: doubleRemoveTenant, ID: "ACTION_PROFILE"}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } +} + +func testdoubleRemoveKillEngine(t *testing.T) { + if err := engine.KillEngine(100); err != nil { + t.Error(err) + } +}