/* Real-time Charging System for Telecom & ISP environments Copyright (C) 2012-2014 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 ( "fmt" "github.com/cgrates/cgrates/utils" "reflect" "strings" "testing" ) var cfgDoc *CgrXmlCfgDocument // Will be populated by first test func TestXmlCdreCfgPopulateCdreRSRFIeld(t *testing.T) { cdreField := CgrXmlCfgCdrField{Name: "TEST1", Type: "cdrfield", Value: `~effective_caller_id_number:s/(\d+)/+$1/`} if err := cdreField.populateRSRField(); err != nil { t.Error("Unexpected error: ", err.Error()) } else if cdreField.valueAsRsrField == nil { t.Error("Failed loading the RSRField") } valRSRField, _ := utils.NewRSRField(`~effective_caller_id_number:s/(\d+)/+$1/`) if recv := cdreField.ValueAsRSRField(); !reflect.DeepEqual(valRSRField, recv) { t.Errorf("Expecting %v, received %v", valRSRField, recv) } /*cdreField = CgrXmlCfgCdrField{Name: "TEST1", Type: "constant", Value: `someval`} if err := cdreField.populateRSRField(); err != nil { t.Error("Unexpected error: ", err.Error()) } else if cdreField.valueAsRsrField != nil { t.Error("Should not load the RSRField") }*/ } func TestXmlCdreCfgParseXmlConfig(t *testing.T) { cfgXmlStr := ` fwv 0.0 0.0 -1 0 MASKED_DESTINATIONS 0 /var/log/cgrates/cdre
` var err error reader := strings.NewReader(cfgXmlStr) if cfgDoc, err = ParseCgrXmlConfig(reader); err != nil { t.Error(err.Error()) } else if cfgDoc == nil { t.Fatal("Could not parse xml configuration document") } if len(cfgDoc.cdres) != 2 { t.Error("Did not cache") } } func TestXmlCdreCfgGetCdreCfg(t *testing.T) { cdreFWCfg := cfgDoc.GetCdreCfgs("CDRE-FW1") if cdreFWCfg == nil { t.Error("Could not parse CdreFw instance") } if len(cdreFWCfg["CDRE-FW1"].Header.Fields) != 8 { t.Error("Unexpected number of header fields parsed", len(cdreFWCfg["CDRE-FW1"].Header.Fields)) } if len(cdreFWCfg["CDRE-FW1"].Content.Fields) != 20 { t.Error("Unexpected number of content fields parsed", len(cdreFWCfg["CDRE-FW1"].Content.Fields)) } if len(cdreFWCfg["CDRE-FW1"].Trailer.Fields) != 9 { t.Error("Unexpected number of trailer fields parsed", len(cdreFWCfg["CDRE-FW1"].Trailer.Fields)) } cdreCsvCfg1 := cfgDoc.GetCdreCfgs("CHECK-CSV1") if cdreCsvCfg1 == nil { t.Error("Could not parse CdreFw instance") } if len(cdreCsvCfg1["CHECK-CSV1"].Content.Fields) != 6 { t.Error("Unexpected number of content fields parsed", len(cdreCsvCfg1["CHECK-CSV1"].Content.Fields)) } } func TestXmlCdreCfgAsCdreConfig(t *testing.T) { cfgXmlStr := ` fwv ; 1024.0 1.19 -1 -3 MASKED_DESTINATIONS 1 /var/log/cgrates/cdre
` var err error reader := strings.NewReader(cfgXmlStr) if cfgDoc, err = ParseCgrXmlConfig(reader); err != nil { t.Error(err.Error()) } else if cfgDoc == nil { t.Fatal("Could not parse xml configuration document") } xmlCdreCfgs := cfgDoc.GetCdreCfgs("CDRE-FW2") if xmlCdreCfgs == nil { t.Error("Could not parse XmlCdre instance") } eCdreCfg := &CdreConfig{ CdrFormat: "fwv", FieldSeparator: ';', DataUsageMultiplyFactor: 1024.0, CostMultiplyFactor: 1.19, CostRoundingDecimals: -1, CostShiftDigits: -3, MaskDestId: "MASKED_DESTINATIONS", MaskLength: 1, ExportDir: "/var/log/cgrates/cdre", } fltrCombiMed, _ := utils.NewRSRField("~mediation_runid:s/DEFAULT/SECOND_RUN/") eCdreCfg.HeaderFields = []*CdreCdrField{ &CdreCdrField{ Name: "TypeOfRecord", Type: "constant", Value: "10", Width: 2, valueAsRsrField: &utils.RSRField{Id: "10"}}, &CdreCdrField{ Name: "LastCdr", Type: "metatag", Value: "last_cdr_time", Layout: "020106150400", Width: 12, valueAsRsrField: &utils.RSRField{Id: "last_cdr_time"}}, } eCdreCfg.ContentFields = []*CdreCdrField{ &CdreCdrField{ Name: "OperatorCode", Type: "cdrfield", Value: "operator", Width: 2, valueAsRsrField: &utils.RSRField{Id: "operator"}, }, &CdreCdrField{ Name: "ProductId", Type: "cdrfield", Value: "productid", Width: 5, valueAsRsrField: &utils.RSRField{Id: "productid"}, }, &CdreCdrField{ Name: "NetworkId", Type: "constant", Value: "3", Width: 1, valueAsRsrField: &utils.RSRField{Id: "3"}, }, &CdreCdrField{ Name: "FromHttpPost1", Type: "http_post", Value: "https://localhost:8000", Width: 10, Strip: "xright", Padding: "left", valueAsRsrField: &utils.RSRField{Id: "https://localhost:8000"}, }, &CdreCdrField{ Name: "CombiMed1", Type: "combimed", Value: "cost", Width: 10, Strip: "xright", Padding: "left", Filter: fltrCombiMed, valueAsRsrField: &utils.RSRField{Id: "cost"}, }, } eCdreCfg.TrailerFields = []*CdreCdrField{ &CdreCdrField{ Name: "DistributorCode", Type: "constant", Value: "VOI", Width: 3, valueAsRsrField: &utils.RSRField{Id: "VOI"}, }, &CdreCdrField{ Name: "FileSeqNr", Type: "metatag", Value: "export_id", Width: 5, Padding: "zeroleft", valueAsRsrField: &utils.RSRField{Id: "export_id"}, }, } if rcvCdreCfg := xmlCdreCfgs["CDRE-FW2"].AsCdreConfig(); !reflect.DeepEqual(rcvCdreCfg, eCdreCfg) { for _, fld := range rcvCdreCfg.ContentFields { fmt.Printf("Fld: %+v\n", fld) } t.Errorf("Expecting: %v, received: %v", eCdreCfg, rcvCdreCfg) } }