diff --git a/config/config_it_test.go b/config/config_it_test.go index cb925da2d..ec3755b93 100644 --- a/config/config_it_test.go +++ b/config/config_it_test.go @@ -1418,3 +1418,38 @@ func (responseTest) Write([]byte) (int, error) { } func (responseTest) WriteHeader(int) {} + +func TestGetLockFilePath(t *testing.T) { + l := LoaderSCfg{ + ID: "file", + LockFilePath: "../tmp/file.txt", + TpInDir: "/home", + } + + exp := "/tmp/file.txt" + pathL := l.GetLockFilePath() + if pathL != exp { + t.Errorf("Expected %s \n but received \n %s", exp, pathL) + } + + l.LockFilePath = "file.txt" + pathL = l.GetLockFilePath() + exp = "/home/file.txt" + if pathL != exp { + t.Errorf("Expected %s \n but received \n %s", exp, pathL) + } + + if err := os.Mkdir(path.Join("/tmp", "TestGetLockFilePath"), 0777); err != nil { + t.Error(err) + } + l.LockFilePath = "TestGetLockFilePath" + l.TpInDir = "/tmp" + pathL = l.GetLockFilePath() + exp = "/tmp/TestGetLockFilePath/file.lck" + if pathL != exp { + t.Errorf("Expected %s \n but received \n %s", exp, pathL) + } + if err := os.RemoveAll(path.Join("/tmp", "TestGetLockFilePath")); err != nil { + t.Error(err) + } +} diff --git a/config/config_json_test.go b/config/config_json_test.go index a90ce6ebd..3c05350ee 100644 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -22,6 +22,7 @@ import ( "fmt" "reflect" "testing" + "time" "github.com/cgrates/birpc/context" "github.com/cgrates/cgrates/utils" @@ -579,30 +580,14 @@ func TestSmgJsonCfg(t *testing.T) { Publickey_path: utils.StringPointer(""), }, Opts: &SessionsOptsJson{ - Accounts: []*utils.DynamicBoolOpt{}, - Attributes: []*utils.DynamicBoolOpt{}, - CDRs: []*utils.DynamicBoolOpt{}, - Chargers: []*utils.DynamicBoolOpt{}, - Resources: []*utils.DynamicBoolOpt{}, - Routes: []*utils.DynamicBoolOpt{}, - Stats: []*utils.DynamicBoolOpt{}, - Thresholds: []*utils.DynamicBoolOpt{}, - Initiate: []*utils.DynamicBoolOpt{}, - Update: []*utils.DynamicBoolOpt{}, - Terminate: []*utils.DynamicBoolOpt{}, - Message: []*utils.DynamicBoolOpt{}, - AttributesDerivedReply: []*utils.DynamicBoolOpt{}, - BlockerError: []*utils.DynamicBoolOpt{}, - CDRsDerivedReply: []*utils.DynamicBoolOpt{}, - ResourcesAuthorize: []*utils.DynamicBoolOpt{}, - ResourcesAllocate: []*utils.DynamicBoolOpt{}, - ResourcesRelease: []*utils.DynamicBoolOpt{}, - ResourcesDerivedReply: []*utils.DynamicBoolOpt{}, - RoutesDerivedReply: []*utils.DynamicBoolOpt{}, - StatsDerivedReply: []*utils.DynamicBoolOpt{}, - ThresholdsDerivedReply: []*utils.DynamicBoolOpt{}, - MaxUsage: []*utils.DynamicBoolOpt{}, - ForceDuration: []*utils.DynamicBoolOpt{}, + Attributes: []*utils.DynamicBoolOpt{}, + Chargers: []*utils.DynamicBoolOpt{}, + Stats: []*utils.DynamicBoolOpt{}, + Thresholds: []*utils.DynamicBoolOpt{}, + Initiate: []*utils.DynamicBoolOpt{}, + Update: []*utils.DynamicBoolOpt{}, + Terminate: []*utils.DynamicBoolOpt{}, + Message: []*utils.DynamicBoolOpt{}, }, } dfCgrJSONCfg, err := NewCgrJsonCfgFromBytes([]byte(CGRATES_CFG_JSON)) @@ -613,7 +598,7 @@ func TestSmgJsonCfg(t *testing.T) { if err := dfCgrJSONCfg.GetSection(context.Background(), SessionSJSON, cfg); err != nil { t.Error(err) } else if !reflect.DeepEqual(eCfg, cfg) { - t.Error("Received: ", cfg) + t.Errorf("Expected %v \n but Received \n %v ", utils.ToJSON(eCfg), utils.ToJSON(cfg)) } } @@ -2350,3 +2335,28 @@ func TestSetSection(t *testing.T) { t.Error(err) } } + +func TestConfigJsonCloneSection(t *testing.T) { + s := Sections{ + &CoreSCfg{ + Caps: 2, + CapsStrategy: "*busy", + CapsStatsInterval: 2 * time.Second, + ShutdownTimeout: 3 * time.Second, + }, + } + + exp := []Section{ + &CoreSCfg{ + Caps: 2, + CapsStrategy: "*busy", + CapsStatsInterval: 2 * time.Second, + ShutdownTimeout: 3 * time.Second, + }, + } + + c := s.Clone() + if !reflect.DeepEqual(exp[0], c[0]) { + t.Errorf("Expected %v \n bu received \n %v", exp, c) + } +} diff --git a/config/config_test.go b/config/config_test.go index 181fa9de3..89d1b3582 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -6293,6 +6293,45 @@ func TestConfigDBCfg(t *testing.T) { } } +func TestConfigDBLoadFromJson(t *testing.T) { + dbCfg := &ConfigDBCfg{} + jsonCfg := &DbJsonCfg{ + Db_port: utils.IntPointer(-1), + } + if err := dbCfg.loadFromJSONCfg(jsonCfg); err != nil { + t.Error(err) + } + if err := dbCfg.loadFromJSONCfg(nil); err != nil { + t.Error(err) + } +} + +func TestConfigDBCloneSection(t *testing.T) { + dbCfg := ConfigDBCfg{ + Type: "*internal", + Host: "localhost", + Port: "2013", + Name: "dbname", + User: "cgrates", + Password: "superSecretPassword", + Opts: &DataDBOpts{}, + } + + exp := &ConfigDBCfg{ + Type: "*internal", + Host: "localhost", + Port: "2013", + Name: "dbname", + User: "cgrates", + Password: "superSecretPassword", + Opts: &DataDBOpts{}, + } + + rcv := dbCfg.CloneSection() + if !reflect.DeepEqual(exp, rcv) { + t.Errorf("Expected %v \n but recevived \n %v", exp, rcv) + } +} func TestFreeSwitchAgentCloneSection(t *testing.T) { fsAgCfg := FsAgentCfg{ Enabled: true, diff --git a/config/loadercgrcfg_test.go b/config/loadercgrcfg_test.go index c65b83b7b..ce8b4bbe0 100644 --- a/config/loadercgrcfg_test.go +++ b/config/loadercgrcfg_test.go @@ -19,6 +19,7 @@ package config import ( "encoding/json" + "fmt" "reflect" "testing" @@ -211,32 +212,32 @@ func TestDiffLoaderCfgJsonCase2(t *testing.T) { } } -// func TestLoaderCfgCloneSection(t *testing.T) { -// ldrCfg := LoaderCgrCfg{ -// TpID: "loaderID", -// DataPath: "/data/path", -// DisableReverse: false, -// FieldSeparator: rune(22), -// CachesConns: []string{"*localhost"}, -// ActionSConns: []string{"*localhost"}, -// GapiCredentials: nil, -// GapiToken: nil, -// } +func TestLoaderCfgCloneSection(t *testing.T) { + ldrCfg := &LoaderCgrCfg{ + TpID: "loaderID", + DataPath: "/data/path", + DisableReverse: false, + FieldSeparator: rune(22), + CachesConns: []string{"*localhost"}, + ActionSConns: []string{"*localhost"}, + GapiCredentials: json.RawMessage{}, + GapiToken: json.RawMessage{}, + } -// exp := &LoaderCgrCfg{ -// TpID: "loaderID", -// DataPath: "/data/path", -// DisableReverse: false, -// FieldSeparator: rune(22), -// CachesConns: []string{"*localhost"}, -// ActionSConns: []string{"*localhost"}, -// GapiCredentials: nil, -// GapiToken: nil, -// } + exp := &LoaderCgrCfg{ + TpID: "loaderID", + DataPath: "/data/path", + DisableReverse: false, + FieldSeparator: rune(22), + CachesConns: []string{"*localhost"}, + ActionSConns: []string{"*localhost"}, + GapiCredentials: json.RawMessage{}, + GapiToken: json.RawMessage{}, + } -// rcv := ldrCfg.CloneSection() -// fmt.Println(utils.ToJSON(rcv)) -// if !reflect.DeepEqual(rcv.(*LoaderCgrCfg), exp) { -// t.Errorf("Expected %+v \n but received \n %v", exp, rcv) -// } -// } + rcv := ldrCfg.CloneSection() + fmt.Println(utils.ToJSON(rcv)) + if !reflect.DeepEqual(rcv.(*LoaderCgrCfg), exp) { + t.Errorf("Expected %+v \n but received \n %v", exp, rcv) + } +} diff --git a/config/loaderscfg_test.go b/config/loaderscfg_test.go index 7d7cdf4ad..111e56466 100644 --- a/config/loaderscfg_test.go +++ b/config/loaderscfg_test.go @@ -1467,6 +1467,12 @@ func TestLoaderSCfgloadFromJsonCfgCase6(t *testing.T) { } } +func TestLoaderSCfgloadFromJsonCfgCase7(t *testing.T) { + cfg := &LoaderSCfg{} + if err := cfg.loadFromJSONCfg(nil, nil, ""); err != nil { + t.Error(err) + } +} func TestEnabledCase1(t *testing.T) { jsonCfg := NewDefaultCGRConfig() @@ -2930,46 +2936,71 @@ func TestLockFolderIsDir(t *testing.T) { } } -// func TestLoaderSCloneSection(t *testing.T) { -// ldrsCfg := LoaderSCfgs{ -// { -// ID: "LoaderID", -// Enabled: false, -// Tenant: "cgrates.org", -// DryRun: false, -// RunDelay: 1 * time.Millisecond, -// LockFilePath: "lockFileName", -// CacheSConns: []string{"*localhost"}, -// FieldSeparator: ";", -// TpInDir: "/tp/in/dir", -// TpOutDir: "/tp/out/dir", -// Data: nil, -// }, -// } +func TestLoaderSCloneSection(t *testing.T) { + ldrsCfg := LoaderSCfgs{ + { + ID: "LoaderID", + Enabled: false, + Tenant: "cgrates.org", + DryRun: false, + RunDelay: 1 * time.Millisecond, + LockFilePath: "lockFileName", + CacheSConns: []string{"*localhost"}, + FieldSeparator: ";", + TpInDir: "/tp/in/dir", + TpOutDir: "/tp/out/dir", + Data: []*LoaderDataType{ + { + Type: "*csv", + Filename: "test", + Flags: utils.FlagsWithParams{ + "k1": map[string][]string{ + "k2": {"f1", "f2"}, + }, + }, + Fields: []*FCTemplate{ + {Tag: "Tenant", + Path: utils.MetaRep + utils.NestingSep + utils.Tenant, Type: utils.MetaVariable, + Value: NewRSRParsersMustCompile("cgrates.org", utils.InfieldSep)}, + }, + }, + }, + }, + } -// exp := LoaderSCfgs{ -// { -// ID: "LoaderID", -// Enabled: false, -// Tenant: "cgrates.org", -// DryRun: false, -// RunDelay: 1 * time.Millisecond, -// LockFilePath: "lockFileName", -// CacheSConns: []string{"*localhost"}, -// FieldSeparator: ";", -// TpInDir: "/tp/in/dir", -// TpOutDir: "/tp/out/dir", -// Data: nil, -// }, -// } + exp := LoaderSCfgs{ + { + ID: "LoaderID", + Enabled: false, + Tenant: "cgrates.org", + DryRun: false, + RunDelay: 1 * time.Millisecond, + LockFilePath: "lockFileName", + CacheSConns: []string{"*localhost"}, + FieldSeparator: ";", + TpInDir: "/tp/in/dir", + TpOutDir: "/tp/out/dir", + Data: []*LoaderDataType{ + { + Type: "*csv", + Filename: "test", + Flags: utils.FlagsWithParams{ + "k1": map[string][]string{ + "k2": {"f1", "f2"}, + }, + }, + Fields: []*FCTemplate{ + {Tag: "Tenant", + Path: utils.MetaRep + utils.NestingSep + utils.Tenant, Type: utils.MetaVariable, + Value: NewRSRParsersMustCompile("cgrates.org", utils.InfieldSep)}, + }, + }, + }, + }, + } -// rcv := ldrsCfg.CloneSection() -// idk, ok := rcv.(*LoaderSCfgs) -// if !ok { -// t.Error("Err") -// } -// (*idk)[0].Data = nil -// if !reflect.DeepEqual(rcv, exp) { -// t.Errorf("Expected %v \n but received \n %v", utils.ToJSON(exp), utils.ToJSON(rcv)) -// } -// } + rcv := ldrsCfg.CloneSection() + if !reflect.DeepEqual((*rcv.(*LoaderSCfgs))[0], exp[0]) { + t.Errorf("Expected %v \n but received \n %v", utils.ToJSON(exp[0]), utils.ToJSON((*rcv.(*LoaderSCfgs))[0])) + } +} diff --git a/config/rpcconn_test.go b/config/rpcconn_test.go index d4cf73a6f..612be628c 100644 --- a/config/rpcconn_test.go +++ b/config/rpcconn_test.go @@ -165,6 +165,60 @@ func TestRPCConnsloadFromJsonCfgCase2(t *testing.T) { } } +func TestRemoteHostLoadFromJSONCfg(t *testing.T) { + rh := &RemoteHost{} + jsnCfg := &RemoteHostJson{ + Connect_timeout: utils.StringPointer("2c"), + // Reply_timeout: utils.StringPointer("2c"), + } + errExpect := `time: unknown unit "c" in duration "2c"` + if err := rh.loadFromJSONCfg(jsnCfg); err == nil || err.Error() != errExpect { + t.Errorf("Expected %v \n but received \n %v", errExpect, err.Error()) + } + + jsnCfg = &RemoteHostJson{ + Connect_timeout: utils.StringPointer("2s"), + Reply_timeout: utils.StringPointer("2c"), + } + if err := rh.loadFromJSONCfg(jsnCfg); err == nil || err.Error() != errExpect { + t.Errorf("Expected %v \n but received \n %v", errExpect, err.Error()) + } +} + +func TestRemoteHostAsMapInterface(t *testing.T) { + rh := &RemoteHost{ + ID: "rh_id1", + Address: "localhost", + Transport: "*json", + ConnectAttempts: 2, + Reconnects: 2, + ConnectTimeout: 3 * time.Nanosecond, + ReplyTimeout: 2 * time.Nanosecond, + TLS: true, + ClientKey: "ck", + ClientCertificate: "cc", + CaCertificate: "ca", + } + + eMap := map[string]interface{}{ + utils.IDCfg: "rh_id1", + utils.AddressCfg: "localhost", + utils.TransportCfg: "*json", + utils.ConnectAttemptsCfg: 2, + utils.ReconnectsCfg: 2, + utils.ConnectTimeoutCfg: 3 * time.Nanosecond, + utils.ReplyTimeoutCfg: 2 * time.Nanosecond, + utils.TLSNoCaps: true, + utils.KeyPathCgr: "ck", + utils.CertPathCgr: "cc", + utils.CAPathCgr: "ca", + } + + rcv := rh.AsMapInterface() + if !reflect.DeepEqual(eMap, rcv) { + t.Errorf("Expected %v \n but received \n %v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } +} func TestRPCConnsAsMapInterface(t *testing.T) { cfgJSONStr := `{ "rpc_conns": { diff --git a/config/sessionscfg_test.go b/config/sessionscfg_test.go index f25db7b22..834f02567 100644 --- a/config/sessionscfg_test.go +++ b/config/sessionscfg_test.go @@ -167,6 +167,14 @@ func TestSessionSCfgloadFromJsonCfgCase1(t *testing.T) { if err = jsonCfg.sessionSCfg.loadFromJSONCfg(cfgJSON); err != nil { t.Error(err) } + + if err := expected.Opts.loadFromJSONCfg(nil); err != nil { + t.Error(err) + } + + if err := expected.STIRCfg.loadFromJSONCfg(nil); err != nil { + t.Error(err) + } } func TestSessionSCfgloadFromJsonCfgCase2(t *testing.T) { @@ -1662,3 +1670,165 @@ func TestSessionSCloneSection(t *testing.T) { t.Errorf("Expected %v \n but received \n %v", utils.ToJSON(exp), utils.ToJSON(rcv)) } } + +func TestDiffSessionsOptsJsonCfg(t *testing.T) { + var d *SessionsOptsJson + + v1 := &SessionsOpts{ + Attributes: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.org", + Value: false, + }, + }, + Chargers: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.org", + Value: false, + }, + }, + Stats: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.org", + Value: false, + }, + }, + Thresholds: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.org", + Value: false, + }, + }, + Initiate: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.org", + Value: false, + }, + }, + Update: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.org", + Value: false, + }, + }, + Terminate: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.org", + Value: false, + }, + }, + Message: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.org", + Value: false, + }, + }, + } + + v2 := &SessionsOpts{ + Attributes: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.net", + Value: true, + }, + }, + Chargers: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.net", + Value: true, + }, + }, + Stats: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.net", + Value: true, + }, + }, + Thresholds: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.net", + Value: true, + }, + }, + Initiate: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.net", + Value: true, + }, + }, + Update: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.net", + Value: true, + }, + }, + Terminate: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.net", + Value: true, + }, + }, + Message: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.net", + Value: true, + }, + }, + } + + expected := &SessionsOptsJson{ + Attributes: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.net", + Value: true, + }, + }, + Chargers: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.net", + Value: true, + }, + }, + Stats: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.net", + Value: true, + }, + }, + Thresholds: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.net", + Value: true, + }, + }, + Initiate: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.net", + Value: true, + }, + }, + Update: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.net", + Value: true, + }, + }, + Terminate: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.net", + Value: true, + }, + }, + Message: []*utils.DynamicBoolOpt{ + { + Tenant: "cgrates.net", + Value: true, + }, + }, + } + + rcv := diffSessionsOptsJsonCfg(d, v1, v2) + if !reflect.DeepEqual(rcv, expected) { + t.Errorf("Expected %v \n but received \n %v", expected, rcv) + } +}