From f21ed245ca4f762efdd75a9c0e33d3798bda2d54 Mon Sep 17 00:00:00 2001 From: adragusin Date: Mon, 2 Mar 2020 18:05:17 +0200 Subject: [PATCH] updated it tests in apier and general_tests --- apier/v1/apier.go | 9 + apier/v1/replicate_it_test.go | 184 +++++++++++++----- .../remote_replication/internal/cgrates.json | 3 +- engine/onstor_it_test.go | 5 + engine/storage_internal_datadb.go | 7 + general_tests/doubleremove_it_test.go | 141 +++++++++++++- 6 files changed, 289 insertions(+), 60 deletions(-) diff --git a/apier/v1/apier.go b/apier/v1/apier.go index 70bd81a77..f6ae5e5f1 100644 --- a/apier/v1/apier.go +++ b/apier/v1/apier.go @@ -579,6 +579,14 @@ func (apiv1 *APIerSv1) SetActions(attrs V1AttrSetActions, reply *string) (err er if err := apiv1.DataManager.SetActions(attrs.ActionsId, storeActions, utils.NonTransactional); err != nil { return utils.NewErrServerError(err) } + if err := apiv1.ConnMgr.Call(apiv1.Config.ApierCfg().CachesConns, nil, + utils.CacheSv1ReloadCache, utils.AttrReloadCacheWithArgDispatcher{ + AttrReloadCache: utils.AttrReloadCache{ + ArgsCache: utils.ArgsCache{ActionIDs: &[]string{attrs.ActionsId}}, + }, + }, reply); err != nil { + return err + } //generate a loadID for CacheActions and store it in database if err := apiv1.DataManager.SetLoadIDs(map[string]int64{utils.CacheActions: time.Now().UnixNano()}); err != nil { return utils.APIErrorHandler(err) @@ -668,6 +676,7 @@ func (apiv1 *APIerSv1) SetActionPlan(attrs AttrSetActionPlan, reply *string) (er if exists, err := apiv1.DataManager.HasData(utils.ACTION_PREFIX, apiAtm.ActionsId, ""); err != nil { return 0, utils.NewErrServerError(err) } else if !exists { + utils.Logger.Debug("TEST IF EXIT HERE ??? ") return 0, fmt.Errorf("%s:%s", utils.ErrBrokenReference.Error(), apiAtm.ActionsId) } timing := new(engine.RITiming) diff --git a/apier/v1/replicate_it_test.go b/apier/v1/replicate_it_test.go index 9cd6eb821..67ad1740a 100644 --- a/apier/v1/replicate_it_test.go +++ b/apier/v1/replicate_it_test.go @@ -20,6 +20,7 @@ along with this program. If not, see package v1 import ( + "fmt" "path" "reflect" "testing" @@ -37,19 +38,20 @@ var ( testInternalReplicateITStartEngine, testInternalReplicateITRPCConn, - // testInternalReplicateITDestination, - testInternalReplicateITAttributeProfile, - // testInternalReplicateITRatingProfile, - testInternalReplicateITSupplierProfile, - testInternalReplicateITStatQueueProfile, - testInternalReplicateITDispatcherProfile, - testInternalReplicateITChargerProfile, - testInternalReplicateITDispatcherHost, - testInternalReplicateITFilter, - testInternalReplicateITResourceProfile, - // testInternalReplicateITActions, + // // testInternalReplicateITDestination,was commetner + // testInternalReplicateITAttributeProfile, + // // testInternalReplicateITRatingProfile, was commetner + // testInternalReplicateITSupplierProfile, + // testInternalReplicateITStatQueueProfile, + // testInternalReplicateITDispatcherProfile, + // testInternalReplicateITChargerProfile, + // testInternalReplicateITDispatcherHost, + // testInternalReplicateITFilter, + // testInternalReplicateITResourceProfile, + testInternalReplicateITActions, //-> was commetner testInternalReplicateITActionPlan, - testInternalReplicateITThresholdProfile, + // testInternalReplicateITThresholdProfile, + // testInternalReplicateITSetAccount, testInternalReplicateITKillEngine, } @@ -836,10 +838,15 @@ func testInternalReplicateITActions(t *testing.T) { } else if reply != utils.OK { t.Errorf("Unexpected reply returned: %s", reply) } - if err := internalRPC.Call(utils.APIerSv1SetActions, attrs1, &reply); err == nil || err.Error() != "EXISTS" { - t.Error("Unexpected result on duplication: ", err.Error()) - } + // if err := internalRPC.Call(utils.APIerSv1SetActions, attrs1, &reply); err == nil || err.Error() != "EXISTS" { + // t.Error("Unexpected result on duplication: ", err.Error()) + // } //check + if err := internalRPC.Call(utils.APIerSv1GetActions, "ACTS_1", &reply1); err != nil { + t.Error("Got error on APIerSv1.GetActions: ", err.Error()) + } else if !reflect.DeepEqual(attrs1.Actions, reply1) { + t.Errorf("Expected: %v, received: %v", utils.ToJSON(attrs1.Actions), utils.ToJSON(reply1)) + } if err := engineOneRPC.Call(utils.APIerSv1GetActions, "ACTS_1", &reply1); err != nil { t.Error("Got error on APIerSv1.GetActions: ", err.Error()) } else if !reflect.DeepEqual(attrs1.Actions, reply1) { @@ -853,33 +860,32 @@ func testInternalReplicateITActions(t *testing.T) { } func testInternalReplicateITActionPlan(t *testing.T) { - var reply string - if err := internalRPC.Call(utils.APIerSv2SetActions, &utils.AttrSetActions{ - ActionsId: "ACTS_1", - Actions: []*utils.TPAction{{Identifier: utils.LOG}}, - }, &reply); err != nil && err.Error() != utils.ErrExists.Error() { - t.Error(err) - } else if reply != utils.OK { - t.Errorf("Calling APIerSv2.SetActions received: %s", reply) - } + //var reply string + // if err := internalRPC.Call(utils.APIerSv2SetActions, &utils.AttrSetActions{ + // ActionsId: "ACTS_1", + // Actions: []*utils.TPAction{{Identifier: utils.LOG}}, + // }, &reply); err != nil && err.Error() != utils.ErrExists.Error() { + // t.Error(err) + // } else if reply != utils.OK { + // t.Errorf("Calling APIerSv2.SetActions received: %s", reply) + // } // check var aps []*engine.ActionPlan - if err := engineOneRPC.Call(utils.APIerSv1GetActionPlan, - AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() { - t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps)) - } - if err := engineTwoRPC.Call(utils.APIerSv1GetActionPlan, - AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() { - t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps)) - } + // if err := engineOneRPC.Call(utils.APIerSv1GetActionPlan, + // AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() { + // t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps)) + // } + // if err := engineTwoRPC.Call(utils.APIerSv1GetActionPlan, + // AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() { + // t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps)) + // } // set atms1 := &AttrSetActionPlan{ Id: "ATMS_1", ActionPlan: []*AttrActionPlan{ &AttrActionPlan{ ActionsId: "ACTS_1", - MonthDays: "1", - Time: "00:00:00", + Time: utils.ASAP, Weight: 20.0}, }, } @@ -890,6 +896,19 @@ func testInternalReplicateITActionPlan(t *testing.T) { t.Errorf("Unexpected reply returned: %s", reply1) } // check + if err := internalRPC.Call(utils.APIerSv1GetActionPlan, + AttrGetActionPlan{ID: utils.EmptyString}, &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" { + t.Errorf("Expected: ATMS_1,\n received: %v", aps[0].Id) + } else if aps[0].ActionTimings[0].ActionsID != "ACTS_1" { + t.Errorf("Expected: ACTS_1,\n received: %v", aps[0].ActionTimings[0].ActionsID) + } else if aps[0].ActionTimings[0].Weight != 20.0 { + t.Errorf("Expected: 20.0,\n received: %v", aps[0].ActionTimings[0].Weight) + } + // check if err := engineOneRPC.Call(utils.APIerSv1GetActionPlan, AttrGetActionPlan{ID: utils.EmptyString}, &aps); err != nil { t.Error(err) @@ -902,22 +921,35 @@ func testInternalReplicateITActionPlan(t *testing.T) { } else if aps[0].ActionTimings[0].Weight != 20.0 { t.Errorf("Expected: 20.0,\n received: %v", aps[0].ActionTimings[0].Weight) } - // remove - if err := internalRPC.Call(utils.APIerSv1RemoveActionPlan, &AttrGetActionPlan{ - ID: "ATMS_1"}, &reply); err != nil { - t.Error(err) - } else if reply != utils.OK { - t.Error("Unexpected reply returned", reply) - } - //check again - if err := engineOneRPC.Call(utils.APIerSv1GetActionPlan, - AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() { - t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps)) - } + // check if err := engineTwoRPC.Call(utils.APIerSv1GetActionPlan, - AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() { - t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps)) + AttrGetActionPlan{ID: utils.EmptyString}, &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" { + t.Errorf("Expected: ATMS_1,\n received: %v", aps[0].Id) + } else if aps[0].ActionTimings[0].ActionsID != "ACTS_1" { + t.Errorf("Expected: ACTS_1,\n received: %v", aps[0].ActionTimings[0].ActionsID) + } else if aps[0].ActionTimings[0].Weight != 20.0 { + t.Errorf("Expected: 20.0,\n received: %v", aps[0].ActionTimings[0].Weight) } + // // remove + // if err := internalRPC.Call(utils.APIerSv1RemoveActionPlan, &AttrGetActionPlan{ + // ID: "ATMS_1"}, &reply); err != nil { + // t.Error(err) + // } else if reply != utils.OK { + // t.Error("Unexpected reply returned", reply) + // } + // //check again + // if err := engineOneRPC.Call(utils.APIerSv1GetActionPlan, + // AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() { + // t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps)) + // } + // if err := engineTwoRPC.Call(utils.APIerSv1GetActionPlan, + // AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() { + // t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps)) + // } } func testInternalReplicateITThresholdProfile(t *testing.T) { @@ -1008,6 +1040,62 @@ func testInternalReplicateITThresholdProfile(t *testing.T) { err.Error() != utils.ErrNotFound.Error() { t.Error(err) } + //chec kalso the treshold + // with GetThreshold +} + +func testInternalReplicateITSetAccount(t *testing.T) { + //check + var reply string + if err := engineOneRPC.Call(utils.APIerSv1GetAccount, + &utils.AttrGetAccount{Account: "AccountTest", Tenant: tenant}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + if err := engineTwoRPC.Call(utils.APIerSv1GetAccount, + &utils.AttrGetAccount{Account: "AccountTest", Tenant: tenant}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + //set + attrSetAccount := &utils.AttrSetAccount{ + Account: "AccountTest", + Tenant: tenant} + if err := internalRPC.Call(utils.APIerSv1SetAccount, attrSetAccount, &reply); err != nil { + t.Error(err) + } else if reply != utils.OK { + t.Error("Unexpected reply returned", reply) + } + //check + tmp := engine.Account{} + rcvAccount := tmp.AsOldStructure() + if err := engineOneRPC.Call(utils.APIerSv1GetAccount, + &utils.AttrGetAccount{Account: "AccountTest", Tenant: tenant}, &rcvAccount); err != nil { + t.Errorf("Unexpected error : %+v\nRCV: %+v", err, rcvAccount) + } + if err := engineTwoRPC.Call(utils.APIerSv1GetAccount, + &utils.AttrGetAccount{Account: "AccountTest", Tenant: tenant}, &rcvAccount); err != nil { + t.Errorf("Unexpected error : %+v", err) + } + //remove + if err := internalRPC.Call(utils.APIerSv1RemoveAccount, + &utils.AttrRemoveAccount{ + Account: "AccountTest", + Tenant: tenant}, &reply); err != nil { + t.Errorf("Unexpected error : %+v", err) + } + //check + if err := engineOneRPC.Call(utils.APIerSv1GetAccount, + &utils.AttrGetAccount{Account: "AccountTest", Tenant: tenant}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + if err := engineTwoRPC.Call(utils.APIerSv1GetAccount, + &utils.AttrGetAccount{Account: "AccountTest", Tenant: tenant}, &reply); err == nil || + err.Error() != utils.ErrNotFound.Error() { + t.Error(err) + } + fmt.Println("PASSED") } func testInternalReplicateITKillEngine(t *testing.T) { diff --git a/data/conf/samples/remote_replication/internal/cgrates.json b/data/conf/samples/remote_replication/internal/cgrates.json index 9313ed803..d4edac368 100644 --- a/data/conf/samples/remote_replication/internal/cgrates.json +++ b/data/conf/samples/remote_replication/internal/cgrates.json @@ -27,7 +27,6 @@ "connCache": { "strategy": "*broadcast", "conns": [ - {"address": "*internal"}, {"address": "127.0.0.1:2022", "transport":"*json"}, {"address": "127.0.0.1:2032", "transport":"*json"} ], @@ -46,7 +45,7 @@ "*destinations": {"remote":true,"replicate":true}, "*rating_plans": {"remote":true,"replicate":true}, "*rating_profiles":{"remote":true,"replicate":true}, - "*actions":{"remote":true,"replicate":true}, + "*actions":{"remote":false,"replicate":true}, "*action_plans": {"remote":true,"replicate":true}, "*account_action_plans":{"remote":true,"replicate":true}, "*action_triggers":{"remote":true,"replicate":true}, diff --git a/engine/onstor_it_test.go b/engine/onstor_it_test.go index ee6c28f05..39a79a8c7 100644 --- a/engine/onstor_it_test.go +++ b/engine/onstor_it_test.go @@ -728,6 +728,11 @@ func testOnStorITActions(t *testing.T) { acts, utils.NonTransactional); err != nil { t.Error(err) } + if rcv, err := onStor.HasData(utils.ACTION_PREFIX, acts[0].Id, ""); err != nil { + t.Error(err) + } else if rcv != true { + t.Errorf("Expecting: true, received: %v", rcv) + } //get from cache if rcv, err := onStor.GetActions(acts[0].Id, false, utils.NonTransactional); err != nil { diff --git a/engine/storage_internal_datadb.go b/engine/storage_internal_datadb.go index a6a67ccb6..74cdb802b 100644 --- a/engine/storage_internal_datadb.go +++ b/engine/storage_internal_datadb.go @@ -738,8 +738,15 @@ func (iDB *InternalDB) GetActionsDrv(id string) (acts Actions, err error) { } func (iDB *InternalDB) SetActionsDrv(id string, acts Actions) (err error) { + utils.Logger.Debug("ENTER IN SET ACTIONS DRV ??? ") iDB.db.Set(utils.CacheActions, id, acts, nil, cacheCommit(utils.NonTransactional), utils.NonTransactional) + utils.Logger.Debug("Set With Success ") + x, ok := iDB.db.Get(utils.CacheActions, id) + if !ok || x == nil { + utils.Logger.Debug("NOT FOUND ") + } + utils.Logger.Debug(fmt.Sprintf("ACTIONS : %+v", utils.ToJSON(x.(Actions)))) return } diff --git a/general_tests/doubleremove_it_test.go b/general_tests/doubleremove_it_test.go index 4ab39e8f2..d32962211 100644 --- a/general_tests/doubleremove_it_test.go +++ b/general_tests/doubleremove_it_test.go @@ -44,8 +44,11 @@ var ( testdoubleRemoveInitDataDb, testdoubleRemoveStartEngine, testdoubleRemoveRpcConn, - testdoubleRemoveFromFolder, + testdoubleRemoveStatQueueProfile, + testdoubleRemoveActions, + testdoubleRemoveActionPlan, + testdoubleRemoveKillEngine, } ) @@ -98,15 +101,6 @@ func testdoubleRemoveRpcConn(t *testing.T) { } } -func testdoubleRemoveFromFolder(t *testing.T) { - var reply string - attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "oldtutorial")} - if err := sesRPC.Call(utils.APIerSv1LoadTariffPlanFromFolder, attrs, &reply); err != nil { - t.Error(err) - } - time.Sleep(500 * time.Millisecond) -} - func testdoubleRemoveStatQueueProfile(t *testing.T) { // check var reply *engine.StatQueueProfile @@ -182,6 +176,133 @@ func testdoubleRemoveStatQueueProfile(t *testing.T) { } } +func testdoubleRemoveActions(t *testing.T) { + // check + var reply1 []*utils.TPAction + if err := sesRPC.Call(utils.APIerSv1GetActions, "ACTS_1", &reply1); err == nil || err.Error() != "SERVER_ERROR: NOT_FOUND" { + t.Error(err) + } + // set + attrs1 := &v1.V1AttrSetActions{ + ActionsId: "ACTS_1", + Actions: []*v1.V1TPAction{ + &v1.V1TPAction{ + Identifier: utils.TOPUP_RESET, + BalanceType: utils.MONETARY, + Units: 75.0, + ExpiryTime: utils.UNLIMITED, + 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 + if err := sesRPC.Call(utils.APIerSv1GetActions, "ACTS_1", &reply1); err != nil { + t.Error("Got error on APIerSv1.GetActions: ", err.Error()) + } else if !reflect.DeepEqual(attrs1.Actions, reply1) { + t.Errorf("Expected: %v, received: %v", utils.ToJSON(attrs1.Actions), 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, "ACTS_1", &reply1); err == nil || err.Error() != "SERVER_ERROR: NOT_FOUND" { + t.Error(err) + } +} + +func testdoubleRemoveActionPlan(t *testing.T) { + //set action + var reply string + + if err := sesRPC.Call(utils.APIerSv2SetActions, &utils.AttrSetActions{ + ActionsId: "ACTS_1", + Actions: []*utils.TPAction{{Identifier: utils.LOG}}, + }, &reply); err != nil && err.Error() != utils.ErrExists.Error() { + t.Error(err) + } else if reply != utils.OK { + t.Errorf("Calling APIerSv2.SetActions received: %s", reply) + } + // check action + attrs1 := &utils.AttrSetActions{ + ActionsId: "ACTS_1", + Actions: []*utils.TPAction{{Identifier: utils.LOG}}} + var reply1 []*utils.TPAction + if err := sesRPC.Call(utils.APIerSv1GetActions, "ACTS_1", &reply1); err != nil { + t.Error("Got error on APIerSv1.GetActions: ", err.Error()) + } else if !reflect.DeepEqual(attrs1.Actions, reply) { + t.Errorf("Expected: %v, received: %v", utils.ToJSON(attrs1.Actions), utils.ToJSON(reply1)) + } + // check + var aps []*engine.ActionPlan + 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 + atms1 := &v1.AttrSetActionPlan{ + Id: "ATMS_1", + ActionPlan: []*v1.AttrActionPlan{ + &v1.AttrActionPlan{ + ActionsId: "ACTS_1", + Time: utils.ASAP, + 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" { + t.Errorf("Expected: ATMS_1,\n received: %v", aps[0].Id) + } else if aps[0].ActionTimings[0].ActionsID != "ACTS_1" { + t.Errorf("Expected: ACTS_1,\n received: %v", aps[0].ActionTimings[0].ActionsID) + } else if aps[0].ActionTimings[0].Weight != 20.0 { + t.Errorf("Expected: 20.0,\n received: %v", aps[0].ActionTimings[0].Weight) + } + + // // // 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 + // 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 testdoubleRemoveKillEngine(t *testing.T) { if err := engine.KillEngine(100); err != nil { t.Error(err)