From b087baf068290b02d99012fca8470f89a62b05d1 Mon Sep 17 00:00:00 2001 From: DanB Date: Sun, 5 Oct 2014 17:26:15 +0200 Subject: [PATCH] CDRC cdr_type-> cdr_format, csv_separator->field_separator for better generics --- cdrc/cdrc.go | 12 +- cdrc/cdrc_test.go | 4 +- config/cdrcconfig.go | 21 ++-- config/cdrcconfig_test.go | 2 +- config/config.go | 2 +- config/config_test.go | 2 +- config/test_data.txt | 4 +- config/xmlcdrc_test.go | 8 +- config/xmlconfig.go | 2 +- data/conf/cgrates.cfg | 4 +- data/conf/samples/multiplecdrc_fwexport.xml | 130 ++++++++++---------- engine/action_timing.go | 5 +- engine/storage_redis.go | 16 +-- general_tests/acntacts_test.go | 108 ++++++++++++++++ general_tests/multiplecdrc_local_test.go | 18 +-- local_test.sh | 4 +- 16 files changed, 228 insertions(+), 114 deletions(-) create mode 100644 general_tests/acntacts_test.go diff --git a/cdrc/cdrc.go b/cdrc/cdrc.go index d52459786..8f883aa11 100644 --- a/cdrc/cdrc.go +++ b/cdrc/cdrc.go @@ -48,7 +48,7 @@ func NewCdrc(cdrcCfg *config.CdrcConfig, httpSkipTlsCheck bool, cdrServer *engin return nil, fmt.Errorf("Unsupported csv separator: %s", cdrcCfg.FieldSeparator) } csvSepRune, _ := utf8.DecodeRune([]byte(cdrcCfg.FieldSeparator)) - cdrc := &Cdrc{cdrsAddress: cdrcCfg.CdrsAddress, cdrType: cdrcCfg.CdrType, cdrInDir: cdrcCfg.CdrInDir, cdrOutDir: cdrcCfg.CdrOutDir, + cdrc := &Cdrc{cdrsAddress: cdrcCfg.CdrsAddress, CdrFormat: cdrcCfg.CdrFormat, cdrInDir: cdrcCfg.CdrInDir, cdrOutDir: cdrcCfg.CdrOutDir, cdrSourceId: cdrcCfg.CdrSourceId, runDelay: cdrcCfg.RunDelay, csvSep: csvSepRune, cdrFields: cdrcCfg.CdrFields, httpSkipTlsCheck: httpSkipTlsCheck, cdrServer: cdrServer} // Before processing, make sure in and out folders exist for _, dir := range []string{cdrc.cdrInDir, cdrc.cdrOutDir} { @@ -62,7 +62,7 @@ func NewCdrc(cdrcCfg *config.CdrcConfig, httpSkipTlsCheck bool, cdrServer *engin type Cdrc struct { cdrsAddress, - cdrType, + CdrFormat, cdrInDir, cdrOutDir, cdrSourceId string @@ -92,7 +92,7 @@ func (self *Cdrc) recordToStoredCdr(record []string) (*utils.StoredCdr, error) { var err error for _, cdrFldCfg := range self.cdrFields { var fieldVal string - if utils.IsSliceMember([]string{CSV, FS_CSV}, self.cdrType) { + if utils.IsSliceMember([]string{CSV, FS_CSV}, self.CdrFormat) { if cdrFldCfg.Type == utils.CDRFIELD { for _, cfgFieldRSR := range cdrFldCfg.Value { if cfgFieldRSR.IsStatic() { @@ -122,7 +122,7 @@ func (self *Cdrc) recordToStoredCdr(record []string) (*utils.StoredCdr, error) { return nil, fmt.Errorf("Unsupported field type: %s", cdrFldCfg.Type) } } else { // Modify here when we add more supported cdr formats - return nil, fmt.Errorf("Unsupported CDR file format: %s", self.cdrType) + return nil, fmt.Errorf("Unsupported CDR file format: %s", self.CdrFormat) } switch cdrFldCfg.CdrFieldId { case utils.TOR: @@ -169,7 +169,7 @@ func (self *Cdrc) processCdrDir() error { engine.Logger.Info(fmt.Sprintf(" Parsing folder %s for CDR files.", self.cdrInDir)) filesInDir, _ := ioutil.ReadDir(self.cdrInDir) for _, file := range filesInDir { - if self.cdrType != FS_CSV || path.Ext(file.Name()) != ".csv" { + if self.CdrFormat != FS_CSV || path.Ext(file.Name()) != ".csv" { go func() { //Enable async processing here if err := self.processFile(path.Join(self.cdrInDir, file.Name())); err != nil { engine.Logger.Err(fmt.Sprintf("Processing file %s, error: %s", file, err.Error())) @@ -195,7 +195,7 @@ func (self *Cdrc) trackCDRFiles() (err error) { for { select { case ev := <-watcher.Event: - if ev.IsCreate() && (self.cdrType != FS_CSV || path.Ext(ev.Name) != ".csv") { + if ev.IsCreate() && (self.CdrFormat != FS_CSV || path.Ext(ev.Name) != ".csv") { go func() { //Enable async processing here if err = self.processFile(ev.Name); err != nil { engine.Logger.Err(fmt.Sprintf("Processing file %s, error: %s", ev.Name, err.Error())) diff --git a/cdrc/cdrc_test.go b/cdrc/cdrc_test.go index 8ccc7882f..e2cd1daf1 100644 --- a/cdrc/cdrc_test.go +++ b/cdrc/cdrc_test.go @@ -30,7 +30,7 @@ func TestRecordForkCdr(t *testing.T) { cgrConfig, _ := config.NewDefaultCGRConfig() cdrcConfig := cgrConfig.CdrcInstances[0] cdrcConfig.CdrFields = append(cdrcConfig.CdrFields, &config.CfgCdrField{Tag: "SupplierTest", Type: utils.CDRFIELD, CdrFieldId: "supplier", Value: []*utils.RSRField{&utils.RSRField{Id: "14"}}}) - cdrc := &Cdrc{cdrType: CSV, cdrSourceId: "TEST_CDRC", cdrFields: cdrcConfig.CdrFields} + cdrc := &Cdrc{CdrFormat: CSV, cdrSourceId: "TEST_CDRC", cdrFields: cdrcConfig.CdrFields} cdrRow := []string{"firstField", "secondField"} _, err := cdrc.recordToStoredCdr(cdrRow) if err == nil { @@ -152,7 +152,7 @@ func TestDnTdmCdrs(t *testing.T) { utils.ANSWER_TIME: &utils.RSRField{Id: "4"}, utils.USAGE: usageFld, } - cdrc := &Cdrc{cgrConfig.CdrcCdrs, cgrConfig.CdrcCdrType, cgrConfig.CdrcCdrInDir, cgrConfig.CdrcCdrOutDir, cgrConfig.CdrcSourceId, cgrConfig.CdrcRunDelay, ',', + cdrc := &Cdrc{cgrConfig.CdrcCdrs, cgrConfig.CdrcCdrFormat, cgrConfig.CdrcCdrInDir, cgrConfig.CdrcCdrOutDir, cgrConfig.CdrcSourceId, cgrConfig.CdrcRunDelay, ',', cgrConfig.CdrcCdrFields, new(cdrs.CDRS), nil} cdrsContent := bytes.NewReader([]byte(tdmCdrs)) csvReader := csv.NewReader(cdrsContent) diff --git a/config/cdrcconfig.go b/config/cdrcconfig.go index c8bb5023a..889f05719 100644 --- a/config/cdrcconfig.go +++ b/config/cdrcconfig.go @@ -35,8 +35,8 @@ func NewCdrcConfigFromCgrXmlCdrcCfg(id string, xmlCdrcCfg *CgrXmlCdrcCfg) (*Cdrc if xmlCdrcCfg.CdrsAddress != nil { cdrcCfg.CdrsAddress = *xmlCdrcCfg.CdrsAddress } - if xmlCdrcCfg.CdrType != nil { - cdrcCfg.CdrType = *xmlCdrcCfg.CdrType + if xmlCdrcCfg.CdrFormat != nil { + cdrcCfg.CdrFormat = *xmlCdrcCfg.CdrFormat } if xmlCdrcCfg.FieldSeparator != nil { cdrcCfg.FieldSeparator = *xmlCdrcCfg.FieldSeparator @@ -47,6 +47,9 @@ func NewCdrcConfigFromCgrXmlCdrcCfg(id string, xmlCdrcCfg *CgrXmlCdrcCfg) (*Cdrc if xmlCdrcCfg.CdrInDir != nil { cdrcCfg.CdrInDir = *xmlCdrcCfg.CdrInDir } + if xmlCdrcCfg.CdrOutDir != nil { + cdrcCfg.CdrOutDir = *xmlCdrcCfg.CdrOutDir + } if xmlCdrcCfg.CdrSourceId != nil { cdrcCfg.CdrSourceId = *xmlCdrcCfg.CdrSourceId } @@ -54,7 +57,7 @@ func NewCdrcConfigFromCgrXmlCdrcCfg(id string, xmlCdrcCfg *CgrXmlCdrcCfg) (*Cdrc cdrcCfg.CdrFields = nil // Reinit the fields, so we do not inherit from defaults here } for _, xmlCdrField := range xmlCdrcCfg.CdrFields { - if cdrFld, err := NewCfgCdrFieldFromCgrXmlCfgCdrField(xmlCdrField, cdrcCfg.CdrType == utils.CDRE_FIXED_WIDTH); err != nil { + if cdrFld, err := NewCfgCdrFieldFromCgrXmlCfgCdrField(xmlCdrField, cdrcCfg.CdrFormat == utils.CDRE_FIXED_WIDTH); err != nil { return nil, err } else { cdrcCfg.CdrFields = append(cdrcCfg.CdrFields, cdrFld) @@ -82,7 +85,7 @@ func NewDefaultCdrcConfig() *CdrcConfig { Id: utils.META_DEFAULT, Enabled: false, CdrsAddress: "", - CdrType: utils.CSV, + CdrFormat: utils.CSV, FieldSeparator: utils.FIELDS_SEP, RunDelay: time.Duration(0), CdrInDir: "/var/log/cgrates/cdrc/in", @@ -102,11 +105,11 @@ func NewCdrcConfigFromFileParams(c *conf.ConfigFile) (*CdrcConfig, error) { if hasOpt := c.HasOption("cdrc", "cdrs"); hasOpt { cdrcCfg.CdrsAddress, _ = c.GetString("cdrc", "cdrs") } - if hasOpt := c.HasOption("cdrc", "cdr_type"); hasOpt { - cdrcCfg.CdrType, _ = c.GetString("cdrc", "cdr_type") + if hasOpt := c.HasOption("cdrc", "cdr_format"); hasOpt { + cdrcCfg.CdrFormat, _ = c.GetString("cdrc", "cdr_format") } - if hasOpt := c.HasOption("cdrc", "csv_separator"); hasOpt { - cdrcCfg.FieldSeparator, _ = c.GetString("cdrc", "csv_separator") + if hasOpt := c.HasOption("cdrc", "field_separator"); hasOpt { + cdrcCfg.FieldSeparator, _ = c.GetString("cdrc", "field_separator") } if hasOpt := c.HasOption("cdrc", "run_delay"); hasOpt { durStr, _ := c.GetString("cdrc", "run_delay") @@ -187,7 +190,7 @@ type CdrcConfig struct { Id string // Configuration label Enabled bool // Enable/Disable the profile CdrsAddress string // The address where CDRs can be reached - CdrType string // The type of CDR file to process + CdrFormat string // The type of CDR file to process FieldSeparator string // The separator to use when reading csvs RunDelay time.Duration // Delay between runs, 0 for inotify driven requests CdrInDir string // Folder to process CDRs from diff --git a/config/cdrcconfig_test.go b/config/cdrcconfig_test.go index 383593805..310f912af 100644 --- a/config/cdrcconfig_test.go +++ b/config/cdrcconfig_test.go @@ -31,7 +31,7 @@ func TestNewDefaultCdrcConfig(t *testing.T) { Id: utils.META_DEFAULT, Enabled: false, CdrsAddress: "", - CdrType: utils.CSV, + CdrFormat: utils.CSV, FieldSeparator: utils.FIELDS_SEP, RunDelay: time.Duration(0), CdrInDir: "/var/log/cgrates/cdrc/in", diff --git a/config/config.go b/config/config.go index a36be6149..4b5cbb12b 100644 --- a/config/config.go +++ b/config/config.go @@ -230,7 +230,7 @@ func (self *CGRConfig) checkConfigSanity() error { if len(cdrcInst.CdrFields) == 0 { return errors.New("CdrC enabled but no fields to be processed defined!") } - if cdrcInst.CdrType == utils.CSV { + if cdrcInst.CdrFormat == utils.CSV { for _, cdrFld := range cdrcInst.CdrFields { for _, rsrFld := range cdrFld.Value { if _, errConv := strconv.Atoi(rsrFld.Id); errConv != nil { diff --git a/config/config_test.go b/config/config_test.go index c1f79923a..73c70f55d 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -232,7 +232,7 @@ func TestConfigFromFile(t *testing.T) { cdrcCfg.Enabled = true cdrcCfg.CdrsAddress = "test" cdrcCfg.RunDelay = time.Duration(99) * time.Second - cdrcCfg.CdrType = "test" + cdrcCfg.CdrFormat = "test" cdrcCfg.FieldSeparator = ";" cdrcCfg.CdrInDir = "test" cdrcCfg.CdrOutDir = "test" diff --git a/config/test_data.txt b/config/test_data.txt index 3a99cbcf2..e06cce284 100644 --- a/config/test_data.txt +++ b/config/test_data.txt @@ -65,8 +65,8 @@ export_template = test # List of fields in the exported CDRs enabled = true # Enable CDR client functionality cdrs = test # Address where to reach CDR server run_delay = 99 # Period to sleep between two runs, 0 to use automation via inotify -cdr_type = test # CDR file format . -csv_separator =; # Csv separator, one character only and should be next to equal sign +cdr_format = test # CDR file format . +field_separator =; # Csv separator, one character only and should be next to equal sign cdr_in_dir = test # Absolute path towards the direccategoryy where the CDRs are kept (file scategoryed CDRs). cdr_out_dir = test # Absolute path towards the direccategoryy where processed CDRs will be moved after processing. cdr_source_id = test # Tag identifying the source of the CDRs within CGRS database. diff --git a/config/xmlcdrc_test.go b/config/xmlcdrc_test.go index 901f049b9..c6e722e87 100644 --- a/config/xmlcdrc_test.go +++ b/config/xmlcdrc_test.go @@ -50,7 +50,7 @@ func TestSetDefaults(t *testing.T) { dfCfg, _ := NewDefaultCGRConfig() xmlCdrc.setDefaults() if xmlCdrc.CdrsAddress != dfCfg.CdrcCdrs || - xmlCdrc.CdrType != dfCfg.CdrcCdrType || + xmlCdrc.CdrFormat != dfCfg.CdrcCdrType || xmlCdrc.CsvSeparator != dfCfg.CdrcCsvSep || xmlCdrc.CdrInDir != dfCfg.CdrcCdrInDir || xmlCdrc.CdrOutDir != dfCfg.CdrcCdrOutDir || @@ -67,7 +67,7 @@ func TestParseXmlCdrcConfig(t *testing.T) { true internal - csv + csv , 0 /var/log/cgrates/cdrc/in @@ -109,13 +109,13 @@ func TestGetCdrcCfgs(t *testing.T) { } enabled := true cdrsAddr := "internal" - cdrType := "csv" + cdrFormat := "csv" fldSep := "," runDelay := int64(0) cdrInDir := "/var/log/cgrates/cdrc/in" cdrOutDir := "/var/log/cgrates/cdrc/out" cdrSrcId := "freeswitch_csv" - expectCdrc := &CgrXmlCdrcCfg{Enabled: &enabled, CdrsAddress: &cdrsAddr, CdrType: &cdrType, FieldSeparator: &fldSep, + expectCdrc := &CgrXmlCdrcCfg{Enabled: &enabled, CdrsAddress: &cdrsAddr, CdrFormat: &cdrFormat, FieldSeparator: &fldSep, RunDelay: &runDelay, CdrInDir: &cdrInDir, CdrOutDir: &cdrOutDir, CdrSourceId: &cdrSrcId} accIdTag, reqTypeTag, dirTag, tntTag, categTag, acntTag, subjTag, dstTag, sTimeTag, aTimeTag, usageTag, extr1, extr2 := utils.ACCID, utils.REQTYPE, utils.DIRECTION, utils.TENANT, utils.CATEGORY, utils.ACCOUNT, utils.SUBJECT, utils.DESTINATION, utils.SETUP_TIME, utils.ANSWER_TIME, utils.USAGE, "extr1", "extr2" diff --git a/config/xmlconfig.go b/config/xmlconfig.go index e80d65031..d51bf65b3 100644 --- a/config/xmlconfig.go +++ b/config/xmlconfig.go @@ -57,7 +57,7 @@ type XmlCfgCdrField struct { type CgrXmlCdrcCfg struct { Enabled *bool `xml:"enabled"` // Enable/Disable the CdrsAddress *string `xml:"cdrs_address"` // The address where CDRs can be reached - CdrType *string `xml:"cdr_type"` // The type of CDR to process + CdrFormat *string `xml:"cdr_format"` // The type of CDR to process FieldSeparator *string `xml:"field_separator"` // The separator to use when reading csvs RunDelay *int64 `xml:"run_delay"` // Delay between runs CdrInDir *string `xml:"cdr_in_dir"` // Folder to process CDRs from diff --git a/data/conf/cgrates.cfg b/data/conf/cgrates.cfg index 91e439aa3..f184e479d 100644 --- a/data/conf/cgrates.cfg +++ b/data/conf/cgrates.cfg @@ -69,8 +69,8 @@ # enabled = false # Enable CDR client functionality # cdrs = internal # Address where to reach CDR server. # run_delay = 0 # Sleep interval in seconds between consecutive runs, 0 to use automation via inotify -# cdr_type = csv # CDR file format . -# csv_separator = , # Separator used in case of csv files. One character only supported and needs to be right after equal sign +# cdr_format = csv # CDR file format . +# field_separator = , # Separator used in case of csv files. One character only supported and needs to be right after equal sign # cdr_in_dir = /var/log/cgrates/cdrc/in # Absolute path towards the directory where the CDRs are stored. # cdr_out_dir = /var/log/cgrates/cdrc/out # Absolute path towards the directory where processed CDRs will be moved. # cdr_source_id = csv # Free form field, tag identifying the source of the CDRs within CGRS database. diff --git a/data/conf/samples/multiplecdrc_fwexport.xml b/data/conf/samples/multiplecdrc_fwexport.xml index fc34de389..6f911c041 100644 --- a/data/conf/samples/multiplecdrc_fwexport.xml +++ b/data/conf/samples/multiplecdrc_fwexport.xml @@ -1,51 +1,51 @@ - + true internal csv - , + , 0 /tmp/cgrates/cdrc2/in /tmp/cgrates/cdrc2/out csv2 - - - - - - - - - - - - + + + + + + + + + + + + - + true internal csv - ; + ; 0 /tmp/cgrates/cdrc3/in /tmp/cgrates/cdrc3/out csv3 - - - - - - - - - - - - + + + + + + + + + + + + @@ -59,51 +59,51 @@
- - - - - - - - + + + + + + + +
- - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + +
diff --git a/engine/action_timing.go b/engine/action_timing.go index 8eaad606a..a04cee13a 100644 --- a/engine/action_timing.go +++ b/engine/action_timing.go @@ -261,10 +261,11 @@ func (at *ActionTiming) Execute() (err error) { Logger.Warning(fmt.Sprintf("Could not get user balances for this id: %s. Skipping!", ubId)) return 0, err } else if ub.Disabled && a.ActionType != ENABLE_ACCOUNT { - return 0, fmt.Errorf("User %s is disabled", ubId) + return 0, fmt.Errorf("Account %s is disabled", ubId) } - //Logger.Info(fmt.Sprintf("Executing %v on %v", a.ActionType, ub.Id)) + //Logger.Info(fmt.Sprintf("Executing %v on %+v", a.ActionType, ub)) err = actionFunction(ub, nil, a) + //Logger.Info(fmt.Sprintf("After execute, account: %+v", ub)) accountingStorage.SetAccount(ub) return 0, nil }) diff --git a/engine/storage_redis.go b/engine/storage_redis.go index 6b0aaeb37..e6c185b41 100644 --- a/engine/storage_redis.go +++ b/engine/storage_redis.go @@ -379,15 +379,15 @@ func (rs *RedisStorage) RemoveRpAliases(tenantRtSubjects []*TenantRatingSubject) return err } for _, key := range alsKeys { + alias, err := rs.GetRpAlias(key[len(RP_ALIAS_PREFIX):], true) + if err != nil { + return err + } for _, tntRSubj := range tenantRtSubjects { tenantPrfx := RP_ALIAS_PREFIX + tntRSubj.Tenant + utils.CONCATENATED_KEY_SEP if len(key) < len(tenantPrfx) || tenantPrfx != key[:len(tenantPrfx)] { // filter out the tenant for accounts continue } - alias, err := rs.GetRpAlias(key[len(RP_ALIAS_PREFIX):], true) - if err != nil { - return err - } if tntRSubj.Subject != alias { continue } @@ -477,15 +477,15 @@ func (rs *RedisStorage) RemoveAccAliases(tenantAccounts []*TenantAccount) (err e return err } for _, key := range alsKeys { + alias, err := rs.GetAccAlias(key[len(ACC_ALIAS_PREFIX):], true) + if err != nil { + return err + } for _, tntAcnt := range tenantAccounts { tenantPrfx := ACC_ALIAS_PREFIX + tntAcnt.Tenant + utils.CONCATENATED_KEY_SEP if len(key) < len(tenantPrfx) || tenantPrfx != key[:len(tenantPrfx)] { // filter out the tenant for accounts continue } - alias, err := rs.GetAccAlias(key[len(ACC_ALIAS_PREFIX):], true) - if err != nil { - return err - } if tntAcnt.Account != alias { continue } diff --git a/general_tests/acntacts_test.go b/general_tests/acntacts_test.go new file mode 100644 index 000000000..8b6879bde --- /dev/null +++ b/general_tests/acntacts_test.go @@ -0,0 +1,108 @@ +/* +Real-time Charging System for Telecom & ISP environments +Copyright (C) 2012-2014 ITsysCOM GmbH + +This program is free software: you can Storagetribute it and/or modify +it under the terms of the GNU 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 WITH*out ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + +package general_tests + +import ( + "github.com/cgrates/cgrates/engine" + "reflect" + "testing" +) + +var ratingDbAcntActs engine.RatingStorage +var acntDbAcntActs engine.AccountingStorage + +func TestAcntActsSetStorage(t *testing.T) { + ratingDbAcntActs, _ = engine.NewMapStorageJson() + engine.SetRatingStorage(ratingDbAcntActs) + acntDbAcntActs, _ = engine.NewMapStorageJson() + engine.SetAccountingStorage(acntDbAcntActs) +} + +func TestAcntActsLoadCsv(t *testing.T) { + timings := `ASAP,*any,*any,*any,*any,*asap` + destinations := `` + rates := `` + destinationRates := `` + ratingPlans := `` + ratingProfiles := `` + sharedGroups := `` + lcrs := `` + actions := `TOPUP10_AC,*topup_reset,,*voice,*out,,*any,,,*unlimited,10,10,10 +DISABLE_ACNT,*disable_account,,,,,,,,,,,10 +ENABLE_ACNT,*enable_account,,,,,,,,,,,10` + actionPlans := `TOPUP10_AT,TOPUP10_AC,ASAP,10` + actionTriggers := `` + accountActions := `cgrates.org,1,*out,TOPUP10_AT,` + derivedCharges := `` + cdrStats := `` + csvr := engine.NewStringCSVReader(ratingDbAcntActs, acntDbAcntActs, ',', destinations, timings, rates, destinationRates, ratingPlans, ratingProfiles, + sharedGroups, lcrs, actions, actionPlans, actionTriggers, accountActions, derivedCharges, cdrStats) + if err := csvr.LoadAll(); err != nil { + t.Fatal(err) + } + csvr.WriteToDatabase(false, false) + ratingDbAcntActs.CacheRating(nil, nil, nil, nil, nil) + acntDbAcntActs.CacheAccounting(nil, nil, nil, nil) + expectAcnt := &engine.Account{Id: "*out:cgrates.org:1"} + if acnt, err := acntDbAcntActs.GetAccount("*out:cgrates.org:1"); err != nil { + t.Error(err) + } else if acnt == nil { + t.Error("No account created") + } else if !reflect.DeepEqual(expectAcnt, acnt) { + t.Errorf("Expecting: %+v, received: %+v", expectAcnt, acnt) + } +} + +/* +//ToDo +// This test fails due to Disabled which is ignored on SetAccount with partial content. SetAccount should only be called with account when no previous one set in dataDb. +func TestAcntActsDisableAcnt(t *testing.T) { + acnt1Tag := "*out:cgrates.org:1" + at := &engine.ActionTiming{ + AccountIds: []string{acnt1Tag}, + ActionsId: "DISABLE_ACNT", + } + if err := at.Execute(); err != nil { + t.Error(err) + } + expectAcnt := &engine.Account{Id: "*out:cgrates.org:1", Disabled: true} + if acnt, err := acntDbAcntActs.GetAccount(acnt1Tag); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(expectAcnt, acnt) { + t.Errorf("Expecting: %+v, received: %+v", expectAcnt, acnt) + } +} +*/ + +func TestAcntActsEnableAcnt(t *testing.T) { + acnt1Tag := "*out:cgrates.org:1" + at := &engine.ActionTiming{ + AccountIds: []string{acnt1Tag}, + ActionsId: "ENABLE_ACNT", + } + if err := at.Execute(); err != nil { + t.Error(err) + } + expectAcnt := &engine.Account{Id: "*out:cgrates.org:1", Disabled: false} + if acnt, err := acntDbAcntActs.GetAccount(acnt1Tag); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(expectAcnt, acnt) { + t.Errorf("Expecting: %+v, received: %+v", expectAcnt, acnt) + } +} diff --git a/general_tests/multiplecdrc_local_test.go b/general_tests/multiplecdrc_local_test.go index f365e7ab4..fb5e90b95 100644 --- a/general_tests/multiplecdrc_local_test.go +++ b/general_tests/multiplecdrc_local_test.go @@ -65,6 +65,7 @@ func startEngine() error { func stopEngine() error { exec.Command("pkill", "cgr-engine").Run() // Just to make sure another one is not running, bit brutal maybe we can fine tune it + time.Sleep(time.Duration(*waitRater) * time.Millisecond) return nil } @@ -96,14 +97,14 @@ func TestCreateCdrDirs(t *testing.T) { if !*testLocal { return } - for _, cdrcDir := range []string{cfg.CdrcInstances[0].CdrInDir, cfg.CdrcInstances[0].CdrOutDir, - *cfg.XmlCfgDocument.GetCdrcCfgs("CDRC-CSV2")["CDRC-CSV2"].CdrInDir, *cfg.XmlCfgDocument.GetCdrcCfgs("CDRC-CSV2")["CDRC-CSV2"].CdrOutDir, - *cfg.XmlCfgDocument.GetCdrcCfgs("CDRC-CSV3")["CDRC-CSV3"].CdrInDir, *cfg.XmlCfgDocument.GetCdrcCfgs("CDRC-CSV3")["CDRC-CSV3"].CdrOutDir} { - if err := os.RemoveAll(cdrcDir); err != nil { - t.Fatal("Error removing folder: ", cdrcDir, err) - } - if err := os.MkdirAll(cdrcDir, 0755); err != nil { - t.Fatal("Error creating folder: ", cdrcDir, err) + for _, cdrcInst := range cfg.CdrcInstances { + for _, dir := range []string{cdrcInst.CdrInDir, cdrcInst.CdrOutDir} { + if err := os.RemoveAll(dir); err != nil { + t.Fatal("Error removing folder: ", dir, err) + } + if err := os.MkdirAll(dir, 0755); err != nil { + t.Fatal("Error creating folder: ", dir, err) + } } } } @@ -114,7 +115,6 @@ func TestRpcConn(t *testing.T) { return } startEngine() - time.Sleep(time.Duration(*waitRater) * time.Millisecond) var err error rater, err = jsonrpc.Dial("tcp", cfg.RPCJSONListen) // We connect over JSON so we can also troubleshoot if needed if err != nil { diff --git a/local_test.sh b/local_test.sh index 50ca97816..c02d3c147 100755 --- a/local_test.sh +++ b/local_test.sh @@ -14,11 +14,13 @@ go test github.com/cgrates/cgrates/config -local cfg=$? go test github.com/cgrates/cgrates/utils -local utl=$? +go test github.com/cgrates/cgrates/general_tests -local +gnr=$? -exit $gen && $ap1 && $ap2 && $en && $cdrc && $cfg && $utl +exit $gen && $ap1 && $ap2 && $en && $cdrc && $cfg && $utl && $gnr