Comment integration test that don't compile and begin fixing them

This commit is contained in:
ionutboangiu
2022-04-20 17:34:56 +03:00
committed by Dan Christian Bogos
parent 2076e7f858
commit 833810932b
7 changed files with 3141 additions and 3129 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -21,300 +21,311 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package agents
import (
"net/rpc"
"path"
"testing"
"time"
// import (
// "path"
// "testing"
// "time"
"github.com/cgrates/birpc/context"
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/engine"
"github.com/cgrates/cgrates/utils"
"github.com/miekg/dns"
)
// "github.com/cgrates/birpc"
// "github.com/cgrates/birpc/context"
// "github.com/cgrates/cgrates/config"
// "github.com/cgrates/cgrates/engine"
// "github.com/cgrates/cgrates/loaders"
// "github.com/cgrates/cgrates/utils"
// "github.com/miekg/dns"
// )
var (
dnsCfgPath string
dnsCfgDIR string
dnsCfg *config.CGRConfig
dnsRPC *rpc.Client
dnsClnt *dns.Conn // so we can cache the connection
// var (
// dnsCfgPath string
// dnsCfgDIR string
// dnsCfg *config.CGRConfig
// dnsRPC *birpc.Client
// dnsClnt *dns.Conn // so we can cache the connection
sTestsDNS = []func(t *testing.T){
testDNSitInitCfg,
testDNSitResetDB,
testDNSitStartEngine,
testDNSitApierRpcConn,
testDNSitTPFromFolder,
testDNSitClntConn,
testDNSitClntNAPTRDryRun,
testDNSitClntNAPTRAttributes,
testDNSitClntNAPTRSuppliers,
testDNSitClntNAPTROpts,
testDNSitClntNAPTROptsWithAttributes,
testDNSitStopEngine,
}
)
// sTestsDNS = []func(t *testing.T){
// testDNSitInitCfg,
// testDNSitResetDB,
// testDNSitStartEngine,
// testDNSitApierRpcConn,
// testDNSitTPFromFolder,
// testDNSitClntConn,
// testDNSitClntNAPTRDryRun,
// testDNSitClntNAPTRAttributes,
// testDNSitClntNAPTRSuppliers,
// testDNSitClntNAPTROpts,
// testDNSitClntNAPTROptsWithAttributes,
// testDNSitStopEngine,
// }
// )
func TestDNSitSimple(t *testing.T) {
switch *dbType {
case utils.MetaInternal:
dnsCfgDIR = "dnsagent_internal"
case utils.MetaMySQL:
dnsCfgDIR = "dnsagent_mysql"
case utils.MetaMongo:
dnsCfgDIR = "dnsagent_mongo"
case utils.MetaPostgres:
t.SkipNow()
default:
t.Fatal("Unknown Database type")
}
for _, stest := range sTestsDNS {
t.Run(dnsCfgDIR, stest)
}
}
// func TestDNSitSimple(t *testing.T) {
// switch *dbType {
// case utils.MetaInternal:
// dnsCfgDIR = "dnsagent_internal"
// case utils.MetaMySQL:
// dnsCfgDIR = "dnsagent_mysql"
// case utils.MetaMongo:
// dnsCfgDIR = "dnsagent_mongo"
// case utils.MetaPostgres:
// t.SkipNow()
// default:
// t.Fatal("Unknown Database type")
// }
// for _, stest := range sTestsDNS {
// t.Run(dnsCfgDIR, stest)
// }
// }
// Init config
func testDNSitInitCfg(t *testing.T) {
var err error
dnsCfgPath = path.Join(*dataDir, "conf", "samples", dnsCfgDIR)
dnsCfg, err = config.NewCGRConfigFromPath(context.Background(), dnsCfgPath)
if err != nil {
t.Error(err)
}
}
// // Init config
// func testDNSitInitCfg(t *testing.T) {
// var err error
// dnsCfgPath = path.Join(*dataDir, "conf", "samples", dnsCfgDIR)
// dnsCfg, err = config.NewCGRConfigFromPath(context.Background(), dnsCfgPath)
// if err != nil {
// t.Error(err)
// }
// }
// Remove data in both rating and accounting db
func testDNSitResetDB(t *testing.T) {
if err := engine.InitDataDB(dnsCfg); err != nil {
t.Fatal(err)
}
// // Remove data in both rating and accounting db
// func testDNSitResetDB(t *testing.T) {
// if err := engine.InitDataDB(dnsCfg); err != nil {
// t.Fatal(err)
// }
}
// }
// Start CGR Engine
func testDNSitStartEngine(t *testing.T) {
if _, err := engine.StopStartEngine(dnsCfgPath, *waitRater); err != nil {
t.Fatal(err)
}
}
// // Start CGR Engine
// func testDNSitStartEngine(t *testing.T) {
// if _, err := engine.StopStartEngine(dnsCfgPath, *waitRater); err != nil {
// t.Fatal(err)
// }
// }
// Connect rpc client to rater
func testDNSitApierRpcConn(t *testing.T) {
var err error
dnsRPC, err = newRPCClient(dnsCfg.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed
if err != nil {
t.Fatal(err)
}
}
// // Connect rpc client to rater
// func testDNSitApierRpcConn(t *testing.T) {
// var err error
// dnsRPC, err = newRPCClient(dnsCfg.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed
// if err != nil {
// t.Fatal(err)
// }
// }
// Load the tariff plan, creating accounts and their balances
func testDNSitTPFromFolder(t *testing.T) {
attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "dnsagent")}
var loadInst utils.LoadInstance
if err := dnsRPC.Call(utils.APIerSv1LoadTariffPlanFromFolder,
attrs, &loadInst); err != nil {
t.Error(err)
}
time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for scheduler to execute topups
}
// // Load the tariff plan, creating accounts and their balances
// func testDNSitTPFromFolder(t *testing.T) {
// caching := utils.MetaReload
// if dnsCfg.DataDbCfg().Type == utils.Internal {
// caching = utils.MetaNone
// }
// var reply string
// if err := dnsRPC.Call(context.Background(), utils.LoaderSv1Run,
// &loaders.ArgsProcessFolder{
// APIOpts: map[string]interface{}{
// utils.MetaCache: caching,
// utils.MetaStopOnError: false,
// },
// }, &reply); err != nil {
// t.Error(err)
// } else if reply != utils.OK {
// t.Error("Unexpected reply returned:", reply)
// }
// time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for scheduler to execute topups
// }
// Connect DNS client to server
func testDNSitClntConn(t *testing.T) {
c := new(dns.Client)
var err error
if dnsClnt, err = c.Dial(dnsCfg.DNSAgentCfg().Listen); err != nil { // just testing the connection, not not saving it
t.Fatal(err)
} else if dnsClnt == nil {
t.Fatalf("conn is nil")
}
}
// // Connect DNS client to server
// func testDNSitClntConn(t *testing.T) {
// c := new(dns.Client)
// var err error
// if dnsClnt, err = c.Dial(dnsCfg.DNSAgentCfg().Listen); err != nil { // just testing the connection, not not saving it
// t.Fatal(err)
// } else if dnsClnt == nil {
// t.Fatalf("conn is nil")
// }
// }
func testDNSitClntNAPTRDryRun(t *testing.T) {
m := new(dns.Msg)
m.SetQuestion("3.6.9.4.7.1.7.1.5.6.8.9.4.e164.arpa.", dns.TypeNAPTR)
if err := dnsClnt.WriteMsg(m); err != nil {
t.Error(err)
}
if rply, err := dnsClnt.ReadMsg(); err != nil {
t.Error(err)
} else {
if rply.Rcode != dns.RcodeSuccess {
t.Errorf("failed to get an valid answer\n%v", rply)
}
answr := rply.Answer[0].(*dns.NAPTR)
if answr.Order != 100 {
t.Errorf("received: <%q>", answr.Order)
}
if answr.Preference != 10 {
t.Errorf("received: <%q>", answr.Preference)
}
if answr.Flags != "U" {
t.Errorf("received: <%q>", answr.Flags)
}
if answr.Service != "E2U+SIP" {
t.Errorf("received: <%q>", answr.Service)
}
if answr.Regexp != "!^(.*)$!sip:1@172.16.1.10.!" {
t.Errorf("received: <%q>", answr.Regexp)
}
if answr.Replacement != "." {
t.Errorf("received: <%q>", answr.Replacement)
}
}
}
// func testDNSitClntNAPTRDryRun(t *testing.T) {
// m := new(dns.Msg)
// m.SetQuestion("3.6.9.4.7.1.7.1.5.6.8.9.4.e164.arpa.", dns.TypeNAPTR)
// if err := dnsClnt.WriteMsg(m); err != nil {
// t.Error(err)
// }
// if rply, err := dnsClnt.ReadMsg(); err != nil {
// t.Error(err)
// } else {
// if rply.Rcode != dns.RcodeSuccess {
// t.Errorf("failed to get a valid answer\n%v", rply)
// }
// answr := rply.Answer[0].(*dns.NAPTR)
// if answr.Order != 100 {
// t.Errorf("received: <%q>", answr.Order)
// }
// if answr.Preference != 10 {
// t.Errorf("received: <%q>", answr.Preference)
// }
// if answr.Flags != "U" {
// t.Errorf("received: <%q>", answr.Flags)
// }
// if answr.Service != "E2U+SIP" {
// t.Errorf("received: <%q>", answr.Service)
// }
// if answr.Regexp != "!^(.*)$!sip:1@172.16.1.10.!" {
// t.Errorf("received: <%q>", answr.Regexp)
// }
// if answr.Replacement != "." {
// t.Errorf("received: <%q>", answr.Replacement)
// }
// }
// }
func testDNSitClntNAPTRAttributes(t *testing.T) {
m := new(dns.Msg)
m.SetQuestion("4.6.9.4.7.1.7.1.5.6.8.9.4.e164.arpa.", dns.TypeNAPTR)
if err := dnsClnt.WriteMsg(m); err != nil {
t.Error(err)
}
if rply, err := dnsClnt.ReadMsg(); err != nil {
t.Error(err)
} else {
if rply.Rcode != dns.RcodeSuccess {
t.Errorf("failed to get an valid answer\n%v", rply)
}
answr := rply.Answer[0].(*dns.NAPTR)
if answr.Order != 100 {
t.Errorf("received: <%q>", answr.Order)
}
if answr.Regexp != "sip:1@172.16.1.1." {
t.Errorf("Expected :<%q> , received: <%q>", "sip:1\\@172.16.1.1.", answr.Regexp)
}
}
}
// func testDNSitClntNAPTRAttributes(t *testing.T) {
// m := new(dns.Msg)
// m.SetQuestion("4.6.9.4.7.1.7.1.5.6.8.9.4.e164.arpa.", dns.TypeNAPTR)
// if err := dnsClnt.WriteMsg(m); err != nil {
// t.Error(err)
// }
// if rply, err := dnsClnt.ReadMsg(); err != nil {
// t.Error(err)
// } else {
// if rply.Rcode != dns.RcodeSuccess {
// t.Errorf("failed to get an valid answer\n%v", rply)
// }
// answr := rply.Answer[0].(*dns.NAPTR)
// if answr.Order != 100 {
// t.Errorf("received: <%q>", answr.Order)
// }
// if answr.Regexp != "sip:1@172.16.1.1." {
// t.Errorf("Expected :<%q> , received: <%q>", "sip:1\\@172.16.1.1.", answr.Regexp)
// }
// }
// }
func testDNSitClntNAPTRSuppliers(t *testing.T) {
m := new(dns.Msg)
m.SetQuestion("5.6.9.4.7.1.7.1.5.6.8.9.4.e164.arpa.", dns.TypeNAPTR)
if err := dnsClnt.WriteMsg(m); err != nil {
t.Error(err)
}
rply, err := dnsClnt.ReadMsg()
if err != nil {
t.Error(err)
} else if len(rply.Answer) != 2 {
t.Fatalf("wrong number of records: %s", utils.ToIJSON(rply.Answer))
}
if rply.Rcode != dns.RcodeSuccess {
t.Errorf("failed to get an valid answer\n%v", rply)
}
answr := rply.Answer[0].(*dns.NAPTR)
if answr.Order != 100 {
t.Errorf("received: <%v>", answr.Order)
}
if answr.Regexp != "!^(.*)$!sip:1@172.16.1.11!" {
t.Errorf("received: <%q>", answr.Regexp)
}
answr2 := rply.Answer[1].(*dns.NAPTR)
if answr2.Regexp != "!^(.*)$!sip:1@172.16.1.12!" {
t.Errorf("received: <%q>", answr2.Regexp)
}
}
// func testDNSitClntNAPTRSuppliers(t *testing.T) {
// m := new(dns.Msg)
// m.SetQuestion("5.6.9.4.7.1.7.1.5.6.8.9.4.e164.arpa.", dns.TypeNAPTR)
// if err := dnsClnt.WriteMsg(m); err != nil {
// t.Error(err)
// }
// rply, err := dnsClnt.ReadMsg()
// if err != nil {
// t.Error(err)
// } else if len(rply.Answer) != 2 {
// t.Fatalf("wrong number of records: %s", utils.ToIJSON(rply.Answer))
// }
// if rply.Rcode != dns.RcodeSuccess {
// t.Errorf("failed to get an valid answer\n%v", rply)
// }
// answr := rply.Answer[0].(*dns.NAPTR)
// if answr.Order != 100 {
// t.Errorf("received: <%v>", answr.Order)
// }
// if answr.Regexp != "!^(.*)$!sip:1@172.16.1.11!" {
// t.Errorf("received: <%q>", answr.Regexp)
// }
// answr2 := rply.Answer[1].(*dns.NAPTR)
// if answr2.Regexp != "!^(.*)$!sip:1@172.16.1.12!" {
// t.Errorf("received: <%q>", answr2.Regexp)
// }
// }
func testDNSitClntNAPTROpts(t *testing.T) {
m := new(dns.Msg)
m.SetQuestion("5.6.9.4.7.1.7.1.5.6.8.9.5.e164.arpa.", dns.TypeNAPTR)
m.SetEdns0(4096, false)
m.IsEdns0().Option = append(m.IsEdns0().Option, &dns.EDNS0_ESU{Uri: "sip:cgrates@cgrates.org"})
if err := dnsClnt.WriteMsg(m); err != nil {
t.Error(err)
}
rply, err := dnsClnt.ReadMsg()
if err != nil {
t.Error(err)
} else if len(rply.Answer) != 1 {
t.Fatalf("wrong number of records: %s", utils.ToIJSON(rply.Answer))
}
if rply.Rcode != dns.RcodeSuccess {
t.Errorf("failed to get an valid answer\n%v", rply)
}
answr := rply.Answer[0].(*dns.NAPTR)
if answr.Order != 100 {
t.Errorf("received: <%q>", answr.Order)
}
if answr.Preference != 10 {
t.Errorf("received: <%q>", answr.Preference)
}
if answr.Flags != "U" {
t.Errorf("received: <%q>", answr.Flags)
}
if answr.Service != "E2U+SIP" {
t.Errorf("received: <%q>", answr.Service)
}
if answr.Regexp != "!^(.*)$!sip:1@172.16.1.10.!" {
t.Errorf("received: <%q>", answr.Regexp)
}
if answr.Replacement != "." {
t.Errorf("received: <%q>", answr.Replacement)
}
if opts := rply.IsEdns0(); opts == nil {
t.Error("recieved nil options")
} else if len(opts.Option) != 2 {
t.Errorf("recieved wrong number of options: %v", len(opts.Option))
} else if ov, can := opts.Option[0].(*dns.EDNS0_ESU); !can {
t.Errorf("recieved wrong option type: %T", opts.Option[0])
} else if expected := "sip:cgrates@cgrates.com"; ov.Uri != expected {
t.Errorf("Expected :<%q> , received: <%q>", expected, ov.Uri)
} else if ov, can := opts.Option[1].(*dns.EDNS0_ESU); !can {
t.Errorf("recieved wrong option type: %T", opts.Option[1])
} else if expected := "sip:cgrates@cgrates.net"; ov.Uri != expected {
t.Errorf("Expected :<%q> , received: <%q>", expected, ov.Uri)
}
}
// func testDNSitClntNAPTROpts(t *testing.T) {
// m := new(dns.Msg)
// m.SetQuestion("5.6.9.4.7.1.7.1.5.6.8.9.5.e164.arpa.", dns.TypeNAPTR)
// m.SetEdns0(4096, false)
// m.IsEdns0().Option = append(m.IsEdns0().Option, &dns.EDNS0_ESU{Uri: "sip:cgrates@cgrates.org"})
// if err := dnsClnt.WriteMsg(m); err != nil {
// t.Error(err)
// }
// rply, err := dnsClnt.ReadMsg()
// if err != nil {
// t.Error(err)
// } else if len(rply.Answer) != 1 {
// t.Fatalf("wrong number of records: %s", utils.ToIJSON(rply.Answer))
// }
// if rply.Rcode != dns.RcodeSuccess {
// t.Errorf("failed to get an valid answer\n%v", rply)
// }
// answr := rply.Answer[0].(*dns.NAPTR)
// if answr.Order != 100 {
// t.Errorf("received: <%q>", answr.Order)
// }
// if answr.Preference != 10 {
// t.Errorf("received: <%q>", answr.Preference)
// }
// if answr.Flags != "U" {
// t.Errorf("received: <%q>", answr.Flags)
// }
// if answr.Service != "E2U+SIP" {
// t.Errorf("received: <%q>", answr.Service)
// }
// if answr.Regexp != "!^(.*)$!sip:1@172.16.1.10.!" {
// t.Errorf("received: <%q>", answr.Regexp)
// }
// if answr.Replacement != "." {
// t.Errorf("received: <%q>", answr.Replacement)
// }
// if opts := rply.IsEdns0(); opts == nil {
// t.Error("recieved nil options")
// } else if len(opts.Option) != 2 {
// t.Errorf("recieved wrong number of options: %v", len(opts.Option))
// } else if ov, can := opts.Option[0].(*dns.EDNS0_ESU); !can {
// t.Errorf("recieved wrong option type: %T", opts.Option[0])
// } else if expected := "sip:cgrates@cgrates.com"; ov.Uri != expected {
// t.Errorf("Expected :<%q> , received: <%q>", expected, ov.Uri)
// } else if ov, can := opts.Option[1].(*dns.EDNS0_ESU); !can {
// t.Errorf("recieved wrong option type: %T", opts.Option[1])
// } else if expected := "sip:cgrates@cgrates.net"; ov.Uri != expected {
// t.Errorf("Expected :<%q> , received: <%q>", expected, ov.Uri)
// }
// }
func testDNSitClntNAPTROptsWithAttributes(t *testing.T) {
m := new(dns.Msg)
m.SetQuestion("7.6.9.4.7.1.7.1.5.6.8.9.5.e164.arpa.", dns.TypeNAPTR)
m.SetEdns0(4096, false)
m.IsEdns0().Option = append(m.IsEdns0().Option, &dns.EDNS0_ESU{Uri: "sip:cgrates@cgrates.org"})
if err := dnsClnt.WriteMsg(m); err != nil {
t.Error(err)
}
rply, err := dnsClnt.ReadMsg()
if err != nil {
t.Error(err)
} else if len(rply.Answer) != 1 {
t.Fatalf("wrong number of records: %s", utils.ToIJSON(rply.Answer))
}
if rply.Rcode != dns.RcodeSuccess {
t.Errorf("failed to get an valid answer\n%v", rply)
}
answr := rply.Answer[0].(*dns.NAPTR)
if answr.Order != 100 {
t.Errorf("received: <%q>", answr.Order)
}
if answr.Preference != 10 {
t.Errorf("received: <%q>", answr.Preference)
}
if answr.Flags != "U" {
t.Errorf("received: <%q>", answr.Flags)
}
if answr.Service != "E2U+SIP" {
t.Errorf("received: <%q>", answr.Service)
}
if answr.Regexp != "!^(.*)$!sip:1@172.16.1.10.!" {
t.Errorf("received: <%q>", answr.Regexp)
}
if answr.Replacement != "." {
t.Errorf("received: <%q>", answr.Replacement)
}
if opts := rply.IsEdns0(); opts == nil {
t.Error("recieved nil options")
} else if len(opts.Option) != 1 {
t.Errorf("recieved wrong number of options: %v", len(opts.Option))
} else if ov, can := opts.Option[0].(*dns.EDNS0_ESU); !can {
t.Errorf("recieved wrong option type: %T", opts.Option[0])
} else if expected := "sip:cgrates@e164.arpa"; ov.Uri != expected {
t.Errorf("Expected :<%q> , received: <%q>", expected, ov.Uri)
}
}
// func testDNSitClntNAPTROptsWithAttributes(t *testing.T) {
// m := new(dns.Msg)
// m.SetQuestion("7.6.9.4.7.1.7.1.5.6.8.9.5.e164.arpa.", dns.TypeNAPTR)
// m.SetEdns0(4096, false)
// m.IsEdns0().Option = append(m.IsEdns0().Option, &dns.EDNS0_ESU{Uri: "sip:cgrates@cgrates.org"})
// if err := dnsClnt.WriteMsg(m); err != nil {
// t.Error(err)
// }
// rply, err := dnsClnt.ReadMsg()
// if err != nil {
// t.Error(err)
// } else if len(rply.Answer) != 1 {
// t.Fatalf("wrong number of records: %s", utils.ToIJSON(rply.Answer))
// }
// if rply.Rcode != dns.RcodeSuccess {
// t.Errorf("failed to get an valid answer\n%v", rply)
// }
// answr := rply.Answer[0].(*dns.NAPTR)
// if answr.Order != 100 {
// t.Errorf("received: <%q>", answr.Order)
// }
// if answr.Preference != 10 {
// t.Errorf("received: <%q>", answr.Preference)
// }
// if answr.Flags != "U" {
// t.Errorf("received: <%q>", answr.Flags)
// }
// if answr.Service != "E2U+SIP" {
// t.Errorf("received: <%q>", answr.Service)
// }
// if answr.Regexp != "!^(.*)$!sip:1@172.16.1.10.!" {
// t.Errorf("received: <%q>", answr.Regexp)
// }
// if answr.Replacement != "." {
// t.Errorf("received: <%q>", answr.Replacement)
// }
// if opts := rply.IsEdns0(); opts == nil {
// t.Error("recieved nil options")
// } else if len(opts.Option) != 1 {
// t.Errorf("recieved wrong number of options: %v", len(opts.Option))
// } else if ov, can := opts.Option[0].(*dns.EDNS0_ESU); !can {
// t.Errorf("recieved wrong option type: %T", opts.Option[0])
// } else if expected := "sip:cgrates@e164.arpa"; ov.Uri != expected {
// t.Errorf("Expected :<%q> , received: <%q>", expected, ov.Uri)
// }
// }
func testDNSitStopEngine(t *testing.T) {
if err := engine.KillEngine(*waitRater); err != nil {
t.Error(err)
}
}
// func testDNSitStopEngine(t *testing.T) {
// if err := engine.KillEngine(*waitRater); err != nil {
// t.Error(err)
// }
// }

