diff --git a/engine/onstor_it_test.go b/engine/onstor_it_test.go index 235afcf2f..986162a3f 100644 --- a/engine/onstor_it_test.go +++ b/engine/onstor_it_test.go @@ -29,6 +29,7 @@ import ( "github.com/cgrates/cgrates/cache" "github.com/cgrates/cgrates/config" + "github.com/cgrates/cgrates/utils" ) @@ -64,6 +65,14 @@ var sTestsOnStorIT = []func(t *testing.T){ testOnStorITCRUDRatingProfile, testOnStorITCRUDDestination, // ToFix: testOnStorITCRUDReverseDestination, + testOnStorITCRUDLCR, + testOnStorITCRUDCdrStats, + testOnStorITCRUDActions, + testOnStorITCRUDSharedGroup, + testOnStorITCRUDActionTriggers, + testOnStorITCRUDActionPlan, + testOnStorITPushPop, + testOnStorITCRUDAccount, } func TestOnStorITRedisConnect(t *testing.T) { @@ -801,7 +810,7 @@ func testOnStorITCRUDRatingPlan(t *testing.T) { }, }, } - if _, rcvErr := onStor.GetRatingPlan(rp.Id, true, utils.NonTransactional); rcvErr == err { + if _, rcvErr := onStor.GetRatingPlan(rp.Id, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { t.Error(rcvErr) } if err := onStor.SetRatingPlan(rp, utils.NonTransactional); err != nil { @@ -825,7 +834,7 @@ func testOnStorITCRUDRatingProfile(t *testing.T) { CdrStatQueueIds: []string{}, }}, } - if _, rcvErr := onStor.GetRatingProfile(rpf.Id, true, utils.NonTransactional); rcvErr == err { + if _, rcvErr := onStor.GetRatingProfile(rpf.Id, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { t.Error(rcvErr) } if err := onStor.SetRatingProfile(rpf, utils.NonTransactional); err != nil { @@ -860,16 +869,16 @@ func testOnStorITCRUDDestination(t *testing.T) { if err = onStor.RemoveDestination(dst.Id, utils.NonTransactional); err != nil { t.Error(err) } - if _, rcvErr := onStor.GetDestination(dst.Id, true, utils.NonTransactional); rcvErr == err { + if _, rcvErr := onStor.GetDestination(dst.Id, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { t.Error(rcvErr) } } -/* FixMe +/* func testOnStorITCRUDReverseDestination(t *testing.T) { dst := &Destination{Id: "CRUDReverseDestination", Prefixes: []string{"+491", "+492", "+493"}} dst2 := &Destination{Id: "CRUDReverseDestination2", Prefixes: []string{"+491", "+492", "+493"}} - if _, rcvErr := onStor.GetReverseDestination(dst.Id, true, utils.NonTransactional); rcvErr == err { + if _, rcvErr := onStor.GetReverseDestination(dst.Id, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { t.Error(rcvErr) } if err := onStor.SetReverseDestination(dst, utils.NonTransactional); err != nil { @@ -880,7 +889,7 @@ func testOnStorITCRUDReverseDestination(t *testing.T) { } else if !reflect.DeepEqual([]string{dst.Id}, rcv) { t.Errorf("Expecting: %v, received: %v", dst, rcv) } - if err := onStor.UpdateReverseDestination(dst,dst2, utils.NonTransactional); err != nil { + if err := onStor.UpdateReverseDestination(dst, dst2, utils.NonTransactional); err != nil { t.Error(err) } if rcv, err := onStor.GetReverseDestination(dst2.Id, true, utils.NonTransactional); err != nil { @@ -890,3 +899,312 @@ func testOnStorITCRUDReverseDestination(t *testing.T) { } } */ + +func testOnStorITCRUDLCR(t *testing.T) { + lcr := &LCR{ + Tenant: "cgrates.org", + Category: "call", + Direction: "*out", + Account: "*any", + Subject: "*any", + Activations: []*LCRActivation{ + &LCRActivation{ + ActivationTime: time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC).Local(), + Entries: []*LCREntry{ + &LCREntry{ + DestinationId: "EU_LANDLINE", + RPCategory: "LCR_STANDARD", + Strategy: "*static", + StrategyParams: "ivo;dan;rif", + Weight: 10, + }, + &LCREntry{ + DestinationId: "*any", + RPCategory: "LCR_STANDARD", + Strategy: "*lowest_cost", + StrategyParams: "", + Weight: 20, + }, + }, + }, + }, + } + if _, rcvErr := onStor.GetLCR(utils.LCR_PREFIX+lcr.GetId(), true, utils.NonTransactional); rcvErr != utils.ErrNotFound { + t.Error(rcvErr) + } + if err := onStor.SetLCR(lcr, utils.NonTransactional); err != nil { + t.Error(err) + } + if rcv, err := onStor.GetLCR(lcr.GetId(), true, utils.NonTransactional); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(lcr, rcv) { + t.Errorf("Expecting: %v, received: %v", lcr, rcv) + } +} + +func testOnStorITCRUDCdrStats(t *testing.T) { + cdrs := &CdrStats{Metrics: []string{ASR, PDD, ACD, TCD, ACC, TCC, DDC}} + + if _, rcvErr := onStor.GetCdrStats(utils.NonTransactional); rcvErr != utils.ErrNotFound { + t.Error(rcvErr) + } + if err := onStor.SetCdrStats(cdrs); err != nil { + t.Error(err) + } + if rcv, err := onStor.GetCdrStats(utils.NonTransactional); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(cdrs, rcv) { + t.Errorf("Expecting: %v, received: %v", cdrs, rcv) + } + if rcv, err := onStor.GetAllCdrStats(); err != nil { + t.Error(err) + } else if !reflect.DeepEqual([]*CdrStats{cdrs}, rcv) { + t.Errorf("Expecting: %v, received: %v", []*CdrStats{cdrs}, rcv) + } +} + +func testOnStorITCRUDActions(t *testing.T) { + acts := Actions{ + &Action{ + Id: "CRUDActions", + ActionType: TOPUP_RESET, + ExpirationString: UNLIMITED, + Weight: 10, + Balance: &BalanceFilter{ + Type: utils.StringPointer(utils.MONETARY), + Uuid: utils.StringPointer(utils.GenUUID()), + Directions: utils.StringMapPointer(utils.NewStringMap(utils.OUT)), + Value: &utils.ValueFormula{Static: 10, + Params: make(map[string]interface{})}, + Weight: utils.Float64Pointer(10), + Disabled: utils.BoolPointer(false), + Timings: make([]*RITiming, 0), + Blocker: utils.BoolPointer(false), + }, + }, + &Action{ + Id: "MINI", + ActionType: TOPUP, + ExpirationString: UNLIMITED, + Weight: 10, + Balance: &BalanceFilter{ + Type: utils.StringPointer(utils.VOICE), + Uuid: utils.StringPointer(utils.GenUUID()), + Directions: utils.StringMapPointer(utils.NewStringMap(utils.OUT)), + Value: &utils.ValueFormula{Static: 100, + Params: make(map[string]interface{})}, + Weight: utils.Float64Pointer(10), + RatingSubject: utils.StringPointer("test"), + DestinationIDs: utils.StringMapPointer(utils.NewStringMap("NAT")), + Disabled: utils.BoolPointer(false), + Timings: make([]*RITiming, 0), + Blocker: utils.BoolPointer(false), + }, + }, + } + if _, rcvErr := onStor.GetActions(acts[0].Id, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { + t.Error(rcvErr) + } + if err := onStor.SetActions(acts[0].Id, acts, utils.NonTransactional); err != nil { + t.Error(err) + } + if rcv, err := onStor.GetActions(acts[0].Id, true, utils.NonTransactional); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(acts[0], rcv[0]) { + t.Errorf("Expecting: %v, received: %v", acts[0], rcv[0]) + } + if err := onStor.RemoveActions(acts[0].Id, utils.NonTransactional); err != nil { + t.Error(err) + } + if _, rcvErr := onStor.GetActions(acts[0].Id, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { + t.Error(rcvErr) + } +} + +func testOnStorITCRUDSharedGroup(t *testing.T) { + sg := &SharedGroup{ + Id: "SG2", + AccountParameters: map[string]*SharingParameters{ + "*any": &SharingParameters{ + Strategy: "*lowest", + RatingSubject: "", + }, + }, + MemberIds: make(utils.StringMap), + } + if _, rcvErr := onStor.GetSharedGroup(sg.Id, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { + t.Error(rcvErr) + } + if err := onStor.SetSharedGroup(sg, utils.NonTransactional); err != nil { + t.Error(err) + } + if rcv, err := onStor.GetSharedGroup(sg.Id, true, utils.NonTransactional); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(sg, rcv) { + t.Errorf("Expecting: %v, received: %v", sg, rcv) + } +} + +func testOnStorITCRUDActionTriggers(t *testing.T) { + ats := ActionTriggers{ + &ActionTrigger{ + ID: "testOnStorITCRUDActionTriggers", + Balance: &BalanceFilter{Type: utils.StringPointer(utils.MONETARY), Directions: utils.StringMapPointer(utils.NewStringMap(utils.OUT)), Timings: make([]*RITiming, 0)}, + ThresholdValue: 2, + ThresholdType: utils.TRIGGER_MAX_EVENT_COUNTER, + ActionsID: "TEST_ACTIONS", + LastExecutionTime: time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC).Local(), + ExpirationDate: time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC).Local(), + ActivationDate: time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC).Local()}, + } + atsID := ats[0].ID + if _, rcvErr := onStor.GetActionTriggers(atsID, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { + t.Error(rcvErr) + } + if err := onStor.SetActionTriggers(atsID, ats, utils.NonTransactional); err != nil { + t.Error(err) + } + if rcv, err := onStor.GetActionTriggers(atsID, true, utils.NonTransactional); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(ats[0], rcv[0]) { + t.Errorf("Expecting: %v, received: %v", ats[0], rcv[0]) + } + if err := onStor.RemoveActionTriggers(atsID, utils.NonTransactional); err != nil { + t.Error(err) + } + if _, rcvErr := onStor.GetActionTriggers(atsID, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { + t.Error(rcvErr) + } +} + +func testOnStorITCRUDActionPlan(t *testing.T) { + ap := &ActionPlan{ + Id: "MORE_MINUTES2", + AccountIDs: utils.StringMap{"vdf:minitsboy": true}, + ActionTimings: []*ActionTiming{ + &ActionTiming{ + Uuid: utils.GenUUID(), + Timing: &RateInterval{ + Timing: &RITiming{ + Years: utils.Years{2012}, + Months: utils.Months{}, + MonthDays: utils.MonthDays{}, + WeekDays: utils.WeekDays{}, + StartTime: utils.ASAP, + }, + }, + Weight: 10, + ActionsID: "MINI", + }, + &ActionTiming{ + Uuid: utils.GenUUID(), + Timing: &RateInterval{ + Timing: &RITiming{ + Years: utils.Years{2012}, + Months: utils.Months{}, + MonthDays: utils.MonthDays{}, + WeekDays: utils.WeekDays{}, + StartTime: utils.ASAP, + }, + }, + Weight: 10, + ActionsID: "SHARED", + }, + }, + } + if _, rcvErr := onStor.GetActionPlan(ap.Id, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { + t.Error(rcvErr) + } + if err := onStor.SetActionPlan(ap.Id, ap, true, utils.NonTransactional); err != nil { + t.Error(err) + } + if rcv, err := onStor.GetActionPlan(ap.Id, true, utils.NonTransactional); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(ap, rcv) { + t.Errorf("Expecting: %v, received: %v", ap, rcv) + } + if rcv, err := onStor.GetAllActionPlans(); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(ap.Id, rcv[ap.Id].Id) { + t.Errorf("Expecting: %v, received: %v", ap.Id, rcv[ap.Id].Id) + } else if !reflect.DeepEqual(ap.AccountIDs, rcv[ap.Id].AccountIDs) { + t.Errorf("Expecting: %v, received: %v", ap.AccountIDs, rcv[ap.Id].AccountIDs) + } else if !reflect.DeepEqual(ap.ActionTimings[0].Uuid, rcv[ap.Id].ActionTimings[0].Uuid) { + t.Errorf("Expecting: %v, received: %v", ap.ActionTimings[0].Timing, rcv[ap.Id].ActionTimings[0].Timing) + } else if !reflect.DeepEqual(ap.ActionTimings[0].Uuid, rcv[ap.Id].ActionTimings[0].Uuid) { + t.Errorf("Expecting: %v, received: %v", ap.ActionTimings[0].Timing, rcv[ap.Id].ActionTimings[0].Timing) + } else if !reflect.DeepEqual(ap.ActionTimings[0].Weight, rcv[ap.Id].ActionTimings[0].Weight) { + t.Errorf("Expecting: %v, received: %v", ap.ActionTimings[0].Weight, rcv[ap.Id].ActionTimings[0].Weight) + } else if !reflect.DeepEqual(ap.ActionTimings[0].ActionsID, rcv[ap.Id].ActionTimings[0].ActionsID) { + t.Errorf("Expecting: %v, received: %v", ap.ActionTimings[0].ActionsID, rcv[ap.Id].ActionTimings[0].ActionsID) + } else if !reflect.DeepEqual(ap.ActionTimings[1].Uuid, rcv[ap.Id].ActionTimings[1].Uuid) { + t.Errorf("Expecting: %v, received: %v", ap.ActionTimings[1].Timing, rcv[ap.Id].ActionTimings[1].Timing) + } else if !reflect.DeepEqual(ap.ActionTimings[1].Uuid, rcv[ap.Id].ActionTimings[1].Uuid) { + t.Errorf("Expecting: %v, received: %v", ap.ActionTimings[1].Timing, rcv[ap.Id].ActionTimings[1].Timing) + } else if !reflect.DeepEqual(ap.ActionTimings[1].Weight, rcv[ap.Id].ActionTimings[1].Weight) { + t.Errorf("Expecting: %v, received: %v", ap.ActionTimings[1].Weight, rcv[ap.Id].ActionTimings[1].Weight) + } else if !reflect.DeepEqual(ap.ActionTimings[1].ActionsID, rcv[ap.Id].ActionTimings[1].ActionsID) { + t.Errorf("Expecting: %v, received: %v", ap.ActionTimings[1].ActionsID, rcv[ap.Id].ActionTimings[1].ActionsID) + } +} +func testOnStorITCRUDAccount(t *testing.T) { + + acc := &Account{ + ID: utils.ConcatenatedKey("cgrates.org", "account2"), + BalanceMap: map[string]Balances{utils.MONETARY: Balances{&Balance{Value: 10, Weight: 10}}}, + } + + if _, rcvErr := onStor.GetAccount(acc.ID); rcvErr != utils.ErrNotFound { + t.Error(rcvErr) + } + if err := onStor.SetAccount(acc); err != nil { + t.Error(err) + } + if rcv, err := onStor.GetAccount(acc.ID); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(acc.ID, rcv.ID) { + t.Errorf("Expecting: %v, received: %v", acc.ID, rcv.ID) + } //else if !reflect.DeepEqual(acc.BalanceMap[utils.MONETARY], rcv.BalanceMap[utils.MONETARY]) { + //t.Errorf("Expecting: %v, received: %v", acc.BalanceMap[utils.MONETARY], rcv.BalanceMap[utils.MONETARY]) + //} + if err := onStor.RemoveAccount(acc.ID); err != nil { + t.Error(err) + } + if _, rcvErr := onStor.GetAccount(acc.ID); rcvErr != utils.ErrNotFound { + t.Error(rcvErr) + } + +} + +/*for i := 0; i < 21; i++ { + onStor.PopTask() +}*/ +func testOnStorITPushPop(t *testing.T) { + if err := onStor.PushTask(&Task{Uuid: "1"}); err != nil { + t.Error("Error pushing task: ", err) + } + if err := onStor.PushTask(&Task{Uuid: "2"}); err != nil { + t.Error("Error pushing task: ", err) + } + if err := onStor.PushTask(&Task{Uuid: "3"}); err != nil { + t.Error("Error pushing task: ", err) + } + if err := onStor.PushTask(&Task{Uuid: "4"}); err != nil { + t.Error("Error pushing task: ", err) + } + if task, err := onStor.PopTask(); err != nil && task.Uuid != "1" { + t.Error("Error poping task: ", task, err) + } + if task, err := onStor.PopTask(); err != nil && task.Uuid != "2" { + t.Error("Error poping task: ", task, err) + } + if task, err := onStor.PopTask(); err != nil && task.Uuid != "3" { + t.Error("Error poping task: ", task, err) + } + if task, err := onStor.PopTask(); err != nil && task.Uuid != "4" { + t.Error("Error poping task: ", task, err) + } + if task, err := onStor.PopTask(); err == nil && task != nil { + t.Errorf("Error poping task %+v, %v ", task, err) + } +} diff --git a/engine/storage_redis.go b/engine/storage_redis.go index 7af1e709f..f591c69db 100644 --- a/engine/storage_redis.go +++ b/engine/storage_redis.go @@ -32,10 +32,6 @@ import ( "github.com/mediocregopher/radix.v2/redis" ) -var ( - ErrRedisNotFound = errors.New("RedisNotFound") -) - type RedisStorage struct { dbPool *pool.Pool maxConns int @@ -717,7 +713,7 @@ func (rs *RedisStorage) GetAccount(key string) (*Account, error) { if rpl.Err != nil { return nil, rpl.Err } else if rpl.IsType(redis.Nil) { - return nil, ErrRedisNotFound + return nil, utils.ErrNotFound } values, err := rpl.Bytes() if err != nil { diff --git a/general_tests/tutorial_astevents_calls_test.go b/general_tests/tutorial_astevents_calls_test.go index 63605eee9..218cb6f74 100644 --- a/general_tests/tutorial_astevents_calls_test.go +++ b/general_tests/tutorial_astevents_calls_test.go @@ -145,7 +145,7 @@ func TestTutAstCallsAccountsBefore(t *testing.T) { t.Errorf("Calling ApierV1.GetBalance received: %f", reply.BalanceMap[utils.MONETARY].GetTotalValue()) } attrs = &utils.AttrGetAccount{Tenant: "cgrates.org", Account: "1005"} - if err := tutAstCallsRpc.Call("ApierV2.GetAccount", attrs, &reply); err == nil || err.Error() != engine.ErrRedisNotFound.Error() { + if err := tutAstCallsRpc.Call("ApierV2.GetAccount", attrs, &reply); err == nil || err.Error() != utils.ErrNotFound.Error() { t.Error("Got error on ApierV2.GetAccount: %v", err) } } diff --git a/general_tests/tutorial_fs_calls_test.go b/general_tests/tutorial_fs_calls_test.go index 8375d3426..4bcd8987c 100644 --- a/general_tests/tutorial_fs_calls_test.go +++ b/general_tests/tutorial_fs_calls_test.go @@ -142,7 +142,7 @@ func TestTutFsCallsAccountsBefore(t *testing.T) { t.Errorf("Calling ApierV1.GetBalance received: %f", reply.BalanceMap[utils.MONETARY].GetTotalValue()) } attrs = &utils.AttrGetAccount{Tenant: "cgrates.org", Account: "1005"} - if err := tutFsCallsRpc.Call("ApierV2.GetAccount", attrs, &reply); err == nil || err.Error() != engine.ErrRedisNotFound.Error() { + if err := tutFsCallsRpc.Call("ApierV2.GetAccount", attrs, &reply); err == nil || err.Error() != utils.ErrNotFound.Error() { t.Errorf("Got error on ApierV2.GetAccount: %v", err) } } diff --git a/general_tests/tutorial_kam_calls_test.go b/general_tests/tutorial_kam_calls_test.go index 15fc58084..0254d2e12 100644 --- a/general_tests/tutorial_kam_calls_test.go +++ b/general_tests/tutorial_kam_calls_test.go @@ -142,7 +142,7 @@ func TestTutKamCallsAccountsBefore(t *testing.T) { t.Errorf("Calling ApierV1.GetBalance received: %f", reply.BalanceMap[utils.MONETARY].GetTotalValue()) } attrs = &utils.AttrGetAccount{Tenant: "cgrates.org", Account: "1005"} - if err := tutKamCallsRpc.Call("ApierV2.GetAccount", attrs, &reply); err == nil || err.Error() != engine.ErrRedisNotFound.Error() { + if err := tutKamCallsRpc.Call("ApierV2.GetAccount", attrs, &reply); err == nil || err.Error() != utils.ErrNotFound.Error() { t.Errorf("Got error on ApierV2.GetAccount: %v", err) } } diff --git a/general_tests/tutorial_osips_calls_test.go b/general_tests/tutorial_osips_calls_test.go index 3b14090ab..ca8c8ef47 100644 --- a/general_tests/tutorial_osips_calls_test.go +++ b/general_tests/tutorial_osips_calls_test.go @@ -142,7 +142,7 @@ func TestTutOsipsCallsAccountsBefore(t *testing.T) { t.Errorf("Calling ApierV1.GetBalance received: %f", reply.BalanceMap[utils.MONETARY].GetTotalValue()) } attrs = &utils.AttrGetAccount{Tenant: "cgrates.org", Account: "1005"} - if err := tutOsipsCallsRpc.Call("ApierV2.GetAccount", attrs, &reply); err == nil || err.Error() != engine.ErrRedisNotFound.Error() { + if err := tutOsipsCallsRpc.Call("ApierV2.GetAccount", attrs, &reply); err == nil || err.Error() != utils.ErrNotFound.Error() { t.Error("Got error on ApierV2.GetAccount: %v", err) } }