Bug fixup on loading extra fields configuration, better config testing

This commit is contained in:
DanB
2014-03-26 10:26:32 +01:00
parent 24fda5b14b
commit fded831fad
9 changed files with 126 additions and 79 deletions

View File

@@ -66,7 +66,7 @@ var waitRater = flag.Int("wait_rater", 500, "Number of miliseconds to wait for r
func init() {
cfgPath = path.Join(*dataDir, "conf", "samples", "apier_local_test.cfg")
cfg, _ = config.NewCGRConfig(&cfgPath)
cfg, _ = config.NewCGRConfigFromFile(&cfgPath)
}
func TestCreateDirs(t *testing.T) {

View File

@@ -38,7 +38,7 @@ var fscsvCfg *config.CGRConfig
func init() {
fscsvCfgPath = path.Join(*dataDir, "tutorials", "fs_csv", "cgrates", "etc", "cgrates", "cgrates.cfg")
fscsvCfg, _ = config.NewCGRConfig(&fscsvCfgPath)
fscsvCfg, _ = config.NewCGRConfigFromFile(&fscsvCfgPath)
}
// Remove here so they can be properly created by init script

View File

@@ -41,7 +41,7 @@ var waitFs = flag.Int("wait_fs", 500, "Number of miliseconds to wait for FreeSWI
func init() {
fsjsonCfgPath = path.Join(*dataDir, "tutorials", "fs_json", "cgrates", "etc", "cgrates", "cgrates.cfg")
fsjsonCfg, _ = config.NewCGRConfig(&fsjsonCfgPath)
fsjsonCfg, _ = config.NewCGRConfigFromFile(&fsjsonCfgPath)
}
// Remove here so they can be properly created by init script

View File

@@ -26,8 +26,8 @@ import (
"github.com/cgrates/cgrates/engine"
"github.com/cgrates/cgrates/utils"
"io/ioutil"
"os/exec"
"os"
"os/exec"
"path"
"testing"
"time"
@@ -56,7 +56,7 @@ var waitRater = flag.Int("wait_rater", 300, "Number of miliseconds to wait for r
func init() {
cfgPath = path.Join(*dataDir, "conf", "samples", "apier_local_test.cfg")
cfg, _ = config.NewCGRConfig(&cfgPath)
cfg, _ = config.NewCGRConfigFromFile(&cfgPath)
}
var fileContent1 = `accid11,prepaid,out,cgrates.org,call,1001,1001,+4986517174963,2013-02-03 19:54:00,62,supplier1,172.16.1.1

View File

@@ -289,7 +289,7 @@ func main() {
}
runtime.GOMAXPROCS(runtime.NumCPU())
cfg, err = config.NewCGRConfig(cfgPath)
cfg, err = config.NewCGRConfigFromFile(cfgPath)
if err != nil {
engine.Logger.Crit(fmt.Sprintf("Could not parse config: %s exiting!", err))
return

View File

@@ -328,12 +328,8 @@ func NewDefaultCGRConfig() (*CGRConfig, error) {
return cfg, nil
}
// Instantiate a new CGRConfig setting defaults or reading from file
func NewCGRConfig(cfgPath *string) (*CGRConfig, error) {
c, err := conf.ReadConfigFile(*cfgPath)
if err != nil {
return nil, errors.New(fmt.Sprintf("Could not open the configuration file: %s", err))
}
// Unifies the config handling for both tests and real path
func NewCGRConfig(c *conf.ConfigFile) (*CGRConfig, error) {
cfg, err := loadConfig(c)
if err != nil {
return nil, err
@@ -344,26 +340,28 @@ func NewCGRConfig(cfgPath *string) (*CGRConfig, error) {
return cfg, nil
}
func NewCGRConfigBytes(data []byte) (*CGRConfig, error) {
// Instantiate a new CGRConfig setting defaults or reading from file
func NewCGRConfigFromFile(cfgPath *string) (*CGRConfig, error) {
c, err := conf.ReadConfigFile(*cfgPath)
if err != nil {
return nil, errors.New(fmt.Sprintf("Could not open the configuration file: %s", err))
}
return NewCGRConfig(c)
}
func NewCGRConfigFromBytes(data []byte) (*CGRConfig, error) {
c, err := conf.ReadConfigBytes(data)
if err != nil {
return nil, errors.New(fmt.Sprintf("Could not open the configuration file: %s", err))
}
cfg, err := loadConfig(c)
if err != nil {
return nil, err
}
if err := cfg.checkConfigSanity(); err != nil {
return nil, err
}
return cfg, nil
return NewCGRConfig(c)
}
func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) {
cfg := &CGRConfig{}
cfg.setDefaults()
var hasOpt bool
var errParse error
var err error
if hasOpt = c.HasOption("global", "ratingdb_type"); hasOpt {
cfg.RatingDBType, _ = c.GetString("global", "ratingdb_type")
}
@@ -479,7 +477,7 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) {
if hasOpt = c.HasOption("cdrs", "extra_fields"); hasOpt {
extraFieldsStr, _ := c.GetString("cdrs", "extra_fields")
if extraFields, err := ParseRSRFields(extraFieldsStr); err != nil {
return nil, errParse
return nil, err
} else {
cfg.CDRSExtraFields = extraFields
}
@@ -494,7 +492,7 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) {
exportTemplate, _ := c.GetString("cdre", "export_template")
if cfg.CdreCdrFormat != utils.CDRE_FIXED_WIDTH { // Csv most likely
if extraFields, err := ParseRSRFields(exportTemplate); err != nil {
return nil, errParse
return nil, err
} else {
cfg.CdreExportedFields = extraFields
}
@@ -520,8 +518,8 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) {
}
if hasOpt = c.HasOption("cdrc", "run_delay"); hasOpt {
durStr, _ := c.GetString("cdrc", "run_delay")
if cfg.CdrcRunDelay, errParse = utils.ParseDurationWithSecs(durStr); errParse != nil {
return nil, errParse
if cfg.CdrcRunDelay, err = utils.ParseDurationWithSecs(durStr); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("cdrc", "cdr_type"); hasOpt {
@@ -570,8 +568,8 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) {
cfg.CdrcDurationField, _ = c.GetString("cdrc", "duration_field")
}
if hasOpt = c.HasOption("cdrc", "extra_fields"); hasOpt {
if cfg.CdrcExtraFields, errParse = ConfigSlice(c, "cdrc", "extra_fields"); errParse != nil {
return nil, errParse
if cfg.CdrcExtraFields, err = ConfigSlice(c, "cdrc", "extra_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("mediator", "enabled"); hasOpt {
@@ -584,58 +582,58 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) {
cfg.MediatorRaterReconnects, _ = c.GetInt("mediator", "rater_reconnects")
}
if hasOpt = c.HasOption("mediator", "run_ids"); hasOpt {
if cfg.MediatorRunIds, errParse = ConfigSlice(c, "mediator", "run_ids"); errParse != nil {
return nil, errParse
if cfg.MediatorRunIds, err = ConfigSlice(c, "mediator", "run_ids"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("mediator", "subject_fields"); hasOpt {
if cfg.MediatorSubjectFields, errParse = ConfigSlice(c, "mediator", "subject_fields"); errParse != nil {
return nil, errParse
if cfg.MediatorSubjectFields, err = ConfigSlice(c, "mediator", "subject_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("mediator", "reqtype_fields"); hasOpt {
if cfg.MediatorReqTypeFields, errParse = ConfigSlice(c, "mediator", "reqtype_fields"); errParse != nil {
return nil, errParse
if cfg.MediatorReqTypeFields, err = ConfigSlice(c, "mediator", "reqtype_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("mediator", "direction_fields"); hasOpt {
if cfg.MediatorDirectionFields, errParse = ConfigSlice(c, "mediator", "direction_fields"); errParse != nil {
return nil, errParse
if cfg.MediatorDirectionFields, err = ConfigSlice(c, "mediator", "direction_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("mediator", "tenant_fields"); hasOpt {
if cfg.MediatorTenantFields, errParse = ConfigSlice(c, "mediator", "tenant_fields"); errParse != nil {
return nil, errParse
if cfg.MediatorTenantFields, err = ConfigSlice(c, "mediator", "tenant_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("mediator", "tor_fields"); hasOpt {
if cfg.MediatorTORFields, errParse = ConfigSlice(c, "mediator", "tor_fields"); errParse != nil {
return nil, errParse
if cfg.MediatorTORFields, err = ConfigSlice(c, "mediator", "tor_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("mediator", "account_fields"); hasOpt {
if cfg.MediatorAccountFields, errParse = ConfigSlice(c, "mediator", "account_fields"); errParse != nil {
return nil, errParse
if cfg.MediatorAccountFields, err = ConfigSlice(c, "mediator", "account_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("mediator", "destination_fields"); hasOpt {
if cfg.MediatorDestFields, errParse = ConfigSlice(c, "mediator", "destination_fields"); errParse != nil {
return nil, errParse
if cfg.MediatorDestFields, err = ConfigSlice(c, "mediator", "destination_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("mediator", "setup_time_fields"); hasOpt {
if cfg.MediatorSetupTimeFields, errParse = ConfigSlice(c, "mediator", "setup_time_fields"); errParse != nil {
return nil, errParse
if cfg.MediatorSetupTimeFields, err = ConfigSlice(c, "mediator", "setup_time_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("mediator", "answer_time_fields"); hasOpt {
if cfg.MediatorAnswerTimeFields, errParse = ConfigSlice(c, "mediator", "answer_time_fields"); errParse != nil {
return nil, errParse
if cfg.MediatorAnswerTimeFields, err = ConfigSlice(c, "mediator", "answer_time_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("mediator", "duration_fields"); hasOpt {
if cfg.MediatorDurationFields, errParse = ConfigSlice(c, "mediator", "duration_fields"); errParse != nil {
return nil, errParse
if cfg.MediatorDurationFields, err = ConfigSlice(c, "mediator", "duration_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("session_manager", "enabled"); hasOpt {
@@ -655,63 +653,63 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) {
}
if hasOpt = c.HasOption("session_manager", "max_call_duration"); hasOpt {
maxCallDurStr, _ := c.GetString("session_manager", "max_call_duration")
if cfg.SMMaxCallDuration, errParse = utils.ParseDurationWithSecs(maxCallDurStr); errParse != nil {
return nil, errParse
if cfg.SMMaxCallDuration, err = utils.ParseDurationWithSecs(maxCallDurStr); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("session_manager", "run_ids"); hasOpt {
if cfg.SMRunIds, errParse = ConfigSlice(c, "session_manager", "run_ids"); errParse != nil {
return nil, errParse
if cfg.SMRunIds, err = ConfigSlice(c, "session_manager", "run_ids"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("session_manager", "reqtype_fields"); hasOpt {
if cfg.SMReqTypeFields, errParse = ConfigSlice(c, "session_manager", "reqtype_fields"); errParse != nil {
return nil, errParse
if cfg.SMReqTypeFields, err = ConfigSlice(c, "session_manager", "reqtype_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("session_manager", "direction_fields"); hasOpt {
if cfg.SMDirectionFields, errParse = ConfigSlice(c, "session_manager", "direction_fields"); errParse != nil {
return nil, errParse
if cfg.SMDirectionFields, err = ConfigSlice(c, "session_manager", "direction_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("session_manager", "tenant_fields"); hasOpt {
if cfg.SMTenantFields, errParse = ConfigSlice(c, "session_manager", "tenant_fields"); errParse != nil {
return nil, errParse
if cfg.SMTenantFields, err = ConfigSlice(c, "session_manager", "tenant_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("session_manager", "tor_fields"); hasOpt {
if cfg.SMTORFields, errParse = ConfigSlice(c, "session_manager", "tor_fields"); errParse != nil {
return nil, errParse
if cfg.SMTORFields, err = ConfigSlice(c, "session_manager", "tor_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("session_manager", "account_fields"); hasOpt {
if cfg.SMAccountFields, errParse = ConfigSlice(c, "session_manager", "account_fields"); errParse != nil {
return nil, errParse
if cfg.SMAccountFields, err = ConfigSlice(c, "session_manager", "account_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("session_manager", "subject_fields"); hasOpt {
if cfg.SMSubjectFields, errParse = ConfigSlice(c, "session_manager", "subject_fields"); errParse != nil {
return nil, errParse
if cfg.SMSubjectFields, err = ConfigSlice(c, "session_manager", "subject_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("session_manager", "destination_fields"); hasOpt {
if cfg.SMDestFields, errParse = ConfigSlice(c, "session_manager", "destination_fields"); errParse != nil {
return nil, errParse
if cfg.SMDestFields, err = ConfigSlice(c, "session_manager", "destination_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("session_manager", "setup_time_fields"); hasOpt {
if cfg.SMSetupTimeFields, errParse = ConfigSlice(c, "session_manager", "setup_time_fields"); errParse != nil {
return nil, errParse
if cfg.SMSetupTimeFields, err = ConfigSlice(c, "session_manager", "setup_time_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("session_manager", "answer_time_fields"); hasOpt {
if cfg.SMAnswerTimeFields, errParse = ConfigSlice(c, "session_manager", "answer_time_fields"); errParse != nil {
return nil, errParse
if cfg.SMAnswerTimeFields, err = ConfigSlice(c, "session_manager", "answer_time_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("session_manager", "duration_fields"); hasOpt {
if cfg.SMDurationFields, errParse = ConfigSlice(c, "session_manager", "duration_fields"); errParse != nil {
return nil, errParse
if cfg.SMDurationFields, err = ConfigSlice(c, "session_manager", "duration_fields"); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("freeswitch", "server"); hasOpt {
@@ -737,8 +735,8 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) {
}
if hasOpt = c.HasOption("history_server", "save_interval"); hasOpt {
saveIntvlStr, _ := c.GetString("history_server", "save_interval")
if cfg.HistorySaveInterval, errParse = utils.ParseDurationWithSecs(saveIntvlStr); errParse != nil {
return nil, errParse
if cfg.HistorySaveInterval, err = utils.ParseDurationWithSecs(saveIntvlStr); err != nil {
return nil, err
}
}
if hasOpt = c.HasOption("mailer", "server"); hasOpt {

View File

@@ -32,7 +32,7 @@ func TestLoadXmlCfg(t *testing.T) {
return
}
cfgPath := path.Join(*dataDir, "conf", "samples", "config_local_test.cfg")
cfg, err := NewCGRConfig(&cfgPath)
cfg, err := NewCGRConfigFromFile(&cfgPath)
if err != nil {
t.Error(err)
}

View File

@@ -193,7 +193,7 @@ func TestSanityCheck(t *testing.T) {
// Load config from file and make sure we have all set
func TestConfigFromFile(t *testing.T) {
cfgPth := "test_data.txt"
cfg, err := NewCGRConfig(&cfgPth)
cfg, err := NewCGRConfigFromFile(&cfgPth)
if err != nil {
t.Log(fmt.Sprintf("Could not parse config: %s!", err))
t.FailNow()
@@ -307,3 +307,52 @@ func TestConfigFromFile(t *testing.T) {
t.Error("Loading of configuration from file failed!")
}
}
func TestCdrsExtraFields(t *testing.T) {
eFieldsCfg := []byte(`[cdrs]
extra_fields = extr1,extr2
`)
if cfg, err := NewCGRConfigFromBytes(eFieldsCfg); err != nil {
t.Error("Could not parse the config", err.Error())
} else if !reflect.DeepEqual(cfg.CDRSExtraFields, []*utils.RSRField{&utils.RSRField{Id: "extr1"}, &utils.RSRField{Id: "extr2"}}) {
t.Errorf("Unexpected value for CdrsExtraFields: %v", cfg.CDRSExtraFields)
}
eFieldsCfg = []byte(`[cdrs]
extra_fields = extr1,extr2,
`)
if _, err := NewCGRConfigFromBytes(eFieldsCfg); err == nil {
t.Error("Failed to detect empty field in the end of extra fields defition")
}
eFieldsCfg = []byte(`[cdrs]
extra_fields = extr1,~extr2:s/x.+/
`)
if _, err := NewCGRConfigFromBytes(eFieldsCfg); err == nil {
t.Error("Failed to detect failed RSRParsing")
}
}
func TestCdreExtraFields(t *testing.T) {
eFieldsCfg := []byte(`[cdre]
cdr_format = csv
export_template = cgrid,mediation_runid,accid
`)
if cfg, err := NewCGRConfigFromBytes(eFieldsCfg); err != nil {
t.Error("Could not parse the config", err.Error())
} else if !reflect.DeepEqual(cfg.CdreExportedFields, []*utils.RSRField{&utils.RSRField{Id: "cgrid"}, &utils.RSRField{Id: "mediation_runid"}, &utils.RSRField{Id: "accid"}}) {
t.Errorf("Unexpected value for CdrsExtraFields: %v", cfg.CDRSExtraFields)
}
eFieldsCfg = []byte(`[cdre]
cdr_format = csv
export_template = cgrid,mediation_runid,accid,
`)
if _, err := NewCGRConfigFromBytes(eFieldsCfg); err == nil {
t.Error("Failed to detect empty field in the end of export_template defition")
}
eFieldsCfg = []byte(`[cdre]
cdr_format = csv
export_template = cgrid,~accid:s/(\d)/$1,runid
`)
if _, err := NewCGRConfigFromBytes(eFieldsCfg); err == nil {
t.Error("Failed to detect failed RSRParsing")
}
}

View File

@@ -59,7 +59,7 @@ var startDelay = flag.Int("delay_start", 300, "Number of miliseconds to it for r
var cfgPath = path.Join(*dataDir, "conf", "samples", "mediator_test1.cfg")
func init() {
cfg, _ = config.NewCGRConfig(&cfgPath)
cfg, _ = config.NewCGRConfigFromFile(&cfgPath)
}
func TestInitRatingDb(t *testing.T) {