/* 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 ( "encoding/xml" "github.com/cgrates/cgrates/utils" "reflect" "strings" "testing" ) var cfgDocCdrc *CgrXmlCfgDocument // Will be populated by first test func TestPopulateRSRFIeld(t *testing.T) { cdrcField := CdrcField{Id: "TEST1", Value: `~effective_caller_id_number:s/(\d+)/+$1/`} if err := cdrcField.PopulateRSRFields(); err != nil { t.Error("Unexpected error: ", err.Error()) } else if cdrcField.rsrFields == nil { t.Error("Failed loading the RSRField") } cdrcField = CdrcField{Id: "TEST2", Value: `99`} if err := cdrcField.PopulateRSRFields(); err != nil { t.Error("Unexpected error: ", err.Error()) } else if cdrcField.rsrFields == nil { t.Error("Failed loading the RSRField") } } func TestSetDefaults(t *testing.T) { cfgXmlStr := ` true ` var xmlCdrc *CgrXmlCdrcCfg reader := strings.NewReader(cfgXmlStr) if cfgDocCdrcDf, err := ParseCgrXmlConfig(reader); err != nil { t.Error(err.Error()) } else if cfgDocCdrcDf == nil { t.Fatal("Could not parse xml configuration document") } else if len(cfgDocCdrcDf.cdrcs) != 1 { t.Error("Did not load cdrc") } else { xmlCdrc = cfgDocCdrcDf.cdrcs["CDRC-CSVDF"] } dfCfg, _ := NewDefaultCGRConfig() xmlCdrc.setDefaults() if xmlCdrc.CdrsAddress != dfCfg.CdrcCdrs || xmlCdrc.CdrType != dfCfg.CdrcCdrType || xmlCdrc.CsvSeparator != dfCfg.CdrcCsvSep || xmlCdrc.CdrInDir != dfCfg.CdrcCdrInDir || xmlCdrc.CdrOutDir != dfCfg.CdrcCdrOutDir || xmlCdrc.CdrSourceId != dfCfg.CdrcSourceId || len(xmlCdrc.CdrFields) != len(dfCfg.CdrcCdrFields) { t.Error("Failed loading default configuration") } } func TestParseXmlCdrcConfig(t *testing.T) { cfgXmlStr := ` true internal csv , 0 /var/log/cgrates/cdrc/in /var/log/cgrates/cdrc/out freeswitch_csv ` var err error reader := strings.NewReader(cfgXmlStr) if cfgDocCdrc, err = ParseCgrXmlConfig(reader); err != nil { t.Error(err.Error()) } else if cfgDocCdrc == nil { t.Fatal("Could not parse xml configuration document") } if len(cfgDocCdrc.cdrcs) != 1 { t.Error("Did not cache") } } func TestGetCdrcCfgs(t *testing.T) { cdrcfgs := cfgDocCdrc.GetCdrcCfgs("CDRC-CSV1") if cdrcfgs == nil { t.Error("No config instance returned") } expectCdrc := &CgrXmlCdrcCfg{Enabled: true, CdrsAddress: "internal", CdrType: "csv", CsvSeparator: ",", RunDelay: 0, CdrInDir: "/var/log/cgrates/cdrc/in", CdrOutDir: "/var/log/cgrates/cdrc/out", CdrSourceId: "freeswitch_csv"} cdrFlds := []*CdrcField{ &CdrcField{XMLName: xml.Name{Local: "field"}, Id: utils.ACCID, Value: "0;13"}, &CdrcField{XMLName: xml.Name{Local: "field"}, Id: utils.REQTYPE, Value: "1"}, &CdrcField{XMLName: xml.Name{Local: "field"}, Id: utils.DIRECTION, Value: "2"}, &CdrcField{XMLName: xml.Name{Local: "field"}, Id: utils.TENANT, Value: "3"}, &CdrcField{XMLName: xml.Name{Local: "field"}, Id: utils.CATEGORY, Value: "4"}, &CdrcField{XMLName: xml.Name{Local: "field"}, Id: utils.ACCOUNT, Value: "5"}, &CdrcField{XMLName: xml.Name{Local: "field"}, Id: utils.SUBJECT, Value: "6"}, &CdrcField{XMLName: xml.Name{Local: "field"}, Id: utils.DESTINATION, Value: "7"}, &CdrcField{XMLName: xml.Name{Local: "field"}, Id: utils.SETUP_TIME, Value: "8"}, &CdrcField{XMLName: xml.Name{Local: "field"}, Id: utils.ANSWER_TIME, Value: "9"}, &CdrcField{XMLName: xml.Name{Local: "field"}, Id: utils.USAGE, Value: "10"}, &CdrcField{XMLName: xml.Name{Local: "field"}, Id: "extr1", Value: "11"}, &CdrcField{XMLName: xml.Name{Local: "field"}, Id: "extr2", Value: "12"}} for _, fld := range cdrFlds { fld.PopulateRSRFields() } expectCdrc.CdrFields = cdrFlds if !reflect.DeepEqual(expectCdrc, cdrcfgs["CDRC-CSV1"]) { t.Errorf("Expecting: %v, received: %v", expectCdrc, cdrcfgs["CDRC-CSV1"]) } } func TestCdrRSRFields(t *testing.T) { cdrcfgs := cfgDocCdrc.GetCdrcCfgs("CDRC-CSV1") if cdrcfgs == nil { t.Error("No config instance returned") } eRSRFields := map[string][]*utils.RSRField{ utils.ACCID: []*utils.RSRField{&utils.RSRField{Id: "0"}, &utils.RSRField{Id: "13"}}, utils.REQTYPE: []*utils.RSRField{&utils.RSRField{Id: "1"}}, utils.DIRECTION: []*utils.RSRField{&utils.RSRField{Id: "2"}}, utils.TENANT: []*utils.RSRField{&utils.RSRField{Id: "3"}}, utils.CATEGORY: []*utils.RSRField{&utils.RSRField{Id: "4"}}, utils.ACCOUNT: []*utils.RSRField{&utils.RSRField{Id: "5"}}, utils.SUBJECT: []*utils.RSRField{&utils.RSRField{Id: "6"}}, utils.DESTINATION: []*utils.RSRField{&utils.RSRField{Id: "7"}}, utils.SETUP_TIME: []*utils.RSRField{&utils.RSRField{Id: "8"}}, utils.ANSWER_TIME: []*utils.RSRField{&utils.RSRField{Id: "9"}}, utils.USAGE: []*utils.RSRField{&utils.RSRField{Id: "10"}}, "extr1": []*utils.RSRField{&utils.RSRField{Id: "11"}}, "extr2": []*utils.RSRField{&utils.RSRField{Id: "12"}}, } if rsrFields := cdrcfgs["CDRC-CSV1"].CdrRSRFields(); !reflect.DeepEqual(rsrFields, eRSRFields) { t.Errorf("Expecting: %v, received: %v", eRSRFields, rsrFields) } }