mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-12 02:26:26 +05:00
Comment integration test that don't compile and begin fixing them
This commit is contained in:
committed by
Dan Christian Bogos
parent
2076e7f858
commit
833810932b
File diff suppressed because it is too large
Load Diff
@@ -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)
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -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×tamp=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×tamp=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)
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -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
@@ -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)
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -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": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user