/*
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
*/
package config
import (
"testing"
"github.com/cgrates/cgrates/utils"
)
func TestConfigSanityRater(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.ralsCfg = &RalsCfg{
Enabled: true,
StatSConns: []string{utils.MetaInternal},
}
expected := " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.ralsCfg.StatSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.ralsCfg.StatSConns = []string{}
cfg.ralsCfg.ThresholdSConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.ralsCfg.ThresholdSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
}
func TestConfigSanityCDRServer(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.cdrsCfg = &CdrsCfg{
Enabled: true,
}
cfg.cdrsCfg.EEsConns = []string{"test"}
expected := " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expected %+q, received %+q", expected, err)
}
cfg.cdrsCfg.EEsConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expected %+q, received %+q", expected, err)
}
cfg.cdrsCfg.ChargerSConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.cdrsCfg.ChargerSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.cdrsCfg.ChargerSConns = []string{}
cfg.cdrsCfg.RaterConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.cdrsCfg.RaterConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.cdrsCfg.RaterConns = []string{}
cfg.cdrsCfg.AttributeSConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.cdrsCfg.AttributeSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.cdrsCfg.AttributeSConns = []string{}
cfg.cdrsCfg.StatSConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.cdrsCfg.StatSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.cdrsCfg.StatSConns = []string{}
cfg.cdrsCfg.ThresholdSConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.cdrsCfg.ThresholdSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.cdrsCfg.ThresholdSConns = []string{}
cfg.cdrsCfg.OnlineCDRExports = []string{"*default", "stringy"}
expected = " cannot find exporter with ID: "
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
}
func TestConfigSanitySessionS(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.sessionSCfg = &SessionSCfg{
Enabled: true,
TerminateAttempts: 0,
}
expected := " 'terminate_attempts' should be at least 1"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.TerminateAttempts = 1
cfg.sessionSCfg.ChargerSConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.ChargerSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.ChargerSConns = []string{}
cfg.chargerSCfg.Enabled = true
cfg.sessionSCfg.RALsConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.RALsConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.RALsConns = []string{}
cfg.ralsCfg.Enabled = true
cfg.sessionSCfg.ResourceSConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.ResourceSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.ResourceSConns = []string{}
cfg.resourceSCfg.Enabled = true
cfg.sessionSCfg.IPsConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("expected %q, received: %q", expected, err)
}
cfg.sessionSCfg.IPsConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.IPsConns = []string{}
cfg.ipsCfg.Enabled = true
cfg.sessionSCfg.ThresholdSConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.ThresholdSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.ThresholdSConns = []string{}
cfg.thresholdSCfg.Enabled = true
cfg.sessionSCfg.StatSConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.StatSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.StatSConns = []string{}
cfg.statsCfg.Enabled = true
cfg.sessionSCfg.RouteSConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.RouteSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.RouteSConns = []string{}
cfg.routeSCfg.Enabled = true
cfg.sessionSCfg.AttributeSConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.AttributeSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.AttributeSConns = []string{}
cfg.attributeSCfg.Enabled = true
cfg.sessionSCfg.CDRsConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.CDRsConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.CDRsConns = []string{}
cfg.cdrsCfg.Enabled = true
cfg.sessionSCfg.ReplicationConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.ReplicationConns = []string{}
cfg.cacheCfg.Partitions[utils.CacheClosedSessions].Limit = 0
expected = " *closed_sessions needs to be != 0, received: 0"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.cacheCfg.Partitions[utils.CacheClosedSessions].Limit = 1
expected = " the following protected field can't be altered by session: "
cfg.sessionSCfg.AlterableFields = utils.NewStringSet([]string{utils.CGRID})
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
}
func TestConfigSanityFreeSWITCHAgent(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.fsAgentCfg = &FsAgentCfg{
Enabled: true,
}
expected := " no SessionS connections defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.fsAgentCfg = &FsAgentCfg{
Enabled: true,
SessionSConns: []string{utils.MetaInternal},
}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.fsAgentCfg.SessionSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
}
func TestConfigSanityKamailioAgent(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.kamAgentCfg = &KamAgentCfg{
Enabled: true,
}
expected := " no SessionS connections defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.kamAgentCfg.SessionSConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaSessionS)}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.kamAgentCfg.SessionSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
}
func TestConfigSanityAsteriskAgent(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.asteriskAgentCfg = &AsteriskAgentCfg{
Enabled: true,
}
expected := " no SessionS connections defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.asteriskAgentCfg.SessionSConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaSessionS)}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.asteriskAgentCfg.SessionSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
}
func TestConfigSanityDAgent(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.templates = FcTemplates{
utils.MetaEEs: {
{Tag: "SessionId", Path: utils.EmptyString, Type: "*variable",
Value: NewRSRParsersMustCompile("~*req.Session-Id", utils.InfieldSep), Mandatory: true},
},
}
cfg.diameterAgentCfg = &DiameterAgentCfg{
Enabled: true,
RequestProcessors: []*RequestProcessor{
{
ID: "cgrates",
Timezone: "Local",
RequestFields: []*FCTemplate{
{Tag: "SessionId", Path: utils.EmptyString, Type: "*variable",
Value: NewRSRParsersMustCompile("~*req.Session-Id", utils.InfieldSep), Mandatory: true},
},
ReplyFields: []*FCTemplate{
{Tag: "SessionId", Path: utils.EmptyString, Type: "*variable",
Value: NewRSRParsersMustCompile("~*req.Session-Id", utils.InfieldSep), Mandatory: true},
},
},
},
}
expected := " no SessionS connections defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.diameterAgentCfg.SessionSConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaSessionS)}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.diameterAgentCfg.SessionSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.rpcConns["test"] = nil
expected = " MANDATORY_IE_MISSING: [Path] for template *ees at SessionId"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.templates[utils.MetaEEs][0].Path = "~Req."
expected = " Empty field path for ~Req. at Path"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.templates[utils.MetaEEs][0].Path = "*req.OriginID"
cfg.templates[utils.MetaEEs][0].Value[0].path = "~Req."
expected = " Empty field path for ~Req. at Values"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.templates[utils.MetaEEs][0].Value[0].path = "*req.OriginID"
cfg.templates[utils.MetaEEs][0].Filters = []string{"*string:~*req..Field"}
expected = " inline parse error for string: <*string:~*req..Field> for [*string:~*req..Field] at templates"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.templates[utils.MetaEEs][0].Filters = []string{"*string:~*req.VAlid.Field"}
cfg.templates = nil
expected = " MANDATORY_IE_MISSING: [Path] for cgrates at SessionId"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.diameterAgentCfg.RequestProcessors[0].RequestFields[0].Type = utils.MetaNone
cfg.diameterAgentCfg.RequestProcessors[0].RequestFields[0].Filters = []string{"*string:~*req..Field"}
expected = " inline parse error for string: <*string:~*req..Field> for [*string:~*req..Field] at request_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.diameterAgentCfg.RequestProcessors[0].RequestFields[0].Filters = []string{"*string:~*req.Valid.Field"}
cfg.diameterAgentCfg.RequestProcessors[0].RequestFields[0].Path = "~REQ."
expected = " Empty field path for ~REQ. at Path"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.diameterAgentCfg.RequestProcessors[0].RequestFields[0].Path = "*req.Valid.Field"
cfg.diameterAgentCfg.RequestProcessors[0].RequestFields[0].Value[0].path = "~REQ."
expected = " Empty field path for ~REQ. at Values of request_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.diameterAgentCfg.RequestProcessors[0].RequestFields[0].Value[0].path = "*req.Valid.Field"
cfg.diameterAgentCfg.RequestProcessors[0].RequestFields = []*FCTemplate{}
expected = " MANDATORY_IE_MISSING: [Path] for cgrates at SessionId"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.diameterAgentCfg.RequestProcessors[0].ReplyFields[0].Type = utils.MetaNone
cfg.diameterAgentCfg.RequestProcessors[0].ReplyFields[0].Filters = []string{"*string:~*req..Field"}
expected = " inline parse error for string: <*string:~*req..Field> for [*string:~*req..Field] at reply_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.diameterAgentCfg.RequestProcessors[0].ReplyFields[0].Filters = []string{"*string:~*req.Valid.Field"}
cfg.diameterAgentCfg.RequestProcessors[0].ReplyFields[0].Path = "~REQ."
expected = " Empty field path for ~REQ. at Path"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.diameterAgentCfg.RequestProcessors[0].ReplyFields[0].Path = "*req.Valid.Field"
cfg.diameterAgentCfg.RequestProcessors[0].ReplyFields[0].Value[0].path = "~REQ."
expected = " Empty field path for ~REQ. at Values of reply_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.diameterAgentCfg.RequestProcessors[0].ReplyFields[0].Value[0].path = "*req.Valid.Field"
cfg.diameterAgentCfg.RequestProcessors[0].ReplyFields = []*FCTemplate{}
cfg.diameterAgentCfg.RequestProcessors[0].Filters = []string{"*string:~*req..Field"}
expected = " inline parse error for string: <*string:~*req..Field> for [*string:~*req..Field] at request_processors"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.diameterAgentCfg.RequestProcessors[0].Filters = []string{"*string:~*req.Valid.Field"}
}
func TestConfigSanityRadiusAgent(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.radiusAgentCfg = &RadiusAgentCfg{
Enabled: true,
RequestProcessors: []*RequestProcessor{
{
ID: "cgrates",
Timezone: "Local",
RequestFields: []*FCTemplate{
{Tag: "SessionId", Path: utils.EmptyString, Type: "*variable",
Value: NewRSRParsersMustCompile("~*req.Session-Id", utils.InfieldSep), Mandatory: true},
},
ReplyFields: []*FCTemplate{
{Tag: "SessionId", Path: utils.EmptyString, Type: "*variable",
Value: NewRSRParsersMustCompile("~*req.Session-Id", utils.InfieldSep), Mandatory: true},
},
},
},
}
cfg.radiusAgentCfg.CoATemplate = "test_coa" // point to non-existent template
expected := " CoA Template test_coa not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("expected %v, received %v", expected, err)
}
cfg.radiusAgentCfg.CoATemplate = "*coa" // point to default CoA template
cfg.radiusAgentCfg.DMRTemplate = "test_dmr" // point to non-existent template
expected = " DMR Template test_dmr not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("expected %v, received %v", expected, err)
}
cfg.radiusAgentCfg.DMRTemplate = "*dmr" // point to default DMR template
cfg.radiusAgentCfg.SessionSConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaSessionS)}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.radiusAgentCfg.SessionSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.rpcConns["test"] = nil
expected = " MANDATORY_IE_MISSING: [Path] for cgrates at SessionId"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.radiusAgentCfg.RequestProcessors[0].RequestFields[0].Type = utils.MetaNone
cfg.radiusAgentCfg.RequestProcessors[0].RequestFields[0].Path = "~req."
expected = " Empty field path for ~req. at Path"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.radiusAgentCfg.RequestProcessors[0].RequestFields[0].Path = "*req.OriginID"
cfg.radiusAgentCfg.RequestProcessors[0].RequestFields[0].Value[0].path = "~req."
expected = " Empty field path for ~req. at Values of request_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.radiusAgentCfg.RequestProcessors[0].RequestFields[0].Value[0].path = "*req.OriginID"
cfg.radiusAgentCfg.RequestProcessors[0].RequestFields[0].Filters = []string{"*empty:*ec"}
expected = " inline parse error for string: <*empty:*ec> for [*empty:*ec] at request_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.radiusAgentCfg.RequestProcessors[0].RequestFields[0].Filters = []string{"*string:~*req.Account:1001"}
cfg.radiusAgentCfg.RequestProcessors[0].RequestFields = []*FCTemplate{}
cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields[0].Path = "~req."
expected = " Empty field path for ~req. at Path"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields[0].Path = "*req.OriginID"
cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields[0].Value[0].path = "~req."
expected = " Empty field path for ~req. at Values of reply_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields[0].Value[0].path = "*req.OriginID"
cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields[0].Filters = []string{"*empty:*ec"}
expected = " inline parse error for string: <*empty:*ec> for [*empty:*ec] at reply_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields[0].Filters = []string{"*string:~*req.Account:1001"}
cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields[0].Type = "changed"
cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields[0].Path = utils.EmptyString
expected = " MANDATORY_IE_MISSING: [Path] for cgrates at SessionId"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.radiusAgentCfg.RequestProcessors[0].ReplyFields = []*FCTemplate{}
cfg.radiusAgentCfg.RequestProcessors[0].Filters = []string{"*empty:*ec"}
expected = " inline parse error for string: <*empty:*ec> for [*empty:*ec] at request_processors"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.radiusAgentCfg.RequestProcessors[0].Filters = []string{"*string:~*req.Account:1001"}
if err := cfg.checkConfigSanity(); err != nil {
t.Error(err)
}
cfg.radiusAgentCfg.CoATemplate = ""
cfg.radiusAgentCfg.DMRTemplate = ""
if err := cfg.checkConfigSanity(); err != nil {
t.Error(err)
}
}
func TestConfigSanityDNSAgent(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.dnsAgentCfg = &DNSAgentCfg{
Enabled: true,
RequestProcessors: []*RequestProcessor{
{
ID: "cgrates",
Timezone: "Local",
RequestFields: []*FCTemplate{
{Tag: "SessionId", Path: utils.EmptyString, Type: "*variable",
Value: NewRSRParsersMustCompile("~*req.Session-Id", utils.InfieldSep), Mandatory: true},
},
ReplyFields: []*FCTemplate{
{Tag: "SessionId", Path: utils.EmptyString, Type: "*variable",
Value: NewRSRParsersMustCompile("~*req.Session-Id", utils.InfieldSep), Mandatory: true},
},
},
},
}
expected := " no SessionS connections defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.dnsAgentCfg.SessionSConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaSessionS)}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.dnsAgentCfg.SessionSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.rpcConns["test"] = nil
expected = " MANDATORY_IE_MISSING: [Path] for cgrates at SessionId"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.dnsAgentCfg.RequestProcessors[0].RequestFields[0].Type = utils.MetaNone
cfg.dnsAgentCfg.RequestProcessors[0].RequestFields[0].Value[0].path = "~req."
expected = " Empty field path for ~req. at Values of request_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.dnsAgentCfg.RequestProcessors[0].RequestFields[0].Value[0].path = "*req.Value"
cfg.dnsAgentCfg.RequestProcessors[0].RequestFields[0].Filters = []string{"*empty:~*req"}
expected = " inline parse error for string: <*empty:~*req> for [*empty:~*req] at request_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.dnsAgentCfg.RequestProcessors[0].RequestFields[0].Filters = []string{"*string:~*req.Account:1001"}
cfg.dnsAgentCfg.RequestProcessors[0].RequestFields[0].Path = "~req."
expected = " Empty field path for ~req. at Path"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.dnsAgentCfg.RequestProcessors[0].RequestFields[0].Path = "*req.Value"
cfg.dnsAgentCfg.RequestProcessors[0].RequestFields = []*FCTemplate{}
cfg.dnsAgentCfg.RequestProcessors[0].ReplyFields[0].Path = "~req."
cfg.dnsAgentCfg.RequestProcessors[0].ReplyFields[0].Type = "CHANGED"
expected = " Empty field path for ~req. at Path"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.dnsAgentCfg.RequestProcessors[0].ReplyFields[0].Path = utils.EmptyString
expected = " MANDATORY_IE_MISSING: [Path] for cgrates at SessionId"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.dnsAgentCfg.RequestProcessors[0].ReplyFields[0].Path = "*empty:*ec"
cfg.dnsAgentCfg.RequestProcessors[0].ReplyFields[0].Value[0].path = "~req."
expected = " Empty field path for ~req. at Values of reply_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.dnsAgentCfg.RequestProcessors[0].ReplyFields[0].Value[0].path = "*empty:*ec"
cfg.dnsAgentCfg.RequestProcessors[0].ReplyFields[0].Filters = []string{"*empty:*ec"}
expected = " inline parse error for string: <*empty:*ec> for [*empty:*ec] at reply_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.dnsAgentCfg.RequestProcessors[0].ReplyFields = []*FCTemplate{}
cfg.dnsAgentCfg.RequestProcessors[0].Filters = []string{"*empty:*ec"}
expected = " inline parse error for string: <*empty:*ec> for [*empty:*ec] at request_processors"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.dnsAgentCfg.RequestProcessors[0].Filters = []string{"*string:~*req.Account:1001"}
}
func TestConfigSanityHTTPAgent1(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.httpAgentCfg = HTTPAgentCfgs{
&HTTPAgentCfg{
SessionSConns: []string{utils.MetaInternal},
RequestProcessors: []*RequestProcessor{
{
ID: "cgrates",
Timezone: "Local",
RequestFields: []*FCTemplate{
{Tag: "SessionId", Path: utils.EmptyString, Type: "*variable",
Value: NewRSRParsersMustCompile("~*req.Session-Id", utils.InfieldSep), Mandatory: true},
},
ReplyFields: []*FCTemplate{
{Tag: "SessionId", Path: utils.EmptyString, Type: "*variable",
Value: NewRSRParsersMustCompile("~*req.Session-Id", utils.InfieldSep), Mandatory: true},
},
},
},
},
}
expected := " not enabled but requested by <> HTTPAgent Template"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.httpAgentCfg[0].SessionSConns = []string{"test"}
expected = " template with ID <> has connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.httpAgentCfg[0].SessionSConns = []string{}
cfg.httpAgentCfg[0].RequestPayload = "test"
expected = " unsupported request payload test"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.httpAgentCfg[0].RequestPayload = utils.MetaXml
cfg.httpAgentCfg[0].ReplyPayload = "test"
expected = " unsupported reply payload test"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.httpAgentCfg[0].ReplyPayload = utils.MetaXml
expected = " MANDATORY_IE_MISSING: [Path] for cgrates at SessionId"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.httpAgentCfg[0].RequestProcessors[0].RequestFields[0].Type = utils.MetaNone
expected = " MANDATORY_IE_MISSING: [Path] for cgrates at SessionId"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.httpAgentCfg[0].RequestProcessors[0].RequestFields[0].Path = "~Field1..Field2[0]"
expected = " Empty field path for ~Field1..Field2[0] at Path"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.httpAgentCfg[0].RequestProcessors[0].RequestFields[0].Value = RSRParsers{
&RSRParser{
Rules: "~*req.Session-Id2",
path: "~Field1..Field2[0]",
},
}
cfg.httpAgentCfg[0].RequestProcessors[0].RequestFields[0].Path = utils.EmptyString
expected = " Empty field path for ~Field1..Field2[0] at Values of request_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.httpAgentCfg[0].RequestProcessors[0].RequestFields[0].Value = RSRParsers{
&RSRParser{
Rules: "~*req.Session-Id2",
path: "~Field1.Field2[0]",
},
}
cfg.httpAgentCfg[0].RequestProcessors[0].RequestFields[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"}
expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at request_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.httpAgentCfg[0].RequestProcessors[0].RequestFields[0].Filters = nil
cfg.httpAgentCfg[0].RequestProcessors[0].ReplyFields[0].Path = "~Field1..Field2[0]"
expected = " Empty field path for ~Field1..Field2[0] at Path"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.httpAgentCfg[0].RequestProcessors[0].ReplyFields[0].Value = RSRParsers{
&RSRParser{
Rules: "~*req.Session-Id2",
path: "~Field1..Field2[0]",
},
}
cfg.httpAgentCfg[0].RequestProcessors[0].ReplyFields[0].Path = utils.EmptyString
cfg.httpAgentCfg[0].RequestProcessors[0].ReplyFields[0].Type = utils.MetaNone
expected = " Empty field path for ~Field1..Field2[0] at Values of reply_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.httpAgentCfg[0].RequestProcessors[0].ReplyFields[0].Value = RSRParsers{
&RSRParser{
Rules: "~*req.Session-Id2",
path: "~Field1.Field2[0]",
},
}
cfg.httpAgentCfg[0].RequestProcessors[0].ReplyFields[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"}
expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at reply_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.httpAgentCfg[0].RequestProcessors[0].ReplyFields[0].Filters = nil
cfg.httpAgentCfg[0].RequestProcessors[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"}
expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at request_processors"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
}
func TestConfigSanitySipAgent(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.sipAgentCfg = &SIPAgentCfg{
Enabled: true,
RequestProcessors: []*RequestProcessor{
{
ID: "cgrates",
Timezone: "Local",
RequestFields: []*FCTemplate{
{Tag: "SessionId", Path: utils.EmptyString, Type: "*variable",
Value: NewRSRParsersMustCompile("~*req.Session-Id", utils.InfieldSep), Mandatory: true},
},
ReplyFields: []*FCTemplate{
{Tag: "SessionId", Path: utils.EmptyString, Type: "*variable",
Value: NewRSRParsersMustCompile("~*req.Session-Id", utils.InfieldSep), Mandatory: true},
},
},
},
}
expected := " no SessionS connections defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
expected = " not enabled but requested by component"
cfg.sipAgentCfg.SessionSConns = []string{utils.MetaInternal}
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
expected = " connection with id: not defined"
cfg.sipAgentCfg.SessionSConns = []string{"test"}
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
//Request fields
cfg.rpcConns["test"] = nil
expected = " MANDATORY_IE_MISSING: [Path] for cgrates at SessionId"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sipAgentCfg.RequestProcessors[0].RequestFields[0].Type = utils.MetaNone
expected = " MANDATORY_IE_MISSING: [Path] for cgrates at SessionId"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sipAgentCfg.RequestProcessors[0].RequestFields[0].Path = "~Field1..Field2[0]"
expected = " Empty field path for ~Field1..Field2[0] at Path"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sipAgentCfg.RequestProcessors[0].RequestFields[0].Value = RSRParsers{
&RSRParser{
Rules: "~*req.Session-Id2",
path: "~Field1..Field2[0]",
},
}
cfg.sipAgentCfg.RequestProcessors[0].RequestFields[0].Path = utils.EmptyString
expected = " Empty field path for ~Field1..Field2[0] at Values of request_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sipAgentCfg.RequestProcessors[0].RequestFields[0].Value = RSRParsers{
&RSRParser{
Rules: "~*req.Session-Id2",
path: "~Field1.Field2[0]",
},
}
cfg.sipAgentCfg.RequestProcessors[0].RequestFields[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"}
expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at request_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sipAgentCfg.RequestProcessors[0].RequestFields[0].Filters = nil
//Reply fields
cfg.sipAgentCfg.RequestProcessors[0].ReplyFields[0].Path = "~Field1..Field2[0]"
expected = " Empty field path for ~Field1..Field2[0] at Path"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sipAgentCfg.RequestProcessors[0].ReplyFields[0].Value = RSRParsers{
&RSRParser{
Rules: "~*req.Session-Id2",
path: "~Field1..Field2[0]",
},
}
cfg.sipAgentCfg.RequestProcessors[0].ReplyFields[0].Path = utils.EmptyString
cfg.sipAgentCfg.RequestProcessors[0].ReplyFields[0].Type = utils.MetaNone
expected = " Empty field path for ~Field1..Field2[0] at Values of reply_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sipAgentCfg.RequestProcessors[0].ReplyFields[0].Value = RSRParsers{
&RSRParser{
Rules: "~*req.Session-Id2",
path: "~Field1.Field2[0]",
},
}
cfg.sipAgentCfg.RequestProcessors[0].ReplyFields[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"}
expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at reply_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sipAgentCfg.RequestProcessors[0].ReplyFields[0].Filters = nil
cfg.sipAgentCfg.RequestProcessors[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"}
expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at request_processors"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
}
func TestConfigSanityAttributesCfg(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.attributeSCfg = &AttributeSCfg{
Enabled: true,
Opts: &AttributesOpts{
ProfileRuns: -1,
},
}
expected := " process_runs needs to be bigger than 0"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
}
func TestConfigSanityChargerS(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.chargerSCfg = &ChargerSCfg{
Enabled: true,
AttributeSConns: []string{utils.MetaInternal},
}
expected := " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.chargerSCfg.AttributeSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
}
func TestConfigSanityResourceLimiter(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.resourceSCfg = &ResourceSConfig{
Enabled: true,
ThresholdSConns: []string{utils.MetaInternal},
}
expected := " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.resourceSCfg.ThresholdSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
}
func TestConfigSanityStatS(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.statsCfg = &StatSCfg{
Enabled: true,
ThresholdSConns: []string{utils.MetaInternal},
}
expected := " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.statsCfg.ThresholdSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
}
func TestConfigSanityRouteS(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.routeSCfg.Enabled = true
cfg.routeSCfg.ResourceSConns = []string{utils.MetaInternal}
expected := " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.routeSCfg.ResourceSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.routeSCfg.ResourceSConns = []string{}
cfg.routeSCfg.StatSConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.routeSCfg.StatSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.routeSCfg.StatSConns = []string{}
cfg.routeSCfg.AttributeSConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.routeSCfg.AttributeSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.routeSCfg.AttributeSConns = []string{}
cfg.routeSCfg.RALsConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.routeSCfg.RALsConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.routeSCfg.RALsConns = []string{}
}
func TestConfigSanityScheduler(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.schedulerCfg.Enabled = true
cfg.schedulerCfg.CDRsConns = []string{utils.MetaInternal}
expected := " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.schedulerCfg.CDRsConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.schedulerCfg.CDRsConns = []string{}
cfg.schedulerCfg.ThreshSConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.schedulerCfg.ThreshSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.schedulerCfg.ThreshSConns = []string{}
cfg.schedulerCfg.StatSConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.schedulerCfg.StatSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.schedulerCfg.StatSConns = []string{}
cfg.schedulerCfg.Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"}
expected = " got Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> in Filters"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
}
func TestConfigSanityEventReader(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.ersCfg = &ERsCfg{
Enabled: true,
SessionSConns: []string{"unexistedConn"},
}
expected := " connection with id: not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.ersCfg.SessionSConns = []string{utils.MetaInternal}
expected = " not enabled but requested by component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.Enabled = true
cfg.ersCfg.Readers = []*EventReaderCfg{{
ID: "test",
Type: "wrongtype",
}}
expected = " unsupported data type: wrongtype for reader with ID: test"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.ersCfg.Readers = []*EventReaderCfg{{
ID: "test2",
Type: utils.MetaFileCSV,
ProcessedPath: "not/a/path",
Opts: &EventReaderOpts{
PartialCacheAction: utils.StringPointer(utils.MetaNone),
},
}}
expected = " nonexistent folder: not/a/path for reader with ID: test2"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.ersCfg.Readers = []*EventReaderCfg{{
ID: "test3",
Type: utils.MetaFileCSV,
ProcessedPath: "/",
SourcePath: "/",
Opts: &EventReaderOpts{
CSV: &CSVROpts{
FieldSeparator: utils.StringPointer(utils.EmptyString),
},
PartialCacheAction: utils.StringPointer(utils.MetaNone),
},
}}
expected = " empty csvFieldSeparator for reader with ID: test3"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.ersCfg.Readers[0] = &EventReaderCfg{
ID: "test4",
Type: utils.MetaKafkajsonMap,
RunDelay: 1,
Opts: &EventReaderOpts{
CSV: &CSVROpts{
FieldSeparator: utils.StringPointer(utils.FieldsSep),
},
PartialCacheAction: utils.StringPointer(utils.MetaNone),
},
}
expected = " the RunDelay field can not be bigger than zero for reader with ID: test4"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.ersCfg.Readers[0] = &EventReaderCfg{
ID: "test5",
Type: utils.MetaFileXML,
RunDelay: 0,
ProcessedPath: "not/a/path",
SourcePath: "not/a/path",
Opts: &EventReaderOpts{
PartialCacheAction: utils.StringPointer(utils.MetaNone),
},
}
expected = " nonexistent folder: not/a/path for reader with ID: test5"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.ersCfg.Readers[0] = &EventReaderCfg{
ID: "test5",
Type: utils.MetaFileFWV,
RunDelay: 0,
ProcessedPath: "not/a/path",
SourcePath: "not/a/path",
Opts: &EventReaderOpts{
PartialCacheAction: utils.StringPointer(utils.MetaNone),
},
}
expected = " nonexistent folder: not/a/path for reader with ID: test5"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.ersCfg = &ERsCfg{
Enabled: true,
Readers: []*EventReaderCfg{
{
Type: utils.MetaKafkajsonMap,
CacheDumpFields: []*FCTemplate{
{Tag: "SessionId", Path: utils.EmptyString, Type: "*variable",
Value: NewRSRParsersMustCompile("~*req.Session-Id", utils.InfieldSep), Mandatory: true},
},
Fields: []*FCTemplate{
{Tag: "SessionId", Path: utils.EmptyString, Type: "*variable",
Value: NewRSRParsersMustCompile("~*req.Session-Id", utils.InfieldSep), Mandatory: true},
},
Opts: &EventReaderOpts{
PartialCacheAction: utils.StringPointer(utils.MetaNone),
},
},
},
}
//CacheDumpFields
expected = " MANDATORY_IE_MISSING: [Path] for at SessionId"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
expected = " MANDATORY_IE_MISSING: [Path] for at SessionId"
cfg.ersCfg.Readers[0].CacheDumpFields[0].Type = utils.MetaNone
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.ersCfg.Readers[0].CacheDumpFields[0].Path = "~Field1..Field2[0]"
expected = " Empty field path for ~Field1..Field2[0] at Path"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.ersCfg.Readers[0].CacheDumpFields[0].Value = RSRParsers{
&RSRParser{
Rules: "~*req.Session-Id2",
path: "~Field1..Field2[0]",
},
}
cfg.ersCfg.Readers[0].CacheDumpFields[0].Path = "~Field1.Field3[0]"
cfg.ersCfg.Readers[0].CacheDumpFields[0].Type = utils.MetaUnixTimestamp
expected = " Empty field path for ~Field1..Field2[0] at Values of cache_dump_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.ersCfg.Readers[0].CacheDumpFields[0].Type = utils.MetaNone
cfg.ersCfg.Readers[0].CacheDumpFields[0].Value = RSRParsers{
&RSRParser{
Rules: "~*req.Session-Id2",
path: "~Field1.Field2[0]",
},
}
cfg.ersCfg.Readers[0].CacheDumpFields[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"}
expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at cache_dump_fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.ersCfg.Readers[0].CacheDumpFields[0].Filters = nil
//Fields
cfg.ersCfg.Readers[0].Fields[0].Path = "~Field1..Field2[0]"
expected = " Empty field path for ~Field1..Field2[0] at Path"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.ersCfg.Readers[0].Fields[0].Value = RSRParsers{
&RSRParser{
Rules: "~*req.Session-Id2",
path: "~Field1..Field2[0]",
},
}
cfg.ersCfg.Readers[0].Fields[0].Path = "~Field1.Field3[0]"
cfg.ersCfg.Readers[0].Fields[0].Type = utils.MetaUnixTimestamp
expected = " Empty field path for ~Field1..Field2[0] at Values of fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.ersCfg.Readers[0].Fields[0].Type = utils.MetaNone
cfg.ersCfg.Readers[0].Fields[0].Value = RSRParsers{
&RSRParser{
Rules: "~*req.Session-Id2",
path: "~Field1.Field2[0]",
},
}
cfg.ersCfg.Readers[0].Fields[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"}
expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.ersCfg.Readers[0].Fields[0].Filters = nil
cfg.ersCfg.Readers[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"}
expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at readers"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
}
func TestConfigSanityEventExporter(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.eesCfg = &EEsCfg{
Enabled: true,
AttributeSConns: []string{utils.MetaInternal},
Exporters: []*EventExporterCfg{
{
Fields: []*FCTemplate{
{Tag: "SessionId", Path: utils.EmptyString, Type: "*variable",
Value: NewRSRParsersMustCompile("~*req.Session-Id", utils.InfieldSep), Mandatory: true},
},
},
},
}
expected := " not enabled but requested by component"
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.eesCfg.AttributeSConns = []string{"test"}
expected = " connection with id: not defined"
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.eesCfg.AttributeSConns = []string{}
expected = " unsupported data type: for exporter with ID: "
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.eesCfg.Exporters[0].Type = utils.MetaHTTPPost
expected = " MANDATORY_IE_MISSING: [Path] for at SessionId"
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.eesCfg.Exporters[0].Type = utils.MetaFileCSV
cfg.eesCfg.Exporters[0].ExportPath = "/"
cfg.eesCfg.Exporters[0].Opts = &EventExporterOpts{
CSVFieldSeparator: utils.StringPointer(utils.EmptyString),
}
expected = " empty csvFieldSeparator for exporter with ID: "
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.eesCfg.Exporters[0].ExportPath = "randomPath"
expected = " nonexistent folder: randomPath for exporter with ID: "
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.eesCfg.Exporters[0].Type = utils.MetaFileFWV
expected = " nonexistent folder: randomPath for exporter with ID: "
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.eesCfg.Exporters[0].Type = utils.MetaHTTPPost
cfg.eesCfg.Exporters[0].Fields[0].Path = "~Field1..Field2[0]"
expected = " Empty field path for ~Field1..Field2[0] at Path"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.eesCfg.Exporters[0].Fields[0].Value = RSRParsers{
&RSRParser{
Rules: "~*req.Session-Id2",
path: "~Field1..Field2[0]",
},
}
cfg.eesCfg.Exporters[0].Fields[0].Path = "~Field1.Field3[0]"
cfg.eesCfg.Exporters[0].Fields[0].Type = utils.MetaUnixTimestamp
expected = " Empty field path for ~Field1..Field2[0] at Values of fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.eesCfg.Exporters[0].Fields[0].Type = utils.MetaNone
cfg.eesCfg.Exporters[0].Fields[0].Value = RSRParsers{
&RSRParser{
Rules: "~*req.Session-Id2",
path: "~Field1.Field2[0]",
},
}
cfg.eesCfg.Exporters[0].Fields[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"}
expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at fields"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.eesCfg.Exporters[0].Fields[0].Filters = nil
cfg.eesCfg.Exporters[0].Filters = []string{"*empty:~Field1..Field2[0]:*Test3:*Test4"}
expected = " Empty field path for <*empty:~Field1..Field2[0]:*Test3:*Test4> for [*empty:~Field1..Field2[0]:*Test3:*Test4] at exporters"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
}
func TestConfigSanityCache(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.cacheCfg = &CacheCfg{
ReplicationConns: []string{"test"},
}
expected := " connection with id: not defined"
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.cacheCfg.ReplicationConns = []string{utils.MetaLocalHost}
expected = " unsupported transport <*json> for connection with ID: <*localhost>"
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
}
func TestConfigSanityRegistrarCRPC(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.registrarCCfg = &RegistrarCCfgs{
RPC: &RegistrarCCfg{
RegistrarSConns: []string{utils.MetaLocalHost},
Hosts: map[string][]*RemoteHost{
"hosts": {},
},
},
Dispatchers: &RegistrarCCfg{},
}
expected := " the register imterval needs to be bigger than 0"
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.registrarCCfg.RPC.Hosts = nil
expected = " missing RPC host IDs"
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.registrarCCfg.RPC.RefreshInterval = 2
cfg.registrarCCfg.RPC.Hosts = map[string][]*RemoteHost{
"hosts": {
{
ID: "randomID",
},
},
}
expected = " unsupported transport <> for host "
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.registrarCCfg.RPC.Hosts["hosts"][0].Transport = utils.MetaJSON
expected = " connection with id: <*localhost> unsupported transport <*json>"
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.registrarCCfg.RPC.RegistrarSConns = []string{utils.MetaInternal}
expected = " internal connection IDs are not supported"
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.registrarCCfg.RPC.RegistrarSConns = []string{utils.MetaLocalHost}
expected = " connection with id: <*localhost> unsupported transport <*json>"
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.registrarCCfg.RPC.RegistrarSConns = []string{"*conn1"}
expected = " connection with id: <*conn1> not defined"
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.rpcConns = RPCConns{
utils.MetaLocalHost: {},
"*conn1": {},
}
expected = " connection with id: <*conn1> needs to have only one host"
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
}
func TestConfigSanityRegistrarCDispatcher(t *testing.T) {
cfg := NewDefaultCGRConfig()
cfg.registrarCCfg = &RegistrarCCfgs{
Dispatchers: &RegistrarCCfg{
RegistrarSConns: []string{utils.MetaLocalHost},
Hosts: map[string][]*RemoteHost{
"hosts": {},
},
},
RPC: &RegistrarCCfg{},
}
expected := " the register imterval needs to be bigger than 0"
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.registrarCCfg.Dispatchers.Hosts = nil
expected = " missing dispatcher host IDs"
if err := cfg.CheckConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.registrarCCfg.Dispatchers.RefreshInterval = 2
cfg.registrarCCfg.Dispatchers.Hosts = map[string][]*RemoteHost{
"hosts": {
{
ID: "randomID",
},
},
}
expected = "