Files
cgrates/engine/datamanager_test.go
2025-11-12 12:54:46 +01:00

9973 lines
296 KiB
Go

/*
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 Affero 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>
*/
package engine
import (
"fmt"
"net/http"
"net/http/httptest"
"reflect"
"testing"
"time"
"github.com/cgrates/baningo"
"github.com/cgrates/birpc"
"github.com/cgrates/birpc/context"
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/utils"
)
func TestDatamanagerCacheDataFromDBNoPrfxErr(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
dm := NewDataManager(&DBConnManager{
dataDBCfg: cfg.DbCfg(),
}, cfg, nil)
err := dm.CacheDataFromDB(context.Background(), "", []string{}, false)
if err == nil || err.Error() != "unsupported cache prefix" {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", "unsupported cache prefix", err)
}
}
func TestDatamanagerCacheDataFromDBNoDMErr(t *testing.T) {
var dm *DataManager
err := dm.CacheDataFromDB(context.Background(), "", []string{}, false)
if err == nil || err != utils.ErrNoDatabaseConn {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDatamanagerCacheDataFromDBNoLimitZeroErr(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
dm := NewDataManager(&DBConnManager{
dataDBCfg: cfg.DbCfg(),
}, cfg, nil)
dm.cfg.CacheCfg().Partitions = map[string]*config.CacheParamCfg{
utils.CachePrefixToInstance[utils.AttributeProfilePrefix]: {
Limit: 0,
},
}
err := dm.CacheDataFromDB(context.Background(), utils.AttributeProfilePrefix, []string{}, false)
if err != nil {
t.Error(err)
}
}
func TestDatamanagerCacheDataFromDBMetaAPIBanErr(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
dm := NewDataManager(&DBConnManager{
dataDBCfg: cfg.DbCfg(),
}, cfg, nil)
dm.cfg.CacheCfg().Partitions = map[string]*config.CacheParamCfg{
utils.CachePrefixToInstance[utils.MetaAPIBan]: {
Limit: 1,
},
}
err := dm.CacheDataFromDB(context.Background(), utils.MetaAPIBan, []string{}, false)
if err != nil {
t.Error(err)
}
}
func TestDatamanagerCacheDataFromDBMustBeCached(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
dm := NewDataManager(&DBConnManager{
dataDBCfg: cfg.DbCfg(),
}, cfg, nil)
dm.cfg.CacheCfg().Partitions = map[string]*config.CacheParamCfg{
utils.CachePrefixToInstance[utils.AttributeProfilePrefix]: {
Limit: 1,
},
}
err := dm.CacheDataFromDB(context.Background(), utils.AttributeProfilePrefix, []string{utils.MetaAny}, true)
if err != nil {
t.Error(err)
}
}
func TestDataManagerDataDB(t *testing.T) {
var dm *DataManager
rcv := dm.DataDB()
if rcv != nil {
t.Errorf("Expected DataDB to be nil, Received <%+v>", rcv)
}
}
func TestDataManagerSetFilterDMNil(t *testing.T) {
expErr := utils.ErrNoDatabaseConn
var dm *DataManager
err := dm.SetFilter(context.Background(), nil, true)
if err != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDataManagerSetFilterErrConnID(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaFilters].Remote = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, nil)
fltr := &Filter{
Tenant: "cgrates.org",
ID: "fltr1",
Rules: []*FilterRule{{
Type: utils.MetaString,
Element: "~*req.Account",
Values: []string{"1001", "1002"},
}},
}
expErr := "MANDATORY_IE_MISSING: [connIDs]"
err := dm.SetFilter(context.Background(), fltr, true)
if err.Error() != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDataManagerSetFilterErrSetFilterDrv(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, nil)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetFilterDrvF: func(ctx *context.Context, str1 string, str2 string) (*Filter, error) {
return nil, utils.ErrNotFound
},
}
fltr := &Filter{
Tenant: "cgrates.org",
ID: "fltr1",
Rules: []*FilterRule{{
Type: utils.MetaString,
Element: "~*req.Account",
Values: []string{"1001", "1002"},
}},
}
err := dm.SetFilter(context.Background(), fltr, true)
if err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, Received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDataManagerSetFilterErrUpdateFilterIndex(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetIndexesDrvF: func(ctx *context.Context, idxItmType, tntCtx, idxKey, transactionID string) (indexes map[string]utils.StringSet, err error) {
return nil, utils.ErrNotImplemented
},
SetFilterDrvF: func(ctx *context.Context, fltr *Filter) error { return nil },
}
fltr := &Filter{
Tenant: "cgrates.org",
ID: "*stirng:~*req.Account:1001",
Rules: []*FilterRule{{
Type: utils.MetaString,
Element: "~*req.Account",
Values: []string{"1001", "1002"},
}},
}
err := dm.SetFilter(context.Background(), fltr, true)
if err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, Received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDataManagerSetFilterErrItemReplicate(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaFilters].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetIndexesDrvF: func(ctx *context.Context, idxItmType, tntCtx, idxKey, transactionID string) (indexes map[string]utils.StringSet, err error) {
return nil, nil
},
SetFilterDrvF: func(ctx *context.Context, fltr *Filter) error { return nil },
}
dm.dbConns.replicators[utils.MetaDefault] = newReplicator(cfg.DbCfg().DBConns[utils.MetaDefault], cM)
fltr := &Filter{
Tenant: "cgrates.org",
ID: "*stirng:~*req.Account:1001",
Rules: []*FilterRule{{
Type: utils.MetaString,
Element: "~*req.Account",
Values: []string{"1001", "1002"},
}},
}
expErr := "MANDATORY_IE_MISSING: [connIDs]"
err := dm.SetFilter(context.Background(), fltr, true)
if err != nil && err.Error() != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDataManagerRemoveFilterNildm(t *testing.T) {
var dm *DataManager
expErr := utils.ErrNoDatabaseConn
err := dm.RemoveFilter(context.Background(), utils.CGRateSorg, "fltr1", true)
if err != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDataManagerRemoveFilterErrGetFilter(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetFilterDrvF: func(ctx *context.Context, str1, str2 string) (*Filter, error) {
return nil, utils.ErrNotImplemented
},
}
expErr := utils.ErrNotImplemented
err := dm.RemoveFilter(context.Background(), utils.CGRateSorg, "fltr1", true)
if err != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDataManagerRemoveFilterErrGetIndexes(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetFilterDrvF: func(ctx *context.Context, str1, str2 string) (*Filter, error) {
return nil, utils.ErrNotFound
},
}
expErr := utils.ErrNotImplemented
err := dm.RemoveFilter(context.Background(), utils.CGRateSorg, "fltr1", true)
if err != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDataManagerRemoveFilterErrGetIndexesBrokenReference(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetIndexesDrvF: func(ctx *context.Context, idxItmType, tntCtx, idxKey, transactionID string) (indexes map[string]utils.StringSet, err error) {
return nil, nil
},
}
fltrId := "*stirng:~*req.Account:1001:4fields"
expErr := "cannot remove filter <cgrates.org:*stirng:~*req.Account:1001:4fields> because will broken the reference to following items: null"
err := dm.RemoveFilter(context.Background(), utils.CGRateSorg, fltrId, true)
if err.Error() != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDataManagerRemoveFilterErrRemoveFilterDrv(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetFilterDrvF: func(ctx *context.Context, str1 string, str2 string) (*Filter, error) {
return &Filter{}, nil
},
GetIndexesDrvF: func(ctx *context.Context, idxItmType, tntCtx, idxKey, transactionID string) (indexes map[string]utils.StringSet, err error) {
return map[string]utils.StringSet{}, utils.ErrNotFound
},
RemoveFilterDrvF: func(ctx *context.Context, str1 string, str2 string) error {
return utils.ErrNotImplemented
},
}
fltrId := "fltr1"
expErr := utils.ErrNotImplemented
err := dm.RemoveFilter(context.Background(), utils.CGRateSorg, fltrId, true)
if err != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDataManagerRemoveFilterErrNilOldFltr(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
var fltrId string
var tnt string
expErr := utils.ErrNotFound
err := dm.RemoveFilter(context.Background(), tnt, fltrId, false)
if err != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDataManagerRemoveFilterReplicateTrue(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaFilters].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{}
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetFilterDrvF: func(ctx *context.Context, str1 string, str2 string) (*Filter, error) {
return &Filter{}, nil
},
RemoveFilterDrvF: func(ctx *context.Context, str1 string, str2 string) error {
return nil
},
}
tnt := utils.CGRateSorg
fltrId := "*stirng:~*req.Account:1001"
// tested replicate
dm.RemoveFilter(context.Background(), tnt, fltrId, false)
}
func TestDataManagerRemoveAccountNilDM(t *testing.T) {
var dm *DataManager
expErr := utils.ErrNoDatabaseConn
err := dm.RemoveAccount(context.Background(), utils.CGRateSorg, "acc1", false)
if err != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDataManagerRemoveAccountErrGetAccount(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) {
return nil, utils.ErrNotImplemented
},
}
expErr := utils.ErrNotImplemented
err := dm.RemoveAccount(context.Background(), utils.CGRateSorg, "fltr1", false)
if err != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDataManagerRemoveAccountErrRemoveAccountDrv(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) {
return &utils.Account{}, nil
},
RemoveAccountDrvF: func(ctx *context.Context, str1, str2 string) error {
return utils.ErrNotImplemented
},
}
expErr := utils.ErrNotImplemented
err := dm.RemoveAccount(context.Background(), utils.CGRateSorg, "fltr1", false)
if err != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDataManagerRemoveAccountErrNiloldRpp(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
var fltrId string
var tnt string
expErr := utils.ErrNotFound
err := dm.RemoveAccount(context.Background(), tnt, fltrId, false)
if err != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDataManagerRemoveAccountErrRemoveItemFromFilterIndex(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) {
return &utils.Account{}, nil
},
RemoveAccountDrvF: func(ctx *context.Context, str1, str2 string) error {
return nil
},
SetIndexesDrvF: func(ctx *context.Context, idxItmType, tntCtx string, indexes map[string]utils.StringSet, commit bool, transactionID string) (err error) {
return utils.ErrNotImplemented
},
}
tnt := utils.CGRateSorg
fltrId := "*stirng:~*req.Account:1001"
expErr := utils.ErrNotImplemented
err := dm.RemoveAccount(context.Background(), tnt, fltrId, true)
if err != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDataManagerRemoveAccountErrRemoveIndexFiltersItem(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) {
return &utils.Account{
FilterIDs: []string{"fltr1"},
}, nil
},
RemoveAccountDrvF: func(ctx *context.Context, str1, str2 string) error {
return nil
},
GetIndexesDrvF: func(ctx *context.Context, idxItmType, tntCtx, idxKey, transactionID string) (indexes map[string]utils.StringSet, err error) {
return nil, utils.ErrNotImplemented
},
}
tnt := utils.CGRateSorg
fltrId := "*stirng:~*req.Account:1001"
expErr := utils.ErrNotImplemented
err := dm.RemoveAccount(context.Background(), tnt, fltrId, true)
if err != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDataManagerRemoveAccountReplicateTrue(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaFilters].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{}
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) {
return &utils.Account{}, nil
},
RemoveAccountDrvF: func(ctx *context.Context, str1, str2 string) error {
return nil
},
}
tnt := utils.CGRateSorg
fltrId := "*stirng:~*req.Account:1001"
// tested replicate
dm.RemoveAccount(context.Background(), tnt, fltrId, false)
}
func TestDMRemoveAccountReplicate(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaAccounts].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) {
return &utils.Account{}, nil
},
RemoveAccountDrvF: func(ctx *context.Context, str1, str2 string) error {
return nil
},
}
// tested replicate
if err := dm.RemoveAccount(context.Background(), utils.CGRateSorg, "accId", false); err != nil {
t.Error(err)
}
}
func TestDMSetAccountNilDM(t *testing.T) {
var dm *DataManager
ap := &utils.Account{}
expErr := utils.ErrNoDatabaseConn
if err := dm.SetAccount(context.Background(), ap, false); err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, Received <%v>", expErr, err)
}
}
func TestDMSetAccountcheckFiltersErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
ap := &utils.Account{
Tenant: "cgrates.org",
ID: "accId",
Weights: []*utils.DynamicWeight{
{
Weight: 0,
},
},
FilterIDs: []string{":::"},
Balances: map[string]*utils.Balance{
"AbstractBalance1": {
ID: "AbstractBalance1",
Weights: utils.DynamicWeights{
{
Weight: 25,
},
},
Type: utils.MetaAbstract,
Units: utils.NewDecimal(int64(40*time.Second), 0),
CostIncrements: []*utils.CostIncrement{
{
Increment: utils.NewDecimal(int64(time.Second), 0),
FixedFee: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(0, 0),
},
},
},
},
Blockers: utils.DynamicBlockers{
{
FilterIDs: []string{"fltrID"},
Blocker: true,
},
},
Opts: make(map[string]any),
ThresholdIDs: []string{utils.MetaNone},
}
expErr := "broken reference to filter: <:::> for item with ID: cgrates.org:accId"
if err := dm.SetAccount(context.Background(), ap, true); err == nil || err.Error() != expErr {
t.Errorf("Expected error <%v>, Received <%v>", expErr, err)
}
}
func TestDMSetAccountGetAccountErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) {
return nil, utils.ErrNotImplemented
},
}
ap := &utils.Account{
Tenant: "cgrates.org",
ID: "accId",
Weights: []*utils.DynamicWeight{
{
Weight: 0,
},
},
FilterIDs: []string{"*stirng:~*req.Account:1001"},
Balances: map[string]*utils.Balance{
"AbstractBalance1": {
ID: "AbstractBalance1",
Weights: utils.DynamicWeights{
{
Weight: 25,
},
},
Type: utils.MetaAbstract,
Units: utils.NewDecimal(int64(40*time.Second), 0),
CostIncrements: []*utils.CostIncrement{
{
Increment: utils.NewDecimal(int64(time.Second), 0),
FixedFee: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(0, 0),
},
},
},
},
Blockers: utils.DynamicBlockers{
{
FilterIDs: []string{"fltrID"},
Blocker: true,
},
},
Opts: make(map[string]any),
ThresholdIDs: []string{utils.MetaNone},
}
expErr := utils.ErrNotImplemented
if err := dm.SetAccount(context.Background(), ap, true); err != expErr {
t.Errorf("Expected error <%v>, Received <%v>", expErr, err)
}
}
func TestDMSetAccountSetAccountDrvErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) {
return &utils.Account{
Tenant: "cgrates.org",
}, nil
},
SetAccountDrvF: func(ctx *context.Context, profile *utils.Account) error {
return utils.ErrNotImplemented
},
}
ap := &utils.Account{
Tenant: "cgrates.org",
ID: "accId",
Weights: []*utils.DynamicWeight{
{
Weight: 0,
},
},
FilterIDs: []string{"*stirng:~*req.Account:1001"},
Balances: map[string]*utils.Balance{
"AbstractBalance1": {
ID: "AbstractBalance1",
Weights: utils.DynamicWeights{
{
Weight: 25,
},
},
Type: utils.MetaAbstract,
Units: utils.NewDecimal(int64(40*time.Second), 0),
CostIncrements: []*utils.CostIncrement{
{
Increment: utils.NewDecimal(int64(time.Second), 0),
FixedFee: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(0, 0),
},
},
},
},
Blockers: utils.DynamicBlockers{
{
FilterIDs: []string{"fltrID"},
Blocker: true,
},
},
Opts: make(map[string]any),
ThresholdIDs: []string{utils.MetaNone},
}
expErr := utils.ErrNotImplemented
if err := dm.SetAccount(context.Background(), ap, true); err != expErr {
t.Errorf("Expected error <%v>, Received <%v>", expErr, err)
}
}
func TestDMSetAccountupdatedIndexesErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) {
return &utils.Account{
Tenant: "cgrates.org",
}, nil
},
SetAccountDrvF: func(ctx *context.Context, profile *utils.Account) error {
return nil
},
}
ap := &utils.Account{
Tenant: "cgrates.org",
ID: "accId",
Weights: []*utils.DynamicWeight{
{
Weight: 0,
},
},
FilterIDs: []string{"*stirng:~*req.Account:1001"},
Balances: map[string]*utils.Balance{
"AbstractBalance1": {
ID: "AbstractBalance1",
Weights: utils.DynamicWeights{
{
Weight: 25,
},
},
Type: utils.MetaAbstract,
Units: utils.NewDecimal(int64(40*time.Second), 0),
CostIncrements: []*utils.CostIncrement{
{
Increment: utils.NewDecimal(int64(time.Second), 0),
FixedFee: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(0, 0),
},
},
},
},
Blockers: utils.DynamicBlockers{
{
FilterIDs: []string{"fltrID"},
Blocker: true,
},
},
Opts: make(map[string]any),
ThresholdIDs: []string{utils.MetaNone},
}
expErr := utils.ErrNotImplemented
if err := dm.SetAccount(context.Background(), ap, true); err != expErr {
t.Errorf("Expected error <%v>, Received <%v>", expErr, err)
}
}
func TestDMSetAccountReplicateTrue(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaAccounts].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) {
return &utils.Account{}, nil
},
SetAccountDrvF: func(ctx *context.Context, profile *utils.Account) error {
return nil
},
}
ap := &utils.Account{
Tenant: "cgrates.org",
ID: "accId",
Weights: []*utils.DynamicWeight{
{
Weight: 0,
},
},
FilterIDs: []string{"*stirng:~*req.Account:1001"},
Balances: map[string]*utils.Balance{
"AbstractBalance1": {
ID: "AbstractBalance1",
Weights: utils.DynamicWeights{
{
Weight: 25,
},
},
Type: utils.MetaAbstract,
Units: utils.NewDecimal(int64(40*time.Second), 0),
CostIncrements: []*utils.CostIncrement{
{
Increment: utils.NewDecimal(int64(time.Second), 0),
FixedFee: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(0, 0),
},
},
},
},
Blockers: utils.DynamicBlockers{
{
FilterIDs: []string{"fltrID"},
Blocker: true,
},
},
Opts: make(map[string]any),
ThresholdIDs: []string{utils.MetaNone},
}
// tests replicete
dm.SetAccount(context.Background(), ap, false)
}
func TestDMRemoveThresholdProfileNilDM(t *testing.T) {
var dm *DataManager
expErr := utils.ErrNoDatabaseConn
if err := dm.RemoveThresholdProfile(context.Background(), utils.CGRateSorg, "ThrPrf1", false); err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, Received <%v>", expErr, err)
}
}
func TestDMRemoveThresholdProfileGetErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) {
return nil, utils.ErrNotImplemented
},
}
expErr := utils.ErrNotImplemented
if err := dm.RemoveThresholdProfile(context.Background(), utils.CGRateSorg, "ThrPrf1", false); err != expErr {
t.Errorf("Expected error <%v>, Received <%v>", expErr, err)
}
}
func TestDMRemoveThresholdProfileRmvErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) {
return nil, nil
},
RemThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (err error) { return utils.ErrNotImplemented },
}
expErr := utils.ErrNotImplemented
if err := dm.RemoveThresholdProfile(context.Background(), utils.CGRateSorg, "ThrPrf1", false); err != expErr {
t.Errorf("Expected error <%v>, Received <%v>", expErr, err)
}
}
func TestDMRemoveThresholdProfileOldThrNil(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) {
return nil, nil
},
RemThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (err error) { return nil },
}
expErr := utils.ErrNotFound
if err := dm.RemoveThresholdProfile(context.Background(), utils.CGRateSorg, "ThrPrf1", false); err != expErr {
t.Errorf("Expected error <%v>, Received <%v>", expErr, err)
}
}
func TestDMRemoveThresholdProfileIndxTrueErr1(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) {
return &ThresholdProfile{
Tenant: "cgrates.org",
ID: "THD_2",
FilterIDs: []string{"*string:~*req.Account:1001"},
ActionProfileIDs: []string{"actPrfID"},
MaxHits: 7,
MinHits: 0,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
Async: true,
}, nil
},
RemThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (err error) { return nil },
}
expErr := utils.ErrNotImplemented
if err := dm.RemoveThresholdProfile(context.Background(), utils.CGRateSorg, "THD_2", true); err != expErr {
t.Errorf("Expected error <%v>, Received <%v>", expErr, err)
}
}
func TestDMRemoveThresholdProfileIndxTrueErr2(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) {
return &ThresholdProfile{
Tenant: "cgrates.org",
ID: "THD_2",
FilterIDs: []string{"*string:~*req.Account:1001", "noPrefix"},
ActionProfileIDs: []string{"actPrfID"},
MaxHits: 7,
MinHits: 0,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
Async: true,
}, nil
},
RemThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (err error) { return nil },
GetIndexesDrvF: func(ctx *context.Context, idxItmType, tntCtx, idxKey, transactionID string) (indexes map[string]utils.StringSet, err error) {
return nil, utils.ErrNotImplemented
},
}
expErr := utils.ErrNotImplemented
if err := dm.RemoveThresholdProfile(context.Background(), utils.CGRateSorg, "THD_2", true); err != expErr {
t.Errorf("Expected error <%v>, Received <%v>", expErr, err)
}
}
func TestDMRemoveThresholdProfileReplicateTrue(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaThresholdProfiles].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) {
return &ThresholdProfile{
Tenant: "cgrates.org",
ID: "THD_2",
FilterIDs: []string{"*string:~*req.Account:1001"},
ActionProfileIDs: []string{"actPrfID"},
MaxHits: 7,
MinHits: 0,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
Async: true,
}, nil
},
RemThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (err error) { return nil },
}
// tests replicate
dm.RemoveThresholdProfile(context.Background(), utils.CGRateSorg, "THD_2", false)
}
func TestDMSetThresholdErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
SetThresholdDrvF: func(ctx *context.Context, t *Threshold) error { return utils.ErrNotImplemented },
}
th := &Threshold{
Tenant: "cgrates.org",
ID: "TH_1",
Hits: 0,
}
expErr := utils.ErrNotImplemented
if err := dm.SetThreshold(context.Background(), th); err != expErr {
t.Errorf("Expected error <%v>, Received <%v>", expErr, err)
}
}
func TestDMSetThresholdReplicateTrue(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaThresholds].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
th := &Threshold{
Tenant: "cgrates.org",
ID: "TH_1",
Hits: 0,
}
// tests replicate
dm.SetThreshold(context.Background(), th)
}
func TestDMRemoveThresholdReplicateTrue(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaThresholds].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
th := &Threshold{
Tenant: "cgrates.org",
ID: "TH_1",
Hits: 0,
}
if err := dm.DataDB()[utils.MetaDefault].SetThresholdDrv(context.Background(), th); err != nil {
t.Error(err)
}
rcv, err := dm.GetThreshold(context.Background(), utils.CGRateSorg, "TH_1", true, false, utils.NonTransactional)
if err != nil {
t.Error(err)
} else if *th != *rcv {
t.Errorf("Expected <%+v> , Received <%+v>", th, rcv)
}
// tests replicate
if err := dm.RemoveThreshold(context.Background(), "cgrates.org", "TH_1"); err != nil {
t.Error(err)
}
if getRcv, err := dm.GetThreshold(context.Background(), utils.CGRateSorg, "TH_1", true, false, utils.NonTransactional); err != utils.ErrNotFound {
t.Error(err)
} else if getRcv != nil {
t.Errorf("Expected <%+v>, \nReceived <%+v>\n", nil, getRcv)
}
}
func TestDMGetThresholdCacheGetErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := Cache.Set(context.Background(), utils.CacheThresholds, utils.ConcatenatedKey(utils.CGRateSorg, "TH_1"), nil, []string{}, true, utils.NonTransactional); err != nil {
t.Error(err)
}
_, err := dm.GetThreshold(context.Background(), utils.CGRateSorg, "TH_1", true, false, utils.NonTransactional)
if err != utils.ErrNotFound {
t.Error(err)
}
}
// unfinished, getting **Threshold GetThresholdDrv outputing *, we need plain
// func TestDMGetThresholdSetThErr(t *testing.T) {
// tmp := Cache
// cfgtmp := config.CgrConfig()
// tmpCM := connMgr
// defer func() {
// Cache = tmp
// config.SetCgrConfig(cfgtmp)
// connMgr = tmpCM
// }()
// Cache.Clear(nil)
// cfg := config.NewDefaultCGRConfig()
// cfg.DbCfg().Items[utils.MetaThresholds].Remote = true
// cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal,
// utils.RemoteConnsCfg)}
// config.SetCgrConfig(cfg)
// data , _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
// th := &Threshold{
// Tenant: "cgrates.org",
// ID: "TH_1",
// Hits: 0,
// }
// cc := &ccMock{
// calls: map[string]func(ctx *context.Context, args any, reply any) error{
// utils.ReplicatorSv1GetThreshold: func(ctx *context.Context, args, reply any) error {
// rplCast, canCast := reply.(*Threshold)
// if !canCast {
// t.Errorf("Wrong argument type : %T", reply)
// return nil
// }
// *rplCast = *th
// return nil
// },
// },
// }
// rpcInternal := make(chan birpc.ClientConnector, 1)
// rpcInternal <- cc
// cM := NewConnManager(cfg)
// cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, rpcInternal)
// dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
// dm := NewDataManager(dbCM, cfg.CacheCfg(), cM)
// _, err := dm.GetThreshold(context.Background(), utils.CGRateSorg, "TH_1", false, false, utils.NonTransactional)
// if err != utils.ErrNotFound {
// t.Error(err)
// }
// }
func TestDMGetThresholdSetThCacheSetErr(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.MetaThresholds].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error {
return utils.ErrNotImplemented
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
Cache = NewCacheS(cfg, dm, cM, nil)
expErr := utils.ErrNotImplemented
_, err := dm.GetThreshold(context.Background(), utils.CGRateSorg, "TH_1", false, true, utils.NonTransactional)
if err != expErr {
t.Errorf("Expected <%v> , Received <%v>", expErr, err)
}
}
func TestDMSetStatQueueNewErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
experr := "marshal mock error"
dm.ms = mockMarshal(experr)
sq := &StatQueue{
SQMetrics: map[string]StatMetric{
"key": statMetricMock(""),
},
}
if err := dm.SetStatQueue(context.Background(), sq); err == nil || err.Error() != experr {
t.Errorf("Expected error <%v>, Received <%v>", experr, err)
}
}
func TestDMSetStatQueueSetDrvErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
SetStatQueueDrvF: func(ctx *context.Context, ssq *StoredStatQueue, sq *StatQueue) error { return utils.ErrNotImplemented },
}
sq := &StatQueue{
SQMetrics: map[string]StatMetric{
utils.MetaASR: &StatASR{
Metric: &Metric{
Value: utils.NewDecimal(1, 0),
Count: 1,
Events: map[string]*DecimalWithCompress{
"cgrates.org:TestStatRemExpired_1": {Stat: utils.NewDecimalFromFloat64(1), CompressFactor: 1},
},
},
},
},
sqPrfl: &StatQueueProfile{
Metrics: []*MetricWithFilters{
{
MetricID: utils.MetaASR,
},
},
},
}
expErr := utils.ErrNotImplemented
if err := dm.SetStatQueue(context.Background(), sq); err != expErr {
t.Errorf("Expected error <%v>, Received <%v>", expErr, err)
}
}
func TestDMSetStatQueueReplicateTrue(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaStatQueues].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
sq := &StatQueue{
SQMetrics: map[string]StatMetric{
utils.MetaASR: &StatASR{
Metric: &Metric{
Value: utils.NewDecimal(1, 0),
Count: 1,
Events: map[string]*DecimalWithCompress{
"cgrates.org:TestStatRemExpired_1": {Stat: utils.NewDecimalFromFloat64(1), CompressFactor: 1},
},
},
},
},
sqPrfl: &StatQueueProfile{
Metrics: []*MetricWithFilters{
{
MetricID: utils.MetaASR,
},
},
},
}
// tests replicate
dm.SetStatQueue(context.Background(), sq)
}
func TestDMRemoveStatQueueNildb(t *testing.T) {
var dm *DataManager
if err := dm.RemoveStatQueue(context.Background(), utils.CGRateSorg, "SQ99"); err != utils.ErrNoDatabaseConn {
t.Error(err)
}
}
func TestDMRemoveStatQueueErrDrv(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
RemStatQueueDrvF: func(ctx *context.Context, tenant, id string) (err error) { return utils.ErrNotImplemented },
}
if err := dm.RemoveStatQueue(context.Background(), utils.CGRateSorg, "SQ99"); err != utils.ErrNotImplemented {
t.Error(err)
}
}
func TestDMRemoveStatQueueReplicate(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaStatQueues].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1SetStatQueue: func(ctx *context.Context, args, reply any) error {
return nil
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
sq := &StatQueue{
Tenant: utils.CGRateSorg,
ID: "sqid99",
SQMetrics: map[string]StatMetric{
utils.MetaASR: &StatASR{
Metric: &Metric{
Value: utils.NewDecimal(1, 0),
Count: 1,
Events: map[string]*DecimalWithCompress{
"cgrates.org:TestStatRemExpired_1": {Stat: utils.NewDecimalFromFloat64(1), CompressFactor: 1},
},
},
},
},
sqPrfl: &StatQueueProfile{
Metrics: []*MetricWithFilters{
{
MetricID: utils.MetaASR,
},
},
},
}
if err := dm.SetStatQueue(context.Background(), sq); err != nil {
t.Error(err)
}
if rcv, err := dm.GetStatQueue(context.Background(), utils.CGRateSorg, "sqid99", true, false, utils.NonTransactional); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(rcv, sq) {
t.Errorf("\nexpected \n<%v> \nreceived \n<%v>\n", sq, rcv)
}
//tests replicate
if err := dm.RemoveStatQueue(context.Background(), utils.CGRateSorg, "sqid99"); err != nil {
t.Error(err)
}
if _, err := dm.GetStatQueue(context.Background(), utils.CGRateSorg, "sqid99", true, false, utils.NonTransactional); err != utils.ErrNotFound {
t.Error(err)
}
}
func TestDMGetStatQueueProfileErrNildm(t *testing.T) {
var dm *DataManager
if _, err := dm.GetStatQueueProfile(context.Background(), utils.CGRateSorg, "sqp99", false, false, utils.NonTransactional); err != utils.ErrNoDatabaseConn {
t.Error(err)
}
}
func TestDMGetStatQueueProfileErrNilCacheRead(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
tntID := utils.ConcatenatedKey(utils.CGRateSorg, "sqp99")
var setVal any
if err := Cache.Set(context.Background(), utils.CacheStatQueueProfiles, tntID, setVal, []string{}, true, utils.NonTransactional); err != nil {
t.Error(err)
}
if _, err := dm.GetStatQueueProfile(context.Background(), utils.CGRateSorg, "sqp99", true, false, utils.NonTransactional); err != utils.ErrNotFound {
t.Error(err)
}
}
func TestDMGetStatQueueProfileErrRemote(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaStatQueueProfiles].Remote = true
cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg)}
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1GetStatQueueProfile: func(ctx *context.Context, args, reply any) error {
return nil
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
sqp := &StatQueueProfile{
Tenant: "cgrates.org",
ID: "sqp99",
FilterIDs: []string{"fltr_test"},
QueueLength: 10,
TTL: 10 * time.Second,
Metrics: []*MetricWithFilters{
{
MetricID: "*sum#~*req.Usage",
},
},
ThresholdIDs: []string{},
Stored: true,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
MinItems: 1,
}
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetStatQueueProfileDrvF: func(ctx *context.Context, tenant, id string) (sq *StatQueueProfile, err error) {
return sqp, utils.ErrNotFound
},
SetStatQueueProfileDrvF: func(ctx *context.Context, sq *StatQueueProfile) (err error) { return utils.ErrNotImplemented },
}
if _, err := dm.GetStatQueueProfile(context.Background(), utils.CGRateSorg, "sqp99", false, false, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Error(err)
}
}
func TestDMGetStatQueueProfileErrCacheWrite(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheStatQueueProfiles].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
sqp := &StatQueueProfile{
Tenant: "cgrates.org",
ID: "sqp99",
FilterIDs: []string{"fltr_test"},
QueueLength: 10,
TTL: 10 * time.Second,
Metrics: []*MetricWithFilters{
{
MetricID: "*sum#~*req.Usage",
},
},
ThresholdIDs: []string{},
Stored: true,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
MinItems: 1,
}
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetStatQueueProfileDrvF: func(ctx *context.Context, tenant, id string) (sq *StatQueueProfile, err error) {
return sqp, utils.ErrNotFound
},
}
Cache = NewCacheS(cfg, dm, cM, nil)
if _, err := dm.GetStatQueueProfile(context.Background(), utils.CGRateSorg, "sqp99", false, true, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Error(err)
}
}
func TestDMGetStatQueueProfileErr2CacheWrite(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheStatQueueProfiles].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
sqp := &StatQueueProfile{
Tenant: "cgrates.org",
ID: "sqp99",
FilterIDs: []string{"fltr_test"},
QueueLength: 10,
TTL: 10 * time.Second,
Metrics: []*MetricWithFilters{
{
MetricID: "*sum#~*req.Usage",
},
},
ThresholdIDs: []string{},
Stored: true,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
MinItems: 1,
}
if err := dm.DataDB()[utils.MetaDefault].SetStatQueueProfileDrv(context.Background(), sqp); err != nil {
t.Error(err)
}
Cache = NewCacheS(cfg, dm, cM, nil)
if _, err := dm.GetStatQueueProfile(context.Background(), utils.CGRateSorg, "sqp99", false, true, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Error(err)
}
}
func TestDMGetThresholdProfileSetThErr2(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.MetaThresholds].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error {
return utils.ErrNotImplemented
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetThresholdDrvF: func(ctx *context.Context, tenant, id string) (*Threshold, error) {
return &Threshold{}, nil
},
}
Cache = NewCacheS(cfg, dm, cM, nil)
expErr := utils.ErrNotImplemented
_, err := dm.GetThreshold(context.Background(), utils.CGRateSorg, "TH_1", false, true, utils.NonTransactional)
if err != expErr {
t.Errorf("Expected <%v> , Received <%v>", expErr, err)
}
}
func TestDMGetThresholdGetThProflErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := Cache.Set(context.Background(), utils.CacheThresholdProfiles, utils.ConcatenatedKey(utils.CGRateSorg, "TH_1"), nil, []string{}, true, utils.NonTransactional); err != nil {
t.Error(err)
}
expErr := utils.ErrNotFound
_, err := dm.GetThresholdProfile(context.Background(), utils.CGRateSorg, "TH_1", true, true, utils.NonTransactional)
if err != expErr {
t.Errorf("Expected <%v> , Received <%v>", expErr, err)
}
}
func TestDMGetThresholdProfileDMErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
var dm *DataManager
expErr := utils.ErrNoDatabaseConn
_, err := dm.GetThresholdProfile(context.Background(), utils.CGRateSorg, "TH_1", true, true, utils.NonTransactional)
if err != expErr {
t.Errorf("Expected <%v> , Received <%v>", expErr, err)
}
}
// unfinished
// func TestGetThresholdProfileSetThErr(t *testing.T) {
// tmp := Cache
// cfgtmp := config.CgrConfig()
// tmpCM := connMgr
// defer func() {
// Cache = tmp
// config.SetCgrConfig(cfgtmp)
// connMgr = tmpCM
// }()
// Cache.Clear(nil)
// cfg := config.NewDefaultCGRConfig()
// cfg.DbCfg().Items[utils.MetaThresholdProfiles].Remote = true
// cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal,
// utils.RemoteConnsCfg)}
// config.SetCgrConfig(cfg)
// data , _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
// th := &Threshold{
// Tenant: "cgrates.org",
// ID: "TH_1",
// Hits: 0,
// }
// cc := &ccMock{
// calls: map[string]func(ctx *context.Context, args any, reply any) error{
// utils.ReplicatorSv1GetThresholdProfile: func(ctx *context.Context, args, reply any) error {
// rplCast, canCast := reply.(*Threshold)
// if !canCast {
// t.Errorf("Wrong argument type : %T", reply)
// return nil
// }
// *rplCast = *th
// return nil
// },
// },
// }
// rpcInternal := make(chan birpc.ClientConnector, 1)
// rpcInternal <- cc
// cM := NewConnManager(cfg)
// cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, rpcInternal)
// dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
// dm := NewDataManager(dbCM, cfg.CacheCfg(), cM)
// _, err := dm.GetThresholdProfile(context.Background(), utils.CGRateSorg, "TH_1", false, false, utils.NonTransactional)
// if err != utils.ErrNotFound {
// t.Error(err)
// }
// }
func TestDMGetThresholdProfileSetThPrfErr(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.MetaThresholdProfiles].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error {
return utils.ErrNotImplemented
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
Cache = NewCacheS(cfg, dm, cM, nil)
expErr := utils.ErrNotImplemented
_, err := dm.GetThresholdProfile(context.Background(), utils.CGRateSorg, "TH_1", false, true, utils.NonTransactional)
if err != expErr {
t.Errorf("Expected <%v> , Received <%v>", expErr, err)
}
}
func TestDMGetThresholdProfileSetThPrfErr2(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.MetaThresholdProfiles].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error {
return utils.ErrNotImplemented
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) {
return &ThresholdProfile{}, nil
},
}
Cache = NewCacheS(cfg, dm, cM, nil)
expErr := utils.ErrNotImplemented
_, err := dm.GetThresholdProfile(context.Background(), utils.CGRateSorg, "TH_1", false, true, utils.NonTransactional)
if err != expErr {
t.Errorf("Expected <%v> , Received <%v>", expErr, err)
}
}
func TestDMCacheDataFromDBResourceProfilesPrefix(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rp := &utils.ResourceProfile{
Tenant: "cgrates.org",
ID: "RL2",
FilterIDs: []string{"fltr_test"},
Weights: utils.DynamicWeights{
{
Weight: 100,
}},
Limit: 2,
ThresholdIDs: []string{"TEST_ACTIONS"},
Blocker: false,
UsageTTL: time.Millisecond,
AllocationMessage: "ALLOC",
}
if err := dm.SetResourceProfile(context.Background(), rp, false); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheResourceProfiles, "cgrates.org:RL2"); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.ResourceProfilesPrefix, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
if rcv, ok := Cache.Get(utils.CacheResourceProfiles, "cgrates.org:RL2"); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, rp) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", rp, rcv)
}
}
func TestDMCacheDataFromDBResourcesPrefix(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rs := &utils.Resource{
Tenant: "cgrates.org",
ID: "ResGroup2",
Usages: map[string]*utils.ResourceUsage{
"RU1": {
Tenant: "cgrates.org",
ID: "RU1",
Units: 9,
},
},
}
if err := dm.SetResource(context.Background(), rs); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheResources, "cgrates.org:ResGroup2"); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.ResourcesPrefix, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
if rcv, ok := Cache.Get(utils.CacheResources, "cgrates.org:ResGroup2"); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, rs) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", rs, rcv)
}
}
func TestDMCacheDataFromDBStatQueueProfilePrefix(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
sQP := &StatQueueProfile{
Tenant: "cgrates.org",
ID: "StatQueueProfile3",
FilterIDs: []string{"fltr_test"},
QueueLength: 10,
TTL: 10 * time.Second,
Metrics: []*MetricWithFilters{
{
MetricID: "*sum#~*req.Usage",
},
},
ThresholdIDs: []string{},
Stored: true,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
MinItems: 1,
}
if err := dm.SetStatQueueProfile(context.Background(), sQP, false); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheStatQueueProfiles, "cgrates.org:StatQueueProfile3"); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.StatQueueProfilePrefix, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
if rcv, ok := Cache.Get(utils.CacheStatQueueProfiles, "cgrates.org:StatQueueProfile3"); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, sQP) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", sQP, rcv)
}
}
func TestDMCacheDataFromDBStatQueuePrefix(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
sq := &StatQueue{
Tenant: "cgrates.org",
ID: "SQ1",
SQItems: []SQItem{
{
EventID: "SqProcessEvent",
},
},
SQMetrics: make(map[string]StatMetric),
}
if err := dm.SetStatQueue(context.Background(), sq); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheStatQueues, "cgrates.org:SQ1"); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.StatQueuePrefix, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
if rcv, ok := Cache.Get(utils.CacheStatQueues, "cgrates.org:SQ1"); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, sq) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", sq, rcv)
}
}
func TestDMCacheDataFromDBThresholdProfilePrefix(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
thP := &ThresholdProfile{
Tenant: "cgrates.org",
ID: "THD_2",
FilterIDs: []string{"*string:~*req.Account:1001"},
ActionProfileIDs: []string{"actPrfID"},
MaxHits: 7,
MinHits: 0,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
Async: true,
}
if err := dm.SetThresholdProfile(context.Background(), thP, false); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheThresholdProfiles, "cgrates.org:THD_2"); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.ThresholdProfilePrefix, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
if rcv, ok := Cache.Get(utils.CacheThresholdProfiles, "cgrates.org:THD_2"); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, thP) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", thP, rcv)
}
}
func TestDMCacheDataFromDBThresholdPrefix(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
th := &Threshold{
Tenant: "cgrates.org",
ID: "TH_3",
Hits: 0,
}
if err := dm.SetThreshold(context.Background(), th); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheThresholds, "cgrates.org:TH_3"); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.ThresholdPrefix, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
if rcv, ok := Cache.Get(utils.CacheThresholds, "cgrates.org:TH_3"); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, th) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", th, rcv)
}
}
func TestDMCacheDataFromDBFilterPrefix(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
fltr := &Filter{
Tenant: cfg.GeneralCfg().DefaultTenant,
ID: "FLTR_CP_2",
Rules: []*FilterRule{
{
Type: utils.MetaString,
Element: "~*req.Charger",
Values: []string{"ChargerProfile2"},
},
},
}
if err := dm.SetFilter(context.Background(), fltr, false); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheFilters, "cgrates.org:FLTR_CP_2"); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.FilterPrefix, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
if rcv, ok := Cache.Get(utils.CacheFilters, "cgrates.org:FLTR_CP_2"); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, fltr) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", fltr, rcv)
}
}
func TestDMCacheDataFromDBRouteProfilePrefix(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
routeProf := &utils.RouteProfile{
Tenant: "cgrates.org",
ID: "RP_1",
FilterIDs: []string{"fltr_test"},
Weights: utils.DynamicWeights{{}},
Sorting: utils.MetaQOS,
SortingParameters: []string{"param"},
Routes: []*utils.Route{{
ID: "RT1",
FilterIDs: []string{"fltr1"},
AccountIDs: []string{"acc1"},
RateProfileIDs: []string{"rp1"},
ResourceIDs: []string{"res1"},
StatIDs: []string{"stat1"},
Weights: utils.DynamicWeights{{}},
Blockers: utils.DynamicBlockers{
{
Blocker: true,
},
},
RouteParameters: "params",
}},
}
if err := dm.SetRouteProfile(context.Background(), routeProf, false); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheRouteProfiles, "cgrates.org:RP_1"); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.RouteProfilePrefix, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
if rcv, ok := Cache.Get(utils.CacheRouteProfiles, "cgrates.org:RP_1"); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, routeProf) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", routeProf, rcv)
}
}
func TestDMCacheDataFromDBChargerProfilePrefix(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
cpp := &utils.ChargerProfile{
Tenant: "cgrates.org",
ID: "CPP_1",
FilterIDs: []string{"FLTR_CP_1"},
RunID: "TestRunID",
AttributeIDs: []string{"*none"},
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
}
if err := dm.SetChargerProfile(context.Background(), cpp, false); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheChargerProfiles, "cgrates.org:CPP_1"); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.ChargerProfilePrefix, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
if rcv, ok := Cache.Get(utils.CacheChargerProfiles, "cgrates.org:CPP_1"); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, cpp) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", cpp, rcv)
}
}
func TestDMCacheDataFromDBRateProfilePrefix(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rpp := &utils.RateProfile{
ID: "RP1",
Tenant: "cgrates.org",
FilterIDs: []string{"*string:~*req.Destination:1234"},
Rates: map[string]*utils.Rate{
"RT1": {
ID: "RT1",
IntervalRates: []*utils.IntervalRate{
{
IntervalStart: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(1, 2),
Unit: utils.NewDecimal(int64(time.Second), 0),
Increment: utils.NewDecimal(int64(time.Second), 0),
},
},
},
},
}
if err := dm.SetRateProfile(context.Background(), rpp, false, false); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheRateProfiles, "cgrates.org:RP1"); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.RateProfilePrefix, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
if rcv, ok := Cache.Get(utils.CacheRateProfiles, "cgrates.org:RP1"); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, rpp) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", rpp, rcv)
}
}
func TestDMCacheDataFromDBActionProfilePrefix(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
ap := &utils.ActionProfile{
Tenant: "cgrates.org",
ID: "ID",
FilterIDs: []string{"fltr1"},
Weights: utils.DynamicWeights{
{
Weight: 65,
},
},
Schedule: "* * * * *",
Targets: map[string]utils.StringSet{utils.MetaAccounts: {"1001": {}}},
Actions: []*utils.APAction{{}},
}
if err := dm.SetActionProfile(context.Background(), ap, false); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheActionProfiles, "cgrates.org:ID"); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.ActionProfilePrefix, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
if rcv, ok := Cache.Get(utils.CacheActionProfiles, "cgrates.org:ID"); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, ap) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", ap, rcv)
}
}
func TestDMCacheDataFromDBAttributeFilterIndexes(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
indexes := map[string]utils.StringSet{"*string:*req.Account:1002": {"ATTR1": {}, "ATTR2": {}}}
if err := dm.SetIndexes(context.Background(), utils.CacheAttributeFilterIndexes, "cgrates.org", indexes, true, utils.NonTransactional); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheAttributeFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.AttributeFilterIndexes, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
exp := utils.StringSet{"ATTR1": {}, "ATTR2": {}}
if rcv, ok := Cache.Get(utils.CacheAttributeFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, exp) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", exp, rcv)
}
}
func TestDMCacheDataFromDBResourceFilterIndexes(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
indexes := map[string]utils.StringSet{"*string:*req.Account:1002": {"ATTR1": {}, "ATTR2": {}}}
if err := dm.SetIndexes(context.Background(), utils.CacheResourceFilterIndexes, "cgrates.org", indexes, true, utils.NonTransactional); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheResourceFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.ResourceFilterIndexes, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
exp := utils.StringSet{"ATTR1": {}, "ATTR2": {}}
if rcv, ok := Cache.Get(utils.CacheResourceFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, exp) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", exp, rcv)
}
}
func TestDMCacheDataFromDBStatFilterIndexes(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
indexes := map[string]utils.StringSet{"*string:*req.Account:1002": {"ATTR1": {}, "ATTR2": {}}}
if err := dm.SetIndexes(context.Background(), utils.CacheStatFilterIndexes, "cgrates.org", indexes, true, utils.NonTransactional); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheStatFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.StatFilterIndexes, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
exp := utils.StringSet{"ATTR1": {}, "ATTR2": {}}
if rcv, ok := Cache.Get(utils.CacheStatFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, exp) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", exp, rcv)
}
}
func TestDMCacheDataFromDBThresholdFilterIndexes(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
indexes := map[string]utils.StringSet{"*string:*req.Account:1002": {"ATTR1": {}, "ATTR2": {}}}
if err := dm.SetIndexes(context.Background(), utils.CacheThresholdFilterIndexes, "cgrates.org", indexes, true, utils.NonTransactional); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheThresholdFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.ThresholdFilterIndexes, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
exp := utils.StringSet{"ATTR1": {}, "ATTR2": {}}
if rcv, ok := Cache.Get(utils.CacheThresholdFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, exp) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", exp, rcv)
}
}
func TestDMCacheDataFromDBRouteFilterIndexes(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
indexes := map[string]utils.StringSet{"*string:*req.Account:1002": {"ATTR1": {}, "ATTR2": {}}}
if err := dm.SetIndexes(context.Background(), utils.CacheRouteFilterIndexes, "cgrates.org", indexes, true, utils.NonTransactional); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheRouteFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.RouteFilterIndexes, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
exp := utils.StringSet{"ATTR1": {}, "ATTR2": {}}
if rcv, ok := Cache.Get(utils.CacheRouteFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, exp) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", exp, rcv)
}
}
func TestDMCacheDataFromDBChargerFilterIndexes(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
indexes := map[string]utils.StringSet{"*string:*req.Account:1002": {"ATTR1": {}, "ATTR2": {}}}
if err := dm.SetIndexes(context.Background(), utils.CacheChargerFilterIndexes, "cgrates.org", indexes, true, utils.NonTransactional); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheChargerFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.ChargerFilterIndexes, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
exp := utils.StringSet{"ATTR1": {}, "ATTR2": {}}
if rcv, ok := Cache.Get(utils.CacheChargerFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, exp) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", exp, rcv)
}
}
func TestDMCacheDataFromDBRateProfilesFilterIndexPrfx(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
indexes := map[string]utils.StringSet{"*string:*req.Account:1002": {"ATTR1": {}, "ATTR2": {}}}
if err := dm.SetIndexes(context.Background(), utils.CacheRateProfilesFilterIndexes, "cgrates.org", indexes, true, utils.NonTransactional); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheRateProfilesFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.RateProfilesFilterIndexPrfx, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
exp := utils.StringSet{"ATTR1": {}, "ATTR2": {}}
if rcv, ok := Cache.Get(utils.CacheRateProfilesFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, exp) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", exp, rcv)
}
}
func TestDMCacheDataFromDBRateFilterIndexPrfx(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
indexes := map[string]utils.StringSet{"*string:*req.Account:1002": {"ATTR1": {}, "ATTR2": {}}}
if err := dm.SetIndexes(context.Background(), utils.CacheRateFilterIndexes, "cgrates.org", indexes, true, utils.NonTransactional); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheRateFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.RateFilterIndexPrfx, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
exp := utils.StringSet{"ATTR1": {}, "ATTR2": {}}
if rcv, ok := Cache.Get(utils.CacheRateFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, exp) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", exp, rcv)
}
}
func TestDMCacheDataFromDBActionProfilesFilterIndexPrfx(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
indexes := map[string]utils.StringSet{"*string:*req.Account:1002": {"ATTR1": {}, "ATTR2": {}}}
if err := dm.SetIndexes(context.Background(), utils.CacheActionProfilesFilterIndexes, "cgrates.org", indexes, true, utils.NonTransactional); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheActionProfilesFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.ActionProfilesFilterIndexPrfx, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
exp := utils.StringSet{"ATTR1": {}, "ATTR2": {}}
if rcv, ok := Cache.Get(utils.CacheActionProfilesFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, exp) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", exp, rcv)
}
}
func TestDMCacheDataFromDBFilterIndexPrfx(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
indexes := map[string]utils.StringSet{"*string:*req.Account:1002": {"ATTR1": {}, "ATTR2": {}}}
if err := dm.SetIndexes(context.Background(), utils.CacheReverseFilterIndexes, "cgrates.org", indexes, true, utils.NonTransactional); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheReverseFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.FilterIndexPrfx, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
exp := utils.StringSet{"ATTR1": {}, "ATTR2": {}}
if rcv, ok := Cache.Get(utils.CacheReverseFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, exp) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", exp, rcv)
}
}
func TestDMCacheDataFromDBAttributeFilterIndexErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
errExp := "WRONG_IDX_KEY_FORMAT<tntCtx:*prefix:~*accounts>"
if err := dm.CacheDataFromDB(context.Background(), utils.AttributeFilterIndexes, []string{"tntCtx:*prefix:~*accounts"}, false); errExp != err.Error() {
t.Errorf("Expected %v\n but received %v", errExp, err)
}
}
func TestDMCacheDataFromDBResourceFilterIndexErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
errExp := "WRONG_IDX_KEY_FORMAT<tntCtx:*prefix:~*accounts>"
if err := dm.CacheDataFromDB(context.Background(), utils.ResourceFilterIndexes, []string{"tntCtx:*prefix:~*accounts"}, false); errExp != err.Error() {
t.Errorf("Expected %v\n but received %v", errExp, err)
}
}
func TestDMCacheDataFromDBStatFilterIndexErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
errExp := "WRONG_IDX_KEY_FORMAT<tntCtx:*prefix:~*accounts>"
if err := dm.CacheDataFromDB(context.Background(), utils.StatFilterIndexes, []string{"tntCtx:*prefix:~*accounts"}, false); errExp != err.Error() {
t.Errorf("Expected %v\n but received %v", errExp, err)
}
}
func TestDMCacheDataFromDBThresholdFilterIndexesErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
errExp := "WRONG_IDX_KEY_FORMAT<tntCtx:*prefix:~*accounts>"
if err := dm.CacheDataFromDB(context.Background(), utils.ThresholdFilterIndexes, []string{"tntCtx:*prefix:~*accounts"}, false); errExp != err.Error() {
t.Errorf("Expected %v\n but received %v", errExp, err)
}
}
func TestDMCacheDataFromDBRouteFilterIndexesErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
errExp := "WRONG_IDX_KEY_FORMAT<tntCtx:*prefix:~*accounts>"
if err := dm.CacheDataFromDB(context.Background(), utils.RouteFilterIndexes, []string{"tntCtx:*prefix:~*accounts"}, false); errExp != err.Error() {
t.Errorf("Expected %v\n but received %v", errExp, err)
}
}
func TestDMCacheDataFromDBChargerFilterIndexesErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
errExp := "WRONG_IDX_KEY_FORMAT<tntCtx:*prefix:~*accounts>"
if err := dm.CacheDataFromDB(context.Background(), utils.ChargerFilterIndexes, []string{"tntCtx:*prefix:~*accounts"}, false); errExp != err.Error() {
t.Errorf("Expected %v\n but received %v", errExp, err)
}
}
func TestDMCacheDataFromDBRateProfilesFilterIndexPrfxErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
errExp := "WRONG_IDX_KEY_FORMAT<tntCtx:*prefix:~*accounts>"
if err := dm.CacheDataFromDB(context.Background(), utils.RateProfilesFilterIndexPrfx, []string{"tntCtx:*prefix:~*accounts"}, false); errExp != err.Error() {
t.Errorf("Expected %v\n but received %v", errExp, err)
}
}
func TestDMCacheDataFromDBRateFilterIndexPrfxErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
errExp := "WRONG_IDX_KEY_FORMAT<tntCtx:*prefix:~*accounts>"
if err := dm.CacheDataFromDB(context.Background(), utils.RateFilterIndexPrfx, []string{"tntCtx:*prefix:~*accounts"}, false); errExp != err.Error() {
t.Errorf("Expected %v\n but received %v", errExp, err)
}
}
func TestDMCacheDataFromDBActionProfilesFilterIndexPrfxErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
errExp := "WRONG_IDX_KEY_FORMAT<tntCtx:*prefix:~*accounts>"
if err := dm.CacheDataFromDB(context.Background(), utils.ActionProfilesFilterIndexPrfx, []string{"tntCtx:*prefix:~*accounts"}, false); errExp != err.Error() {
t.Errorf("Expected %v\n but received %v", errExp, err)
}
}
func TestDMGetAccountNil(t *testing.T) {
var dm *DataManager
expErr := utils.ErrNoDatabaseConn
if _, err := dm.GetAccount(context.Background(), utils.CGRateSorg, "1002"); err != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDMGetAccountReplicate(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaAccounts].Remote = true
cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg)}
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1GetAccount: func(ctx *context.Context, args, reply any) error {
return nil
},
},
}
rpcInternal := make(chan birpc.ClientConnector, 1)
rpcInternal <- cc
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, rpcInternal)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
ap := &utils.Account{
Tenant: "cgrates.org",
ID: "1002",
Weights: []*utils.DynamicWeight{
{
Weight: 0,
},
},
FilterIDs: []string{"*stirng:~*req.Account:1001"},
Balances: map[string]*utils.Balance{
"AbstractBalance1": {
ID: "AbstractBalance1",
Weights: utils.DynamicWeights{
{
Weight: 25,
},
},
Type: utils.MetaAbstract,
Units: utils.NewDecimal(int64(40*time.Second), 0),
CostIncrements: []*utils.CostIncrement{
{
Increment: utils.NewDecimal(int64(time.Second), 0),
FixedFee: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(0, 0),
},
},
},
},
Blockers: utils.DynamicBlockers{
{
FilterIDs: []string{"fltrID"},
Blocker: true,
},
},
Opts: make(map[string]any),
ThresholdIDs: []string{utils.MetaNone},
}
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetAccountDrvF: func(ctx *context.Context, str1, str2 string) (*utils.Account, error) {
return ap, utils.ErrNotFound
},
SetAccountDrvF: func(ctx *context.Context, profile *utils.Account) error {
return nil
},
}
// tests replicate
if rcv, err := dm.GetAccount(context.Background(), utils.CGRateSorg, "1002"); err != nil {
t.Error(err, rcv)
} else if rcv != ap {
t.Errorf("Expected <%v>, received <%v>", ap, rcv)
}
}
func TestDMGetRateProfileRatesNil(t *testing.T) {
var dm *DataManager
expErr := utils.ErrNoDatabaseConn
if _, _, err := dm.GetRateProfileRates(context.Background(), &utils.ArgsSubItemIDs{}, false); err != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDMGetRateProfileRatesOK(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rps := &utils.RateProfile{
ID: "test_ID1",
Tenant: "cgrates.org",
FilterIDs: []string{"*string:~*req.Destination:1234"},
Rates: map[string]*utils.Rate{
"RT1": {
ID: "RT1",
IntervalRates: []*utils.IntervalRate{
{
IntervalStart: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(1, 2),
Unit: utils.NewDecimal(int64(time.Second), 0),
Increment: utils.NewDecimal(int64(time.Second), 0),
},
},
},
},
}
dm.DataDB()[utils.MetaDefault].SetRateProfileDrv(context.Background(), rps, true)
args := &utils.ArgsSubItemIDs{
Tenant: "cgrates.org",
ProfileID: "test_ID1",
ItemsPrefix: "RT1",
}
exp := []*utils.Rate{
{
ID: "RT1",
IntervalRates: []*utils.IntervalRate{
{
IntervalStart: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(1, 2),
Unit: utils.NewDecimal(int64(time.Second), 0),
Increment: utils.NewDecimal(int64(time.Second), 0),
},
},
},
}
if _, rcv, err := dm.GetRateProfileRates(context.Background(), args, false); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(utils.ToJSON(exp), utils.ToJSON(rcv)) {
t.Errorf("Expected \n<%+v>,\nreceived \n<%+v>", exp, rcv)
}
}
func TestDMSetLoadIDsNil(t *testing.T) {
var dm *DataManager
expErr := utils.ErrNoDatabaseConn
if err := dm.SetLoadIDs(context.Background(), map[string]int64{}); err != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDMSetLoadIDsDrvErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
SetLoadIDsDrvF: func(ctx *context.Context, loadIDs map[string]int64) error { return utils.ErrNotImplemented },
}
itmLIDs := map[string]int64{
"ID_1": 21,
}
expErr := utils.ErrNotImplemented
if err := dm.SetLoadIDs(context.Background(), itmLIDs); err != expErr {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDMSetLoadIDsReplicate(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaLoadIDs].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
itmLIDs := map[string]int64{
"ID_1": 21,
}
// tests Replicate
dm.SetLoadIDs(context.Background(), itmLIDs)
}
func TestDMCheckFiltersErrBadReference(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
dm := NewDataManager(&DBConnManager{dataDBs: map[string]DataDB{utils.MetaDefault: &DataDBMock{}}}, cfg, nil)
expErr := "broken reference to filter: <*string:~*req.Account>"
if err := dm.checkFilters(context.Background(), utils.CGRateSorg, []string{"*string:~*req.Account"}); expErr != err.Error() {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDMCheckFiltersErrBadPath(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
dm := NewDataManager(&DBConnManager{dataDBs: map[string]DataDB{utils.MetaDefault: &DataDBMock{}}}, cfg, nil)
expErr := `Path is missing for filter <{"Tenant":"cgrates.org","ID":"*string:~missing path:chp1","Rules":[{"Type":"*string","Element":"~missing path","Values":["chp1"]}]}>`
if err := dm.checkFilters(context.Background(), utils.CGRateSorg, []string{"*string:~missing path:chp1"}); expErr != err.Error() {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDMCheckFiltersErrBrokenReferenceCache(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
var val any
if err := Cache.Set(context.Background(), utils.CacheFilters, utils.ConcatenatedKey(utils.CGRateSorg, "fltr1"), val, []string{}, true, utils.NonTransactional); err != nil {
t.Error(err)
}
expErr := `broken reference to filter: <fltr1>`
if err := dm.checkFilters(context.Background(), utils.CGRateSorg, []string{"fltr1"}); expErr != err.Error() {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestDMCheckFiltersErrCall(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaFilters].Remote = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
HasDataDrvF: func(ctx *context.Context, category, subject, tenant string) (bool, error) {
return false, utils.ErrNotFound
},
}
expErr := `broken reference to filter: <fltr1>`
if err := dm.checkFilters(context.Background(), utils.CGRateSorg, []string{"fltr1"}); expErr != err.Error() {
t.Errorf("Expected error <%v>, Received error <%v>", expErr, err)
}
}
func TestGetAPIBanErrSingleCacheWrite(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.APIBanCfg().Keys = []string{"testKey"}
cfg.CacheCfg().Partitions[utils.MetaAPIBan].Replicate = true
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
var counter int
testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Method != "GET" {
w.WriteHeader(http.StatusMethodNotAllowed)
return
}
responses := map[string]struct {
code int
body []byte
}{
"/testKey/check/1.2.3.251": {code: http.StatusOK, body: []byte(`{"ipaddress":["1.2.3.251"], "ID":"987654321"}`)},
}
if val, has := responses[r.URL.EscapedPath()]; has {
w.WriteHeader(val.code)
if val.body != nil {
w.Write(val.body)
}
return
}
counter++
w.WriteHeader(http.StatusOK)
if counter < 2 {
_, _ = w.Write([]byte(`{"ipaddress": ["1.2.3.251", "ID": "100"}`))
} else {
_, _ = w.Write([]byte(`{"ID": "none"}`))
counter = 0
}
}))
defer testServer.Close()
baningo.RootURL = testServer.URL + "/"
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error {
return utils.ErrNotImplemented
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
Cache = NewCacheS(cfg, dm, cM, nil)
if _, err := GetAPIBan(context.Background(), "1.2.3.251", []string{"testKey"}, true, false, true); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, Received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestGetAPIBanErrMultipleCacheWrite(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.APIBanCfg().Keys = []string{"testKey"}
cfg.CacheCfg().Partitions[utils.MetaAPIBan].Replicate = true
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
var counter int
testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Method != "GET" {
w.WriteHeader(http.StatusMethodNotAllowed)
return
}
responses := map[string]struct {
code int
body []byte
}{
"/testKey/check/1.2.3.251": {code: http.StatusOK, body: []byte(`{"ipaddress":["1.2.3.251"], "ID":"987654321"}`)},
}
if val, has := responses[r.URL.EscapedPath()]; has {
w.WriteHeader(val.code)
if val.body != nil {
w.Write(val.body)
}
return
}
counter++
w.WriteHeader(http.StatusOK)
if counter < 2 {
_, _ = w.Write([]byte(`{"ipaddress": ["1.2.3.251", "1.2.3.252"], "ID": "100"}`))
} else {
_, _ = w.Write([]byte(`{"ID": "none"}`))
counter = 0
}
}))
defer testServer.Close()
baningo.RootURL = testServer.URL + "/"
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error {
return utils.ErrNotImplemented
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
Cache = NewCacheS(cfg, dm, cM, nil)
if _, err := GetAPIBan(context.Background(), "1.2.3.251", []string{"testKey"}, false, false, true); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, Received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestGetAPIBanErrNoBanCacheSet(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.APIBanCfg().Keys = []string{"testKey"}
cfg.CacheCfg().Partitions[utils.MetaAPIBan].Replicate = true
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
var counter int
testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Method != "GET" {
w.WriteHeader(http.StatusMethodNotAllowed)
return
}
responses := map[string]struct {
code int
body []byte
}{
"/testKey/check/1.2.3.251": {code: http.StatusOK, body: []byte(`{"ipaddress":["1.2.3.251"], "ID":"987654321"}`)},
"/testKey/check/1.2.3.254": {code: http.StatusBadRequest, body: []byte(`{"ipaddress":["not blocked"], "ID":"none"}`)},
}
if val, has := responses[r.URL.EscapedPath()]; has {
w.WriteHeader(val.code)
if val.body != nil {
w.Write(val.body)
}
return
}
counter++
w.WriteHeader(http.StatusOK)
if counter < 2 {
_, _ = w.Write([]byte(`{"ipaddress": ["1.2.3.251", "1.2.3.252"], "ID": "100"}`))
} else {
_, _ = w.Write([]byte(`{"ID": "none"}`))
counter = 0
}
}))
defer testServer.Close()
baningo.RootURL = testServer.URL + "/"
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error {
return utils.ErrNotImplemented
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
Cache = NewCacheS(cfg, dm, cM, nil)
if _, err := GetAPIBan(context.Background(), "1.2.3.254", []string{}, false, false, true); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, Received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveIndexesErrNilDm(t *testing.T) {
var dm *DataManager
if err := dm.RemoveIndexes(context.Background(), "indxItmtype", "cgrates.org", "indxkey"); err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMRemoveIndexesErrDrv(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
RemoveIndexesDrvF: func(ctx *context.Context, idxItmType, tntCtx, idxKey string) error {
return utils.ErrNotImplemented
},
}
if err := dm.RemoveIndexes(context.Background(), "*ip_filter_indexes", "cgrates.org", "indxkey"); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveIndexesReplicate(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.CacheAttributeFilterIndexes].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
indexes := map[string]utils.StringSet{"*string:*req.Account:1002": {"ATTR1": {}, "ATTR2": {}}}
if err := dm.dbConns.dataDBs[utils.MetaDefault].SetIndexesDrv(context.Background(), utils.CacheAttributeFilterIndexes, "cgrates.org", indexes, true, utils.NonTransactional); err != nil {
t.Error(err)
}
_, err := dm.dbConns.dataDBs[utils.MetaDefault].GetIndexesDrv(context.Background(), utils.CacheAttributeFilterIndexes, "cgrates.org", utils.EmptyString, utils.NonTransactional)
if err != nil {
t.Error(err)
}
if err := dm.RemoveIndexes(context.Background(), utils.CacheAttributeFilterIndexes, "cgrates.org", utils.EmptyString); err != nil {
t.Errorf("Expected error <%v>, received error <%v>", nil, err)
}
_, err = dm.dbConns.dataDBs[utils.MetaDefault].GetIndexesDrv(context.Background(), utils.CacheAttributeFilterIndexes, "cgrates.org", utils.EmptyString, utils.NonTransactional)
if err != utils.ErrNotFound {
t.Error(err)
}
}
func TestDMSetIndexesErrNilDm(t *testing.T) {
var dm *DataManager
indexes := map[string]utils.StringSet{"*string:*req.Account:1002": {"ATTR1": {}, "ATTR2": {}}}
if err := dm.SetIndexes(context.Background(), utils.CacheAttributeFilterIndexes, utils.CGRateSorg, indexes, true, utils.NonTransactional); err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMSetIndexesReplicate(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.CacheAttributeFilterIndexes].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1SetIndexes: func(ctx *context.Context, args, reply any) error {
return nil
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
indexes := map[string]utils.StringSet{"*string:*req.Account:1002": {"ATTR1": {}, "ATTR2": {}}}
if err := dm.SetIndexes(context.Background(), utils.CacheAttributeFilterIndexes, utils.CGRateSorg, indexes, true, utils.NonTransactional); err != nil {
t.Errorf("Expected error <%v>, received error <%v>", nil, err)
}
if _, err := dm.GetIndexes(context.Background(), utils.CacheAttributeFilterIndexes, utils.CGRateSorg, utils.EmptyString, utils.NonTransactional, true, false); err != nil {
t.Error(err)
}
}
func TestDMGetIndexesErrSetIdxDrv(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.CacheAttributeFilterIndexes].Remote = true
cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1GetIndexes: func(ctx *context.Context, args, reply any) error {
return nil
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, cc)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
indexes2 := map[string]utils.StringSet{"*string:*req.Account:1002": {"ATTR1": {}, "ATTR2": {}}}
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetIndexesDrvF: func(ctx *context.Context, idxItmType, tntCtx, idxKey, transactionID string) (indexes map[string]utils.StringSet, err error) {
return indexes2, utils.ErrNotFound
},
SetIndexesDrvF: func(ctx *context.Context, idxItmType, tntCtx string, indexes map[string]utils.StringSet, commit bool, transactionID string) (err error) {
return utils.ErrNotFound
},
}
if _, err := dm.GetIndexes(context.Background(), utils.CacheAttributeFilterIndexes, utils.CGRateSorg, "idxKey", utils.NonTransactional, false, true); err != utils.ErrNotFound {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotFound, err)
}
}
func TestDMGetIndexesErrCacheSet(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().Partitions[utils.CacheAttributeFilterIndexes].Replicate = true
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error {
return utils.ErrNotImplemented
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
Cache = NewCacheS(cfg, dm, cM, nil)
if _, err := dm.GetIndexes(context.Background(), utils.CacheAttributeFilterIndexes, utils.CGRateSorg, "idxKey", utils.NonTransactional, false, true); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetIndexesErrCacheWriteSet(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().Partitions[utils.CacheAttributeFilterIndexes].Replicate = true
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error {
return utils.ErrNotImplemented
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
Cache = NewCacheS(cfg, dm, cM, nil)
indexes := map[string]utils.StringSet{"*string:*req.Account:1002": {"ATTR1": {}, "ATTR2": {}}}
if err := dm.SetIndexes(context.Background(), utils.CacheAttributeFilterIndexes, utils.CGRateSorg, indexes, true, utils.NonTransactional); err != nil {
t.Error(err)
}
if _, err := dm.GetIndexes(context.Background(), utils.CacheAttributeFilterIndexes, utils.CGRateSorg, utils.EmptyString, utils.NonTransactional, false, true); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveActionProfileErrNilDM(t *testing.T) {
var dm *DataManager
if err := dm.RemoveActionProfile(context.Background(), "cgrates.org", "AP1", false); err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMRemoveActionProfileErrGetActionProf(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetActionProfileDrvF: func(ctx *context.Context, tenant, ID string) (*utils.ActionProfile, error) {
return nil, utils.ErrNotImplemented
},
}
if err := dm.RemoveActionProfile(context.Background(), "cgrates.org", "AP1", false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveActionProfileErrRemvProfDrv(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
ap := &utils.ActionProfile{
Tenant: "cgrates.org",
ID: "AP1",
FilterIDs: []string{"fltr1"},
Weights: utils.DynamicWeights{
{
Weight: 65,
},
},
Schedule: "* * * * *",
Targets: map[string]utils.StringSet{utils.MetaAccounts: {"1001": {}}},
Actions: []*utils.APAction{{}},
}
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetActionProfileDrvF: func(ctx *context.Context, tenant, ID string) (*utils.ActionProfile, error) {
return ap, nil
},
RemoveActionProfileDrvF: func(ctx *context.Context, tenant, ID string) error {
return utils.ErrNotImplemented
},
}
if err := dm.RemoveActionProfile(context.Background(), "cgrates.org", "AP1", false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMCacheDataFromDBPrefixKeysErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetKeysForPrefixF: func(ctx *context.Context, s string) ([]string, error) { return []string{}, utils.ErrNotImplemented },
}
if err := dm.CacheDataFromDB(context.Background(), utils.FilterIndexPrfx, []string{utils.MetaAny}, false); err.Error() != utils.ErrNotImplemented.Error() {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetFilterCacheReadGetErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := Cache.Set(context.Background(), utils.CacheFilters, utils.ConcatenatedKey(utils.CGRateSorg, "fltr_for_prf"), nil, []string{}, true, utils.NonTransactional); err != nil {
t.Error(err)
}
if _, err := dm.GetFilter(context.Background(), "cgrates.org", "fltr_for_prf", true, false, utils.GenUUID()); err != utils.ErrNotFound {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotFound, err)
}
}
func TestDMGetFilterNilDMErr(t *testing.T) {
var dm *DataManager
if _, err := dm.GetFilter(context.Background(), "cgrates.org", "fltr_for_prf", false, false, utils.GenUUID()); err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMGetThresholdSetThPrflDrvErr(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaThresholdProfiles].Remote = true
cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1GetThresholdProfile: func(ctx *context.Context, args, reply any) error { return nil },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, cc)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
th := &ThresholdProfile{
Tenant: "cgrates.org",
ID: "THD_100",
FilterIDs: []string{"*string:~*req.Account:1001"},
ActionProfileIDs: []string{"actPrfID"},
MaxHits: 7,
MinHits: 0,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
Async: true,
}
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) {
return th, utils.ErrNotFound
},
}
if _, err := dm.GetThresholdProfile(context.Background(), "cgrates.org", "THD_100", false, false, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetThresholdProfileNilDM(t *testing.T) {
var dm *DataManager
th := &ThresholdProfile{
Tenant: "cgrates.org",
ID: "THD_100",
FilterIDs: []string{"*string:~*req.Account:1001"},
ActionProfileIDs: []string{"actPrfID"},
MaxHits: 7,
MinHits: 0,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
Async: true,
}
if err := dm.SetThresholdProfile(context.Background(), th, false); err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMSetThresholdProfileWithIndexErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
th := &ThresholdProfile{
Tenant: "cgrates.org",
ID: "THD_100",
FilterIDs: []string{"*string*req.Account1001"},
ActionProfileIDs: []string{"actPrfID"},
MaxHits: 7,
MinHits: 0,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
Async: true,
}
expErr := "broken reference to filter: <*string*req.Account1001> for item with ID: cgrates.org:THD_100"
if err := dm.SetThresholdProfile(context.Background(), th, true); err.Error() != expErr {
t.Errorf("Expected error <%v>, received error <%v>", expErr, err)
}
}
func TestDMSetThresholdProfileGetThPrfErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) {
return nil, utils.ErrNotImplemented
},
}
th := &ThresholdProfile{
Tenant: "cgrates.org",
ID: "THD_100",
FilterIDs: []string{"*string:~*req.Account:1001"},
ActionProfileIDs: []string{"actPrfID"},
MaxHits: 7,
MinHits: 0,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
Async: true,
}
if err := dm.SetThresholdProfile(context.Background(), th, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetThresholdProfileSetThPrflDrvErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
th := &ThresholdProfile{
Tenant: "cgrates.org",
ID: "THD_100",
FilterIDs: []string{"*string:~*req.Account:1001"},
ActionProfileIDs: []string{"actPrfID"},
MaxHits: 7,
MinHits: 0,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
Async: true,
}
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) {
return th, nil
},
SetThresholdProfileDrvF: func(ctx *context.Context, tp *ThresholdProfile) (err error) { return utils.ErrNotFound },
}
if err := dm.SetThresholdProfile(context.Background(), th, false); err != utils.ErrNotFound {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotFound, err)
}
}
func TestDMSetThresholdProfileUpdatedIndexesErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetThresholdProfileDrvF: func(ctx *context.Context, tenant, id string) (tp *ThresholdProfile, err error) {
return &ThresholdProfile{
Tenant: utils.CGRateSorg,
}, nil
},
SetThresholdProfileDrvF: func(ctx *context.Context, tp *ThresholdProfile) (err error) { return nil },
}
th := &ThresholdProfile{
Tenant: "cgrates.org",
ID: "THD_100",
FilterIDs: []string{"*string:~*req.Account:1001"},
ActionProfileIDs: []string{"actPrfID"},
MaxHits: 7,
MinHits: 0,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
Async: true,
}
if err := dm.SetThresholdProfile(context.Background(), th, true); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetThresholdProfileReplicateErr(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaThresholdProfiles].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1SetThresholdProfile: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
th := &ThresholdProfile{
Tenant: "cgrates.org",
ID: "THD_100",
FilterIDs: []string{"*string:~*req.Account:1001"},
ActionProfileIDs: []string{"actPrfID"},
MaxHits: 7,
MinHits: 0,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
Async: true,
}
if err := dm.SetThresholdProfile(context.Background(), th, true); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetStatQueueCacheGetErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := Cache.Set(context.Background(), utils.CacheStatQueues, utils.ConcatenatedKey(utils.CGRateSorg, "SQ1"), nil, []string{}, true, utils.NonTransactional); err != nil {
t.Error(err)
}
_, err := dm.GetStatQueue(context.Background(), utils.CGRateSorg, "SQ1", true, false, utils.NonTransactional)
if err != utils.ErrNotFound {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotFound, err)
}
}
func TestDMGetStatQueueNewStoredStatQueueErr(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaStatQueues].Remote = true
cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg)}
config.SetCgrConfig(cfg)
stq := &StatQueue{
Tenant: "cgrates.org",
ID: "sq01",
SQMetrics: map[string]StatMetric{
"key": statMetricMock(""),
},
SQItems: []SQItem{
{
EventID: "SqProcessEvent",
},
},
}
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1GetStatQueue: func(ctx *context.Context, args, reply any) error {
return nil
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetStatQueueDrvF: func(ctx *context.Context, tenant, id string) (sq *StatQueue, err error) {
return stq, utils.ErrNotFound
},
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
experr := "marshal mock error"
dm.ms = mockMarshal(experr)
if _, err := dm.GetStatQueue(context.Background(), utils.CGRateSorg, "sq01", false, false, utils.NonTransactional); err == nil || err.Error() != experr {
t.Errorf("Expected error <%v>, received error <%v>", experr, err)
}
}
func TestDMGetStatQueueSetStatQueueDrvErr(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaStatQueues].Remote = true
cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg)}
config.SetCgrConfig(cfg)
stq := &StatQueue{
Tenant: "cgrates.org",
ID: "sq01",
SQItems: []SQItem{
{
EventID: "SqProcessEvent",
},
},
SQMetrics: make(map[string]StatMetric),
}
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1GetStatQueue: func(ctx *context.Context, args, reply any) error {
return nil
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetStatQueueDrvF: func(ctx *context.Context, tenant, id string) (sq *StatQueue, err error) {
return stq, utils.ErrNotFound
},
SetStatQueueDrvF: func(ctx *context.Context, ssq *StoredStatQueue, sq *StatQueue) error { return utils.ErrNotImplemented },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if _, err := dm.GetStatQueue(context.Background(), utils.CGRateSorg, "sq01", false, false, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetStatQueueCacheWriteErr(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheStatQueues].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
ssq := &StoredStatQueue{
Tenant: "cgrates.org",
ID: "ssq01",
SQItems: []SQItem{
{
EventID: "testEventID",
},
},
SQMetrics: map[string][]byte{
utils.MetaTCD: []byte(""),
},
Compressed: true,
}
sq := &StatQueue{
Tenant: "cgrates.org",
ID: "sq01",
SQItems: []SQItem{
{
EventID: "SqProcessEvent",
},
},
SQMetrics: make(map[string]StatMetric),
}
if err := dm.DataDB()[utils.MetaDefault].SetStatQueueDrv(context.Background(), ssq, sq); err != nil {
t.Error(err)
}
Cache = NewCacheS(cfg, dm, cM, nil)
if _, err := dm.GetStatQueue(context.Background(), utils.CGRateSorg, "sq01", false, true, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Errorf("Expected %v\n but received %v", utils.ErrNotImplemented, err)
}
}
func TestDMCacheDataFromDBAccountFilterIndexPrfx(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
indexes := map[string]utils.StringSet{"*string:*req.Account:1002": {"ATTR1": {}, "ATTR2": {}}}
if err := dm.SetIndexes(context.Background(), utils.CacheAccountsFilterIndexes, "cgrates.org", indexes, true, utils.NonTransactional); err != nil {
t.Error(err)
}
if _, ok := Cache.Get(utils.CacheAccountsFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); ok {
t.Error("expected ok to be false")
}
if err := dm.CacheDataFromDB(context.Background(), utils.AccountFilterIndexPrfx, []string{utils.MetaAny}, false); err != nil {
t.Error(err)
}
exp := utils.StringSet{"ATTR1": {}, "ATTR2": {}}
if rcv, ok := Cache.Get(utils.CacheAccountsFilterIndexes, utils.ConcatenatedKey("cgrates.org", "*string:*req.Account:1002")); !ok {
t.Error("expected ok to be true")
} else if !reflect.DeepEqual(rcv, exp) {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", exp, rcv)
}
}
func TestDMCacheDataFromDBAccountFilterIndexPrfxErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
errExp := "WRONG_IDX_KEY_FORMAT<tntCtx:*prefix:~*accounts>"
if err := dm.CacheDataFromDB(context.Background(), utils.AccountFilterIndexPrfx, []string{"tntCtx:*prefix:~*accounts"}, false); errExp != err.Error() {
t.Errorf("Expected %v\n but received %v", errExp, err)
}
}
func TestDMSetStatQueueProfileNilDm(t *testing.T) {
var dm *DataManager
sqp := &StatQueueProfile{}
if err := dm.SetStatQueueProfile(context.Background(), sqp, false); err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMSetStatQueueProfileCheckFiltrsErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
sqp := &StatQueueProfile{
Tenant: "cgrates.org",
ID: "sqp001",
FilterIDs: []string{":::"},
QueueLength: 10,
TTL: 10 * time.Second,
Metrics: []*MetricWithFilters{
{
MetricID: "*sum#~*req.Usage",
},
},
ThresholdIDs: []string{},
Stored: true,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
MinItems: 1,
}
expErr := "broken reference to filter: <:::> for item with ID: cgrates.org:sqp001"
if err := dm.SetStatQueueProfile(context.Background(), sqp, true); err == nil || err.Error() != expErr {
t.Errorf("Expected error <%v>, received error <%v>", expErr, err)
}
}
func TestDMSetStatQueueProfileGetStatQProflErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
sqp := &StatQueueProfile{
Tenant: "cgrates.org",
ID: "sqp002",
FilterIDs: []string{"*string:~*req.Account:1001"},
QueueLength: 10,
TTL: 10 * time.Second,
Metrics: []*MetricWithFilters{
{
MetricID: "*sum#~*req.Usage",
},
},
ThresholdIDs: []string{},
Stored: true,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
MinItems: 1,
}
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetStatQueueProfileDrvF: func(ctx *context.Context, tenant, id string) (sq *StatQueueProfile, err error) {
return sqp, utils.ErrNotImplemented
},
}
expErr := utils.ErrNotImplemented
if err := dm.SetStatQueueProfile(context.Background(), sqp, false); err != expErr {
t.Errorf("Expected error <%v>, received error <%v>", expErr, err)
}
}
func TestDMSetStatQueueProfileSetStatQPrflDrvErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
sqp := &StatQueueProfile{
Tenant: "cgrates.org",
ID: "sqp003",
FilterIDs: []string{"*string:~*req.Account:1001"},
QueueLength: 10,
TTL: 10 * time.Second,
Metrics: []*MetricWithFilters{
{
MetricID: "*sum#~*req.Usage",
},
},
ThresholdIDs: []string{},
Stored: true,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
MinItems: 1,
}
dm.dbConns.dataDBs[utils.MetaDefault] = &DataDBMock{
GetStatQueueProfileDrvF: func(ctx *context.Context, tenant, id string) (sq *StatQueueProfile, err error) { return sqp, nil },
SetStatQueueProfileDrvF: func(ctx *context.Context, sq *StatQueueProfile) (err error) { return utils.ErrNotImplemented },
}
expErr := utils.ErrNotImplemented
if err := dm.SetStatQueueProfile(context.Background(), sqp, false); err != expErr {
t.Errorf("Expected error <%v>, received error <%v>", expErr, err)
}
}
func TestDMGetResourceCacheGetErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := Cache.Set(context.Background(), utils.CacheResources, utils.ConcatenatedKey(utils.CGRateSorg, "rsrc1"), nil, []string{}, true, utils.NonTransactional); err != nil {
t.Error(err)
}
_, err := dm.GetResource(context.Background(), utils.CGRateSorg, "rsrc1", true, false, utils.NonTransactional)
if err != utils.ErrNotFound {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotFound, err)
}
}
func TestDMGetResourceNilDmErr(t *testing.T) {
var dm *DataManager
_, err := dm.GetResource(context.Background(), utils.CGRateSorg, "rsrc1", false, false, utils.NonTransactional)
if err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMGetResourceSetResourceDrvErr(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaResources].Remote = true
cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1GetResource: func(ctx *context.Context, args, reply any) error {
return nil
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetResourceDrvF: func(ctx *context.Context, tenant, id string) (*utils.Resource, error) {
return &utils.Resource{}, utils.ErrNotFound
},
SetResourceDrvF: func(ctx *context.Context, r *utils.Resource) error { return utils.ErrNotImplemented },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if _, err := dm.GetResource(context.Background(), utils.CGRateSorg, "ResGroup2", false, false, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetResourceCacheWriteErr1(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheResources].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
Cache = NewCacheS(cfg, dm, cM, nil)
if _, err := dm.GetResource(context.Background(), utils.CGRateSorg, "ResGroup2", false, true, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetResourceCacheWriteErr2(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheResources].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rs := &utils.Resource{
Tenant: "cgrates.org",
ID: "ResGroup2",
Usages: map[string]*utils.ResourceUsage{
"RU1": {
Tenant: "cgrates.org",
ID: "RU1",
Units: 9,
},
},
}
if err := dm.dbConns.dataDBs[utils.MetaDefault].SetResourceDrv(context.Background(), rs); err != nil {
t.Error(err)
}
Cache = NewCacheS(cfg, dm, cM, nil)
if _, err := dm.GetResource(context.Background(), utils.CGRateSorg, "ResGroup2", false, true, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetResourceSetResourceDrvErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
SetResourceDrvF: func(ctx *context.Context, r *utils.Resource) error { return utils.ErrNotImplemented },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rs := &utils.Resource{
Tenant: "cgrates.org",
ID: "ResGroup2",
Usages: map[string]*utils.ResourceUsage{
"RU1": {
Tenant: "cgrates.org",
ID: "RU1",
Units: 9,
},
},
}
if err := dm.SetResource(context.Background(), rs); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetResourceNilDmErr(t *testing.T) {
var dm *DataManager
if err := dm.RemoveResource(context.Background(), "cgrates.org", "ResGroup2"); err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMRemoveResourceRemoveResourceDrvErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
RemoveResourceDrvF: func(ctx *context.Context, tnt, id string) error { return utils.ErrNotImplemented },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := dm.RemoveResource(context.Background(), "cgrates.org", "ResGroup2"); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveResourceReplicateErr(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaResources].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1RemoveResource: func(ctx *context.Context, args, reply any) error {
return nil
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
// test replicate
if err := dm.RemoveResource(context.Background(), "cgrates.org", "ResGroup2"); err != nil {
t.Errorf("Expected error <nil>, received error <%v>", err)
}
}
func TestDMGetResourceProfileCacheGetErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := Cache.Set(context.Background(), utils.CacheResourceProfiles, utils.ConcatenatedKey(utils.CGRateSorg, "rsrc1"), nil, []string{}, true, utils.NonTransactional); err != nil {
t.Error(err)
}
_, err := dm.GetResourceProfile(context.Background(), utils.CGRateSorg, "rsrc1", true, false, utils.NonTransactional)
if err != utils.ErrNotFound {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotFound, err)
}
}
func TestDMGetResourceProfileNilDmErr(t *testing.T) {
var dm *DataManager
_, err := dm.GetResourceProfile(context.Background(), utils.CGRateSorg, "rsrc1", false, false, utils.NonTransactional)
if err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMGetResourceProfileSetResourceProfileDrvErr(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaResourceProfiles].Remote = true
cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1GetResourceProfile: func(ctx *context.Context, args, reply any) error {
return nil
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetResourceProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ResourceProfile, error) {
return &utils.ResourceProfile{}, utils.ErrNotFound
},
SetResourceProfileDrvF: func(ctx *context.Context, rp *utils.ResourceProfile) error { return utils.ErrNotImplemented },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if _, err := dm.GetResourceProfile(context.Background(), utils.CGRateSorg, "rsrc1", false, false, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetResourceProfileCacheWriteErr1(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheResourceProfiles].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
Cache = NewCacheS(cfg, dm, cM, nil)
if _, err := dm.GetResourceProfile(context.Background(), utils.CGRateSorg, "ResGroup2", false, true, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetResourceProfileCacheWriteErr2(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheResourceProfiles].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rp := &utils.ResourceProfile{
Tenant: "cgrates.org",
ID: "RL2",
FilterIDs: []string{"fltr_test"},
Weights: utils.DynamicWeights{
{
Weight: 100,
}},
Limit: 2,
ThresholdIDs: []string{"TEST_ACTIONS"},
Blocker: false,
UsageTTL: time.Millisecond,
AllocationMessage: "ALLOC",
}
if err := dm.dbConns.dataDBs[utils.MetaDefault].SetResourceProfileDrv(context.Background(), rp); err != nil {
t.Error(err)
}
Cache = NewCacheS(cfg, dm, cM, nil)
if _, err := dm.GetResourceProfile(context.Background(), utils.CGRateSorg, "RL2", false, true, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetFilterSetFilterDrvErr(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaFilters].Remote = true
cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1GetFilter: func(ctx *context.Context, args, reply any) error { return nil },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetFilterDrvF: func(ctx *context.Context, str1, str2 string) (*Filter, error) { return &Filter{}, utils.ErrNotFound },
SetFilterDrvF: func(ctx *context.Context, fltr *Filter) error { return utils.ErrNotImplemented },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if _, err := dm.GetFilter(context.Background(), "cgrates.org", "fltr2", false, true, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetFilterCacheWriteErr1(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheFilters].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
Cache = NewCacheS(cfg, dm, cM, nil)
if _, err := dm.GetFilter(context.Background(), utils.CGRateSorg, "fltr2", false, true, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetFilterCacheWriteErr2(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheFilters].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
f := &Filter{
Tenant: utils.CGRateSorg,
ID: "fltr2",
Rules: []*FilterRule{
{
Type: utils.MetaString,
Element: "~*req.Charger",
Values: []string{"ChargerProfile2"},
},
},
}
if err := dm.dbConns.dataDBs[utils.MetaDefault].SetFilterDrv(context.Background(), f); err != nil {
t.Error(err)
}
Cache = NewCacheS(cfg, dm, cM, nil)
if _, err := dm.GetFilter(context.Background(), utils.CGRateSorg, "fltr2", false, true, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetThresholdSetThresholdDrvErr(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaThresholds].Remote = true
cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1GetThreshold: func(ctx *context.Context, args, reply any) error { return nil },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetThresholdDrvF: func(ctx *context.Context, tenant, id string) (*Threshold, error) {
return &Threshold{}, utils.ErrNotFound
},
SetThresholdDrvF: func(ctx *context.Context, t *Threshold) error { return utils.ErrNotImplemented },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if _, err := dm.GetThreshold(context.Background(), "cgrates.org", "TH1", false, false, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetResourceProfileNilDm(t *testing.T) {
var dm *DataManager
if err := dm.SetResourceProfile(context.Background(), &utils.ResourceProfile{}, false); err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMSetResourceProfileGetResourceProfileErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetResourceProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ResourceProfile, error) {
return &utils.ResourceProfile{}, utils.ErrNotImplemented
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := dm.SetResourceProfile(context.Background(), &utils.ResourceProfile{}, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetResourceProfileSetResourceProfileDrvErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetResourceProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ResourceProfile, error) {
return &utils.ResourceProfile{}, nil
},
SetResourceProfileDrvF: func(ctx *context.Context, rp *utils.ResourceProfile) error { return utils.ErrNotImplemented },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := dm.SetResourceProfile(context.Background(), &utils.ResourceProfile{}, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetResourceProfileUpdatedIndexesErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetResourceProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ResourceProfile, error) {
return &utils.ResourceProfile{}, nil
},
SetResourceProfileDrvF: func(ctx *context.Context, rp *utils.ResourceProfile) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rp := &utils.ResourceProfile{
Tenant: "cgrates.org",
ID: "RL1",
FilterIDs: []string{"*string:~*req.Account:1001"},
Weights: utils.DynamicWeights{
{
Weight: 100,
}},
Limit: 2,
ThresholdIDs: []string{"TEST_ACTIONS"},
UsageTTL: time.Millisecond,
AllocationMessage: "ALLOC",
}
if err := dm.SetResourceProfile(context.Background(), rp, true); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetResourceProfileErr(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaResourceProfiles].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1SetResourceProfile: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := dm.SetResourceProfile(context.Background(), &utils.ResourceProfile{}, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveResourceProfileNilDm(t *testing.T) {
var dm *DataManager
if err := dm.RemoveResourceProfile(context.Background(), utils.CGRateSorg, "RSP1", false); err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMRemoveResourceProfileGetResourceProfileErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetResourceProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ResourceProfile, error) {
return &utils.ResourceProfile{}, utils.ErrNotImplemented
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := dm.RemoveResourceProfile(context.Background(), utils.CGRateSorg, "RSP1", false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveResourceProfileRemoveResourceProfileDrvErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetResourceProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ResourceProfile, error) {
return &utils.ResourceProfile{}, nil
},
RemoveResourceProfileDrvF: func(ctx *context.Context, tnt, id string) error { return utils.ErrNotImplemented },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := dm.RemoveResourceProfile(context.Background(), utils.CGRateSorg, "RSP1", false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveResourceProfileOldResErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := dm.RemoveResourceProfile(context.Background(), utils.CGRateSorg, "RSP1", false); err != utils.ErrNotFound {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotFound, err)
}
}
func TestDMRemoveResourceProfileRemoveItemFromFilterIndexErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
rp := &utils.ResourceProfile{
Tenant: "cgrates.org",
ID: "RSP1",
FilterIDs: []string{"*string:~*req.Account:1001"},
Weights: utils.DynamicWeights{
{
Weight: 100,
}},
Limit: 2,
ThresholdIDs: []string{"TEST_ACTIONS"},
UsageTTL: time.Millisecond,
AllocationMessage: "ALLOC",
}
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetResourceProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ResourceProfile, error) { return rp, nil },
RemoveResourceProfileDrvF: func(ctx *context.Context, tnt, id string) error {
return nil
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := dm.RemoveResourceProfile(context.Background(), utils.CGRateSorg, rp.ID, true); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveResourceProfileRemoveIndexFiltersItemErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
rp := &utils.ResourceProfile{
Tenant: "cgrates.org",
ID: "RSP1",
FilterIDs: []string{"fltrID"},
Weights: utils.DynamicWeights{
{
Weight: 100,
}},
Limit: 2,
ThresholdIDs: []string{"TEST_ACTIONS"},
UsageTTL: time.Millisecond,
AllocationMessage: "ALLOC",
}
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetResourceProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ResourceProfile, error) { return rp, nil },
RemoveResourceProfileDrvF: func(ctx *context.Context, tnt, id string) error {
return nil
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := dm.RemoveResourceProfile(context.Background(), utils.CGRateSorg, rp.ID, true); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveResourceProfileReplicate(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
rp := &utils.ResourceProfile{
Tenant: "cgrates.org",
ID: "RSP1",
FilterIDs: []string{"fltrID"},
Weights: utils.DynamicWeights{
{
Weight: 100,
}},
Limit: 2,
ThresholdIDs: []string{"TEST_ACTIONS"},
UsageTTL: time.Millisecond,
AllocationMessage: "ALLOC",
}
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaResourceProfiles].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1SetResourceProfile: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetResourceProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ResourceProfile, error) { return rp, nil },
RemoveResourceProfileDrvF: func(ctx *context.Context, tnt, id string) error {
return nil
},
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
// tests replicate
if err := dm.RemoveResourceProfile(context.Background(), utils.CGRateSorg, rp.ID, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMHasDataNilDmErr(t *testing.T) {
var dm *DataManager
if _, err := dm.HasData("Category", "subj", "cgrates.org"); err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMHasDataOK(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
fltrTh1 := &Filter{
Tenant: config.CgrConfig().GeneralCfg().DefaultTenant,
ID: "FLTR_TH_1",
Rules: []*FilterRule{
{
Type: utils.MetaString,
Element: "~*req.Threshold",
Values: []string{"TH_1"},
},
},
}
if err := dm.SetFilter(context.Background(), fltrTh1, true); err != nil {
t.Error(err)
}
if has, err := dm.HasData(utils.FilterPrefix, fltrTh1.ID, fltrTh1.Tenant); err != nil {
t.Error(err)
} else if !has {
t.Errorf("Expected to have data")
}
}
func TestDMGetRouteProfileCacheGetErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := Cache.Set(context.Background(), utils.CacheRouteProfiles, utils.ConcatenatedKey(utils.CGRateSorg, "rsrc1"), nil, []string{}, true, utils.NonTransactional); err != nil {
t.Error(err)
}
_, err := dm.GetRouteProfile(context.Background(), utils.CGRateSorg, "rsrc1", true, false, utils.NonTransactional)
if err != utils.ErrNotFound {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotFound, err)
}
}
func TestDMGetRouteProfileNilDmErr(t *testing.T) {
var dm *DataManager
_, err := dm.GetRouteProfile(context.Background(), utils.CGRateSorg, "rsrc1", false, false, utils.NonTransactional)
if err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMGetRouteProfileSetRouteProfileDrvErr(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
rp := &utils.RouteProfile{
Tenant: "cgrates.org",
ID: "RP_1",
FilterIDs: []string{"fltr_test"},
Weights: utils.DynamicWeights{{}},
Sorting: utils.MetaQOS,
SortingParameters: []string{"param"},
Routes: []*utils.Route{{
ID: "RT1",
FilterIDs: []string{"fltr1"},
AccountIDs: []string{"acc1"},
RateProfileIDs: []string{"rp1"},
ResourceIDs: []string{"res1"},
StatIDs: []string{"stat1"},
Weights: utils.DynamicWeights{{}},
Blockers: utils.DynamicBlockers{
{
Blocker: true,
},
},
RouteParameters: "params",
}},
}
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaRouteProfiles].Remote = true
cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1GetRouteProfile: func(ctx *context.Context, args, reply any) error { return nil },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetRouteProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.RouteProfile, error) { return rp, utils.ErrNotFound },
SetRouteProfileDrvF: func(ctx *context.Context, rtPrf *utils.RouteProfile) error { return utils.ErrNotImplemented },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
_, err := dm.GetRouteProfile(context.Background(), utils.CGRateSorg, rp.ID, false, false, utils.NonTransactional)
if err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetRouteProfileCacheWriteErr1(t *testing.T) {
rp := &utils.RouteProfile{
Tenant: "cgrates.org",
ID: "RP_1",
FilterIDs: []string{"fltr_test"},
Weights: utils.DynamicWeights{{}},
Sorting: utils.MetaQOS,
SortingParameters: []string{"param"},
Routes: []*utils.Route{{
ID: "RT1",
FilterIDs: []string{"fltr1"},
AccountIDs: []string{"acc1"},
RateProfileIDs: []string{"rp1"},
ResourceIDs: []string{"res1"},
StatIDs: []string{"stat1"},
Weights: utils.DynamicWeights{{}},
Blockers: utils.DynamicBlockers{
{
Blocker: true,
},
},
RouteParameters: "params",
}},
}
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheRouteProfiles].Replicate = true
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error {
return utils.ErrNotImplemented
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
data := &DataDBMock{
GetRouteProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.RouteProfile, error) { return rp, utils.ErrNotFound },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
Cache = NewCacheS(cfg, dm, cM, nil)
_, err := dm.GetRouteProfile(context.Background(), utils.CGRateSorg, rp.ID, false, true, utils.NonTransactional)
if err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetRouteProfileCacheWriteErr2(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheRouteProfiles].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rp := &utils.RouteProfile{
Tenant: "cgrates.org",
ID: "RP_1",
FilterIDs: []string{"fltr_test"},
Weights: utils.DynamicWeights{{}},
Sorting: utils.MetaQOS,
SortingParameters: []string{"param"},
Routes: []*utils.Route{{
ID: "RT1",
FilterIDs: []string{"fltr1"},
AccountIDs: []string{"acc1"},
RateProfileIDs: []string{"rp1"},
ResourceIDs: []string{"res1"},
StatIDs: []string{"stat1"},
Weights: utils.DynamicWeights{{}},
Blockers: utils.DynamicBlockers{
{
Blocker: true,
},
},
RouteParameters: "params",
}},
}
if err := dm.dbConns.dataDBs[utils.MetaDefault].SetRouteProfileDrv(context.Background(), rp); err != nil {
t.Error(err)
}
Cache = NewCacheS(cfg, dm, cM, nil)
if _, err := dm.GetRouteProfile(context.Background(), utils.CGRateSorg, rp.ID, false, true, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetRouteProfileNoDMErr(t *testing.T) {
var dm *DataManager
err := dm.SetRouteProfile(context.Background(), &utils.RouteProfile{}, false)
if err != utils.ErrNoDatabaseConn {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMSetRouteProfileCheckFiltersErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rpp := &utils.RouteProfile{
Tenant: "cgrates.org",
ID: "RP_1",
FilterIDs: []string{":::"},
Weights: utils.DynamicWeights{{}},
Sorting: utils.MetaQOS,
SortingParameters: []string{"param"},
Routes: []*utils.Route{{
ID: "RT1",
FilterIDs: []string{"fltr1"},
AccountIDs: []string{"acc1"},
RateProfileIDs: []string{"rp1"},
ResourceIDs: []string{"res1"},
StatIDs: []string{"stat1"},
Weights: utils.DynamicWeights{{}},
Blockers: utils.DynamicBlockers{
{
Blocker: true,
},
},
RouteParameters: "params",
}},
}
expErr := "broken reference to filter: <:::> for item with ID: cgrates.org:RP_1"
if err := dm.SetRouteProfile(context.Background(), rpp, true); err == nil || err.Error() != expErr {
t.Errorf("Expected error <%v>, received error <%v>", expErr, err)
}
}
func TestDMSetRouteProfileGetRouteProfileErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetRouteProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.RouteProfile, error) {
return &utils.RouteProfile{}, utils.ErrNotImplemented
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rpp := &utils.RouteProfile{
Tenant: "cgrates.org",
ID: "RP_1",
FilterIDs: []string{"FilterID1"},
Weights: utils.DynamicWeights{{}},
Sorting: utils.MetaQOS,
SortingParameters: []string{"param"},
Routes: []*utils.Route{{
ID: "RT1",
FilterIDs: []string{"fltr1"},
AccountIDs: []string{"acc1"},
RateProfileIDs: []string{"rp1"},
ResourceIDs: []string{"res1"},
StatIDs: []string{"stat1"},
Weights: utils.DynamicWeights{{}},
Blockers: utils.DynamicBlockers{
{
Blocker: true,
},
},
RouteParameters: "params",
}},
}
if err := dm.SetRouteProfile(context.Background(), rpp, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetRouteProfileSetRouteProfileDrvErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetRouteProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.RouteProfile, error) {
return &utils.RouteProfile{}, nil
},
SetRouteProfileDrvF: func(ctx *context.Context, rtPrf *utils.RouteProfile) error { return utils.ErrNotImplemented },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rpp := &utils.RouteProfile{
Tenant: "cgrates.org",
ID: "RP_1",
FilterIDs: []string{"FilterID1"},
Weights: utils.DynamicWeights{{}},
Sorting: utils.MetaQOS,
SortingParameters: []string{"param"},
Routes: []*utils.Route{{
ID: "RT1",
FilterIDs: []string{"fltr1"},
AccountIDs: []string{"acc1"},
RateProfileIDs: []string{"rp1"},
ResourceIDs: []string{"res1"},
StatIDs: []string{"stat1"},
Weights: utils.DynamicWeights{{}},
Blockers: utils.DynamicBlockers{
{
Blocker: true,
},
},
RouteParameters: "params",
}},
}
if err := dm.SetRouteProfile(context.Background(), rpp, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetRouteProfileUpdatedIndexesErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetRouteProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.RouteProfile, error) {
return &utils.RouteProfile{}, nil
},
SetRouteProfileDrvF: func(ctx *context.Context, rtPrf *utils.RouteProfile) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rpp := &utils.RouteProfile{
Tenant: "cgrates.org",
ID: "RP_1",
FilterIDs: []string{"*string:~*req.Account:1001"},
Weights: utils.DynamicWeights{{}},
Sorting: utils.MetaQOS,
SortingParameters: []string{"param"},
Routes: []*utils.Route{{
ID: "RT1",
FilterIDs: []string{"fltr1"},
AccountIDs: []string{"acc1"},
RateProfileIDs: []string{"rp1"},
ResourceIDs: []string{"res1"},
StatIDs: []string{"stat1"},
Weights: utils.DynamicWeights{{}},
Blockers: utils.DynamicBlockers{
{
Blocker: true,
},
},
RouteParameters: "params",
}},
}
if err := dm.SetRouteProfile(context.Background(), rpp, true); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetRouteProfileReplicate(t *testing.T) {
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
rpp := &utils.RouteProfile{
Tenant: "cgrates.org",
ID: "RP_1",
FilterIDs: []string{"*string:~*req.Account:1001"},
Weights: utils.DynamicWeights{{}},
Sorting: utils.MetaQOS,
SortingParameters: []string{"param"},
Routes: []*utils.Route{{
ID: "RT1",
FilterIDs: []string{"fltr1"},
AccountIDs: []string{"acc1"},
RateProfileIDs: []string{"rp1"},
ResourceIDs: []string{"res1"},
StatIDs: []string{"stat1"},
Weights: utils.DynamicWeights{{}},
Blockers: utils.DynamicBlockers{
{
Blocker: true,
},
},
RouteParameters: "params",
}},
}
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaRouteProfiles].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1SetRouteProfile: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetRouteProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.RouteProfile, error) { return rpp, nil },
SetRouteProfileDrvF: func(ctx *context.Context, rtPrf *utils.RouteProfile) error { return nil },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
// tests replicate
if err := dm.SetRouteProfile(context.Background(), rpp, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveRouteProfileNoDMErr(t *testing.T) {
var dm *DataManager
err := dm.RemoveRouteProfile(context.Background(), "cgrates.org", "RP_1", false)
if err != utils.ErrNoDatabaseConn {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMRemoveRouteProfileGetRouteProfileErr(t *testing.T) {
tmp := Cache
defer func() {
Cache = tmp
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetRouteProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.RouteProfile, error) {
return &utils.RouteProfile{}, utils.ErrNotImplemented
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rpp := &utils.RouteProfile{
Tenant: "cgrates.org",
ID: "RP_1",
FilterIDs: []string{"FilterID1"},
Weights: utils.DynamicWeights{{}},
Sorting: utils.MetaQOS,
SortingParameters: []string{"param"},
Routes: []*utils.Route{{
ID: "RT1",
FilterIDs: []string{"fltr1"},
AccountIDs: []string{"acc1"},
RateProfileIDs: []string{"rp1"},
ResourceIDs: []string{"res1"},
StatIDs: []string{"stat1"},
Weights: utils.DynamicWeights{{}},
Blockers: utils.DynamicBlockers{
{
Blocker: true,
},
},
RouteParameters: "params",
}},
}
err := dm.RemoveRouteProfile(context.Background(), rpp.Tenant, rpp.ID, false)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveRouteProfileRemoveRouteProfileDrvErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetRouteProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.RouteProfile, error) {
return &utils.RouteProfile{}, nil
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rpp := &utils.RouteProfile{
Tenant: "cgrates.org",
ID: "RP_1",
FilterIDs: []string{"FilterID1"},
Weights: utils.DynamicWeights{{}},
Sorting: utils.MetaQOS,
SortingParameters: []string{"param"},
Routes: []*utils.Route{{
ID: "RT1",
FilterIDs: []string{"fltr1"},
AccountIDs: []string{"acc1"},
RateProfileIDs: []string{"rp1"},
ResourceIDs: []string{"res1"},
StatIDs: []string{"stat1"},
Weights: utils.DynamicWeights{{}},
Blockers: utils.DynamicBlockers{
{
Blocker: true,
},
},
RouteParameters: "params",
}},
}
err := dm.RemoveRouteProfile(context.Background(), rpp.Tenant, rpp.ID, false)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveRouteProfileNilOldRppErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
var Id string
var tnt string
err := dm.RemoveRouteProfile(context.Background(), tnt, Id, false)
if err != utils.ErrNotFound {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotFound, err)
}
}
func TestDMRemoveRouteProfileRmvItemFromFiltrIndexErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetRouteProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.RouteProfile, error) {
return &utils.RouteProfile{}, nil
},
RemoveRouteProfileDrvF: func(ctx *context.Context, tnt, id string) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rpp := &utils.RouteProfile{
Tenant: "cgrates.org",
ID: "RP_1",
FilterIDs: []string{"FilterID1"},
Weights: utils.DynamicWeights{{}},
Sorting: utils.MetaQOS,
SortingParameters: []string{"param"},
Routes: []*utils.Route{{
ID: "RT1",
FilterIDs: []string{"fltr1"},
AccountIDs: []string{"acc1"},
RateProfileIDs: []string{"rp1"},
ResourceIDs: []string{"res1"},
StatIDs: []string{"stat1"},
Weights: utils.DynamicWeights{{}},
Blockers: utils.DynamicBlockers{
{
Blocker: true,
},
},
RouteParameters: "params",
}},
}
err := dm.RemoveRouteProfile(context.Background(), rpp.Tenant, rpp.ID, true)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveRouteProfileRmvIndexFiltersItemErr(t *testing.T) {
Cache.Clear(nil)
rpp := &utils.RouteProfile{
Tenant: "cgrates.org",
ID: "RP_1",
FilterIDs: []string{"fltrID"},
Weights: utils.DynamicWeights{{}},
Sorting: utils.MetaQOS,
SortingParameters: []string{"param"},
Routes: []*utils.Route{{
ID: "RT1",
FilterIDs: []string{"fltr1"},
AccountIDs: []string{"acc1"},
RateProfileIDs: []string{"rp1"},
ResourceIDs: []string{"res1"},
StatIDs: []string{"stat1"},
Weights: utils.DynamicWeights{{}},
Blockers: utils.DynamicBlockers{
{
Blocker: true,
},
},
RouteParameters: "params",
}},
}
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetRouteProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.RouteProfile, error) { return rpp, nil },
RemoveRouteProfileDrvF: func(ctx *context.Context, tnt, id string) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
err := dm.RemoveRouteProfile(context.Background(), rpp.Tenant, rpp.ID, true)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveRouteProfileReplicate(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
rpp := &utils.RouteProfile{
Tenant: "cgrates.org",
ID: "RP_1",
FilterIDs: []string{"fltrID"},
Weights: utils.DynamicWeights{{}},
Sorting: utils.MetaQOS,
SortingParameters: []string{"param"},
Routes: []*utils.Route{{
ID: "RT1",
FilterIDs: []string{"fltr1"},
AccountIDs: []string{"acc1"},
RateProfileIDs: []string{"rp1"},
ResourceIDs: []string{"res1"},
StatIDs: []string{"stat1"},
Weights: utils.DynamicWeights{{}},
Blockers: utils.DynamicBlockers{
{
Blocker: true,
},
},
RouteParameters: "params",
}},
}
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaRouteProfiles].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1RemoveRouteProfile: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetRouteProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.RouteProfile, error) { return rpp, nil },
RemoveRouteProfileDrvF: func(ctx *context.Context, tnt, id string) error { return nil },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
// tests replicate
dm.RemoveRouteProfile(context.Background(), rpp.Tenant, rpp.ID, false)
}
func TestDMRemoveAttributeProfileNoDMErr(t *testing.T) {
var dm *DataManager
err := dm.RemoveAttributeProfile(context.Background(), "cgrates.org", "ap_1", false)
if err != utils.ErrNoDatabaseConn {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMRemoveAttributeProfileGetAttributeProfileErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*utils.AttributeProfile, error) {
return &utils.AttributeProfile{}, utils.ErrNotImplemented
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
attrPrfl := &utils.AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"FLTR_ACNT_1"},
Attributes: []*utils.Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: utils.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
err := dm.RemoveAttributeProfile(context.Background(), attrPrfl.Tenant, attrPrfl.ID, false)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveAttributeProfileRemoveAttributeProfileDrvErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*utils.AttributeProfile, error) {
return &utils.AttributeProfile{}, nil
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
attrPrfl := &utils.AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"FLTR_ACNT_1"},
Attributes: []*utils.Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: utils.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
err := dm.RemoveAttributeProfile(context.Background(), attrPrfl.Tenant, attrPrfl.ID, false)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveAttributeProfileNilOldAttrErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
var Id string
var tnt string
err := dm.RemoveAttributeProfile(context.Background(), tnt, Id, false)
if err != utils.ErrNotFound {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotFound, err)
}
}
func TestDMRemoveAttributeProfileRmvItemFromFiltrIndexErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*utils.AttributeProfile, error) {
return &utils.AttributeProfile{}, nil
},
RemoveAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
attrPrfl := &utils.AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"FLTR_ACNT_1"},
Attributes: []*utils.Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: utils.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
err := dm.RemoveAttributeProfile(context.Background(), attrPrfl.Tenant, attrPrfl.ID, true)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveAttributeProfileRmvIndexFiltersItemErr(t *testing.T) {
Cache.Clear(nil)
attrPrfl := &utils.AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"FLTR_ACNT_1"},
Attributes: []*utils.Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: utils.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*utils.AttributeProfile, error) {
return attrPrfl, nil
},
RemoveAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
err := dm.RemoveAttributeProfile(context.Background(), attrPrfl.Tenant, attrPrfl.ID, true)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveAttributeProfileReplicate(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
attrPrfl := &utils.AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"FLTR_ACNT_1"},
Attributes: []*utils.Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: utils.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaAttributeProfiles].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1RemoveRouteProfile: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*utils.AttributeProfile, error) {
return attrPrfl, nil
},
RemoveAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) error { return nil },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
// tests replicate
dm.RemoveAttributeProfile(context.Background(), attrPrfl.Tenant, attrPrfl.ID, false)
}
func TestDMRemoveChargerProfileNoDMErr(t *testing.T) {
var dm *DataManager
err := dm.RemoveChargerProfile(context.Background(), "cgrates.org", "cp_1", false)
if err != utils.ErrNoDatabaseConn {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMRemoveChargerProfileGetChargerProfileErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetChargerProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ChargerProfile, error) {
return &utils.ChargerProfile{}, utils.ErrNotImplemented
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
cpp := &utils.ChargerProfile{
Tenant: "cgrates.org",
ID: "CPP_1",
FilterIDs: []string{"FLTR_CP_1"},
RunID: "TestRunID",
AttributeIDs: []string{"*none"},
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
}
err := dm.RemoveChargerProfile(context.Background(), cpp.Tenant, cpp.ID, false)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveChargerProfileRemoveChargerProfileDrvErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetChargerProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ChargerProfile, error) {
return &utils.ChargerProfile{}, nil
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
cpp := &utils.ChargerProfile{
Tenant: "cgrates.org",
ID: "CPP_1",
FilterIDs: []string{"FLTR_CP_1"},
RunID: "TestRunID",
AttributeIDs: []string{"*none"},
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
}
err := dm.RemoveChargerProfile(context.Background(), cpp.Tenant, cpp.ID, false)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveChargerProfileNilOldCppErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
var Id string
var tnt string
err := dm.RemoveChargerProfile(context.Background(), tnt, Id, false)
if err != utils.ErrNotFound {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotFound, err)
}
}
func TestDMRemoveChargerProfileRmvItemFromFiltrIndexErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetChargerProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ChargerProfile, error) {
return &utils.ChargerProfile{}, nil
},
RemoveChargerProfileDrvF: func(ctx *context.Context, chr, rpl string) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
cpp := &utils.ChargerProfile{
Tenant: "cgrates.org",
ID: "CPP_1",
FilterIDs: []string{"FLTR_CP_1"},
RunID: "TestRunID",
AttributeIDs: []string{"*none"},
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
}
err := dm.RemoveChargerProfile(context.Background(), cpp.Tenant, cpp.ID, true)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveChargerProfileRmvIndexFiltersItemErr(t *testing.T) {
Cache.Clear(nil)
cpp := &utils.ChargerProfile{
Tenant: "cgrates.org",
ID: "CPP_1",
FilterIDs: []string{"FLTR_CP_1"},
RunID: "TestRunID",
AttributeIDs: []string{"*none"},
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
}
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetChargerProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ChargerProfile, error) {
return cpp, nil
},
RemoveChargerProfileDrvF: func(ctx *context.Context, chr, rpl string) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
err := dm.RemoveChargerProfile(context.Background(), cpp.Tenant, cpp.ID, true)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveChargerProfileReplicate(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cpp := &utils.ChargerProfile{
Tenant: "cgrates.org",
ID: "CPP_1",
FilterIDs: []string{"FLTR_CP_1"},
RunID: "TestRunID",
AttributeIDs: []string{"*none"},
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
}
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaChargerProfiles].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1RemoveChargerProfile: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetChargerProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ChargerProfile, error) {
return cpp, nil
},
RemoveChargerProfileDrvF: func(ctx *context.Context, chr, rpl string) error { return nil },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
// tests replicate
dm.RemoveChargerProfile(context.Background(), cpp.Tenant, cpp.ID, false)
}
func TestDMRemoveRateProfileNoDMErr(t *testing.T) {
var dm *DataManager
err := dm.RemoveRateProfile(context.Background(), "cgrates.org", "Rp_1", false)
if err != utils.ErrNoDatabaseConn {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMRemoveRateProfileGetRateProfileErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetRateProfileDrvF: func(ctx *context.Context, s1, s2 string) (*utils.RateProfile, error) {
return &utils.RateProfile{}, utils.ErrNotImplemented
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rpp := &utils.RateProfile{
ID: "test_ID1",
Tenant: "cgrates.org",
FilterIDs: []string{"*string:~*req.Destination:1234"},
Rates: map[string]*utils.Rate{
"RT1": {
ID: "RT1",
IntervalRates: []*utils.IntervalRate{
{
IntervalStart: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(1, 2),
Unit: utils.NewDecimal(int64(time.Second), 0),
Increment: utils.NewDecimal(int64(time.Second), 0),
},
},
},
},
}
err := dm.RemoveRateProfile(context.Background(), rpp.Tenant, rpp.ID, false)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveRateProfileRemoveRateProfileDrvErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetRateProfileDrvF: func(ctx *context.Context, s1, s2 string) (*utils.RateProfile, error) {
return &utils.RateProfile{}, nil
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rpp := &utils.RateProfile{
ID: "test_ID1",
Tenant: "cgrates.org",
FilterIDs: []string{"*string:~*req.Destination:1234"},
Rates: map[string]*utils.Rate{
"RT1": {
ID: "RT1",
IntervalRates: []*utils.IntervalRate{
{
IntervalStart: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(1, 2),
Unit: utils.NewDecimal(int64(time.Second), 0),
Increment: utils.NewDecimal(int64(time.Second), 0),
},
},
},
},
}
err := dm.RemoveRateProfile(context.Background(), rpp.Tenant, rpp.ID, false)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveRateProfileNilOldRppErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
var Id string
var tnt string
err := dm.RemoveRateProfile(context.Background(), tnt, Id, false)
if err != utils.ErrNotFound {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotFound, err)
}
}
func TestDMRemoveRateProfileRemoveIndexFiltersItemErr1(t *testing.T) {
Cache.Clear(nil)
rpp := &utils.RateProfile{
ID: "test_ID1",
Tenant: "cgrates.org",
FilterIDs: []string{"*string:~*req.Destination:1234"},
Rates: map[string]*utils.Rate{
"RT1": {
FilterIDs: []string{"FltrId1"},
ID: "RT1",
IntervalRates: []*utils.IntervalRate{
{
IntervalStart: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(1, 2),
Unit: utils.NewDecimal(int64(time.Second), 0),
Increment: utils.NewDecimal(int64(time.Second), 0),
},
},
},
},
}
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetRateProfileDrvF: func(ctx *context.Context, s1, s2 string) (*utils.RateProfile, error) {
return rpp, nil
},
RemoveRateProfileDrvF: func(ctx *context.Context, str1, str2 string, rateIDs *[]string) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
err := dm.RemoveRateProfile(context.Background(), rpp.Tenant, rpp.ID, true)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveRateProfileRemoveIndexFiltersItemErr2(t *testing.T) {
Cache.Clear(nil)
rpp := &utils.RateProfile{
ID: "test_ID1",
Tenant: "cgrates.org",
FilterIDs: []string{"fltrId1"},
}
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetRateProfileDrvF: func(ctx *context.Context, s1, s2 string) (*utils.RateProfile, error) {
return rpp, nil
},
RemoveRateProfileDrvF: func(ctx *context.Context, str1, str2 string, rateIDs *[]string) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
err := dm.RemoveRateProfile(context.Background(), rpp.Tenant, rpp.ID, true)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveRateProfileRmvItemFromFiltrIndexErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetRateProfileDrvF: func(ctx *context.Context, s1, s2 string) (*utils.RateProfile, error) {
return &utils.RateProfile{}, nil
},
RemoveRateProfileDrvF: func(ctx *context.Context, str1, str2 string, rateIDs *[]string) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rpp := &utils.RateProfile{
ID: "test_ID1",
Tenant: "cgrates.org",
FilterIDs: []string{"*string:~*req.Destination:1234"},
Rates: map[string]*utils.Rate{
"RT1": {
ID: "RT1",
IntervalRates: []*utils.IntervalRate{
{
IntervalStart: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(1, 2),
Unit: utils.NewDecimal(int64(time.Second), 0),
Increment: utils.NewDecimal(int64(time.Second), 0),
},
},
},
},
}
err := dm.RemoveRateProfile(context.Background(), rpp.Tenant, rpp.ID, true)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveRateProfileRmvIndexFiltersItemErr(t *testing.T) {
Cache.Clear(nil)
rpp := &utils.RateProfile{
ID: "test_ID1",
Tenant: "cgrates.org",
FilterIDs: []string{"*string:~*req.Destination:1234"},
Rates: map[string]*utils.Rate{
"RT1": {
ID: "RT1",
IntervalRates: []*utils.IntervalRate{
{
IntervalStart: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(1, 2),
Unit: utils.NewDecimal(int64(time.Second), 0),
Increment: utils.NewDecimal(int64(time.Second), 0),
},
},
},
},
}
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetRateProfileDrvF: func(ctx *context.Context, s1, s2 string) (*utils.RateProfile, error) {
return rpp, nil
},
RemoveRateProfileDrvF: func(ctx *context.Context, str1, str2 string, rateIDs *[]string) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
err := dm.RemoveRateProfile(context.Background(), rpp.Tenant, rpp.ID, true)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveRateProfileReplicate(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
rpp := &utils.RateProfile{
ID: "test_ID1",
Tenant: "cgrates.org",
FilterIDs: []string{"*string:~*req.Destination:1234"},
Rates: map[string]*utils.Rate{
"RT1": {
ID: "RT1",
IntervalRates: []*utils.IntervalRate{
{
IntervalStart: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(1, 2),
Unit: utils.NewDecimal(int64(time.Second), 0),
Increment: utils.NewDecimal(int64(time.Second), 0),
},
},
},
},
}
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaRateProfiles].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1RemoveRateProfile: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetRateProfileDrvF: func(ctx *context.Context, s1, s2 string) (*utils.RateProfile, error) {
return rpp, nil
},
RemoveRateProfileDrvF: func(ctx *context.Context, str1, str2 string, rateIDs *[]string) error { return nil },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
// tests replicate
dm.RemoveRateProfile(context.Background(), rpp.Tenant, rpp.ID, false)
}
func TestDMRemoveActionProfileNilOldActErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
var Id string
var tnt string
err := dm.RemoveActionProfile(context.Background(), tnt, Id, false)
if err != utils.ErrNotFound {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotFound, err)
}
}
func TestDMRemoveActionProfileRmvItemFromFiltrIndexErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetActionProfileDrvF: func(ctx *context.Context, tenant, ID string) (*utils.ActionProfile, error) {
return &utils.ActionProfile{}, nil
},
RemoveActionProfileDrvF: func(ctx *context.Context, tenant, ID string) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
ap := &utils.ActionProfile{
Tenant: "cgrates.org",
ID: "AP1",
FilterIDs: []string{"fltr1"},
Weights: utils.DynamicWeights{
{
Weight: 65,
},
},
Schedule: "* * * * *",
Targets: map[string]utils.StringSet{utils.MetaAccounts: {"1001": {}}},
Actions: []*utils.APAction{{}},
}
err := dm.RemoveActionProfile(context.Background(), ap.Tenant, ap.ID, true)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveActionProfileRmvIndexFiltersItemErr(t *testing.T) {
Cache.Clear(nil)
ap := &utils.ActionProfile{
Tenant: "cgrates.org",
ID: "AP1",
FilterIDs: []string{"fltr1"},
Weights: utils.DynamicWeights{
{
Weight: 65,
},
},
Schedule: "* * * * *",
Targets: map[string]utils.StringSet{utils.MetaAccounts: {"1001": {}}},
Actions: []*utils.APAction{{}},
}
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetActionProfileDrvF: func(ctx *context.Context, tenant, ID string) (*utils.ActionProfile, error) { return ap, nil },
RemoveActionProfileDrvF: func(ctx *context.Context, tenant, ID string) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
err := dm.RemoveActionProfile(context.Background(), ap.Tenant, ap.ID, true)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveActionProfileReplicate(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
ap := &utils.ActionProfile{
Tenant: "cgrates.org",
ID: "AP1",
FilterIDs: []string{"fltr1"},
Weights: utils.DynamicWeights{
{
Weight: 65,
},
},
Schedule: "* * * * *",
Targets: map[string]utils.StringSet{utils.MetaAccounts: {"1001": {}}},
Actions: []*utils.APAction{{}},
}
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaActionProfiles].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1RemoveActionProfile: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetActionProfileDrvF: func(ctx *context.Context, tenant, ID string) (*utils.ActionProfile, error) { return ap, nil },
RemoveActionProfileDrvF: func(ctx *context.Context, tenant, ID string) error { return nil },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
// tests replicate
dm.RemoveActionProfile(context.Background(), ap.Tenant, ap.ID, false)
}
func TestDMSetAttributeProfileNoDMErr(t *testing.T) {
var dm *DataManager
err := dm.SetAttributeProfile(context.Background(), &utils.AttributeProfile{}, false)
if err != utils.ErrNoDatabaseConn {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMSetAttributeProfileCheckFiltersErr(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
attrPrfl := &utils.AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{":::"},
Attributes: []*utils.Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: utils.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
expErr := "broken reference to filter: <:::> for item with ID: cgrates.org:ATTR_ID"
if err := dm.SetAttributeProfile(context.Background(), attrPrfl, true); err == nil || err.Error() != expErr {
t.Errorf("Expected error <%v>, received error <%v>", expErr, err)
}
}
func TestDMSetAttributeProfileGetAttributeProfileErr(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*utils.AttributeProfile, error) {
return &utils.AttributeProfile{}, utils.ErrNotImplemented
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
attrPrfl := &utils.AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"filtrId1"},
Attributes: []*utils.Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: utils.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
if err := dm.SetAttributeProfile(context.Background(), attrPrfl, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetAttributeProfileSetAttributeProfileDrvErr(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*utils.AttributeProfile, error) {
return &utils.AttributeProfile{}, nil
},
SetAttributeProfileDrvF: func(ctx *context.Context, attr *utils.AttributeProfile) error { return utils.ErrNotImplemented },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
attrPrfl := &utils.AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"filtrId1"},
Attributes: []*utils.Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: utils.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
if err := dm.SetAttributeProfile(context.Background(), attrPrfl, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetAttributeProfileUpdatedIndexesErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*utils.AttributeProfile, error) {
return &utils.AttributeProfile{}, nil
},
SetAttributeProfileDrvF: func(ctx *context.Context, attr *utils.AttributeProfile) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
attrPrfl := &utils.AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"*string:~*req.Account:1001"},
Attributes: []*utils.Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: utils.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
if err := dm.SetAttributeProfile(context.Background(), attrPrfl, true); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetAttributeProfileReplicate(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
attrPrfl := &utils.AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"filtrId1"},
Attributes: []*utils.Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: utils.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaAttributeProfiles].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1SetAttributeProfile: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*utils.AttributeProfile, error) {
return attrPrfl, nil
},
SetAttributeProfileDrvF: func(ctx *context.Context, attr *utils.AttributeProfile) error { return nil },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
// tests replicate
if err := dm.SetAttributeProfile(context.Background(), attrPrfl, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetAttributeProfileNilDmErr(t *testing.T) {
var dm *DataManager
_, err := dm.GetAttributeProfile(context.Background(), utils.CGRateSorg, "ap_1", false, false, utils.NonTransactional)
if err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMGetAttributeProfileSetAttributeProfileDrvErr(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
attrPrfl := &utils.AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"filtrId1"},
Attributes: []*utils.Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: utils.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaAttributeProfiles].Remote = true
cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1GetAttributeProfile: func(ctx *context.Context, args, reply any) error { return nil },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*utils.AttributeProfile, error) {
return attrPrfl, utils.ErrNotFound
},
SetAttributeProfileDrvF: func(ctx *context.Context, attr *utils.AttributeProfile) error { return utils.ErrNotImplemented },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
_, err := dm.GetAttributeProfile(context.Background(), utils.CGRateSorg, attrPrfl.ID, false, false, utils.NonTransactional)
if err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetAttributeProfileComputeHashErr(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*utils.AttributeProfile, error) {
return &utils.AttributeProfile{}, nil
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
value := utils.NewRSRParsersMustCompile("31 0a 0a 32 0a 0a 33 0a 0a 34 0a 0a 35 0a 0a 36 0a 0a 37 0a 0a 38 0a 0a 39 0a 0a 31 30 0a 0a 31", utils.RSRSep)
attrPrfl := &utils.AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"filtrId1"},
Attributes: []*utils.Attribute{
{
Type: utils.MetaPassword,
Value: value,
},
},
Weights: make(utils.DynamicWeights, 1),
}
expErr := "bcrypt: password length exceeds 72 bytes"
if err := dm.SetAttributeProfile(context.Background(), attrPrfl, false); err == nil || err.Error() != expErr {
t.Errorf("Expected error <%v>, received error <%v>", expErr, err)
}
}
func TestDMSetChargerProfileNoDMErr(t *testing.T) {
var dm *DataManager
err := dm.SetChargerProfile(context.Background(), &utils.ChargerProfile{}, false)
if err != utils.ErrNoDatabaseConn {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMSetChargerProfileCheckFiltersErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
cpp := &utils.ChargerProfile{
Tenant: "cgrates.org",
ID: "CHP_1",
FilterIDs: []string{"*string*req.Account1001"},
RunID: "*rated",
AttributeIDs: []string{"ATTR_1"},
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
}
expErr := "broken reference to filter: <*string*req.Account1001> for item with ID: cgrates.org:CHP_1"
if err := dm.SetChargerProfile(context.Background(), cpp, true); err == nil || err.Error() != expErr {
t.Errorf("Expected error <%v>, received error <%v>", expErr, err)
}
}
func TestDMSetChargerProfileGetChargerProfileErr(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetChargerProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ChargerProfile, error) {
return &utils.ChargerProfile{}, utils.ErrNotImplemented
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
cpp := &utils.ChargerProfile{
Tenant: "cgrates.org",
ID: "CHP_1",
FilterIDs: []string{"FltrId1"},
RunID: "*rated",
AttributeIDs: []string{"ATTR_1"},
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
}
if err := dm.SetChargerProfile(context.Background(), cpp, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetChargerProfileSetChargerProfileDrvErr(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetChargerProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ChargerProfile, error) {
return &utils.ChargerProfile{}, nil
},
SetChargerProfileDrvF: func(ctx *context.Context, chr *utils.ChargerProfile) (err error) { return utils.ErrNotImplemented },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
cpp := &utils.ChargerProfile{
Tenant: "cgrates.org",
ID: "CHP_1",
FilterIDs: []string{"FltrId1"},
RunID: "*rated",
AttributeIDs: []string{"ATTR_1"},
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
}
if err := dm.SetChargerProfile(context.Background(), cpp, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetChargerProfileUpdatedIndexesErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetChargerProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ChargerProfile, error) {
return &utils.ChargerProfile{}, nil
},
SetChargerProfileDrvF: func(ctx *context.Context, chr *utils.ChargerProfile) (err error) { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
cpp := &utils.ChargerProfile{
Tenant: "cgrates.org",
ID: "CHP_1",
FilterIDs: []string{"*string:~*req.Account:1001"},
RunID: "*rated",
AttributeIDs: []string{"ATTR_1"},
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
}
if err := dm.SetChargerProfile(context.Background(), cpp, true); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetChargerProfileReplicate(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cpp := &utils.ChargerProfile{
Tenant: "cgrates.org",
ID: "CHP_1",
FilterIDs: []string{"*string:~*req.Account:1001"},
RunID: "*rated",
AttributeIDs: []string{"ATTR_1"},
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
}
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaChargerProfiles].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1SetChargerProfile: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetChargerProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ChargerProfile, error) {
return cpp, nil
},
SetChargerProfileDrvF: func(ctx *context.Context, chr *utils.ChargerProfile) (err error) { return nil },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
// tests replicate
if err := dm.SetChargerProfile(context.Background(), cpp, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetActionProfileNoDMErr(t *testing.T) {
var dm *DataManager
err := dm.SetActionProfile(context.Background(), &utils.ActionProfile{}, false)
if err != utils.ErrNoDatabaseConn {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMSetActionProfileCheckFiltersErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
ap := &utils.ActionProfile{
Tenant: "cgrates.org",
ID: "AP1",
FilterIDs: []string{"*string*req.Account1001"},
Weights: utils.DynamicWeights{
{
Weight: 65,
},
},
Schedule: "* * * * *",
Targets: map[string]utils.StringSet{utils.MetaAccounts: {"1001": {}}},
Actions: []*utils.APAction{{}},
}
expErr := "broken reference to filter: <*string*req.Account1001> for item with ID: cgrates.org:AP1"
if err := dm.SetActionProfile(context.Background(), ap, true); err == nil || err.Error() != expErr {
t.Errorf("Expected error <%v>, received error <%v>", expErr, err)
}
}
func TestDMSetActionProfileGetActionProfileErr(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetActionProfileDrvF: func(ctx *context.Context, tenant, ID string) (*utils.ActionProfile, error) {
return &utils.ActionProfile{}, utils.ErrNotImplemented
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
ap := &utils.ActionProfile{
Tenant: "cgrates.org",
ID: "AP1",
FilterIDs: []string{"*string*req.Account1001"},
Weights: utils.DynamicWeights{
{
Weight: 65,
},
},
Schedule: "* * * * *",
Targets: map[string]utils.StringSet{utils.MetaAccounts: {"1001": {}}},
Actions: []*utils.APAction{{}},
}
if err := dm.SetActionProfile(context.Background(), ap, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetActionProfileSetActionProfileDrvErr(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetActionProfileDrvF: func(ctx *context.Context, tenant, ID string) (*utils.ActionProfile, error) {
return &utils.ActionProfile{}, nil
},
SetActionProfileDrvF: func(ctx *context.Context, ap *utils.ActionProfile) error { return utils.ErrNotImplemented },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
ap := &utils.ActionProfile{
Tenant: "cgrates.org",
ID: "AP1",
FilterIDs: []string{"*string*req.Account1001"},
Weights: utils.DynamicWeights{
{
Weight: 65,
},
},
Schedule: "* * * * *",
Targets: map[string]utils.StringSet{utils.MetaAccounts: {"1001": {}}},
Actions: []*utils.APAction{{}},
}
if err := dm.SetActionProfile(context.Background(), ap, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetActionProfileUpdatedIndexesErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetActionProfileDrvF: func(ctx *context.Context, tenant, ID string) (*utils.ActionProfile, error) {
return &utils.ActionProfile{}, nil
},
SetActionProfileDrvF: func(ctx *context.Context, ap *utils.ActionProfile) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
ap := &utils.ActionProfile{
Tenant: "cgrates.org",
ID: "AP1",
FilterIDs: []string{"*string:~*req.Account:1001"},
Weights: utils.DynamicWeights{
{
Weight: 65,
},
},
Schedule: "* * * * *",
Targets: map[string]utils.StringSet{utils.MetaAccounts: {"1001": {}}},
Actions: []*utils.APAction{{}},
}
if err := dm.SetActionProfile(context.Background(), ap, true); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetActionProfileReplicate(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
ap := &utils.ActionProfile{
Tenant: "cgrates.org",
ID: "AP1",
FilterIDs: []string{"*string*req.Account1001"},
Weights: utils.DynamicWeights{
{
Weight: 65,
},
},
Schedule: "* * * * *",
Targets: map[string]utils.StringSet{utils.MetaAccounts: {"1001": {}}},
Actions: []*utils.APAction{{}},
}
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaActionProfiles].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1SetActionProfile: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetActionProfileDrvF: func(ctx *context.Context, tenant, ID string) (*utils.ActionProfile, error) {
return ap, nil
},
SetActionProfileDrvF: func(ctx *context.Context, ap *utils.ActionProfile) error { return nil },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
// tests replicate
if err := dm.SetActionProfile(context.Background(), ap, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetRateProfileNoDMErr(t *testing.T) {
var dm *DataManager
err := dm.SetRateProfile(context.Background(), &utils.RateProfile{}, false, false)
if err != utils.ErrNoDatabaseConn {
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMSetRateProfileRatesProfileCheckFiltersErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rpp := &utils.RateProfile{
ID: "test_ID1",
Tenant: "cgrates.org",
FilterIDs: []string{"*string*req.Account1001"},
Rates: map[string]*utils.Rate{
"RT1": {
ID: "RT1",
FilterIDs: []string{"*string*req.Account1001"},
IntervalRates: []*utils.IntervalRate{
{
IntervalStart: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(1, 2),
Unit: utils.NewDecimal(int64(time.Second), 0),
Increment: utils.NewDecimal(int64(time.Second), 0),
},
},
},
},
}
expErr := "broken reference to filter: <*string*req.Account1001> for item with ID: cgrates.org:test_ID1"
if err := dm.SetRateProfile(context.Background(), rpp, false, false); err == nil || err.Error() != expErr {
t.Errorf("Expected error <%v>, received error <%v>", expErr, err)
}
}
func TestDMSetRateProfileRatesCheckFiltersErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rpp := &utils.RateProfile{
ID: "test_ID1",
Tenant: "cgrates.org",
FilterIDs: []string{"*string:~*req.Account:1001"},
Rates: map[string]*utils.Rate{
"RT1": {
ID: "RT1",
FilterIDs: []string{"*string*req.Account1001"},
IntervalRates: []*utils.IntervalRate{
{
IntervalStart: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(1, 2),
Unit: utils.NewDecimal(int64(time.Second), 0),
Increment: utils.NewDecimal(int64(time.Second), 0),
},
},
},
},
}
expErr := "broken reference to filter: <*string*req.Account1001> for item with ID: RT1"
if err := dm.SetRateProfile(context.Background(), rpp, false, false); err == nil || err.Error() != expErr {
t.Errorf("Expected error <%v>, received error <%v>", expErr, err)
}
}
func TestDMSetRateProfileGetRateProfileErr(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetRateProfileDrvF: func(ctx *context.Context, s1, s2 string) (*utils.RateProfile, error) {
return &utils.RateProfile{}, utils.ErrNotImplemented
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rpp := &utils.RateProfile{
ID: "test_ID1",
Tenant: "cgrates.org",
FilterIDs: []string{"*string:*req.Account:1001"},
Rates: map[string]*utils.Rate{
"RT1": {
ID: "RT1",
IntervalRates: []*utils.IntervalRate{
{
IntervalStart: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(1, 2),
Unit: utils.NewDecimal(int64(time.Second), 0),
Increment: utils.NewDecimal(int64(time.Second), 0),
},
},
},
},
}
if err := dm.SetRateProfile(context.Background(), rpp, false, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetRateProfileUpdatedIndexesErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetRateProfileDrvF: func(ctx *context.Context, s1, s2 string) (*utils.RateProfile, error) {
return &utils.RateProfile{}, nil
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rpp := &utils.RateProfile{
ID: "test_ID1",
Tenant: "cgrates.org",
FilterIDs: []string{"*string:*req.Account:1001"},
Rates: map[string]*utils.Rate{
"RT1": {
ID: "RT1",
IntervalRates: []*utils.IntervalRate{
{
IntervalStart: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(1, 2),
Unit: utils.NewDecimal(int64(time.Second), 0),
Increment: utils.NewDecimal(int64(time.Second), 0),
},
},
},
},
}
if err := dm.SetRateProfile(context.Background(), rpp, true, true); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetRateProfileRatesSetRateProfileDrvErr(t *testing.T) {
Cache.Clear(nil)
rpp := &utils.RateProfile{
ID: "test_ID1",
Tenant: "cgrates.org",
FilterIDs: []string{"*string:~*req.Account:1001"},
Rates: map[string]*utils.Rate{},
}
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetRateProfileDrvF: func(ctx *context.Context, s1, s2 string) (*utils.RateProfile, error) {
return rpp, nil
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := dm.SetRateProfile(context.Background(), rpp, false, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetRateProfileReplicate(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
rpp := &utils.RateProfile{
ID: "test_ID1",
Tenant: "cgrates.org",
FilterIDs: []string{"*string:~*req.Account:1001"},
Rates: map[string]*utils.Rate{},
}
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaRateProfiles].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1SetRateProfile: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetRateProfileDrvF: func(ctx *context.Context, s1, s2 string) (*utils.RateProfile, error) {
return rpp, nil
},
SetRateProfileDrvF: func(ctx *context.Context, rp *utils.RateProfile, b bool) error { return nil },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
// tests replicate
if err := dm.SetRateProfile(context.Background(), rpp, false, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetActionProfileCacheGetErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := Cache.Set(context.Background(), utils.CacheActionProfiles, utils.ConcatenatedKey(utils.CGRateSorg, "ap1"), nil, []string{}, true, utils.NonTransactional); err != nil {
t.Error(err)
}
_, err := dm.GetActionProfile(context.Background(), utils.CGRateSorg, "ap1", true, false, utils.NonTransactional)
if err != utils.ErrNotFound {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotFound, err)
}
}
func TestDMGetActionProfileCacheGet(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
val := &utils.ActionProfile{
Tenant: "cgrates.org",
ID: "AP1",
FilterIDs: []string{"*string*req.Account1001"},
Weights: utils.DynamicWeights{
{
Weight: 65,
},
},
Schedule: "* * * * *",
Targets: map[string]utils.StringSet{utils.MetaAccounts: {"1001": {}}},
Actions: []*utils.APAction{{}}}
if err := Cache.Set(context.Background(), utils.CacheActionProfiles, utils.ConcatenatedKey(utils.CGRateSorg, "ap1"), val, []string{}, true, utils.NonTransactional); err != nil {
t.Error(err)
}
if rcv, err := dm.GetActionProfile(context.Background(), utils.CGRateSorg, "ap1", true, false, utils.NonTransactional); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(rcv, val) {
t.Errorf("Expected <%v>, received <%v>", val, rcv)
}
}
func TestDMGetActionProfileNilDmErr(t *testing.T) {
var dm *DataManager
_, err := dm.GetActionProfile(context.Background(), utils.CGRateSorg, "ap1", false, false, utils.NonTransactional)
if err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMGetActionProfileSetActionProfileDrvErr(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
config.SetCgrConfig(cfgtmp)
}()
ap := &utils.ActionProfile{
Tenant: "cgrates.org",
ID: "AP1",
FilterIDs: []string{"*string*req.Account1001"},
Weights: utils.DynamicWeights{
{
Weight: 65,
},
},
Schedule: "* * * * *",
Targets: map[string]utils.StringSet{utils.MetaAccounts: {"1001": {}}},
Actions: []*utils.APAction{{}},
}
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaActionProfiles].Remote = true
cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1GetActionProfile: func(ctx *context.Context, args, reply any) error { return nil },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetActionProfileDrvF: func(ctx *context.Context, tenant, ID string) (*utils.ActionProfile, error) {
return ap, utils.ErrNotFound
},
SetActionProfileDrvF: func(ctx *context.Context, ap *utils.ActionProfile) error { return utils.ErrNotImplemented },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
_, err := dm.GetActionProfile(context.Background(), utils.CGRateSorg, ap.ID, false, false, utils.NonTransactional)
if err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetActionProfileCacheWriteErr1(t *testing.T) {
ap := &utils.ActionProfile{
Tenant: "cgrates.org",
ID: "AP1",
FilterIDs: []string{"*string*req.Account1001"},
Weights: utils.DynamicWeights{
{
Weight: 65,
},
},
Schedule: "* * * * *",
Targets: map[string]utils.StringSet{utils.MetaAccounts: {"1001": {}}},
Actions: []*utils.APAction{{}},
}
cfgtmp := config.CgrConfig()
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheActionProfiles].Replicate = true
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error {
return utils.ErrNotImplemented
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
data := &DataDBMock{
GetActionProfileDrvF: func(ctx *context.Context, tenant, ID string) (*utils.ActionProfile, error) {
return ap, utils.ErrNotFound
},
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
Cache = NewCacheS(cfg, dm, cM, nil)
_, err := dm.GetActionProfile(context.Background(), utils.CGRateSorg, ap.ID, false, true, utils.NonTransactional)
if err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetActionProfileCacheWriteErr2(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheActionProfiles].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
ap := &utils.ActionProfile{
Tenant: "cgrates.org",
ID: "AP1",
FilterIDs: []string{"*string*req.Account1001"},
Weights: utils.DynamicWeights{
{
Weight: 65,
},
},
Schedule: "* * * * *",
Targets: map[string]utils.StringSet{utils.MetaAccounts: {"1001": {}}},
Actions: []*utils.APAction{{}},
}
if err := dm.dbConns.dataDBs[utils.MetaDefault].SetActionProfileDrv(context.Background(), ap); err != nil {
t.Error(err)
}
Cache = NewCacheS(cfg, dm, cM, nil)
if _, err := dm.GetActionProfile(context.Background(), utils.CGRateSorg, ap.ID, false, true, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetAttributeProfileCacheGetErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := Cache.Set(context.Background(), utils.CacheAttributeProfiles, utils.ConcatenatedKey(utils.CGRateSorg, "ap1"), nil, []string{}, true, utils.NonTransactional); err != nil {
t.Error(err)
}
_, err := dm.GetAttributeProfile(context.Background(), utils.CGRateSorg, "ap1", true, false, utils.NonTransactional)
if err != utils.ErrNotFound {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotFound, err)
}
}
func TestDMGetAttributeProfileCacheWriteErr1(t *testing.T) {
attrPrfl := &utils.AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"filtrId1"},
Attributes: []*utils.Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: utils.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
cfgtmp := config.CgrConfig()
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheAttributeProfiles].Replicate = true
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error {
return utils.ErrNotImplemented
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*utils.AttributeProfile, error) {
return attrPrfl, utils.ErrNotFound
},
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
Cache = NewCacheS(cfg, dm, cM, nil)
_, err := dm.GetAttributeProfile(context.Background(), utils.CGRateSorg, attrPrfl.ID, false, true, utils.NonTransactional)
if err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetAttributeProfileCacheWriteErr2(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheAttributeProfiles].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
attrPrfl := &utils.AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"filtrId1"},
Attributes: []*utils.Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: utils.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
if err := dm.dbConns.dataDBs[utils.MetaDefault].SetAttributeProfileDrv(context.Background(), attrPrfl); err != nil {
t.Error(err)
}
Cache = NewCacheS(cfg, dm, cM, nil)
if _, err := dm.GetAttributeProfile(context.Background(), utils.CGRateSorg, attrPrfl.ID, false, true, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGGetChargerProfileCacheGetErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := Cache.Set(context.Background(), utils.CacheChargerProfiles, utils.ConcatenatedKey(utils.CGRateSorg, "chp1"), nil, []string{}, true, utils.NonTransactional); err != nil {
t.Error(err)
}
_, err := dm.GetChargerProfile(context.Background(), utils.CGRateSorg, "chp1", true, false, utils.NonTransactional)
if err != utils.ErrNotFound {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotFound, err)
}
}
func TestDMGetChargerProfileNilDmErr(t *testing.T) {
var dm *DataManager
_, err := dm.GetChargerProfile(context.Background(), utils.CGRateSorg, "chp1", false, false, utils.NonTransactional)
if err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMSetStatQueueProfileUpdatedIndexesErr(t *testing.T) {
defer func() { Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil) }()
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetStatQueueProfileDrvF: func(ctx *context.Context, tenant, id string) (sq *StatQueueProfile, err error) {
return &StatQueueProfile{}, nil
},
SetStatQueueProfileDrvF: func(ctx *context.Context, sq *StatQueueProfile) (err error) { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
sqp := &StatQueueProfile{
Tenant: "cgrates.org",
ID: "sqp003",
FilterIDs: []string{"*string:~*req.Account:1001"},
QueueLength: 10,
TTL: 10 * time.Second,
Metrics: []*MetricWithFilters{
{
MetricID: "*sum#~*req.Usage",
},
},
ThresholdIDs: []string{},
Stored: true,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
MinItems: 1,
}
if err := dm.SetStatQueueProfile(context.Background(), sqp, true); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetStatQueueProfileReplicate(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
config.SetCgrConfig(cfgtmp)
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
}()
sqp := &StatQueueProfile{
Tenant: "cgrates.org",
ID: "sqp003",
FilterIDs: []string{"*string:~*req.Account:1001"},
QueueLength: 10,
TTL: 10 * time.Second,
Metrics: []*MetricWithFilters{
{
MetricID: "*sum#~*req.Usage",
},
},
ThresholdIDs: []string{},
Stored: true,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
MinItems: 1,
}
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaStatQueueProfiles].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1SetStatQueueProfile: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetStatQueueProfileDrvF: func(ctx *context.Context, tenant, id string) (sq *StatQueueProfile, err error) {
return sqp, nil
},
SetStatQueueProfileDrvF: func(ctx *context.Context, sq *StatQueueProfile) (err error) { return nil },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
// tests replicate
if err := dm.SetStatQueueProfile(context.Background(), sqp, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetStatQueueProfileNewStatQueueNilOldStsErr(t *testing.T) {
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
}()
var minItems int
sqp := &StatQueueProfile{
Tenant: "cgrates.org",
ID: "sqp003",
FilterIDs: []string{"*string:~*req.Account:1001"},
QueueLength: 10,
TTL: 10 * time.Second,
Metrics: []*MetricWithFilters{
{
MetricID: "invalid",
},
},
ThresholdIDs: []string{},
Stored: true,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
MinItems: minItems,
}
cfg := config.NewDefaultCGRConfig()
cM := NewConnManager(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
experr := fmt.Sprintf("unsupported metric type <%s>", sqp.Metrics[0].MetricID)
if err := dm.SetStatQueueProfile(context.Background(), sqp, false); err == nil || err.Error() != experr {
t.Errorf("\nexpected error: %v, \nreceived error: %v", experr, err)
}
}
func TestDMSetStatQueueProfileNewStatQueueErr(t *testing.T) {
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
}()
var minItems int
sqp := &StatQueueProfile{
Tenant: "cgrates.org",
ID: "sqp003",
FilterIDs: []string{"*string:~*req.Account:1001"},
QueueLength: 10,
TTL: 10 * time.Second,
Metrics: []*MetricWithFilters{
{
MetricID: "invalid",
},
},
ThresholdIDs: []string{},
Stored: true,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
MinItems: minItems,
}
cfg := config.NewDefaultCGRConfig()
cM := NewConnManager(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := dm.dbConns.dataDBs[utils.MetaDefault].SetStatQueueProfileDrv(context.Background(), sqp); err != nil {
t.Error(err)
}
experr := fmt.Sprintf("unsupported metric type <%s>", sqp.Metrics[0].MetricID)
if err := dm.SetStatQueueProfile(context.Background(), sqp, false); err == nil || err.Error() != experr {
t.Errorf("\nexpected error: %v, \nreceived error: %v", experr, err)
}
}
func TestDMRemoveStatQueueProfileNilDMErr(t *testing.T) {
var dm *DataManager
err := dm.RemoveStatQueueProfile(context.Background(), "tnt", "Id", false)
if err != utils.ErrNoDatabaseConn {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMRemoveStatQueueProfileGetStatQueueProfileErr(t *testing.T) {
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
}()
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetStatQueueProfileDrvF: func(ctx *context.Context, tenant, id string) (sq *StatQueueProfile, err error) {
return &StatQueueProfile{}, utils.ErrNotImplemented
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
err := dm.RemoveStatQueueProfile(context.Background(), "tnt", "Id", false)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveStatQueueProfileRemStatQueueProfileDrvErr(t *testing.T) {
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
}()
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetStatQueueProfileDrvF: func(ctx *context.Context, tenant, id string) (sq *StatQueueProfile, err error) {
return &StatQueueProfile{}, nil
},
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
sqp := &StatQueueProfile{
Tenant: "cgrates.org",
ID: "sqp003",
FilterIDs: []string{"*string:~*req.Account:1001"},
QueueLength: 10,
TTL: 10 * time.Second,
Metrics: []*MetricWithFilters{
{
MetricID: "*sum#~*req.Usage",
},
},
ThresholdIDs: []string{},
Stored: true,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
MinItems: 1,
}
err := dm.RemoveStatQueueProfile(context.Background(), sqp.Tenant, sqp.ID, true)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveStatQueueProfileNilOldStsErr(t *testing.T) {
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
}()
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
var Id string
var tnt string
err := dm.RemoveStatQueueProfile(context.Background(), tnt, Id, false)
if err != utils.ErrNotFound {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotFound, err)
}
}
func TestDMRemoveStatQueueProfileRmvItemFromFiltrIndexErr(t *testing.T) {
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
}()
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetStatQueueProfileDrvF: func(ctx *context.Context, tenant, id string) (sq *StatQueueProfile, err error) {
return &StatQueueProfile{}, nil
},
RemStatQueueProfileDrvF: func(ctx *context.Context, tenant, ID string) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
sqp := &StatQueueProfile{
Tenant: "cgrates.org",
ID: "sqp003",
FilterIDs: []string{"*string:~*req.Account:1001"},
QueueLength: 10,
TTL: 10 * time.Second,
Metrics: []*MetricWithFilters{
{
MetricID: "*sum#~*req.Usage",
},
},
ThresholdIDs: []string{},
Stored: true,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
MinItems: 1,
}
err := dm.RemoveStatQueueProfile(context.Background(), sqp.Tenant, sqp.ID, true)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveStatQueueProfileRmvIndexFiltersItemErr(t *testing.T) {
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
}()
sqp := &StatQueueProfile{
Tenant: "cgrates.org",
ID: "sqp003",
FilterIDs: []string{"fltrID1"},
QueueLength: 10,
TTL: 10 * time.Second,
Metrics: []*MetricWithFilters{
{
MetricID: "*sum#~*req.Usage",
},
},
ThresholdIDs: []string{},
Stored: true,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
MinItems: 1,
}
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetStatQueueProfileDrvF: func(ctx *context.Context, tenant, id string) (sq *StatQueueProfile, err error) {
return sqp, nil
},
RemStatQueueProfileDrvF: func(ctx *context.Context, tenant, ID string) error { return nil },
}
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
err := dm.RemoveStatQueueProfile(context.Background(), sqp.Tenant, sqp.ID, true)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveStatQueueProfileReplicate(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
config.SetCgrConfig(cfgtmp)
}()
sqp := &StatQueueProfile{
Tenant: "cgrates.org",
ID: "sqp003",
FilterIDs: []string{"*string:~*req.Account:1001"},
QueueLength: 10,
TTL: 10 * time.Second,
Metrics: []*MetricWithFilters{
{
MetricID: "*sum#~*req.Usage",
},
},
ThresholdIDs: []string{},
Stored: true,
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
MinItems: 1,
}
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaStatQueueProfiles].Replicate = true
cfg.DbCfg().DBConns[utils.MetaDefault].RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1RemoveStatQueueProfile: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetStatQueueProfileDrvF: func(ctx *context.Context, tenant, id string) (sq *StatQueueProfile, err error) {
return sqp, nil
},
RemStatQueueProfileDrvF: func(ctx *context.Context, tenant, ID string) error { return nil },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
// tests replicate
dm.RemoveStatQueueProfile(context.Background(), sqp.Tenant, sqp.ID, false)
}
func TestDMGetStatQueueCacheWriteErr1(t *testing.T) {
sq := &StatQueue{
Tenant: "cgrates.org",
ID: "sq01",
SQItems: []SQItem{
{
EventID: "SqProcessEvent",
},
},
SQMetrics: make(map[string]StatMetric),
}
cfgtmp := config.CgrConfig()
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheStatQueues].Replicate = true
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error {
return utils.ErrNotImplemented
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
data := &DataDBMock{
GetStatQueueDrvF: func(ctx *context.Context, tenant, id string) (sq *StatQueue, err error) { return sq, utils.ErrNotFound },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
Cache = NewCacheS(cfg, dm, cM, nil)
_, err := dm.GetStatQueue(context.Background(), utils.CGRateSorg, sq.ID, false, true, utils.NonTransactional)
if err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetChargerProfileSetChargerProfileDrvErr(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cpp := &utils.ChargerProfile{
Tenant: "cgrates.org",
ID: "CHP_1",
FilterIDs: []string{"*string:~*req.Account:1001"},
RunID: "*rated",
AttributeIDs: []string{"ATTR_1"},
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
}
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaChargerProfiles].Remote = true
cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1GetChargerProfile: func(ctx *context.Context, args, reply any) error { return nil },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetChargerProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ChargerProfile, error) {
return cpp, utils.ErrNotFound
},
SetChargerProfileDrvF: func(ctx *context.Context, chr *utils.ChargerProfile) (err error) { return utils.ErrNotImplemented },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
_, err := dm.GetChargerProfile(context.Background(), utils.CGRateSorg, cpp.ID, false, false, utils.NonTransactional)
if err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetChargerProfileCacheWriteErr1(t *testing.T) {
cpp := &utils.ChargerProfile{
Tenant: "cgrates.org",
ID: "CHP_1",
FilterIDs: []string{"*string:~*req.Account:1001"},
RunID: "*rated",
AttributeIDs: []string{"ATTR_1"},
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
}
cfgtmp := config.CgrConfig()
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheChargerProfiles].Replicate = true
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error {
return utils.ErrNotImplemented
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
data := &DataDBMock{
GetChargerProfileDrvF: func(ctx *context.Context, tnt, id string) (*utils.ChargerProfile, error) {
return cpp, utils.ErrNotFound
},
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
Cache = NewCacheS(cfg, dm, cM, nil)
_, err := dm.GetChargerProfile(context.Background(), utils.CGRateSorg, cpp.ID, false, true, utils.NonTransactional)
if err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetChargerProfileCacheWriteErr2(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheChargerProfiles].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
cpp := &utils.ChargerProfile{
Tenant: "cgrates.org",
ID: "CHP_1",
FilterIDs: []string{"*string:~*req.Account:1001"},
RunID: "*rated",
AttributeIDs: []string{"ATTR_1"},
Weights: utils.DynamicWeights{
{
Weight: 20,
},
},
}
if err := dm.dbConns.dataDBs[utils.MetaDefault].SetChargerProfileDrv(context.Background(), cpp); err != nil {
t.Error(err)
}
Cache = NewCacheS(cfg, dm, cM, nil)
if _, err := dm.GetChargerProfile(context.Background(), utils.CGRateSorg, cpp.ID, false, true, utils.NonTransactional); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetItemLoadIDsNilDM(t *testing.T) {
var dm *DataManager
_, err := dm.GetItemLoadIDs(context.Background(), "", false)
if err != utils.ErrNoDatabaseConn {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMGetItemLoadIDsSetSetLoadIDsDrvErr(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
config.SetCgrConfig(cfgtmp)
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
}()
cfg := config.NewDefaultCGRConfig()
cfg.DbCfg().Items[utils.MetaLoadIDs].Remote = true
cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1GetItemLoadIDs: func(ctx *context.Context, args, reply any) error { return nil },
},
}
itmLIDs := map[string]int64{
"ID_1": 21,
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetItemLoadIDsDrvF: func(ctx *context.Context, itemIDPrefix string) (loadIDs map[string]int64, err error) {
return itmLIDs, utils.ErrNotFound
},
SetLoadIDsDrvF: func(ctx *context.Context, loadIDs map[string]int64) error { return utils.ErrNotImplemented },
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
_, err := dm.GetItemLoadIDs(context.Background(), cfg.GeneralCfg().DefaultTenant, false)
if err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetItemLoadIDsCacheWriteErr1(t *testing.T) {
itmLIDs := map[string]int64{
"ID_1": 21,
}
cfgtmp := config.CgrConfig()
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheLoadIDs].Replicate = true
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error {
return utils.ErrNotImplemented
},
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
data := &DataDBMock{
GetItemLoadIDsDrvF: func(ctx *context.Context, itemIDPrefix string) (loadIDs map[string]int64, err error) {
return itmLIDs, utils.ErrNotFound
},
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
Cache = NewCacheS(cfg, dm, cM, nil)
_, err := dm.GetItemLoadIDs(context.Background(), cfg.GeneralCfg().DefaultTenant, true)
if err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetItemLoadIDsCacheWriteErr2(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
config.SetCgrConfig(cfgtmp)
}()
cfg := config.NewDefaultCGRConfig()
cfg.CacheCfg().ReplicationConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
cfg.CacheCfg().Partitions[utils.CacheLoadIDs].Replicate = true
config.SetCgrConfig(cfg)
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.CacheSv1ReplicateSet: func(ctx *context.Context, args, reply any) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.CacheSv1, cc)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
itmLIDs := map[string]int64{
"ID_1": 21,
}
if err := dm.dbConns.dataDBs[utils.MetaDefault].SetLoadIDsDrv(context.Background(), itmLIDs); err != nil {
t.Error(err)
}
Cache = NewCacheS(cfg, dm, cM, nil)
_, err := dm.GetItemLoadIDs(context.Background(), cfg.GeneralCfg().DefaultTenant, true)
if err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetRateProfileCacheGetOK(t *testing.T) {
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
}()
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
rP := &utils.RateProfile{
ID: "test_ID1",
Tenant: "cgrates.org",
FilterIDs: []string{"*string:*req.Account:1001"},
Rates: map[string]*utils.Rate{
"RT1": {
ID: "RT1",
IntervalRates: []*utils.IntervalRate{
{
IntervalStart: utils.NewDecimal(0, 0),
RecurrentFee: utils.NewDecimal(1, 2),
Unit: utils.NewDecimal(int64(time.Second), 0),
Increment: utils.NewDecimal(int64(time.Second), 0),
},
},
},
},
}
if err := Cache.Set(context.Background(), utils.CacheRateProfiles, utils.ConcatenatedKey(utils.CGRateSorg, "rp1"), rP, []string{}, true, utils.NonTransactional); err != nil {
t.Error(err)
}
if rcv, err := dm.GetRateProfile(context.Background(), utils.CGRateSorg, "rp1", true, false, utils.NonTransactional); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(rcv, rP) {
t.Errorf("Expected <%v>, received <%v>", rP, rcv)
}
}
func TestDMGetRateProfileCacheGetErr(t *testing.T) {
defer func() {
Cache = NewCacheS(config.NewDefaultCGRConfig(), nil, nil, nil)
}()
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, cM)
if err := Cache.Set(context.Background(), utils.CacheRateProfiles, utils.ConcatenatedKey(utils.CGRateSorg, "rp1"), nil, []string{}, true, utils.NonTransactional); err != nil {
t.Error(err)
}
_, err := dm.GetRateProfile(context.Background(), utils.CGRateSorg, "rp1", true, false, utils.NonTransactional)
if err != utils.ErrNotFound {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotFound, err)
}
}
func TestDMGetRateProfileNildm(t *testing.T) {
var dm *DataManager
_, err := dm.GetRateProfile(context.Background(), utils.CGRateSorg, "rp1", false, false, utils.NonTransactional)
if err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMResourcesUpdateResource(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
idb, err := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
if err != nil {
t.Error(err)
}
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: idb}, cfg.DbCfg())
dm := NewDataManager(dbCM, cfg, nil)
Cache.Clear(nil)
res := &utils.ResourceProfile{
Tenant: "cgrates.org",
ID: "RES1",
UsageTTL: 0,
Limit: 10,
Stored: true,
}
r := &utils.Resource{
Tenant: res.Tenant,
ID: res.ID,
Usages: map[string]*utils.ResourceUsage{
"jkbdfgs": {
Tenant: res.Tenant,
ID: "jkbdfgs",
ExpiryTime: time.Now(),
Units: 5,
},
},
TTLIdx: []string{"jkbdfgs"},
}
expR := &utils.Resource{
Tenant: res.Tenant,
ID: res.ID,
Usages: make(map[string]*utils.ResourceUsage),
}
if err := dm.SetResourceProfile(context.Background(), res, true); err != nil {
t.Fatal(err)
}
if r, err := dm.GetResource(context.Background(), res.Tenant, res.ID, false, false, utils.NonTransactional); err != nil {
t.Fatal(err)
} else if !reflect.DeepEqual(r, expR) {
t.Errorf("Expected: %s, received: %s", utils.ToJSON(expR), utils.ToJSON(r))
}
if err := dm.RemoveResource(context.Background(), r.Tenant, r.ID); err != nil {
t.Fatal(err)
}
if err := dm.SetResourceProfile(context.Background(), res, true); err != nil {
t.Fatal(err)
}
if r, err := dm.GetResource(context.Background(), res.Tenant, res.ID, false, false, utils.NonTransactional); err != nil {
t.Fatal(err)
} else if !reflect.DeepEqual(r, expR) {
t.Errorf("Expected: %s, received: %s", utils.ToJSON(expR), utils.ToJSON(r))
}
if err := dm.SetResource(context.Background(), r); err != nil {
t.Fatal(err)
}
res = &utils.ResourceProfile{
Tenant: "cgrates.org",
ID: "RES1",
UsageTTL: 0,
Limit: 5,
Stored: true,
}
if err := dm.SetResourceProfile(context.Background(), res, true); err != nil {
t.Fatal(err)
}
if r, err := dm.GetResource(context.Background(), res.Tenant, res.ID, false, false, utils.NonTransactional); err != nil {
t.Fatal(err)
} else if !reflect.DeepEqual(r, expR) {
t.Errorf("Expected: %s, received: %s", utils.ToJSON(expR), utils.ToJSON(r))
}
if err := dm.SetResource(context.Background(), r); err != nil {
t.Fatal(err)
}
res = &utils.ResourceProfile{
Tenant: "cgrates.org",
ID: "RES1",
UsageTTL: 10,
Limit: 5,
Stored: true,
}
if err := dm.SetResourceProfile(context.Background(), res, true); err != nil {
t.Fatal(err)
}
if r, err := dm.GetResource(context.Background(), res.Tenant, res.ID, false, false, utils.NonTransactional); err != nil {
t.Fatal(err)
} else if !reflect.DeepEqual(r, expR) {
t.Errorf("Expected: %s, received: %s", utils.ToJSON(expR), utils.ToJSON(r))
}
if err := dm.SetResource(context.Background(), r); err != nil {
t.Fatal(err)
}
res = &utils.ResourceProfile{
Tenant: "cgrates.org",
ID: "RES1",
UsageTTL: 10,
Limit: 5,
Stored: false,
}
if err := dm.SetResourceProfile(context.Background(), res, true); err != nil {
t.Fatal(err)
}
if r, err := dm.GetResource(context.Background(), res.Tenant, res.ID, false, false, utils.NonTransactional); err != nil {
t.Fatal(err)
} else if !reflect.DeepEqual(r, expR) {
t.Errorf("Expected: %s, received: %s", utils.ToJSON(expR), utils.ToJSON(r))
}
if err := dm.RemoveResourceProfile(context.Background(), res.Tenant, res.ID, true); err != nil {
t.Fatal(err)
}
if _, err := dm.GetResource(context.Background(), res.Tenant, res.ID, false, false, utils.NonTransactional); err != utils.ErrNotFound {
t.Fatal(err)
}
dm.DataDB()[utils.MetaDefault].Flush(utils.EmptyString)
}
func TestDMGetTrend(t *testing.T) {
var dm *DataManager
if _, err := dm.GetTrend(context.Background(), utils.CGRateSorg, "TrendNil", false, false, utils.NonTransactional); err != utils.ErrNoDatabaseConn {
t.Errorf("expected ErrNoDatabaseConn, got %v", err)
}
tmp := Cache
cfgtmp := config.CgrConfig()
defer func() {
Cache = tmp
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data, _ := NewInternalDB(nil, nil, nil, cfg.DbCfg().Items)
cM := NewConnManager(cfg)
dbCM := NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm = NewDataManager(dbCM, cfg, cM)
tntID := utils.ConcatenatedKey(utils.CGRateSorg, "TrendCacheNil")
if err := Cache.Set(context.Background(), utils.CacheTrends, tntID, nil, []string{}, true, utils.NonTransactional); err != nil {
t.Fatal(err)
}
if _, err := dm.GetTrend(context.Background(), utils.CGRateSorg, "TrendCacheNil", true, false, utils.NonTransactional); err != utils.ErrNotFound {
t.Errorf("expected ErrNotFound, got %v", err)
}
Cache.Clear(nil)
tr := &utils.Trend{
Tenant: "cgrates.org",
ID: "TrendOk",
RunTimes: []time.Time{
time.Now(),
},
Metrics: map[time.Time]map[string]*utils.MetricWithTrend{
time.Now(): {
"metric1": {
ID: "metric1",
Value: 5,
TrendGrowth: 0.5,
TrendLabel: "*positive",
},
},
},
}
if err := dm.dbConns.dataDBs[utils.MetaDefault].SetTrendDrv(context.Background(), tr); err != nil {
t.Fatalf("failed SetTrendDrv: %v", err)
}
got, err := dm.GetTrend(context.Background(), utils.CGRateSorg, "TrendOk", false, true, utils.NonTransactional)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if got.ID != "TrendOk" {
t.Fatalf("expected TrendOk, got %s", got.ID)
}
Cache.Clear(nil)
if _, err := dm.GetTrend(context.Background(), utils.CGRateSorg, "TrendNotFound", false, true, utils.NonTransactional); err != nil && err != utils.ErrNotFound {
t.Errorf("expected ErrNotFound, got %v", err)
}
Cache.Clear(nil)
cfg.DbCfg().Items[utils.MetaTrends].Remote = true
cfg.DbCfg().DBConns[utils.MetaDefault].RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args any, reply any) error{
utils.ReplicatorSv1GetTrend: func(ctx *context.Context, args, reply any) error {
return utils.ErrNotFound
},
},
}
cM = NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, cc)
dbCM = NewDBConnManager(map[string]DataDB{utils.MetaDefault: data}, cfg.DbCfg())
dm = NewDataManager(dbCM, cfg, cM)
if _, err := dm.GetTrend(context.Background(), utils.CGRateSorg, "TrendRemote", false, true, utils.NonTransactional); err != nil && err != utils.ErrNotFound {
t.Errorf("expected ErrNotFound or nil, got %v", err)
}
}
func TestDataDBGetIPProfileDrv(t *testing.T) {
ctx := &context.Context{}
tenant := "cgrates.org"
id := "ip1"
dbNil := &DataDBMock{}
profile, err := dbNil.GetIPProfileDrv(ctx, tenant, id)
if profile != nil {
t.Errorf("expected profile to be nil, got %+v", profile)
}
if err != utils.ErrNotImplemented {
t.Errorf("expected ErrNotImplemented, got %v", err)
}
expectedProfile := &utils.IPProfile{
Tenant: tenant,
ID: id,
FilterIDs: []string{"f1", "f2"},
Weights: nil,
TTL: 5 * time.Minute,
Stored: true,
Pools: nil,
}
dbMock := &DataDBMock{
GetIPProfileDrvF: func(ctx *context.Context, tnt, iid string) (*utils.IPProfile, error) {
if tnt != tenant || iid != id {
t.Errorf("unexpected arguments: got %s, %s", tnt, iid)
}
return expectedProfile, nil
},
}
profile2, err2 := dbMock.GetIPProfileDrv(ctx, tenant, id)
if err2 != nil {
t.Errorf("expected no error, got %v", err2)
}
if profile2 != expectedProfile {
t.Errorf("expected profile %+v, got %+v", expectedProfile, profile2)
}
}
func TestDataDBSetIPProfileDrv(t *testing.T) {
ctx := &context.Context{}
ipp := &utils.IPProfile{
Tenant: "cgrates.org",
ID: "ip1",
FilterIDs: []string{"f1", "f2"},
TTL: 5 * time.Minute,
Stored: true,
}
dbNil := &DataDBMock{}
err := dbNil.SetIPProfileDrv(ctx, ipp)
if err != utils.ErrNotImplemented {
t.Errorf("expected ErrNotImplemented, got %v", err)
}
called := false
dbMock := &DataDBMock{
SetIPProfileDrvF: func(ctx *context.Context, ip *utils.IPProfile) error {
called = true
if ip != ipp {
t.Errorf("expected IPProfile %+v, got %+v", ipp, ip)
}
return nil
},
}
err2 := dbMock.SetIPProfileDrv(ctx, ipp)
if err2 != nil {
t.Errorf("expected no error, got %v", err2)
}
if !called {
t.Errorf("expected SetIPProfileDrvF to be called")
}
expectedErr := utils.ErrNotFound
dbMock2 := &DataDBMock{
SetIPProfileDrvF: func(ctx *context.Context, ip *utils.IPProfile) error {
return expectedErr
},
}
err3 := dbMock2.SetIPProfileDrv(ctx, ipp)
if err3 != expectedErr {
t.Errorf("expected error %v, got %v", expectedErr, err3)
}
}
func TestDataDBRemoveIPProfileDrv(t *testing.T) {
ctx := &context.Context{}
tenant := "cgrates.org"
id := "ip1"
dbNil := &DataDBMock{}
err := dbNil.RemoveIPProfileDrv(ctx, tenant, id)
if err != utils.ErrNotImplemented {
t.Errorf("expected ErrNotImplemented, got %v", err)
}
called := false
dbMock := &DataDBMock{
RemoveIPProfileDrvF: func(ctx *context.Context, tntArg, idArg string) error {
called = true
if tntArg != tenant || idArg != id {
t.Errorf("unexpected arguments: got %s, %s", tntArg, idArg)
}
return nil
},
}
err2 := dbMock.RemoveIPProfileDrv(ctx, tenant, id)
if err2 != nil {
t.Errorf("expected no error, got %v", err2)
}
if !called {
t.Errorf("expected RemoveIPProfileDrvF to be called")
}
expectedErr := utils.ErrNotFound
dbMock2 := &DataDBMock{
RemoveIPProfileDrvF: func(ctx *context.Context, tntArg, idArg string) error {
return expectedErr
},
}
err3 := dbMock2.RemoveIPProfileDrv(ctx, tenant, id)
if err3 != expectedErr {
t.Errorf("expected error %v, got %v", expectedErr, err3)
}
}