View File

@@ -21,358 +21,358 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package agents
import (
"bytes"
"crypto/tls"
"crypto/x509"
"fmt"
"io"
"net/http"
"net/rpc"
"os"
"path"
"reflect"
"testing"
"time"
// import (
// "bytes"
// "crypto/tls"
// "crypto/x509"
// "fmt"
// "io"
// "net/http"
// "net/rpc"
// "os"
// "path"
// "reflect"
// "testing"
// "time"
"github.com/cgrates/birpc/context"
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/engine"
"github.com/cgrates/cgrates/utils"
)
// "github.com/cgrates/birpc/context"
// "github.com/cgrates/cgrates/config"
// "github.com/cgrates/cgrates/engine"
// "github.com/cgrates/cgrates/utils"
// )
var (
haCfgPath string
haCfgDIR string
haCfg *config.CGRConfig
haRPC *rpc.Client
httpC *http.Client // so we can cache the connection
err error
isTls bool
// var (
// haCfgPath string
// haCfgDIR string
// haCfg *config.CGRConfig
// haRPC *rpc.Client
// httpC *http.Client // so we can cache the connection
// err error
// isTls bool
sTestsHA = []func(t *testing.T){
testHAitInitCfg,
testHAitHttp,
testHAitResetDB,
testHAitStartEngine,
testHAitApierRpcConn,
testHAitTPFromFolder,
testHAitAuthDryRun,
testHAitAuth1001,
testHAitCDRmtcall,
testHAitCDRmtcall2,
testHAitTextPlain,
testHAitStopEngine,
}
)
// sTestsHA = []func(t *testing.T){
// testHAitInitCfg,
// testHAitHttp,
// testHAitResetDB,
// testHAitStartEngine,
// testHAitApierRpcConn,
// testHAitTPFromFolder,
// testHAitAuthDryRun,
// testHAitAuth1001,
// testHAitCDRmtcall,
// testHAitCDRmtcall2,
// testHAitTextPlain,
// testHAitStopEngine,
// }
// )
func TestHAit(t *testing.T) {
switch *dbType {
case utils.MetaInternal:
haCfgDIR = "httpagent_internal"
case utils.MetaMySQL:
haCfgDIR = "httpagent_mysql"
case utils.MetaMongo:
haCfgDIR = "httpagent_mongo"
case utils.MetaPostgres:
t.SkipNow()
default:
t.Fatal("Unknown Database type")
}
if *encoding == utils.MetaGOB {
haCfgDIR += "_gob"
}
//Run the tests without Tls
isTls = false
for _, stest := range sTestsHA {
t.Run(haCfgDIR, stest)
}
// func TestHAit(t *testing.T) {
// switch *dbType {
// case utils.MetaInternal:
// haCfgDIR = "httpagent_internal"
// case utils.MetaMySQL:
// haCfgDIR = "httpagent_mysql"
// case utils.MetaMongo:
// haCfgDIR = "httpagent_mongo"
// case utils.MetaPostgres:
// t.SkipNow()
// default:
// t.Fatal("Unknown Database type")
// }
// if *encoding == utils.MetaGOB {
// haCfgDIR += "_gob"
// }
// //Run the tests without Tls
// isTls = false
// for _, stest := range sTestsHA {
// t.Run(haCfgDIR, stest)
// }
}
// }
func TestHAitTls(t *testing.T) {
switch *dbType {
case utils.MetaInternal:
haCfgDIR = "httpagenttls_internal"
case utils.MetaMySQL:
haCfgDIR = "httpagenttls_mysql"
case utils.MetaMongo:
haCfgDIR = "httpagenttls_mongo"
case utils.MetaPostgres:
t.SkipNow()
default:
t.Fatal("Unknown Database type")
}
if *encoding == utils.MetaGOB {
haCfgDIR += "_gob"
}
//Run the tests with Tls
isTls = true
for _, stest := range sTestsHA {
t.Run(haCfgDIR, stest)
}
}
// func TestHAitTls(t *testing.T) {
// switch *dbType {
// case utils.MetaInternal:
// haCfgDIR = "httpagenttls_internal"
// case utils.MetaMySQL:
// haCfgDIR = "httpagenttls_mysql"
// case utils.MetaMongo:
// haCfgDIR = "httpagenttls_mongo"
// case utils.MetaPostgres:
// t.SkipNow()
// default:
// t.Fatal("Unknown Database type")
// }
// if *encoding == utils.MetaGOB {
// haCfgDIR += "_gob"
// }
// //Run the tests with Tls
// isTls = true
// for _, stest := range sTestsHA {
// t.Run(haCfgDIR, stest)
// }
// }
// Init config first
func testHAitInitCfg(t *testing.T) {
var err error
haCfgPath = path.Join(*dataDir, "conf", "samples", haCfgDIR)
haCfg, err = config.NewCGRConfigFromPath(context.Background(), haCfgPath)
if err != nil {
t.Error(err)
}
}
// // Init config first
// func testHAitInitCfg(t *testing.T) {
// var err error
// haCfgPath = path.Join(*dataDir, "conf", "samples", haCfgDIR)
// haCfg, err = config.NewCGRConfigFromPath(context.Background(), haCfgPath)
// if err != nil {
// t.Error(err)
// }
// }
func testHAitHttp(t *testing.T) {
if isTls {
// With Tls
//make http client with tls
cert, err := tls.LoadX509KeyPair(haCfg.TLSCfg().ClientCerificate, haCfg.TLSCfg().ClientKey)
if err != nil {
t.Error(err)
}
// Load CA cert
caCert, err := os.ReadFile(haCfg.TLSCfg().CaCertificate)
if err != nil {
t.Error(err)
}
rootCAs, _ := x509.SystemCertPool()
if ok := rootCAs.AppendCertsFromPEM(caCert); !ok {
t.Error("Cannot append CA")
}
// func testHAitHttp(t *testing.T) {
// if isTls {
// // With Tls
// //make http client with tls
// cert, err := tls.LoadX509KeyPair(haCfg.TLSCfg().ClientCerificate, haCfg.TLSCfg().ClientKey)
// if err != nil {
// t.Error(err)
// }
// // Load CA cert
// caCert, err := os.ReadFile(haCfg.TLSCfg().CaCertificate)
// if err != nil {
// t.Error(err)
// }
// rootCAs, _ := x509.SystemCertPool()
// if ok := rootCAs.AppendCertsFromPEM(caCert); !ok {
// t.Error("Cannot append CA")
// }
// Setup HTTPS client
tlsConfig := &tls.Config{
Certificates: []tls.Certificate{cert},
RootCAs: rootCAs,
}
transport := &http.Transport{TLSClientConfig: tlsConfig}
httpC = &http.Client{Transport: transport}
} else {
// Without Tls
httpC = new(http.Client)
}
}
// // Setup HTTPS client
// tlsConfig := &tls.Config{
// Certificates: []tls.Certificate{cert},
// RootCAs: rootCAs,
// }
// transport := &http.Transport{TLSClientConfig: tlsConfig}
// httpC = &http.Client{Transport: transport}
// } else {
// // Without Tls
// httpC = new(http.Client)
// }
// }
// Remove data in both rating and accounting db
func testHAitResetDB(t *testing.T) {
if err := engine.InitDataDB(haCfg); err != nil {
t.Fatal(err)
}
}
// // Remove data in both rating and accounting db
// func testHAitResetDB(t *testing.T) {
// if err := engine.InitDataDB(haCfg); err != nil {
// t.Fatal(err)
// }
// }
// Start CGR Engine
func testHAitStartEngine(t *testing.T) {
if _, err := engine.StopStartEngine(haCfgPath, *waitRater); err != nil {
t.Fatal(err)
}
}
// // Start CGR Engine
// func testHAitStartEngine(t *testing.T) {
// if _, err := engine.StopStartEngine(haCfgPath, *waitRater); err != nil {
// t.Fatal(err)
// }
// }
// Connect rpc client to rater
func testHAitApierRpcConn(t *testing.T) {
var err error
haRPC, err = newRPCClient(haCfg.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed
if err != nil {
t.Fatal(err)
}
}
// // Connect rpc client to rater
// func testHAitApierRpcConn(t *testing.T) {
// var err error
// haRPC, err = newRPCClient(haCfg.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed
// if err != nil {
// t.Fatal(err)
// }
// }
// Load the tariff plan, creating accounts and their balances
func testHAitTPFromFolder(t *testing.T) {
attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "oldtutorial")}
var loadInst utils.LoadInstance
if err := haRPC.Call(utils.APIerSv1LoadTariffPlanFromFolder, attrs, &loadInst); err != nil {
t.Error(err)
}
time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for scheduler to execute topups
}
// // Load the tariff plan, creating accounts and their balances
// func testHAitTPFromFolder(t *testing.T) {
// attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "oldtutorial")}
// var loadInst utils.LoadInstance
// if err := haRPC.Call(utils.APIerSv1LoadTariffPlanFromFolder, attrs, &loadInst); err != nil {
// t.Error(err)
// }
// time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for scheduler to execute topups
// }
func testHAitAuthDryRun(t *testing.T) {
httpConst := "http"
addr := haCfg.ListenCfg().HTTPListen
if isTls {
addr = haCfg.ListenCfg().HTTPTLSListen
httpConst = "https"
}
reqUrl := fmt.Sprintf("%s://%s%s?request_type=OutboundAUTH&CallID=123456&Msisdn=497700056231&Imsi=2343000000000123&Destination=491239440004&MSRN=0102220233444488999&ProfileID=1&AgentID=176&GlobalMSISDN=497700056129&GlobalIMSI=214180000175129&ICCID=8923418450000089629&MCC=234&MNC=10&calltype=callback",
httpConst, addr, haCfg.HTTPAgentCfg()[0].URL)
rply, err := httpC.Get(reqUrl)
if err != nil {
t.Fatal(err)
}
eXml := []byte(`<?xml version="1.0" encoding="UTF-8"?>
<response>
<Allow>1</Allow>
<Concatenated>234/Val1</Concatenated>
<MaxDuration>1200</MaxDuration>
</response>`)
if body, err := io.ReadAll(rply.Body); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eXml, body) {
t.Errorf("expecting: <%s>, received: <%s>", string(eXml), string(body))
}
rply.Body.Close()
time.Sleep(time.Millisecond)
}
// func testHAitAuthDryRun(t *testing.T) {
// httpConst := "http"
// addr := haCfg.ListenCfg().HTTPListen
// if isTls {
// addr = haCfg.ListenCfg().HTTPTLSListen
// httpConst = "https"
// }
// reqUrl := fmt.Sprintf("%s://%s%s?request_type=OutboundAUTH&CallID=123456&Msisdn=497700056231&Imsi=2343000000000123&Destination=491239440004&MSRN=0102220233444488999&ProfileID=1&AgentID=176&GlobalMSISDN=497700056129&GlobalIMSI=214180000175129&ICCID=8923418450000089629&MCC=234&MNC=10&calltype=callback",
// httpConst, addr, haCfg.HTTPAgentCfg()[0].URL)
// rply, err := httpC.Get(reqUrl)
// if err != nil {
// t.Fatal(err)
// }
// eXml := []byte(`<?xml version="1.0" encoding="UTF-8"?>
// <response>
// <Allow>1</Allow>
// <Concatenated>234/Val1</Concatenated>
// <MaxDuration>1200</MaxDuration>
// </response>`)
// if body, err := io.ReadAll(rply.Body); err != nil {
// t.Error(err)
// } else if !reflect.DeepEqual(eXml, body) {
// t.Errorf("expecting: <%s>, received: <%s>", string(eXml), string(body))
// }
// rply.Body.Close()
// time.Sleep(time.Millisecond)
// }
func testHAitAuth1001(t *testing.T) {
acnt := "20002"
maxDuration := 60
// func testHAitAuth1001(t *testing.T) {
// acnt := "20002"
// maxDuration := 60
attrSetBalance := utils.AttrSetBalance{
Tenant: "cgrates.org",
Account: acnt,
BalanceType: utils.MetaVoice,
Value: float64(maxDuration) * float64(time.Second),
Balance: map[string]interface{}{
utils.ID: "TestDynamicDebitBalance",
utils.RatingSubject: "*zero5ms",
},
}
var reply string
if err := haRPC.Call(utils.APIerSv2SetBalance, attrSetBalance, &reply); err != nil {
t.Error(err)
} else if reply != utils.OK {
t.Errorf("Received: %s", reply)
}
time.Sleep(10 * time.Millisecond)
// attrSetBalance := utils.AttrSetBalance{
// Tenant: "cgrates.org",
// Account: acnt,
// BalanceType: utils.MetaVoice,
// Value: float64(maxDuration) * float64(time.Second),
// Balance: map[string]interface{}{
// utils.ID: "TestDynamicDebitBalance",
// utils.RatingSubject: "*zero5ms",
// },
// }
// var reply string
// if err := haRPC.Call(utils.APIerSv2SetBalance, attrSetBalance, &reply); err != nil {
// t.Error(err)
// } else if reply != utils.OK {
// t.Errorf("Received: %s", reply)
// }
// time.Sleep(10 * time.Millisecond)
httpConst := "http"
addr := haCfg.ListenCfg().HTTPListen
if isTls {
addr = haCfg.ListenCfg().HTTPTLSListen
httpConst = "https"
}
// httpConst := "http"
// addr := haCfg.ListenCfg().HTTPListen
// if isTls {
// addr = haCfg.ListenCfg().HTTPTLSListen
// httpConst = "https"
// }
reqUrl := fmt.Sprintf("%s://%s%s?request_type=OutboundAUTH&CallID=123456&Msisdn=%s&Imsi=2343000000000123&Destination=1002&MSRN=0102220233444488999&ProfileID=1&AgentID=176&GlobalMSISDN=497700056129&GlobalIMSI=214180000175129&ICCID=8923418450000089629&MCC=234&MNC=10&calltype=callback",
httpConst, addr, haCfg.HTTPAgentCfg()[0].URL, acnt)
rply, err := httpC.Get(reqUrl)
if err != nil {
t.Fatal(err)
}
eXml := []byte(fmt.Sprintf(`<?xml version="1.0" encoding="UTF-8"?>
<response>
<Allow>1</Allow>
<MaxDuration>%v</MaxDuration>
</response>`, maxDuration))
if body, err := io.ReadAll(rply.Body); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eXml, body) {
t.Errorf("expecting: %s, received: %s", string(eXml), string(body))
}
rply.Body.Close()
time.Sleep(time.Millisecond)
}
// reqUrl := fmt.Sprintf("%s://%s%s?request_type=OutboundAUTH&CallID=123456&Msisdn=%s&Imsi=2343000000000123&Destination=1002&MSRN=0102220233444488999&ProfileID=1&AgentID=176&GlobalMSISDN=497700056129&GlobalIMSI=214180000175129&ICCID=8923418450000089629&MCC=234&MNC=10&calltype=callback",
// httpConst, addr, haCfg.HTTPAgentCfg()[0].URL, acnt)
// rply, err := httpC.Get(reqUrl)
// if err != nil {
// t.Fatal(err)
// }
// eXml := []byte(fmt.Sprintf(`<?xml version="1.0" encoding="UTF-8"?>
// <response>
// <Allow>1</Allow>
// <MaxDuration>%v</MaxDuration>
// </response>`, maxDuration))
// if body, err := io.ReadAll(rply.Body); err != nil {
// t.Error(err)
// } else if !reflect.DeepEqual(eXml, body) {
// t.Errorf("expecting: %s, received: %s", string(eXml), string(body))
// }
// rply.Body.Close()
// time.Sleep(time.Millisecond)
// }
func testHAitCDRmtcall(t *testing.T) {
httpConst := "http"
addr := haCfg.ListenCfg().HTTPListen
if isTls {
addr = haCfg.ListenCfg().HTTPTLSListen
httpConst = "https"
}
reqUrl := fmt.Sprintf("%s://%s%s?request_type=MTCALL_CDR&timestamp=2018-08-14%%2012:03:22&call_date=2018-0814%%2012:00:49&transactionid=10000&CDR_ID=123456&carrierid=1&mcc=0&mnc=0&imsi=434180000000000&msisdn=1001&destination=1002&leg=C&leg_duration=185&reseller_charge=11.1605&client_charge=0.0000&user_charge=22.0000&IOT=0&user_balance=10.00&cli=%%2B498702190000&polo=0.0100&ddi_map=N",
httpConst, addr, haCfg.HTTPAgentCfg()[0].URL)
rply, err := httpC.Get(reqUrl)
if err != nil {
t.Fatal(err)
}
eXml := []byte(`<?xml version="1.0" encoding="UTF-8"?>
<CDR_RESPONSE>
<CDR_ID>123456</CDR_ID>
<CDR_STATUS>1</CDR_STATUS>
</CDR_RESPONSE>`)
if body, err := io.ReadAll(rply.Body); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eXml, body) {
t.Errorf("expecting: <%s>, received: <%s>", string(eXml), string(body))
}
rply.Body.Close()
time.Sleep(50 * time.Millisecond)
var cdrs []*engine.ExternalCDR
req := utils.RPCCDRsFilter{RunIDs: []string{utils.MetaDefault}}
if err := haRPC.Call(utils.APIerSv2GetCDRs, &req, &cdrs); err != nil {
t.Error("Unexpected error: ", err.Error())
} else if len(cdrs) != 1 {
t.Error("Unexpected number of CDRs returned: ", len(cdrs))
} else {
if cdrs[0].Usage != "3m5s" { // should be 1 but maxUsage returns rounded version
t.Errorf("Unexpected CDR Usage received, cdr: %s ", utils.ToJSON(cdrs[0]))
}
if utils.Round(cdrs[0].Cost, 4, utils.MetaRoundingMiddle) != 0.2188 { // sql have only 4 digits after decimal point
t.Errorf("Unexpected CDR Cost received, cdr: %+v ", cdrs[0].Cost)
}
if cdrs[0].OriginHost != "127.0.0.1" {
t.Errorf("Unexpected CDR OriginHost received, cdr: %+v ", cdrs[0].OriginHost)
}
}
}
// func testHAitCDRmtcall(t *testing.T) {
// httpConst := "http"
// addr := haCfg.ListenCfg().HTTPListen
// if isTls {
// addr = haCfg.ListenCfg().HTTPTLSListen
// httpConst = "https"
// }
// reqUrl := fmt.Sprintf("%s://%s%s?request_type=MTCALL_CDR&timestamp=2018-08-14%%2012:03:22&call_date=2018-0814%%2012:00:49&transactionid=10000&CDR_ID=123456&carrierid=1&mcc=0&mnc=0&imsi=434180000000000&msisdn=1001&destination=1002&leg=C&leg_duration=185&reseller_charge=11.1605&client_charge=0.0000&user_charge=22.0000&IOT=0&user_balance=10.00&cli=%%2B498702190000&polo=0.0100&ddi_map=N",
// httpConst, addr, haCfg.HTTPAgentCfg()[0].URL)
// rply, err := httpC.Get(reqUrl)
// if err != nil {
// t.Fatal(err)
// }
// eXml := []byte(`<?xml version="1.0" encoding="UTF-8"?>
// <CDR_RESPONSE>
// <CDR_ID>123456</CDR_ID>
// <CDR_STATUS>1</CDR_STATUS>
// </CDR_RESPONSE>`)
// if body, err := io.ReadAll(rply.Body); err != nil {
// t.Error(err)
// } else if !reflect.DeepEqual(eXml, body) {
// t.Errorf("expecting: <%s>, received: <%s>", string(eXml), string(body))
// }
// rply.Body.Close()
// time.Sleep(50 * time.Millisecond)
// var cdrs []*engine.ExternalCDR
// req := utils.RPCCDRsFilter{RunIDs: []string{utils.MetaDefault}}
// if err := haRPC.Call(utils.APIerSv2GetCDRs, &req, &cdrs); err != nil {
// t.Error("Unexpected error: ", err.Error())
// } else if len(cdrs) != 1 {
// t.Error("Unexpected number of CDRs returned: ", len(cdrs))
// } else {
// if cdrs[0].Usage != "3m5s" { // should be 1 but maxUsage returns rounded version
// t.Errorf("Unexpected CDR Usage received, cdr: %s ", utils.ToJSON(cdrs[0]))
// }
// if utils.Round(cdrs[0].Cost, 4, utils.MetaRoundingMiddle) != 0.2188 { // sql have only 4 digits after decimal point
// t.Errorf("Unexpected CDR Cost received, cdr: %+v ", cdrs[0].Cost)
// }
// if cdrs[0].OriginHost != "127.0.0.1" {
// t.Errorf("Unexpected CDR OriginHost received, cdr: %+v ", cdrs[0].OriginHost)
// }
// }
// }
func testHAitCDRmtcall2(t *testing.T) {
xmlBody := `<?xml version="1.0" encoding="utf-8"?><complete-datasession-notification callid="48981764"><createtime>2005-08-26T14:17:34</createtime><reference>Data</reference><userid>528594</userid><username>447700086788</username><customerid>510163</customerid><companyname>Silliname</companyname><totalcost amount="0.1400" currency="USD">0.1400</totalcost><agenttotalcost amount="0.1400" currency="USD">0.1400</agenttotalcost><agentid>234</agentid><callleg calllegid="89357336"><number>447700086788</number><description>China, Peoples Republic of - China Unicom (CU-GSM)</description><mcc>460</mcc><mnc>001</mnc><seconds>32</seconds><bytes>4558</bytes><permegabyterate currency="USD">1.3330</permegabyterate><cost amount="0.1400" currency="USD">0.1400</cost><agentpermegabyterate currency="USD">1.3330</agentpermegabyterate><agentcost amount="0.1400"currency="USD">0.1400</agentcost></callleg></complete-datasession-notification>`
httpConst := "http"
addr := haCfg.ListenCfg().HTTPListen
if isTls {
addr = haCfg.ListenCfg().HTTPTLSListen
httpConst = "https"
}
url := fmt.Sprintf("%s://%s%s", httpConst, addr, haCfg.HTTPAgentCfg()[1].URL)
// func testHAitCDRmtcall2(t *testing.T) {
// xmlBody := `<?xml version="1.0" encoding="utf-8"?><complete-datasession-notification callid="48981764"><createtime>2005-08-26T14:17:34</createtime><reference>Data</reference><userid>528594</userid><username>447700086788</username><customerid>510163</customerid><companyname>Silliname</companyname><totalcost amount="0.1400" currency="USD">0.1400</totalcost><agenttotalcost amount="0.1400" currency="USD">0.1400</agenttotalcost><agentid>234</agentid><callleg calllegid="89357336"><number>447700086788</number><description>China, Peoples Republic of - China Unicom (CU-GSM)</description><mcc>460</mcc><mnc>001</mnc><seconds>32</seconds><bytes>4558</bytes><permegabyterate currency="USD">1.3330</permegabyterate><cost amount="0.1400" currency="USD">0.1400</cost><agentpermegabyterate currency="USD">1.3330</agentpermegabyterate><agentcost amount="0.1400"currency="USD">0.1400</agentcost></callleg></complete-datasession-notification>`
// httpConst := "http"
// addr := haCfg.ListenCfg().HTTPListen
// if isTls {
// addr = haCfg.ListenCfg().HTTPTLSListen
// httpConst = "https"
// }
// url := fmt.Sprintf("%s://%s%s", httpConst, addr, haCfg.HTTPAgentCfg()[1].URL)
req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(xmlBody)))
if err != nil {
t.Error(err)
}
req.Header.Add("Content-Type", "application/xml; charset=utf-8")
resp, err := httpC.Do(req)
if err != nil {
t.Fatal(err)
}
resp.Body.Close()
// req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(xmlBody)))
// if err != nil {
// t.Error(err)
// }
// req.Header.Add("Content-Type", "application/xml; charset=utf-8")
// resp, err := httpC.Do(req)
// if err != nil {
// t.Fatal(err)
// }
// resp.Body.Close()
time.Sleep(50 * time.Millisecond)
var cdrs []*engine.ExternalCDR
fltr := utils.RPCCDRsFilter{RunIDs: []string{utils.MetaDefault}, Accounts: []string{"447700086788"}}
if err := haRPC.Call(utils.APIerSv2GetCDRs, &fltr, &cdrs); err != nil {
t.Error("Unexpected error: ", err.Error())
} else if len(cdrs) != 1 {
t.Error("Unexpected number of CDRs returned: ", len(cdrs))
} else {
if cdrs[0].Usage != "4558" { // should be 1 but maxUsage returns rounded version
t.Errorf("Unexpected CDR Usage received, cdr: %s ", utils.ToJSON(cdrs[0]))
}
}
}
// time.Sleep(50 * time.Millisecond)
// var cdrs []*engine.ExternalCDR
// fltr := utils.RPCCDRsFilter{RunIDs: []string{utils.MetaDefault}, Accounts: []string{"447700086788"}}
// if err := haRPC.Call(utils.APIerSv2GetCDRs, &fltr, &cdrs); err != nil {
// t.Error("Unexpected error: ", err.Error())
// } else if len(cdrs) != 1 {
// t.Error("Unexpected number of CDRs returned: ", len(cdrs))
// } else {
// if cdrs[0].Usage != "4558" { // should be 1 but maxUsage returns rounded version
// t.Errorf("Unexpected CDR Usage received, cdr: %s ", utils.ToJSON(cdrs[0]))
// }
// }
// }
func testHAitTextPlain(t *testing.T) {
httpConst := "http"
addr := haCfg.ListenCfg().HTTPListen
if isTls {
addr = haCfg.ListenCfg().HTTPTLSListen
httpConst = "https"
}
reqUrl := fmt.Sprintf("%s://%s%s?request_type=TextPlainDryRun&CallID=123456&Msisdn=497700056231&Imsi=2343000000000123&Destination=491239440004",
httpConst, addr, haCfg.HTTPAgentCfg()[2].URL)
rply, err := httpC.Get(reqUrl)
if err != nil {
t.Fatal(err)
}
response := []byte(`Variable1=Hola1
Variable2=Hola2
ComposedVar=TestComposed
Item1.1=Val2
Item1.1=Val1
`)
if body, err := io.ReadAll(rply.Body); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(len(response), len(body)) {
t.Errorf("expecting: \n<%s>\n, received: \n<%s>\n", string(response), string(body))
}
rply.Body.Close()
time.Sleep(time.Millisecond)
}
// func testHAitTextPlain(t *testing.T) {
// httpConst := "http"
// addr := haCfg.ListenCfg().HTTPListen
// if isTls {
// addr = haCfg.ListenCfg().HTTPTLSListen
// httpConst = "https"
// }
// reqUrl := fmt.Sprintf("%s://%s%s?request_type=TextPlainDryRun&CallID=123456&Msisdn=497700056231&Imsi=2343000000000123&Destination=491239440004",
// httpConst, addr, haCfg.HTTPAgentCfg()[2].URL)
// rply, err := httpC.Get(reqUrl)
// if err != nil {
// t.Fatal(err)
// }
// response := []byte(`Variable1=Hola1
// Variable2=Hola2
// ComposedVar=TestComposed
// Item1.1=Val2
// Item1.1=Val1
// `)
// if body, err := io.ReadAll(rply.Body); err != nil {
// t.Error(err)
// } else if !reflect.DeepEqual(len(response), len(body)) {
// t.Errorf("expecting: \n<%s>\n, received: \n<%s>\n", string(response), string(body))
// }
// rply.Body.Close()
// time.Sleep(time.Millisecond)
// }
func testHAitStopEngine(t *testing.T) {
if err := engine.KillEngine(*waitRater); err != nil {
t.Error(err)
}
}
// func testHAitStopEngine(t *testing.T) {
// if err := engine.KillEngine(*waitRater); err != nil {
// t.Error(err)
// }
// }

