/* 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 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 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 config import ( "reflect" "testing" "time" "github.com/cgrates/cgrates/utils" ) func TestLoadCdrcConfigMultipleFiles(t *testing.T) { cgrCfg, err := NewCGRConfigFromFolder(".") if err != nil { t.Error(err) } eCgrCfg, _ := NewDefaultCGRConfig() eCgrCfg.CdrcProfiles = make(map[string][]*CdrcConfig) // Default instance first eCgrCfg.CdrcProfiles["/var/spool/cgrates/cdrc/in"] = []*CdrcConfig{ &CdrcConfig{ ID: utils.META_DEFAULT, Enabled: false, CdrsConns: []*HaPoolConfig{&HaPoolConfig{Address: utils.MetaInternal}}, CdrFormat: "csv", FieldSeparator: ',', DataUsageMultiplyFactor: 1024, RunDelay: 0, MaxOpenFiles: 1024, CdrInDir: "/var/spool/cgrates/cdrc/in", CdrOutDir: "/var/spool/cgrates/cdrc/out", FailedCallsPrefix: "missed_calls", CDRPath: utils.HierarchyPath([]string{""}), CdrSourceId: "freeswitch_csv", Filters: []string{}, Tenant: NewRSRParsersMustCompile("cgrates.org", true), PartialRecordCache: time.Duration(10) * time.Second, PartialCacheExpiryAction: utils.MetaDumpToFile, HeaderFields: make([]*FCTemplate, 0), ContentFields: []*FCTemplate{ &FCTemplate{Tag: "TOR", Type: utils.META_COMPOSED, FieldId: utils.ToR, Value: NewRSRParsersMustCompile("~2", true), Mandatory: true}, &FCTemplate{Tag: "OriginID", Type: utils.META_COMPOSED, FieldId: utils.OriginID, Value: NewRSRParsersMustCompile("~3", true), Mandatory: true}, &FCTemplate{Tag: "RequestType", Type: utils.META_COMPOSED, FieldId: utils.RequestType, Value: NewRSRParsersMustCompile("~4", true), Mandatory: true}, &FCTemplate{Tag: "Tenant", Type: utils.META_COMPOSED, FieldId: utils.Tenant, Value: NewRSRParsersMustCompile("~6", true), Mandatory: true}, &FCTemplate{Tag: "Category", Type: utils.META_COMPOSED, FieldId: utils.Category, Value: NewRSRParsersMustCompile("~7", true), Mandatory: true}, &FCTemplate{Tag: "Account", Type: utils.META_COMPOSED, FieldId: utils.Account, Value: NewRSRParsersMustCompile("~8", true), Mandatory: true}, &FCTemplate{Tag: "Subject", Type: utils.META_COMPOSED, FieldId: utils.Subject, Value: NewRSRParsersMustCompile("~9", true), Mandatory: true}, &FCTemplate{Tag: "Destination", Type: utils.META_COMPOSED, FieldId: utils.Destination, Value: NewRSRParsersMustCompile("~10", true), Mandatory: true}, &FCTemplate{Tag: "SetupTime", Type: utils.META_COMPOSED, FieldId: utils.SetupTime, Value: NewRSRParsersMustCompile("~11", true), Mandatory: true}, &FCTemplate{Tag: "AnswerTime", Type: utils.META_COMPOSED, FieldId: utils.AnswerTime, Value: NewRSRParsersMustCompile("~12", true), Mandatory: true}, &FCTemplate{Tag: "Usage", Type: utils.META_COMPOSED, FieldId: utils.Usage, Value: NewRSRParsersMustCompile("~13", true), Mandatory: true}, }, TrailerFields: make([]*FCTemplate, 0), CacheDumpFields: []*FCTemplate{ &FCTemplate{Tag: "CGRID", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.CGRID, true)}, &FCTemplate{Tag: "RunID", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.RunID, true)}, &FCTemplate{Tag: "TOR", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.ToR, true)}, &FCTemplate{Tag: "OriginID", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.OriginID, true)}, &FCTemplate{Tag: "RequestType", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.RequestType, true)}, &FCTemplate{Tag: "Tenant", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Tenant, true)}, &FCTemplate{Tag: "Category", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Category, true)}, &FCTemplate{Tag: "Account", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Account, true)}, &FCTemplate{Tag: "Subject", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Subject, true)}, &FCTemplate{Tag: "Destination", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Destination, true)}, &FCTemplate{Tag: "SetupTime", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.SetupTime, true), Layout: "2006-01-02T15:04:05Z07:00"}, &FCTemplate{Tag: "AnswerTime", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.AnswerTime, true), Layout: "2006-01-02T15:04:05Z07:00"}, &FCTemplate{Tag: "Usage", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Usage, true)}, &FCTemplate{Tag: "Cost", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.COST, true)}, }, }, } eCgrCfg.CdrcProfiles["/tmp/cgrates/cdrc1/in"] = []*CdrcConfig{ &CdrcConfig{ ID: "CDRC-CSV1", Enabled: true, CdrsConns: []*HaPoolConfig{&HaPoolConfig{Address: utils.MetaInternal}}, CdrFormat: "csv", FieldSeparator: ',', DataUsageMultiplyFactor: 1024, RunDelay: 0, MaxOpenFiles: 1024, CdrInDir: "/tmp/cgrates/cdrc1/in", CdrOutDir: "/tmp/cgrates/cdrc1/out", CDRPath: utils.HierarchyPath([]string{""}), CdrSourceId: "csv1", Filters: []string{}, Tenant: NewRSRParsersMustCompile("cgrates.org", true), PartialRecordCache: time.Duration(10) * time.Second, PartialCacheExpiryAction: utils.MetaDumpToFile, HeaderFields: make([]*FCTemplate, 0), ContentFields: []*FCTemplate{ &FCTemplate{Tag: "TOR", Type: utils.META_COMPOSED, FieldId: utils.ToR, Value: NewRSRParsersMustCompile("~2", true), Mandatory: true}, &FCTemplate{Tag: "OriginID", Type: utils.META_COMPOSED, FieldId: utils.OriginID, Value: NewRSRParsersMustCompile("~3", true), Mandatory: true}, &FCTemplate{Tag: "RequestType", Type: utils.META_COMPOSED, FieldId: utils.RequestType, Value: NewRSRParsersMustCompile("~4", true), Mandatory: true}, &FCTemplate{Tag: "Tenant", Type: utils.META_COMPOSED, FieldId: utils.Tenant, Value: NewRSRParsersMustCompile("~6", true), Mandatory: true}, &FCTemplate{Tag: "Category", Type: utils.META_COMPOSED, FieldId: utils.Category, Value: NewRSRParsersMustCompile("~7", true), Mandatory: true}, &FCTemplate{Tag: "Account", Type: utils.META_COMPOSED, FieldId: utils.Account, Value: NewRSRParsersMustCompile("~8", true), Mandatory: true}, &FCTemplate{Tag: "Subject", Type: utils.META_COMPOSED, FieldId: utils.Subject, Value: NewRSRParsersMustCompile("~9", true), Mandatory: true}, &FCTemplate{Tag: "Destination", Type: utils.META_COMPOSED, FieldId: utils.Destination, Value: NewRSRParsersMustCompile("~10", true), Mandatory: true}, &FCTemplate{Tag: "SetupTime", Type: utils.META_COMPOSED, FieldId: utils.SetupTime, Value: NewRSRParsersMustCompile("~11", true), Mandatory: true}, &FCTemplate{Tag: "AnswerTime", Type: utils.META_COMPOSED, FieldId: utils.AnswerTime, Value: NewRSRParsersMustCompile("~12", true), Mandatory: true}, &FCTemplate{Tag: "Usage", Type: utils.META_COMPOSED, FieldId: utils.Usage, Value: NewRSRParsersMustCompile("~13", true), Mandatory: true}, }, TrailerFields: make([]*FCTemplate, 0), CacheDumpFields: []*FCTemplate{ &FCTemplate{Tag: "CGRID", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.CGRID, true)}, &FCTemplate{Tag: "RunID", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.RunID, true)}, &FCTemplate{Tag: "TOR", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.ToR, true)}, &FCTemplate{Tag: "OriginID", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.OriginID, true)}, &FCTemplate{Tag: "RequestType", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.RequestType, true)}, &FCTemplate{Tag: "Tenant", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Tenant, true)}, &FCTemplate{Tag: "Category", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Category, true)}, &FCTemplate{Tag: "Account", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Account, true)}, &FCTemplate{Tag: "Subject", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Subject, true)}, &FCTemplate{Tag: "Destination", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Destination, true)}, &FCTemplate{Tag: "SetupTime", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.SetupTime, true), Layout: "2006-01-02T15:04:05Z07:00"}, &FCTemplate{Tag: "AnswerTime", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.AnswerTime, true), Layout: "2006-01-02T15:04:05Z07:00"}, &FCTemplate{Tag: "Usage", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Usage, true)}, &FCTemplate{Tag: "Cost", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.COST, true)}, }, }, } eCgrCfg.CdrcProfiles["/tmp/cgrates/cdrc2/in"] = []*CdrcConfig{ &CdrcConfig{ ID: "CDRC-CSV2", Enabled: true, CdrsConns: []*HaPoolConfig{&HaPoolConfig{Address: utils.MetaInternal}}, CdrFormat: "csv", FieldSeparator: ',', DataUsageMultiplyFactor: 0.000976563, RunDelay: 1000000000, MaxOpenFiles: 1024, CdrInDir: "/tmp/cgrates/cdrc2/in", CdrOutDir: "/tmp/cgrates/cdrc2/out", CDRPath: utils.HierarchyPath([]string{""}), CdrSourceId: "csv2", Filters: []string{}, Tenant: NewRSRParsersMustCompile("cgrates.org", true), PartialRecordCache: time.Duration(10) * time.Second, PartialCacheExpiryAction: utils.MetaDumpToFile, HeaderFields: make([]*FCTemplate, 0), ContentFields: []*FCTemplate{ &FCTemplate{FieldId: utils.ToR, Value: NewRSRParsersMustCompile("~7:s/^(voice|data|sms|mms|generic)$/*$1/", true)}, &FCTemplate{Tag: "", Type: "", FieldId: utils.AnswerTime, Value: NewRSRParsersMustCompile("~1", true)}, &FCTemplate{FieldId: utils.Usage, Value: NewRSRParsersMustCompile("~9:s/^(\\d+)$/${1}s/", true)}, }, TrailerFields: make([]*FCTemplate, 0), CacheDumpFields: []*FCTemplate{ &FCTemplate{Tag: "CGRID", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.CGRID, true)}, &FCTemplate{Tag: "RunID", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.RunID, true)}, &FCTemplate{Tag: "TOR", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.ToR, true)}, &FCTemplate{Tag: "OriginID", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.OriginID, true)}, &FCTemplate{Tag: "RequestType", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.RequestType, true)}, &FCTemplate{Tag: "Tenant", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Tenant, true)}, &FCTemplate{Tag: "Category", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Category, true)}, &FCTemplate{Tag: "Account", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Account, true)}, &FCTemplate{Tag: "Subject", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Subject, true)}, &FCTemplate{Tag: "Destination", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Destination, true)}, &FCTemplate{Tag: "SetupTime", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.SetupTime, true), Layout: "2006-01-02T15:04:05Z07:00"}, &FCTemplate{Tag: "AnswerTime", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.AnswerTime, true), Layout: "2006-01-02T15:04:05Z07:00"}, &FCTemplate{Tag: "Usage", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Usage, true)}, &FCTemplate{Tag: "Cost", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.COST, true)}, }, }, } eCgrCfg.CdrcProfiles["/tmp/cgrates/cdrc3/in"] = []*CdrcConfig{ &CdrcConfig{ ID: "CDRC-CSV3", Enabled: true, CdrsConns: []*HaPoolConfig{&HaPoolConfig{Address: utils.MetaInternal}}, CdrFormat: "csv", FieldSeparator: ',', DataUsageMultiplyFactor: 1024, RunDelay: 0, MaxOpenFiles: 1024, CdrInDir: "/tmp/cgrates/cdrc3/in", CdrOutDir: "/tmp/cgrates/cdrc3/out", CDRPath: utils.HierarchyPath([]string{""}), CdrSourceId: "csv3", Filters: []string{}, Tenant: NewRSRParsersMustCompile("cgrates.org", true), PartialRecordCache: time.Duration(10) * time.Second, PartialCacheExpiryAction: utils.MetaDumpToFile, HeaderFields: make([]*FCTemplate, 0), ContentFields: []*FCTemplate{ &FCTemplate{Tag: "TOR", Type: utils.META_COMPOSED, FieldId: utils.ToR, Value: NewRSRParsersMustCompile("~2", true), Mandatory: true}, &FCTemplate{Tag: "OriginID", Type: utils.META_COMPOSED, FieldId: utils.OriginID, Value: NewRSRParsersMustCompile("~3", true), Mandatory: true}, &FCTemplate{Tag: "RequestType", Type: utils.META_COMPOSED, FieldId: utils.RequestType, Value: NewRSRParsersMustCompile("~4", true), Mandatory: true}, &FCTemplate{Tag: "Tenant", Type: utils.META_COMPOSED, FieldId: utils.Tenant, Value: NewRSRParsersMustCompile("~6", true), Mandatory: true}, &FCTemplate{Tag: "Category", Type: utils.META_COMPOSED, FieldId: utils.Category, Value: NewRSRParsersMustCompile("~7", true), Mandatory: true}, &FCTemplate{Tag: "Account", Type: utils.META_COMPOSED, FieldId: utils.Account, Value: NewRSRParsersMustCompile("~8", true), Mandatory: true}, &FCTemplate{Tag: "Subject", Type: utils.META_COMPOSED, FieldId: utils.Subject, Value: NewRSRParsersMustCompile("~9", true), Mandatory: true}, &FCTemplate{Tag: "Destination", Type: utils.META_COMPOSED, FieldId: utils.Destination, Value: NewRSRParsersMustCompile("~10", true), Mandatory: true}, &FCTemplate{Tag: "SetupTime", Type: utils.META_COMPOSED, FieldId: utils.SetupTime, Value: NewRSRParsersMustCompile("~11", true), Mandatory: true}, &FCTemplate{Tag: "AnswerTime", Type: utils.META_COMPOSED, FieldId: utils.AnswerTime, Value: NewRSRParsersMustCompile("~12", true), Mandatory: true}, &FCTemplate{Tag: "Usage", Type: utils.META_COMPOSED, FieldId: utils.Usage, Value: NewRSRParsersMustCompile("~13", true), Mandatory: true}, }, TrailerFields: make([]*FCTemplate, 0), CacheDumpFields: []*FCTemplate{ &FCTemplate{Tag: "CGRID", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.CGRID, true)}, &FCTemplate{Tag: "RunID", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.RunID, true)}, &FCTemplate{Tag: "TOR", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.ToR, true)}, &FCTemplate{Tag: "OriginID", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.OriginID, true)}, &FCTemplate{Tag: "RequestType", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.RequestType, true)}, &FCTemplate{Tag: "Tenant", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Tenant, true)}, &FCTemplate{Tag: "Category", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Category, true)}, &FCTemplate{Tag: "Account", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Account, true)}, &FCTemplate{Tag: "Subject", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Subject, true)}, &FCTemplate{Tag: "Destination", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Destination, true)}, &FCTemplate{Tag: "SetupTime", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.SetupTime, true), Layout: "2006-01-02T15:04:05Z07:00"}, &FCTemplate{Tag: "AnswerTime", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.AnswerTime, true), Layout: "2006-01-02T15:04:05Z07:00"}, &FCTemplate{Tag: "Usage", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.Usage, true)}, &FCTemplate{Tag: "Cost", Type: utils.META_COMPOSED, Value: NewRSRParsersMustCompile(utils.DynamicDataPrefix+utils.COST, true)}, }, }, } if !reflect.DeepEqual(eCgrCfg.CdrcProfiles, cgrCfg.CdrcProfiles) { t.Errorf("Expected: %s \n, received: %s", utils.ToJSON(eCgrCfg.CdrcProfiles), utils.ToJSON(cgrCfg.CdrcProfiles)) } }