diff --git a/apier/v1/cdrs.go b/apier/v1/cdrs.go
index 9cb01e78b..1b0171694 100644
--- a/apier/v1/cdrs.go
+++ b/apier/v1/cdrs.go
@@ -52,7 +52,7 @@ func (apier *ApierV1) GetCdrs(attrs utils.AttrGetCdrs, reply *[]*engine.External
return utils.NewErrServerError(err)
}
if cdrs, _, err := apier.CdrDb.GetCDRs(cdrsFltr, false); err != nil {
- return utils.NewErrServerError(err)
+ return err
} else if len(cdrs) == 0 {
*reply = make([]*engine.ExternalCDR, 0)
} else {
diff --git a/general_tests/cdre_it_test.go b/general_tests/cdre_it_test.go
new file mode 100644
index 000000000..e0b44fa2c
--- /dev/null
+++ b/general_tests/cdre_it_test.go
@@ -0,0 +1,178 @@
+// +build integration
+
+/*
+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 general_tests
+
+import (
+ "net/rpc"
+ "net/rpc/jsonrpc"
+ "os"
+ "path"
+ "testing"
+ "time"
+
+ "github.com/cgrates/cgrates/apier/v1"
+ "github.com/cgrates/cgrates/config"
+ "github.com/cgrates/cgrates/engine"
+ "github.com/cgrates/cgrates/utils"
+)
+
+var (
+ cdreCfgPath string
+ cdreCfg *config.CGRConfig
+ cdreRPC *rpc.Client
+ cdreDataDir = "/usr/share/cgrates"
+ cdreDelay int
+ cdreConfigDIR string
+)
+
+var sTestsCDRE = []func(t *testing.T){
+ testCDREInitCfg,
+ testCDREInitDataDb,
+ testCDREResetStorDb,
+ testCDREStartEngine,
+ testCDRERpcConn,
+ testCDREGetCdrs,
+ testCDREExportNotFound,
+ testCDREProcessCdr,
+ testCDREExport,
+ testCDREStopEngine,
+}
+
+func TestCDREITMySql(t *testing.T) {
+ cdreConfigDIR = "tutmysql"
+ for _, stest := range sTestsCDRE {
+ t.Run(cdreConfigDIR, stest)
+ }
+}
+
+func TestCDREITMongo(t *testing.T) {
+ cdreConfigDIR = "tutmongo"
+ for _, stest := range sTestsCDRE {
+ t.Run(cdreConfigDIR, stest)
+ }
+}
+
+func testCDREInitCfg(t *testing.T) {
+ var err error
+ cdreCfgPath = path.Join(cdreDataDir, "conf", "samples", cdreConfigDIR)
+ cdreCfg, err = config.NewCGRConfigFromFolder(cdreCfgPath)
+ if err != nil {
+ t.Error(err)
+ }
+ cdreCfg.DataFolderPath = cdreDataDir
+ config.SetCgrConfig(cdreCfg)
+ switch cdreConfigDIR {
+ case "tutmongo":
+ cdreDelay = 4000
+ default:
+ cdreDelay = 2000
+ }
+}
+
+func testCDREInitDataDb(t *testing.T) {
+ if err := engine.InitDataDb(cdreCfg); err != nil {
+ t.Fatal(err)
+ }
+}
+
+func testCDREResetStorDb(t *testing.T) {
+ if err := engine.InitStorDb(cdreCfg); err != nil {
+ t.Fatal(err)
+ }
+}
+
+func testCDREStartEngine(t *testing.T) {
+ if _, err := engine.StopStartEngine(cdreCfgPath, cdreDelay); err != nil {
+ t.Fatal(err)
+ }
+}
+
+func testCDRERpcConn(t *testing.T) {
+ var err error
+ cdreRPC, err = jsonrpc.Dial("tcp", cdreCfg.RPCJSONListen)
+ if err != nil {
+ t.Fatal(err)
+ }
+}
+
+func testCDREGetCdrs(t *testing.T) {
+ var reply []*engine.ExternalCDR
+ req := utils.RPCCDRsFilter{}
+ if err := cdreRPC.Call("ApierV1.GetCdrs", req, &reply); err.Error() != utils.ErrNotFound.Error() {
+ t.Error("Unexpected error: ", err.Error())
+ }
+}
+
+func testCDREExportNotFound(t *testing.T) {
+ var replyExport v1.RplExportedCDRs
+ exportArgs := v1.ArgExportCDRs{
+ ExportPath: utils.StringPointer("/tmp"),
+ ExportFileName: utils.StringPointer("TestTutITExportCDR.csv"),
+ ExportTemplate: utils.StringPointer("TestTutITExportCDR"),
+ RPCCDRsFilter: utils.RPCCDRsFilter{},
+ }
+ if err := cdreRPC.Call("ApierV1.ExportCDRs", exportArgs, &replyExport); err.Error() != utils.ErrNotFound.Error() {
+ t.Error(err)
+ }
+}
+
+func testCDREProcessCdr(t *testing.T) {
+ cdr := &engine.CDR{ToR: utils.VOICE, OriginID: "testCDREProcessCdr", OriginHost: "192.168.1.1",
+ Source: "TestTutITExportCDR", RequestType: utils.META_RATED,
+ Tenant: "cgrates.org", Category: "call", Account: "1001",
+ Subject: "1001", Destination: "1003",
+ SetupTime: time.Date(2016, 11, 30, 17, 5, 24, 0, time.UTC),
+ AnswerTime: time.Date(2016, 11, 30, 17, 6, 4, 0, time.UTC),
+ Usage: time.Duration(98) * time.Second,
+ ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}}
+ cdr.ComputeCGRID()
+ var reply string
+ if err := cdreRPC.Call("CdrsV1.ProcessCdr", cdr, &reply); err != nil {
+ t.Error("Unexpected error: ", err.Error())
+ } else if reply != utils.OK {
+ t.Error("Unexpected reply received: ", reply)
+ }
+}
+
+func testCDREExport(t *testing.T) {
+ var replyExport v1.RplExportedCDRs
+ exportArgs := v1.ArgExportCDRs{
+ ExportPath: utils.StringPointer("/tmp"),
+ ExportFileName: utils.StringPointer("TestTutITExportCDR.csv"),
+ ExportTemplate: utils.StringPointer("TestTutITExportCDR"),
+ RPCCDRsFilter: utils.RPCCDRsFilter{},
+ }
+ if err := cdreRPC.Call("ApierV1.ExportCDRs", exportArgs, &replyExport); err != nil {
+ t.Error(err)
+ } else if replyExport.TotalRecords != 1 {
+ t.Errorf("Unexpected total records: %+v", replyExport.TotalRecords)
+ }
+ expFilePath := path.Join(*exportArgs.ExportPath, *exportArgs.ExportFileName)
+ if err := os.Remove(expFilePath); err != nil {
+ t.Error(err)
+ }
+}
+
+func testCDREStopEngine(t *testing.T) {
+ if err := engine.KillEngine(100); err != nil {
+ t.Error(err)
+ }
+}
diff --git a/migrator/tp_destination_it_test.go b/migrator/tp_destination_it_test.go
new file mode 100644
index 000000000..bf7939f1c
--- /dev/null
+++ b/migrator/tp_destination_it_test.go
@@ -0,0 +1,150 @@
+// +build integration
+
+/*
+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 migrator
+
+// import (
+// "log"
+// "path"
+// "reflect"
+// "testing"
+
+// "github.com/cgrates/cgrates/config"
+// "github.com/cgrates/cgrates/engine"
+// "github.com/cgrates/cgrates/utils"
+// )
+
+// var (
+// tpDstPathIn string
+// tpDstPathOut string
+// tpDstCfgIn *config.CGRConfig
+// tpDstCfgOut *config.CGRConfig
+// tpDstMigrator *Migrator
+// tpDestination []*utils.TPDestination
+// )
+
+// var sTestsTpDstIT = []func(t *testing.T){
+// testTpDstITConnect,
+// testTpDstITFlush,
+// testTpDstITPopulate,
+// testTpDstITMove,
+// testTpDstITCheckData,
+// }
+
+// func TestTpDstMove(t *testing.T) {
+// for _, stest := range sTestsTpDstIT {
+// t.Run("TestTpDstMove", stest)
+// }
+// }
+
+// func testTpDstITConnect(t *testing.T) {
+// var err error
+// tpDstPathIn = path.Join(*dataDir, "conf", "samples", "tutmongo")
+// tpDstCfgIn, err = config.NewCGRConfigFromFolder(tpDstPathIn)
+// if err != nil {
+// t.Fatal(err)
+// }
+// tpDstPathOut = path.Join(*dataDir, "conf", "samples", "tutmysql")
+// tpDstCfgOut, err = config.NewCGRConfigFromFolder(tpDstPathOut)
+// if err != nil {
+// t.Fatal(err)
+// }
+// storDBIn, err := engine.ConfigureStorDB(tpDstCfgIn.StorDBType, tpDstCfgIn.StorDBHost,
+// tpDstCfgIn.StorDBPort, tpDstCfgIn.StorDBName,
+// tpDstCfgIn.StorDBUser, tpDstCfgIn.StorDBPass,
+// config.CgrConfig().StorDBMaxOpenConns,
+// config.CgrConfig().StorDBMaxIdleConns,
+// config.CgrConfig().StorDBConnMaxLifetime,
+// config.CgrConfig().StorDBCDRSIndexes)
+// if err != nil {
+// log.Fatal(err)
+// }
+// storDBOut, err := engine.ConfigureStorDB(tpDstCfgOut.StorDBType,
+// tpDstCfgOut.StorDBHost, tpDstCfgOut.StorDBPort, tpDstCfgOut.StorDBName,
+// tpDstCfgOut.StorDBUser, tpDstCfgOut.StorDBPass,
+// config.CgrConfig().StorDBMaxOpenConns,
+// config.CgrConfig().StorDBMaxIdleConns,
+// config.CgrConfig().StorDBConnMaxLifetime,
+// config.CgrConfig().StorDBCDRSIndexes)
+// if err != nil {
+// log.Fatal(err)
+// }
+// tpDstMigrator, err = NewMigrator(nil, nil, tpDstCfgIn.DataDbType,
+// tpDstCfgIn.DBDataEncoding, storDBIn, storDBOut, tpDstCfgIn.StorDBType, nil,
+// tpDstCfgIn.DataDbType, tpDstCfgIn.DBDataEncoding, nil,
+// tpDstCfgIn.StorDBType, false, false, false, false, false)
+// if err != nil {
+// log.Fatal(err)
+// }
+// }
+
+// func testTpDstITFlush(t *testing.T) {
+// if err := tpDstMigrator.storDBIn.Flush(
+// path.Join(tpDstCfgIn.DataFolderPath, "storage", tpDstCfgIn.StorDBType)); err != nil {
+// t.Error(err)
+// }
+
+// if err := tpDstMigrator.storDBOut.Flush(
+// path.Join(tpDstCfgOut.DataFolderPath, "storage", tpDstCfgOut.StorDBType)); err != nil {
+// t.Error(err)
+// }
+// }
+
+// func testTpDstITPopulate(t *testing.T) {
+// tpDestination = []*utils.TPDestination{
+// &utils.TPDestination{
+// TPid: "TPD",
+// ID: "GERMANY",
+// Prefixes: []string{"+49", "+4915"},
+// },
+// }
+// if err := tpDstMigrator.storDBIn.SetTPDestinations(tpDestination); err != nil {
+// t.Error("Error when setting TpDestination ", err.Error())
+// }
+// currentVersion := engine.CurrentStorDBVersions()
+// err := tpDstMigrator.storDBOut.SetVersions(currentVersion, false)
+// if err != nil {
+// t.Error("Error when setting version for TpDestination ", err.Error())
+// }
+// }
+
+// func testTpDstITMove(t *testing.T) {
+// err, _ := tpDstMigrator.Migrate([]string{utils.MetaTpDestinations})
+// if err != nil {
+// t.Error("Error when migrating TpDestination ", err.Error())
+// }
+// }
+
+// func testTpDstITCheckData(t *testing.T) {
+// result, err := tpDstMigrator.storDBOut.GetTPDestinations(
+// tpDestination[0].TPid, tpDestination[0].ID)
+// if err != nil {
+// t.Error("Error when getting TpDestination ", err.Error())
+// }
+// if !reflect.DeepEqual(tpDestination[0], result[0]) {
+// t.Errorf("Expecting: %+v, received: %+v",
+// utils.ToJSON(tpDestination[0]), utils.ToJSON(result[0]))
+// }
+// result, err = tpDstMigrator.storDBIn.GetTPDestinations(
+// tpDestination[0].TPid, tpDestination[0].ID)
+// if err != utils.ErrNotFound {
+// t.Error(err)
+// }
+// }
diff --git a/migrator/tp_stats_it_test.go b/migrator/tp_stats_it_test.go
index ed512c842..2557f1a71 100644
--- a/migrator/tp_stats_it_test.go
+++ b/migrator/tp_stats_it_test.go
@@ -133,19 +133,19 @@ func testTpStatsITPopulate(t *testing.T) {
},
}
if err := tpStatsMigrator.storDBIn.SetTPStats(tpStats); err != nil {
- t.Error("Error when setting TpFilter ", err.Error())
+ t.Error("Error when setting TpStat ", err.Error())
}
currentVersion := engine.CurrentStorDBVersions()
err := tpStatsMigrator.storDBOut.SetVersions(currentVersion, false)
if err != nil {
- t.Error("Error when setting version for TpFilter ", err.Error())
+ t.Error("Error when setting version for TpStat ", err.Error())
}
}
func testTpStatsITMove(t *testing.T) {
err, _ := tpStatsMigrator.Migrate([]string{utils.MetaTpStats})
if err != nil {
- t.Error("Error when migrating TpFilter ", err.Error())
+ t.Error("Error when migrating TpStat ", err.Error())
}
}
@@ -153,7 +153,7 @@ func testTpStatsITCheckData(t *testing.T) {
result, err := tpStatsMigrator.storDBOut.GetTPStats(
tpStats[0].TPid, tpStats[0].ID)
if err != nil {
- t.Error("Error when getting TpFilter ", err.Error())
+ t.Error("Error when getting TpStat ", err.Error())
}
if !reflect.DeepEqual(tpStats[0], result[0]) {
t.Errorf("Expecting: %+v, received: %+v",