View File

@@ -21,9 +21,9 @@ package agents
import (
"errors"
"flag"
"net/rpc"
"net/rpc/jsonrpc"
"github.com/cgrates/birpc"
"github.com/cgrates/birpc/jsonrpc"
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/utils"
)
@@ -35,12 +35,12 @@ var (
dbType = flag.String("dbtype", utils.MetaInternal, "The type of DataBase (Internal/Mongo/mySql)")
)
func newRPCClient(cfg *config.ListenCfg) (c *rpc.Client, err error) {
func newRPCClient(cfg *config.ListenCfg) (c *birpc.Client, err error) {
switch *encoding {
case utils.MetaJSON:
return jsonrpc.Dial(utils.TCP, cfg.RPCJSONListen)
case utils.MetaGOB:
return rpc.Dial(utils.TCP, cfg.RPCGOBListen)
return birpc.Dial(utils.TCP, cfg.RPCGOBListen)
default:
return nil, errors.New("UNSUPPORTED_RPC")
}

File diff suppressed because it is too large Load Diff

View File

@@ -21,196 +21,196 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package agents
import (
"net"
"net/rpc"
"path"
"testing"
"time"
// import (
// "net"
// "net/rpc"
// "path"
// "testing"
// "time"
"github.com/cgrates/birpc/context"
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/engine"
"github.com/cgrates/cgrates/utils"
"github.com/cgrates/sipingo"
)
// "github.com/cgrates/birpc/context"
// "github.com/cgrates/cgrates/config"
// "github.com/cgrates/cgrates/engine"
// "github.com/cgrates/cgrates/utils"
// "github.com/cgrates/sipingo"
// )
var (
saonfigDIR string
saCfgPath string
saCfg *config.CGRConfig
saRPC *rpc.Client
saConn net.Conn
// var (
// saonfigDIR string
// saCfgPath string
// saCfg *config.CGRConfig
// saRPC *rpc.Client
// saConn net.Conn
sTestsSIP = []func(t *testing.T){
testSAitInitCfg,
testSAitResetDataDb,
// sTestsSIP = []func(t *testing.T){
// testSAitInitCfg,
// testSAitResetDataDb,
testSAitStartEngine,
testSAitApierRpcConn,
testSAitTPFromFolder,
// testSAitStartEngine,
// testSAitApierRpcConn,
// testSAitTPFromFolder,
testSAitSIPRegister,
testSAitSIPInvite,
// testSAitSIPRegister,
// testSAitSIPInvite,
testSAitStopCgrEngine,
}
)
// testSAitStopCgrEngine,
// }
// )
// Test start here
func TestSAit(t *testing.T) {
// engine.KillEngine(0)
switch *dbType {
case utils.MetaInternal:
saonfigDIR = "sipagent_internal"
case utils.MetaMySQL:
saonfigDIR = "sipagent_mysql"
case utils.MetaMongo:
saonfigDIR = "sipagent_mongo"
case utils.MetaPostgres:
t.SkipNow()
default:
t.Fatal("Unknown Database type")
}
for _, stest := range sTestsSIP {
t.Run(saonfigDIR, stest)
}
}
// // Test start here
// func TestSAit(t *testing.T) {
// // engine.KillEngine(0)
// switch *dbType {
// case utils.MetaInternal:
// saonfigDIR = "sipagent_internal"
// case utils.MetaMySQL:
// saonfigDIR = "sipagent_mysql"
// case utils.MetaMongo:
// saonfigDIR = "sipagent_mongo"
// case utils.MetaPostgres:
// t.SkipNow()
// default:
// t.Fatal("Unknown Database type")
// }
// for _, stest := range sTestsSIP {
// t.Run(saonfigDIR, stest)
// }
// }
func testSAitInitCfg(t *testing.T) {
saCfgPath = path.Join(*dataDir, "conf", "samples", saonfigDIR)
// Init config first
var err error
saCfg, err = config.NewCGRConfigFromPath(context.Background(), saCfgPath)
if err != nil {
t.Error(err)
}
if isDispatcherActive {
saCfg.ListenCfg().RPCJSONListen = ":6012"
}
}
// func testSAitInitCfg(t *testing.T) {
// saCfgPath = path.Join(*dataDir, "conf", "samples", saonfigDIR)
// // Init config first
// var err error
// saCfg, err = config.NewCGRConfigFromPath(context.Background(), saCfgPath)
// if err != nil {
// t.Error(err)
// }
// if isDispatcherActive {
// saCfg.ListenCfg().RPCJSONListen = ":6012"
// }
// }
// Remove data in both rating and accounting db
func testSAitResetDataDb(t *testing.T) {
if err := engine.InitDataDB(saCfg); err != nil {
t.Fatal(err)
}
}
// // Remove data in both rating and accounting db
// func testSAitResetDataDb(t *testing.T) {
// if err := engine.InitDataDB(saCfg); err != nil {
// t.Fatal(err)
// }
// }
// Start CGR Engine
func testSAitStartEngine(t *testing.T) {
if _, err := engine.StartEngine(saCfgPath, *waitRater); err != nil {
t.Fatal(err)
}
}
// // Start CGR Engine
// func testSAitStartEngine(t *testing.T) {
// if _, err := engine.StartEngine(saCfgPath, *waitRater); err != nil {
// t.Fatal(err)
// }
// }
// Connect rpc client to rater
func testSAitApierRpcConn(t *testing.T) {
var err error
saRPC, err = newRPCClient(saCfg.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed
if err != nil {
t.Fatal(err)
}
if saConn, err = net.Dial(utils.TCP, "127.0.0.1:5060"); err != nil {
t.Fatal(err)
}
}
// // Connect rpc client to rater
// func testSAitApierRpcConn(t *testing.T) {
// var err error
// saRPC, err = newRPCClient(saCfg.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed
// if err != nil {
// t.Fatal(err)
// }
// if saConn, err = net.Dial(utils.TCP, "127.0.0.1:5060"); err != nil {
// t.Fatal(err)
// }
// }
// Load the tariff plan, creating accounts and their balances
func testSAitTPFromFolder(t *testing.T) {
attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "tut_sip_redirect")}
var loadInst utils.LoadInstance
if err := saRPC.Call(utils.APIerSv1LoadTariffPlanFromFolder, attrs, &loadInst); err != nil {
t.Error(err)
}
time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for scheduler to execute topups
}
// // Load the tariff plan, creating accounts and their balances
// func testSAitTPFromFolder(t *testing.T) {
// attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "tut_sip_redirect")}
// var loadInst utils.LoadInstance
// if err := saRPC.Call(utils.APIerSv1LoadTariffPlanFromFolder, attrs, &loadInst); err != nil {
// t.Error(err)
// }
// time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for scheduler to execute topups
// }
func testSAitStopCgrEngine(t *testing.T) {
if err := engine.KillEngine(100); err != nil {
t.Error(err)
}
}
// func testSAitStopCgrEngine(t *testing.T) {
// if err := engine.KillEngine(100); err != nil {
// t.Error(err)
// }
// }
func testSAitSIPRegister(t *testing.T) {
registerMessage := "REGISTER sip:192.168.58.203 SIP/2.0\r\nCall-ID: d72a4ed6feb4167b5adb208525879db5@0:0:0:0:0:0:0:0\r\nCSeq: 1 REGISTER\r\nFrom: \"1002\" <sip:1002@192.168.58.203>;tag=d28739b9\r\nTo: \"1002\" <sip:1002@192.168.58.203>\r\nVia: SIP/2.0/UDP 192.168.58.201:5060;branch=z9hG4bK-323131-311ce8716a7bf1f6094859ae516a44eb\r\nMax-Forwards: 70\r\nUser-Agent: Jitsi2.11.20200408Linux\r\nExpires: 600\r\nContact: \"1002\" <sip:1002@192.168.58.201:5060;transport=udp;registering_acc=192_168_58_203>;expires=600\r\nContent-Length: 0\r\n"
if saConn == nil {
t.Fatal("connection not initialized")
}
var err error
if _, err = saConn.Write([]byte(registerMessage)); err != nil {
t.Fatal(err)
}
buffer := make([]byte, bufferSize)
if _, err = saConn.Read(buffer); err != nil {
t.Fatal(err)
}
var received sipingo.Message
if received, err = sipingo.NewMessage(string(buffer)); err != nil {
t.Fatal(err)
}
// func testSAitSIPRegister(t *testing.T) {
// registerMessage := "REGISTER sip:192.168.58.203 SIP/2.0\r\nCall-ID: d72a4ed6feb4167b5adb208525879db5@0:0:0:0:0:0:0:0\r\nCSeq: 1 REGISTER\r\nFrom: \"1002\" <sip:1002@192.168.58.203>;tag=d28739b9\r\nTo: \"1002\" <sip:1002@192.168.58.203>\r\nVia: SIP/2.0/UDP 192.168.58.201:5060;branch=z9hG4bK-323131-311ce8716a7bf1f6094859ae516a44eb\r\nMax-Forwards: 70\r\nUser-Agent: Jitsi2.11.20200408Linux\r\nExpires: 600\r\nContact: \"1002\" <sip:1002@192.168.58.201:5060;transport=udp;registering_acc=192_168_58_203>;expires=600\r\nContent-Length: 0\r\n"
// if saConn == nil {
// t.Fatal("connection not initialized")
// }
// var err error
// if _, err = saConn.Write([]byte(registerMessage)); err != nil {
// t.Fatal(err)
// }
// buffer := make([]byte, bufferSize)
// if _, err = saConn.Read(buffer); err != nil {
// t.Fatal(err)
// }
// var received sipingo.Message
// if received, err = sipingo.NewMessage(string(buffer)); err != nil {
// t.Fatal(err)
// }
if expected := "SIP/2.0 405 Method Not Allowed"; received["Request"] != expected {
t.Errorf("Expected %q, received: %q", expected, received["Request"])
}
}
// if expected := "SIP/2.0 405 Method Not Allowed"; received["Request"] != expected {
// t.Errorf("Expected %q, received: %q", expected, received["Request"])
// }
// }
func testSAitSIPInvite(t *testing.T) {
inviteMessage := "INVITE sip:1002@192.168.58.203 SIP/2.0\r\nCall-ID: 4d4d84b0cc83fc90aca41e295cd8ff43@0:0:0:0:0:0:0:0\r\nCSeq: 2 INVITE\r\nFrom: \"1001\" <sip:1001@192.168.58.203>;tag=99f35805\r\nTo: <sip:1002@192.168.58.203>\r\nMax-Forwards: 70\r\nContact: \"1001\" <sip:1001@192.168.58.201:5060;transport=udp;registering_acc=192_168_58_203>\r\nUser-Agent: Jitsi2.11.20200408Linux\r\nContent-Type: application/sdp\r\nVia: SIP/2.0/UDP 192.168.58.201:5060;branch=z9hG4bK-393139-939e89686023b86822cb942ede452b62\r\nProxy-Authorization: Digest username=\"1001\",realm=\"192.168.58.203\",nonce=\"XruO2167ja8uRODnSv8aXqv+/hqPJiXh\",uri=\"sip:1002@192.168.58.203\",response=\"5b814c709d1541d72ea778599c2e48a4\"\r\nContent-Length: 897\r\n\r\nv=0\r\no=1001-jitsi.org 0 0 IN IP4 192.168.58.201\r\ns=-\r\nc=IN IP4 192.168.58.201\r\nt=0 0\r\nm=audio 5000 RTP/AVP 96 97 98 9 100 102 0 8 103 3 104 101\r\na=rtpmap:96 opus/48000/2\r\na=fmtp:96 usedtx=1\r\na=ptime:20\r\na=rtpmap:97 SILK/24000\r\na=rtpmap:98 SILK/16000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:100 speex/32000\r\na=rtpmap:102 speex/16000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:103 iLBC/8000\r\na=rtpmap:3 GSM/8000\r\na=rtpmap:104 speex/8000\r\na=rtpmap:101 telephone-event/8000\r\na=extmap:1 urn:ietf:params:rtp-hdrext:csrc-audio-level\r\na=extmap:2 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=rtcp-xr:voip-metrics\r\nm=video 5002 RTP/AVP 105 99\r\na=recvonly\r\na=rtpmap:105 h264/90000\r\na=fmtp:105 profile-level-id=42E01f;packetization-mode=1\r\na=imageattr:105 send * recv [x=[1:1920],y=[1:1080]]\r\na=rtpmap:\r\n"
ack := "ACK sip:1001@192.168.56.203:6060 SIP/2.0\r\nVia: SIP/2.0/UDP 192.168.56.203;rport;branch=z9hG4bKQeB89BamX86UD\r\nMax-Forwards: 69\r\nFrom: \"1001\" <sip:1001@192.168.58.203>;tag=99f35805\r\nTo: <sip:1001@192.168.56.203:6060>\r\nCall-ID: 4d4d84b0cc83fc90aca41e295cd8ff43@0:0:0:0:0:0:0:0\r\nCSeq: 21984733 ACK\r\nContent-Length: 0\r\n"
if saConn == nil {
t.Fatal("connection not initialized")
}
var err error
if _, err = saConn.Write([]byte(inviteMessage)); err != nil {
t.Fatal(err)
}
buffer := make([]byte, bufferSize)
if _, err = saConn.Read(buffer); err != nil {
t.Fatal(err)
}
var received sipingo.Message
if received, err = sipingo.NewMessage(string(buffer)); err != nil {
t.Fatal(err)
}
// func testSAitSIPInvite(t *testing.T) {
// inviteMessage := "INVITE sip:1002@192.168.58.203 SIP/2.0\r\nCall-ID: 4d4d84b0cc83fc90aca41e295cd8ff43@0:0:0:0:0:0:0:0\r\nCSeq: 2 INVITE\r\nFrom: \"1001\" <sip:1001@192.168.58.203>;tag=99f35805\r\nTo: <sip:1002@192.168.58.203>\r\nMax-Forwards: 70\r\nContact: \"1001\" <sip:1001@192.168.58.201:5060;transport=udp;registering_acc=192_168_58_203>\r\nUser-Agent: Jitsi2.11.20200408Linux\r\nContent-Type: application/sdp\r\nVia: SIP/2.0/UDP 192.168.58.201:5060;branch=z9hG4bK-393139-939e89686023b86822cb942ede452b62\r\nProxy-Authorization: Digest username=\"1001\",realm=\"192.168.58.203\",nonce=\"XruO2167ja8uRODnSv8aXqv+/hqPJiXh\",uri=\"sip:1002@192.168.58.203\",response=\"5b814c709d1541d72ea778599c2e48a4\"\r\nContent-Length: 897\r\n\r\nv=0\r\no=1001-jitsi.org 0 0 IN IP4 192.168.58.201\r\ns=-\r\nc=IN IP4 192.168.58.201\r\nt=0 0\r\nm=audio 5000 RTP/AVP 96 97 98 9 100 102 0 8 103 3 104 101\r\na=rtpmap:96 opus/48000/2\r\na=fmtp:96 usedtx=1\r\na=ptime:20\r\na=rtpmap:97 SILK/24000\r\na=rtpmap:98 SILK/16000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:100 speex/32000\r\na=rtpmap:102 speex/16000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:103 iLBC/8000\r\na=rtpmap:3 GSM/8000\r\na=rtpmap:104 speex/8000\r\na=rtpmap:101 telephone-event/8000\r\na=extmap:1 urn:ietf:params:rtp-hdrext:csrc-audio-level\r\na=extmap:2 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=rtcp-xr:voip-metrics\r\nm=video 5002 RTP/AVP 105 99\r\na=recvonly\r\na=rtpmap:105 h264/90000\r\na=fmtp:105 profile-level-id=42E01f;packetization-mode=1\r\na=imageattr:105 send * recv [x=[1:1920],y=[1:1080]]\r\na=rtpmap:\r\n"
// ack := "ACK sip:1001@192.168.56.203:6060 SIP/2.0\r\nVia: SIP/2.0/UDP 192.168.56.203;rport;branch=z9hG4bKQeB89BamX86UD\r\nMax-Forwards: 69\r\nFrom: \"1001\" <sip:1001@192.168.58.203>;tag=99f35805\r\nTo: <sip:1001@192.168.56.203:6060>\r\nCall-ID: 4d4d84b0cc83fc90aca41e295cd8ff43@0:0:0:0:0:0:0:0\r\nCSeq: 21984733 ACK\r\nContent-Length: 0\r\n"
// if saConn == nil {
// t.Fatal("connection not initialized")
// }
// var err error
// if _, err = saConn.Write([]byte(inviteMessage)); err != nil {
// t.Fatal(err)
// }
// buffer := make([]byte, bufferSize)
// if _, err = saConn.Read(buffer); err != nil {
// t.Fatal(err)
// }
// var received sipingo.Message
// if received, err = sipingo.NewMessage(string(buffer)); err != nil {
// t.Fatal(err)
// }
if expected := "SIP/2.0 302 Moved Temporarily"; received["Request"] != expected {
t.Errorf("Expected %q, received: %q", expected, received["Request"])
}
if expected := "\"1002\" <sip:1002@cgrates.org>;q=0.7; expires=3600;cgr_cost=0.3;cgr_maxusage=30000000000,\"1002\" <sip:1002@cgrates.net>;q=0.2;cgr_cost=0.6;cgr_maxusage=30000000000,\"1002\" <sip:1002@cgrates.com>;q=0.1;cgr_cost=0.01;cgr_maxusage=30000000000"; received["Contact"] != expected {
t.Errorf("Expected %q, received: %q", expected, received["Contact"])
}
// if expected := "SIP/2.0 302 Moved Temporarily"; received["Request"] != expected {
// t.Errorf("Expected %q, received: %q", expected, received["Request"])
// }
// if expected := "\"1002\" <sip:1002@cgrates.org>;q=0.7; expires=3600;cgr_cost=0.3;cgr_maxusage=30000000000,\"1002\" <sip:1002@cgrates.net>;q=0.2;cgr_cost=0.6;cgr_maxusage=30000000000,\"1002\" <sip:1002@cgrates.com>;q=0.1;cgr_cost=0.01;cgr_maxusage=30000000000"; received["Contact"] != expected {
// t.Errorf("Expected %q, received: %q", expected, received["Contact"])
// }
time.Sleep(time.Second)
buffer = make([]byte, bufferSize)
if _, err = saConn.Read(buffer); err != nil {
t.Fatal(err)
}
if received, err = sipingo.NewMessage(string(buffer)); err != nil {
t.Fatal(err)
}
// time.Sleep(time.Second)
// buffer = make([]byte, bufferSize)
// if _, err = saConn.Read(buffer); err != nil {
// t.Fatal(err)
// }
// if received, err = sipingo.NewMessage(string(buffer)); err != nil {
// t.Fatal(err)
// }
if expected := "SIP/2.0 302 Moved Temporarily"; received["Request"] != expected {
t.Errorf("Expected %q, received: %q", expected, received["Request"])
}
if expected := "\"1002\" <sip:1002@cgrates.org>;q=0.7; expires=3600;cgr_cost=0.3;cgr_maxusage=30000000000,\"1002\" <sip:1002@cgrates.net>;q=0.2;cgr_cost=0.6;cgr_maxusage=30000000000,\"1002\" <sip:1002@cgrates.com>;q=0.1;cgr_cost=0.01;cgr_maxusage=30000000000"; received["Contact"] != expected {
t.Errorf("Expected %q, received: %q", expected, received["Contact"])
}
// if expected := "SIP/2.0 302 Moved Temporarily"; received["Request"] != expected {
// t.Errorf("Expected %q, received: %q", expected, received["Request"])
// }
// if expected := "\"1002\" <sip:1002@cgrates.org>;q=0.7; expires=3600;cgr_cost=0.3;cgr_maxusage=30000000000,\"1002\" <sip:1002@cgrates.net>;q=0.2;cgr_cost=0.6;cgr_maxusage=30000000000,\"1002\" <sip:1002@cgrates.com>;q=0.1;cgr_cost=0.01;cgr_maxusage=30000000000"; received["Contact"] != expected {
// t.Errorf("Expected %q, received: %q", expected, received["Contact"])
// }
if expected := "<sip:1002@route1.com>"; received["P-Charge-Info"] != expected {
t.Errorf("Expected %q, received: %q", expected, received["P-Charge-Info"])
}
// if expected := "<sip:1002@route1.com>"; received["P-Charge-Info"] != expected {
// t.Errorf("Expected %q, received: %q", expected, received["P-Charge-Info"])
// }
if _, err = saConn.Write([]byte(ack)); err != nil {
t.Fatal(err)
}
buffer = make([]byte, bufferSize)
saConn.SetDeadline(time.Now().Add(time.Second))
if _, err = saConn.Read(buffer); err == nil {
t.Error("Expected error received nil")
} else if nerr, ok := err.(net.Error); !ok {
t.Errorf("Expected net.Error received:%v", err)
} else if !nerr.Timeout() {
t.Errorf("Expected a timeout error received:%v", err)
}
}
// if _, err = saConn.Write([]byte(ack)); err != nil {
// t.Fatal(err)
// }
// buffer = make([]byte, bufferSize)
// saConn.SetDeadline(time.Now().Add(time.Second))
// if _, err = saConn.Read(buffer); err == nil {
// t.Error("Expected error received nil")
// } else if nerr, ok := err.(net.Error); !ok {
// t.Errorf("Expected net.Error received:%v", err)
// } else if !nerr.Timeout() {
// t.Errorf("Expected a timeout error received:%v", err)
// }
// }

View File

@@ -1,66 +1,67 @@
{
"general": {
"log_level": 7
},
// Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments
// Copyright (C) ITsysCOM GmbH
//
// This file contains the default configuration hardcoded into CGRateS.
// This is what you get when you load CGRateS with an empty configuration file.
"data_db": {
"db_type": "*internal"
},
"schedulers": {
"enabled": true,
"cdrs_conns": ["*internal"]
},
"sessions": {
"enabled": true,
"attributes_conns": ["*localhost"],
"rals_conns": ["*internal"],
"cdrs_conns": ["*internal"],
"chargers_conns": ["*internal"],
"routes_conns": ["*localhost"]
},
"rates": {
"enabled": true
},
"cdrs": {
"enabled": true,
"rates_conns": ["*internal"]
},
"chargers": {
"enabled": true
},
"general": {
"log_level": 7, // control the level of messages logged (0-emerg to 7-debug)
},
"attributes": {
"enabled": true
},
"data_db": {
"db_type": "*internal",
},
"routes": {
"enabled": true
},
"dns_agent": {
"enabled": true,
"listen": ":2053",
"sessions_conns": ["*localhost"]
},
"sessions": {
"enabled": true,
"attributes_conns": ["*localhost"],
"rates_conns": ["*internal"],
"cdrs_conns": ["*internal"],
"chargers_conns": ["*internal"],
"routes_conns": ["*localhost"],
},
"admins": {
"enabled": true,
"scheduler_conns": ["*internal"]
},
"rates": {
"enabled": true,
},
"cdrs": {
"enabled": true,
"rates_conns": ["*internal"],
},
"chargers": {
"enabled": true,
},
"attributes": {
"enabled": true,
},
"routes": {
"enabled": true,
},
"dns_agent": {
"enabled": true,
"listen": ":2053",
"sessions_conns": ["*localhost"],
},
"admins": {
"enabled": true,
},
}
"loaders": [
{
"id": "*default",
"enabled": true,
"tenant": "cgrates.org",
"lockfile_path": ".cgr.lck",
"tp_in_dir": "/usr/share/cgrates/tariffplans/dnsagent",
"tp_out_dir": ""
}
]
}