diff --git a/agents/diam_it_test.go b/agents/diam_it_test.go
index bfc619b1e..fe5654752 100644
--- a/agents/diam_it_test.go
+++ b/agents/diam_it_test.go
@@ -21,1593 +21,1593 @@ along with this program. If not, see
package agents
-import (
- "flag"
- "fmt"
- "net/rpc"
- "os/exec"
- "path"
- "strings"
- "sync"
- "testing"
- "time"
-
- "github.com/cgrates/birpc/context"
- "github.com/cgrates/cgrates/apis"
- "github.com/cgrates/cgrates/config"
- "github.com/cgrates/cgrates/engine"
- "github.com/cgrates/cgrates/utils"
- "github.com/fiorix/go-diameter/v4/diam"
- "github.com/fiorix/go-diameter/v4/diam/avp"
- "github.com/fiorix/go-diameter/v4/diam/datatype"
- "github.com/fiorix/go-diameter/v4/diam/dict"
-)
-
-var (
- interations = flag.Int("iterations", 1, "Number of iterations to do for dry run simulation")
- replyTimeout = flag.String("reply_timeout", "1s", "Maximum duration to wait for a reply")
-
- daCfgPath, diamConfigDIR string
- daCfg *config.CGRConfig
- apierRpc *rpc.Client
- diamClnt *DiameterClient
-
- rplyTimeout time.Duration
-
- isDispatcherActive bool
-
- sTestsDiam = []func(t *testing.T){
- testDiamItInitCfg,
- testDiamItResetDataDb,
- testDiamItStartEngine,
- testDiamItConnectDiameterClient,
- testDiamItApierRpcConn,
- testDiamItTPFromFolder,
- testDiamItDryRun,
- testDiamItCCRInit,
- testDiamItCCRUpdate,
-
- testDiamItRAR,
-
- testDiamItCCRTerminate,
- testDiamItCCRSMS,
- testDiamItCCRMMS,
-
- testDiamItEmulateTerminate,
-
- testDiamItTemplateErr,
- testDiamItCCRInitWithForceDuration,
-
- testDiamItDRR,
-
- testDiamItKillEngine,
- }
-)
-
-// Test start here
-func TestDiamItTcp(t *testing.T) {
- switch *dbType {
- case utils.MetaInternal:
- diamConfigDIR = "diamagent_internal"
- case utils.MetaMySQL:
- diamConfigDIR = "diamagent_mysql"
- case utils.MetaMongo:
- diamConfigDIR = "diamagent_mongo"
- case utils.MetaPostgres:
- t.SkipNow()
- default:
- t.Fatal("Unknown Database type")
- }
- for _, stest := range sTestsDiam {
- t.Run(diamConfigDIR, stest)
- }
-}
-
-func TestDiamItDispatcher(t *testing.T) {
- if *encoding == utils.MetaGOB {
- t.SkipNow()
- return
- }
- testDiamItResetAllDB(t)
- isDispatcherActive = true
- engine.StartEngine(path.Join(*dataDir, "conf", "samples", "dispatchers", "all"), 200)
- engine.StartEngine(path.Join(*dataDir, "conf", "samples", "dispatchers", "all2"), 200)
- diamConfigDIR = "dispatchers/diamagent"
- for _, stest := range sTestsDiam {
- t.Run(diamConfigDIR, stest)
- }
- isDispatcherActive = false
-}
-
-func TestDiamItSctp(t *testing.T) {
- switch *dbType {
- case utils.MetaInternal:
- diamConfigDIR = "diamsctpagent_internal"
- case utils.MetaMySQL:
- diamConfigDIR = "diamsctpagent_mysql"
- case utils.MetaMongo:
- diamConfigDIR = "diamsctpagent_mongo"
- case utils.MetaPostgres:
- t.SkipNow()
- default:
- t.Fatal("Unknown Database type")
- }
- for _, stest := range sTestsDiam {
- t.Run(diamConfigDIR, stest)
- }
-}
-
-func TestDiamItBiRPC(t *testing.T) {
- switch *dbType {
- case utils.MetaInternal:
- diamConfigDIR = "diamagent_internal_%sbirpc"
- case utils.MetaMySQL:
- diamConfigDIR = "diamagent_mysql_%sbirpc"
- case utils.MetaMongo:
- diamConfigDIR = "diamagent_mongo_%sbirpc"
- case utils.MetaPostgres:
- t.SkipNow()
- default:
- t.Fatal("Unknown Database type")
- }
- diamConfigDIR = fmt.Sprintf(diamConfigDIR, strings.TrimPrefix(*encoding, utils.Meta))
- for _, stest := range sTestsDiam {
- t.Run(diamConfigDIR, stest)
- }
-}
-
-func TestDiamItMaxConn(t *testing.T) {
- switch *dbType {
- case utils.MetaInternal:
- diamConfigDIR = "diamagentmaxconn_internal"
- case utils.MetaMySQL:
- diamConfigDIR = "diamagentmaxconn_mysql"
- case utils.MetaMongo:
- diamConfigDIR = "diamagentmaxconn_mongo"
- case utils.MetaPostgres:
- t.SkipNow()
- default:
- t.Fatal("Unknown Database type")
- }
- for _, stest := range sTestsDiam[:7] {
- t.Run(diamConfigDIR, stest)
- }
- t.Run(diamConfigDIR, testDiamItDryRunMaxConn)
- t.Run(diamConfigDIR, testDiamItKillEngine)
-}
-
-func TestDiamItSessionDisconnect(t *testing.T) {
- switch *dbType {
- case utils.MetaInternal:
- diamConfigDIR = "diamagent_internal"
- case utils.MetaMySQL:
- diamConfigDIR = "diamagent_mysql"
- case utils.MetaMongo:
- diamConfigDIR = "diamagent_mongo"
- case utils.MetaPostgres:
- t.SkipNow()
- default:
- t.Fatal("Unknown Database type")
- }
-
- for _, stest := range sTestsDiam[:7] {
- t.Run(diamConfigDIR, stest)
- }
- t.Run(diamConfigDIR, testDiamInitWithSessionDisconnect)
- t.Run(diamConfigDIR, testDiamItKillEngine)
-}
-
-func testDiamItInitCfg(t *testing.T) {
- daCfgPath = path.Join(*dataDir, "conf", "samples", diamConfigDIR)
- // Init config first
- var err error
- daCfg, err = config.NewCGRConfigFromPath(context.Background(), daCfgPath)
- if err != nil {
- t.Fatal(err)
- }
- rplyTimeout, _ = utils.ParseDurationWithSecs(*replyTimeout)
- if isDispatcherActive {
- daCfg.ListenCfg().RPCJSONListen = ":6012"
- }
-}
-
-func testDiamItResetAllDB(t *testing.T) {
- cfgPath1 := path.Join(*dataDir, "conf", "samples", "dispatchers", "all")
- allCfg, err := config.NewCGRConfigFromPath(context.Background(), cfgPath1)
- if err != nil {
- t.Fatal(err)
- }
- if err := engine.InitDataDB(allCfg); err != nil {
- t.Fatal(err)
- }
-
- cfgPath2 := path.Join(*dataDir, "conf", "samples", "dispatchers", "all2")
- allCfg2, err := config.NewCGRConfigFromPath(context.Background(), cfgPath2)
- if err != nil {
- t.Fatal(err)
- }
- if err := engine.InitDataDB(allCfg2); err != nil {
- t.Fatal(err)
- }
-
-}
-
-// Remove data in both rating and accounting db
-func testDiamItResetDataDb(t *testing.T) {
- if err := engine.InitDataDB(daCfg); err != nil {
- t.Fatal(err)
- }
-}
-
-// Start CGR Engine
-func testDiamItStartEngine(t *testing.T) {
- if _, err := engine.StartEngine(daCfgPath, 500); err != nil {
- t.Fatal(err)
- }
-}
-
-func testDiamItConnectDiameterClient(t *testing.T) {
- diamClnt, err = NewDiameterClient(daCfg.DiameterAgentCfg().Listen, "INTEGRATION_TESTS",
- daCfg.DiameterAgentCfg().OriginRealm, daCfg.DiameterAgentCfg().VendorID,
- daCfg.DiameterAgentCfg().ProductName, utils.DiameterFirmwareRevision,
- daCfg.DiameterAgentCfg().DictionariesPath, daCfg.DiameterAgentCfg().ListenNet)
- if err != nil {
- t.Fatal(err)
- }
-}
-
-// Connect rpc client to rater
-func testDiamItApierRpcConn(t *testing.T) {
- var err error
- apierRpc, err = newRPCClient(daCfg.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 testDiamItTPFromFolder(t *testing.T) {
- attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "tutorial")}
- var loadInst utils.LoadInstance
- if err := apierRpc.Call(utils.APIerSv1LoadTariffPlanFromFolder, attrs, &loadInst); err != nil {
- t.Error(err)
- }
- if isDispatcherActive {
- testDiamItTPLoadData(t)
- }
- time.Sleep(100 * time.Millisecond) // Give time for scheduler to execute topups
-}
-
-func testDiamItTPLoadData(t *testing.T) {
- wchan := make(chan struct{}, 1)
- go func() {
- loaderPath, err := exec.LookPath("cgr-loader")
- if err != nil {
- t.Error(err)
- }
- loader := exec.Command(loaderPath, "-config_path", daCfgPath, "-path", path.Join(*dataDir, "tariffplans", "dispatchers"))
-
- if err := loader.Start(); err != nil {
- t.Error(err)
- }
- loader.Wait()
- wchan <- struct{}{}
- }()
- select {
- case <-wchan:
- case <-time.After(time.Second):
- t.Errorf("cgr-loader failed: ")
- }
-}
-
-func testDiamItDryRun(t *testing.T) {
- ccr := diam.NewRequest(diam.CreditControl, 4, nil)
- ccr.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("cgrates;1451911932;00082"))
- ccr.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
- ccr.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- ccr.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- ccr.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
- ccr.NewAVP(avp.UserName, avp.Mbit, 0, datatype.UTF8String("CGR-DA"))
- ccr.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
- ccr.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("TestDiamItDryRun")) // Match specific DryRun profile
- ccr.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(1))
- ccr.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(1))
- ccr.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2016, 1, 5, 11, 30, 10, 0, time.UTC)))
- ccr.NewAVP(avp.TerminationCause, avp.Mbit, 0, datatype.Enumerated(1))
- ccr.NewAVP(443, avp.Mbit, 0, &diam.GroupedAVP{ // Subscription-Id
- AVP: []*diam.AVP{
- diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(0)), // Subscription-Id-Type
- diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("1001")), // Subscription-Id-Data
- }})
- ccr.NewAVP(443, avp.Mbit, 0, &diam.GroupedAVP{ // Subscription-Id
- AVP: []*diam.AVP{
- diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(1)), // Subscription-Id-Type
- diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("208123456789")), // Subscription-Id-Data
- }})
- ccr.NewAVP(439, avp.Mbit, 0, datatype.Unsigned32(0)) // Service-Identifier
- ccr.NewAVP(437, avp.Mbit, 0, &diam.GroupedAVP{ // Requested-Service-Unit
- AVP: []*diam.AVP{
- diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(300)), // CC-Time
- }})
- ccr.NewAVP(873, avp.Mbit|avp.Vbit, 10415, &diam.GroupedAVP{ // Service-information
- AVP: []*diam.AVP{
- diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
- AVP: []*diam.AVP{
- diam.NewAVP(20336, avp.Mbit, 2011, datatype.UTF8String("1001")), // CallingPartyAdress
- diam.NewAVP(20337, avp.Mbit, 2011, datatype.UTF8String("1002")), // CalledPartyAdress
- diam.NewAVP(20339, avp.Mbit, 2011, datatype.Unsigned32(0)), // ChargeFlowType
- diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("33609004940")), // CallingVlrNumber
- diam.NewAVP(20303, avp.Mbit, 2011, datatype.UTF8String("208104941749984")), // CallingCellID
- diam.NewAVP(20313, avp.Mbit, 2011, datatype.OctetString("0x8090a3")), // BearerCapability
- diam.NewAVP(20321, avp.Mbit, 2011, datatype.OctetString("0x401c4132ed665")), // CallreferenceNumber
- diam.NewAVP(20322, avp.Mbit, 2011, datatype.UTF8String("33609004940")), // MSCAddress
- diam.NewAVP(20386, avp.Mbit, 2011, datatype.UTF8String("20160501010101")), // SSPTime
- diam.NewAVP(20938, avp.Mbit, 2011, datatype.OctetString("0x00000001")), // HighLayerCharacteristics
- diam.NewAVP(20324, avp.Mbit, 2011, datatype.Integer32(8)), // Time-Zone
- },
- }),
- }})
- ccr.NewAVP(avp.MultipleServicesCreditControl, avp.Mbit, 0, &diam.GroupedAVP{ // Multiple-Services-Credit-Control
- AVP: []*diam.AVP{
- diam.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{ // Used-Service-Unit
- AVP: []*diam.AVP{
- diam.NewAVP(avp.CCTotalOctets, avp.Mbit, 0, datatype.Unsigned64(7640)), // CC-Total-Octets
- diam.NewAVP(avp.CCInputOctets, avp.Mbit, 0, datatype.Unsigned64(5337)), // CC-Input-Octets
- diam.NewAVP(avp.CCOutputOctets, avp.Mbit, 0, datatype.Unsigned64(2303)), // CC-Output-Octets
- },
- }),
- diam.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(65000)), // Service-Identifier
- diam.NewAVP(avp.RatingGroup, avp.Mbit, 0, datatype.Unsigned32(1)), // Rating-Group
- diam.NewAVP(avp.ReportingReason, avp.Mbit, 0, datatype.Enumerated(2)), // Reporting-Reason
- },
- })
- ccr.NewAVP(avp.MultipleServicesCreditControl, avp.Mbit, 0, &diam.GroupedAVP{ // Multiple-Services-Credit-Control
- AVP: []*diam.AVP{
- diam.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{ // Used-Service-Unit
- AVP: []*diam.AVP{
- diam.NewAVP(avp.CCTotalOctets, avp.Mbit, 0, datatype.Unsigned64(3000)), // CC-Total-Octets
- diam.NewAVP(avp.CCInputOctets, avp.Mbit, 0, datatype.Unsigned64(2000)), // CC-Input-Octets
- diam.NewAVP(avp.CCOutputOctets, avp.Mbit, 0, datatype.Unsigned64(1000)), // CC-Output-Octets
- },
- }),
- diam.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(65000)), // Service-Identifier
- diam.NewAVP(avp.RatingGroup, avp.Mbit, 0, datatype.Unsigned32(2)), // Rating-Group
- diam.NewAVP(avp.ReportingReason, avp.Mbit, 0, datatype.Enumerated(2)), // Reporting-Reason
- },
- })
- if _, err := ccr.NewAVP("Framed-IP-Address", avp.Mbit, 0, datatype.UTF8String("10.228.16.4")); err != nil {
- t.Error(err)
- }
- for i := 0; i < *interations; i++ {
- // ============================================
- // prevent nil pointer dereference
- // ============================================
- if diamClnt == nil {
- t.Fatal("Diameter client should not be nil")
- }
- if diamClnt.conn == nil {
- t.Fatal("Diameter connection should not be nil")
- }
- if ccr == nil {
- t.Fatal("The mesage to diameter should not be nil")
- }
- // ============================================
-
- if err := diamClnt.SendMessage(ccr); err != nil {
- t.Error(err)
- }
- msg := diamClnt.ReceivedMessage(rplyTimeout)
- if msg == nil {
- t.Fatal("No message returned")
- }
- // Result-Code
- eVal := "2002"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
-
- eVal = "cgrates;1451911932;00082"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Session-Id"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
- eVal = "CGR-DA"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Origin-Host"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
- eVal = "cgrates.org"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Origin-Realm"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
- eVal = "4"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Auth-Application-Id"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
- eVal = "1"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"CC-Request-Type"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
- eVal = "1"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"CC-Request-Number"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Multiple-Services-Credit-Control", "Rating-Group"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) != 2 {
- t.Errorf("Unexpected number of Multiple-Services-Credit-Control.Rating-Group : %d", len(avps))
- } else {
- if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != "1" {
- t.Errorf("expecting: 1, received: <%s>", val)
- }
- if val, err := diamAVPAsString(avps[1]); err != nil {
- t.Error(err)
- } else if val != "2" {
- t.Errorf("expecting: 2, received: <%s>", val)
- }
- }
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Multiple-Services-Credit-Control", "Used-Service-Unit", "CC-Total-Octets"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) != 2 {
- t.Errorf("Unexpected number of Multiple-Services-Credit-Control.Used-Service-Unit.CC-Total-Octets : %d", len(avps))
- } else {
- if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != "7640" {
- t.Errorf("expecting: 7640, received: <%s>", val)
- }
- if val, err := diamAVPAsString(avps[1]); err != nil {
- t.Error(err)
- } else if val != "3000" {
- t.Errorf("expecting: 3000, received: <%s>", val)
- }
- }
- eVal = "6" // sum of items
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Granted-Service-Unit", "CC-Time"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
- }
-}
-
-func testDiamItDryRunMaxConn(t *testing.T) {
- ccr := diam.NewRequest(diam.CreditControl, 4, nil)
- ccr.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("cgrates;1451911932;00082"))
- ccr.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
- ccr.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- ccr.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- ccr.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
- ccr.NewAVP(avp.UserName, avp.Mbit, 0, datatype.UTF8String("CGR-DA"))
- ccr.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
- ccr.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("TestDiamItDryRun")) // Match specific DryRun profile
- ccr.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(1))
- ccr.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(1))
- ccr.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2016, 1, 5, 11, 30, 10, 0, time.UTC)))
- ccr.NewAVP(avp.TerminationCause, avp.Mbit, 0, datatype.Enumerated(1))
- if _, err := ccr.NewAVP("Framed-IP-Address", avp.Mbit, 0, datatype.UTF8String("10.228.16.4")); err != nil {
- t.Error(err)
- }
- for i := 0; i < *interations; i++ {
- if err := diamClnt.SendMessage(ccr); err != nil {
- t.Error(err)
- }
- msg := diamClnt.ReceivedMessage(rplyTimeout)
- if msg == nil {
- t.Fatal("No message returned")
- }
- // Result-Code
- eVal := "5012"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
- eVal = "cgrates;1451911932;00082"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Session-Id"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
- eVal = "CGR-DA"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Origin-Host"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
- eVal = "cgrates.org"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Origin-Realm"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
- }
-}
-
-func testDiamItCCRInit(t *testing.T) {
- m := diam.NewRequest(diam.CreditControl, 4, nil)
- m.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8"))
- m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("192.168.1.1"))
- m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- m.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
- m.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(1))
- m.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(0))
- m.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
- m.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- m.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("voice@DiamItCCRInit"))
- m.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 4, 14, 42, 20, 0, time.UTC)))
- m.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(0)), // Subscription-Id-Type
- diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("1006")), // Subscription-Id-Data
- }})
- m.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
- m.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(300))}})
- m.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(0))}})
- m.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
- AVP: []*diam.AVP{
- diam.NewAVP(831, avp.Mbit, 10415, datatype.UTF8String("1006")), // Calling-Party-Address
- diam.NewAVP(832, avp.Mbit, 10415, datatype.UTF8String("1002")), // Called-Party-Address
- diam.NewAVP(20327, avp.Mbit, 2011, datatype.UTF8String("1002")), // Real-Called-Number
- diam.NewAVP(20339, avp.Mbit, 2011, datatype.Unsigned32(0)), // Charge-Flow-Type
- diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-Vlr-Number
- diam.NewAVP(20303, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-CellID-Or-SAI
- diam.NewAVP(20313, avp.Mbit, 2011, datatype.OctetString("")), // Bearer-Capability
- diam.NewAVP(20321, avp.Mbit, 2011, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8")), // Call-Reference-Number
- diam.NewAVP(20322, avp.Mbit, 2011, datatype.UTF8String("")), // MSC-Address
- diam.NewAVP(20324, avp.Mbit, 2011, datatype.Unsigned32(0)), // Time-Zone
- diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("")), // Called-Party-NP
- diam.NewAVP(20386, avp.Mbit, 2011, datatype.UTF8String("")), // SSP-Time
- },
- }),
- }})
- // ============================================
- // prevent nil pointer dereference
- // ============================================
- if diamClnt == nil {
- t.Fatal("Diameter client should not be nil")
- }
- if diamClnt.conn == nil {
- t.Fatal("Diameter connection should not be nil")
- }
- if m == nil {
- t.Fatal("The mesage to diameter should not be nil")
- }
- // ============================================
- if err := diamClnt.SendMessage(m); err != nil {
- t.Error(err)
- }
- msg := diamClnt.ReceivedMessage(rplyTimeout)
- if msg == nil {
- t.Fatal("No message returned")
- }
- // Result-Code
- eVal := "2001"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
- // Result-Code
- eVal = "300" // 5 mins of session
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Granted-Service-Unit", "CC-Time"},
- dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
-}
-
-func testDiamItCCRInitWithForceDuration(t *testing.T) {
- m := diam.NewRequest(diam.CreditControl, 4, nil)
- m.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbfx1"))
- m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("192.168.1.1"))
- m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- m.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
- m.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(1))
- m.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(0))
- m.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
- m.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- m.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("forceDurationVoice@DiamItCCRInit"))
- m.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 4, 14, 42, 20, 0, time.UTC)))
- m.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(0)), // Subscription-Id-Type
- diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("1006")), // Subscription-Id-Data
- }})
- m.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
- m.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(3000000000))}})
- m.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(0))}})
- m.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
- AVP: []*diam.AVP{
- diam.NewAVP(831, avp.Mbit, 10415, datatype.UTF8String("1006")), // Calling-Party-Address
- diam.NewAVP(832, avp.Mbit, 10415, datatype.UTF8String("1002")), // Called-Party-Address
- diam.NewAVP(20327, avp.Mbit, 2011, datatype.UTF8String("1002")), // Real-Called-Number
- diam.NewAVP(20339, avp.Mbit, 2011, datatype.Unsigned32(0)), // Charge-Flow-Type
- diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-Vlr-Number
- diam.NewAVP(20303, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-CellID-Or-SAI
- diam.NewAVP(20313, avp.Mbit, 2011, datatype.OctetString("")), // Bearer-Capability
- diam.NewAVP(20321, avp.Mbit, 2011, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8")), // Call-Reference-Number
- diam.NewAVP(20322, avp.Mbit, 2011, datatype.UTF8String("")), // MSC-Address
- diam.NewAVP(20324, avp.Mbit, 2011, datatype.Unsigned32(0)), // Time-Zone
- diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("")), // Called-Party-NP
- diam.NewAVP(20386, avp.Mbit, 2011, datatype.UTF8String("")), // SSP-Time
- },
- }),
- }})
- // ============================================
- // prevent nil pointer dereference
- // ============================================
- if diamClnt == nil {
- t.Fatal("Diameter client should not be nil")
- }
- if diamClnt.conn == nil {
- t.Fatal("Diameter connection should not be nil")
- }
- if m == nil {
- t.Fatal("The mesage to diameter should not be nil")
- }
- // ============================================
- if err := diamClnt.SendMessage(m); err != nil {
- t.Error(err)
- }
- msg := diamClnt.ReceivedMessage(rplyTimeout)
- if msg == nil {
- t.Fatal("No message returned")
- }
- // Result-Code
- eVal := "5030"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
-
-}
-
-func testDiamItCCRUpdate(t *testing.T) {
- m := diam.NewRequest(diam.CreditControl, 4, nil)
- m.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8"))
- m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("192.168.1.1"))
- m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- m.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
- m.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(2))
- m.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(1))
- m.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
- m.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- m.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("voice@DiamItCCRInit"))
- m.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 4, 14, 57, 20, 0, time.UTC)))
- m.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(0)), // Subscription-Id-Type
- diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("1006")), // Subscription-Id-Data
- }})
- m.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
- m.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(300))}})
- m.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(300))}})
- m.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
- AVP: []*diam.AVP{
- diam.NewAVP(831, avp.Mbit, 10415, datatype.UTF8String("1006")), // Calling-Party-Address
- diam.NewAVP(832, avp.Mbit, 10415, datatype.UTF8String("1002")), // Called-Party-Address
- diam.NewAVP(20327, avp.Mbit, 2011, datatype.UTF8String("1002")), // Real-Called-Number
- diam.NewAVP(20339, avp.Mbit, 2011, datatype.Unsigned32(0)), // Charge-Flow-Type
- diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-Vlr-Number
- diam.NewAVP(20303, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-CellID-Or-SAI
- diam.NewAVP(20313, avp.Mbit, 2011, datatype.OctetString("")), // Bearer-Capability
- diam.NewAVP(20321, avp.Mbit, 2011, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8")), // Call-Reference-Number
- diam.NewAVP(20322, avp.Mbit, 2011, datatype.UTF8String("")), // MSC-Address
- diam.NewAVP(20324, avp.Mbit, 2011, datatype.Unsigned32(0)), // Time-Zone
- diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("")), // Called-Party-NP
- diam.NewAVP(20386, avp.Mbit, 2011, datatype.UTF8String("")), // SSP-Time
- },
- }),
- }})
- // ============================================
- // prevent nil pointer dereference
- // ============================================
- if diamClnt == nil {
- t.Fatal("Diameter client should not be nil")
- }
- if diamClnt.conn == nil {
- t.Fatal("Diameter connection should not be nil")
- }
- if m == nil {
- t.Fatal("The mesage to diameter should not be nil")
- }
- // ============================================
- if err := diamClnt.SendMessage(m); err != nil {
- t.Error(err)
- }
- msg := diamClnt.ReceivedMessage(rplyTimeout)
- if msg == nil {
- t.Fatal("No message returned")
- }
- // Result-Code
- eVal := "2001"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
- // Result-Code
- eVal = "300" // 5 mins of session
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Granted-Service-Unit", "CC-Time"},
- dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
-}
-
-func testDiamItCCRTerminate(t *testing.T) {
- m := diam.NewRequest(diam.CreditControl, 4, nil)
- m.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8"))
- m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("192.168.1.1"))
- m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- m.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
- m.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(3))
- m.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(2))
- m.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
- m.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- m.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("voice@DiamItCCRInit"))
- m.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 4, 15, 12, 20, 0, time.UTC)))
- m.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(0)), // Subscription-Id-Type
- diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("1006")), // Subscription-Id-Data
- }})
- m.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
- m.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(0))}})
- m.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(250))}})
- m.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
- AVP: []*diam.AVP{
- diam.NewAVP(831, avp.Mbit, 10415, datatype.UTF8String("1006")), // Calling-Party-Address
- diam.NewAVP(832, avp.Mbit, 10415, datatype.UTF8String("1002")), // Called-Party-Address
- diam.NewAVP(20327, avp.Mbit, 2011, datatype.UTF8String("1002")), // Real-Called-Number
- diam.NewAVP(20339, avp.Mbit, 2011, datatype.Unsigned32(0)), // Charge-Flow-Type
- diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-Vlr-Number
- diam.NewAVP(20303, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-CellID-Or-SAI
- diam.NewAVP(20313, avp.Mbit, 2011, datatype.OctetString("")), // Bearer-Capability
- diam.NewAVP(20321, avp.Mbit, 2011, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8")), // Call-Reference-Number
- diam.NewAVP(20322, avp.Mbit, 2011, datatype.UTF8String("")), // MSC-Address
- diam.NewAVP(20324, avp.Mbit, 2011, datatype.Unsigned32(0)), // Time-Zone
- diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("")), // Called-Party-NP
- diam.NewAVP(20386, avp.Mbit, 2011, datatype.UTF8String("")), // SSP-Time
- },
- }),
- }})
- // ============================================
- // prevent nil pointer dereference
- // ============================================
- if diamClnt == nil {
- t.Fatal("Diameter client should not be nil")
- }
- if diamClnt.conn == nil {
- t.Fatal("Diameter connection should not be nil")
- }
- if m == nil {
- t.Fatal("The mesage to diameter should not be nil")
- }
- // ============================================
- if err := diamClnt.SendMessage(m); err != nil {
- t.Error(err)
- }
- msg := diamClnt.ReceivedMessage(rplyTimeout)
- if msg == nil {
- t.Fatal("No message returned")
- }
- // Result-Code
- eVal := "2001"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
- time.Sleep(time.Duration(*waitRater) * time.Millisecond)
- var cdrs []*engine.CDR
- args := utils.RPCCDRsFilterWithAPIOpts{RPCCDRsFilter: &utils.RPCCDRsFilter{RunIDs: []string{utils.MetaRaw}}}
- if err := apierRpc.Call(utils.CDRsV1GetCDRs, &args, &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 != 550*time.Second {
- t.Errorf("Unexpected Usage CDR: %+v", cdrs[0])
- }
- // in case of sctp we get OriginHost ip1/ip2/ip3/...
- if !strings.Contains(cdrs[0].OriginHost, "127.0.0.1") {
- t.Errorf("Unexpected OriginHost CDR: %+v", cdrs[0])
- }
- }
-}
-
-func testDiamItCCRSMS(t *testing.T) {
- ccr := diam.NewRequest(diam.CreditControl, 4, nil)
- ccr.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("TestDmtAgentSendCCRSMS"))
- ccr.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
- ccr.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- ccr.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
- ccr.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("message@DiamItCCRSMS"))
- ccr.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(4))
- ccr.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(0))
- ccr.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 5, 11, 43, 10, 0, time.UTC)))
- ccr.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(avp.SubscriptionIDType, avp.Mbit, 0, datatype.Enumerated(0)),
- diam.NewAVP(avp.SubscriptionIDData, avp.Mbit, 0, datatype.UTF8String("1001")), // Subscription-Id-Data
- }})
- ccr.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(avp.SubscriptionIDType, avp.Mbit, 0, datatype.Enumerated(1)),
- diam.NewAVP(avp.SubscriptionIDData, avp.Mbit, 0, datatype.UTF8String("104502200011")), // Subscription-Id-Data
- }})
- ccr.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
- ccr.NewAVP(avp.RequestedAction, avp.Mbit, 0, datatype.Enumerated(0))
- ccr.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(avp.CCTime, avp.Mbit, 0, datatype.Unsigned32(1))}})
- ccr.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{ //
- AVP: []*diam.AVP{
- diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
- AVP: []*diam.AVP{
- diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("22509")), // Calling-Vlr-Number
- diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("4002")), // Called-Party-NP
- },
- }),
- diam.NewAVP(2000, avp.Mbit, 10415, &diam.GroupedAVP{ // SMS-Information
- AVP: []*diam.AVP{
- diam.NewAVP(886, avp.Mbit, 10415, &diam.GroupedAVP{ // Originator-Address
- AVP: []*diam.AVP{
- diam.NewAVP(899, avp.Mbit, 10415, datatype.Enumerated(1)), // Address-Type
- diam.NewAVP(897, avp.Mbit, 10415, datatype.UTF8String("1001")), // Address-Data
- }}),
- diam.NewAVP(1201, avp.Mbit, 10415, &diam.GroupedAVP{ // Recipient-Address
- AVP: []*diam.AVP{
- diam.NewAVP(899, avp.Mbit, 10415, datatype.Enumerated(1)), // Address-Type
- diam.NewAVP(897, avp.Mbit, 10415, datatype.UTF8String("1003")), // Address-Data
- }}),
- },
- }),
- }})
- // ============================================
- // prevent nil pointer dereference
- // ============================================
- if diamClnt == nil {
- t.Fatal("Diameter client should not be nil")
- }
- if diamClnt.conn == nil {
- t.Fatal("Diameter connection should not be nil")
- }
- if ccr == nil {
- t.Fatal("The mesage to diameter should not be nil")
- }
- // ============================================
- if err := diamClnt.SendMessage(ccr); err != nil {
- t.Error(err)
- }
-
- time.Sleep(100 * time.Millisecond)
- diamClnt.ReceivedMessage(rplyTimeout)
-
- var cdrs []*engine.CDR
- args := &utils.RPCCDRsFilterWithAPIOpts{RPCCDRsFilter: &utils.RPCCDRsFilter{RunIDs: []string{utils.MetaRaw}, ToRs: []string{utils.MetaSMS}}}
- if err := apierRpc.Call(utils.CDRsV1GetCDRs, args, &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 != 1 {
- t.Errorf("Unexpected Usage CDR: %+v", cdrs[0])
- }
-}
-
-func testDiamItCCRMMS(t *testing.T) {
- ccr := diam.NewRequest(diam.CreditControl, 4, nil)
- ccr.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("TestDmtAgentSendCCRMMS"))
- ccr.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
- ccr.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- ccr.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
- ccr.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("mms@DiamItCCRMMS"))
- ccr.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(4))
- ccr.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(0))
- ccr.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 5, 11, 43, 10, 0, time.UTC)))
- ccr.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(avp.SubscriptionIDType, avp.Mbit, 0, datatype.Enumerated(0)),
- diam.NewAVP(avp.SubscriptionIDData, avp.Mbit, 0, datatype.UTF8String("1001")), // Subscription-Id-Data
- }})
- ccr.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(avp.SubscriptionIDType, avp.Mbit, 0, datatype.Enumerated(1)),
- diam.NewAVP(avp.SubscriptionIDData, avp.Mbit, 0, datatype.UTF8String("104502200011")), // Subscription-Id-Data
- }})
- ccr.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
- ccr.NewAVP(avp.RequestedAction, avp.Mbit, 0, datatype.Enumerated(0))
- ccr.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(avp.CCTime, avp.Mbit, 0, datatype.Unsigned32(1))}})
- ccr.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{ //
- AVP: []*diam.AVP{
- diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
- AVP: []*diam.AVP{
- diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("22509")), // Calling-Vlr-Number
- diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("4002")), // Called-Party-NP
- },
- }),
- diam.NewAVP(2000, avp.Mbit, 10415, &diam.GroupedAVP{ // SMS-Information
- AVP: []*diam.AVP{
- diam.NewAVP(886, avp.Mbit, 10415, &diam.GroupedAVP{ // Originator-Address
- AVP: []*diam.AVP{
- diam.NewAVP(899, avp.Mbit, 10415, datatype.Enumerated(1)), // Address-Type
- diam.NewAVP(897, avp.Mbit, 10415, datatype.UTF8String("1001")), // Address-Data
- }}),
- diam.NewAVP(1201, avp.Mbit, 10415, &diam.GroupedAVP{ // Recipient-Address
- AVP: []*diam.AVP{
- diam.NewAVP(899, avp.Mbit, 10415, datatype.Enumerated(1)), // Address-Type
- diam.NewAVP(897, avp.Mbit, 10415, datatype.UTF8String("1003")), // Address-Data
- }}),
- },
- }),
- }})
- // ============================================
- // prevent nil pointer dereference
- // ============================================
- if diamClnt == nil {
- t.Fatal("Diameter client should not be nil")
- }
- if diamClnt.conn == nil {
- t.Fatal("Diameter connection should not be nil")
- }
- if ccr == nil {
- t.Fatal("The mesage to diameter should not be nil")
- }
- // ============================================
- if err := diamClnt.SendMessage(ccr); err != nil {
- t.Error(err)
- }
-
- time.Sleep(100 * time.Millisecond)
- diamClnt.ReceivedMessage(rplyTimeout)
-
- var cdrs []*engine.CDR
- args := &utils.RPCCDRsFilterWithAPIOpts{RPCCDRsFilter: &utils.RPCCDRsFilter{RunIDs: []string{utils.MetaRaw}, ToRs: []string{utils.MetaMMS}}}
- if err := apierRpc.Call(utils.CDRsV1GetCDRs, args, &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 != 1 {
- t.Errorf("Unexpected Usage CDR: %+v", cdrs[0])
- }
-}
-
-func testDiamInitWithSessionDisconnect(t *testing.T) {
- attrSetBalance := utils.AttrSetBalance{Tenant: "cgrates.org",
- Account: "testDiamInitWithSessionDisconnect",
- BalanceType: utils.MetaVoice,
- Value: float64(time.Second),
- Balance: map[string]interface{}{
- utils.ID: "testDiamInitWithSessionDisconnect",
- utils.RatingSubject: "*zero1ms",
- },
- }
- var reply string
- if err := apierRpc.Call(utils.APIerSv2SetBalance, attrSetBalance, &reply); err != nil {
- t.Error(err)
- } else if reply != utils.OK {
- t.Errorf("Received: %s", reply)
- }
- sessID := "bb97be2b9f37c2be9614fff71c8b1d08bdisconnect"
- m := diam.NewRequest(diam.CreditControl, 4, nil)
- m.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String(sessID))
- m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("192.168.1.1"))
- m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- m.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
- m.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(1))
- m.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(1))
- m.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
- m.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- m.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("testSessionDisconnect"))
- m.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 4, 14, 42, 20, 0, time.UTC)))
- m.NewAVP(avp.UserName, avp.Mbit, 0, datatype.UTF8String("testDiamInitWithSessionDisconnect"))
- m.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(0)), // Subscription-Id-Type
- diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("testDiamInitWithSessionDisconnect")), // Subscription-Id-Data
- }})
- m.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
- m.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(300))}})
- m.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(0))}})
- m.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
- AVP: []*diam.AVP{
- diam.NewAVP(831, avp.Mbit, 10415, datatype.UTF8String("1001")), // Calling-Party-Address
- diam.NewAVP(832, avp.Mbit, 10415, datatype.UTF8String("1002")), // Called-Party-Address
- diam.NewAVP(20327, avp.Mbit, 2011, datatype.UTF8String("1002")), // Real-Called-Number
- diam.NewAVP(20339, avp.Mbit, 2011, datatype.Unsigned32(0)), // Charge-Flow-Type
- diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-Vlr-Number
- diam.NewAVP(20303, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-CellID-Or-SAI
- diam.NewAVP(20313, avp.Mbit, 2011, datatype.OctetString("")), // Bearer-Capability
- diam.NewAVP(20321, avp.Mbit, 2011, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08bdisconnect")), // Call-Reference-Number
- diam.NewAVP(20322, avp.Mbit, 2011, datatype.UTF8String("")), // MSC-Address
- diam.NewAVP(20324, avp.Mbit, 2011, datatype.Unsigned32(0)), // Time-Zone
- diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("")), // Called-Party-NP
- diam.NewAVP(20386, avp.Mbit, 2011, datatype.UTF8String("")), // SSP-Time
- },
- }),
- }})
- // ============================================
- // prevent nil pointer dereference
- // ============================================
- if diamClnt == nil {
- t.Fatal("Diameter client should not be nil")
- }
- if diamClnt.conn == nil {
- t.Fatal("Diameter connection should not be nil")
- }
- if m == nil {
- t.Fatal("The mesage to diameter should not be nil")
- }
- // ============================================
- if err := diamClnt.SendMessage(m); err != nil {
- t.Error(err)
- }
- msg := diamClnt.ReceivedMessage(rplyTimeout)
- if msg == nil {
- t.Fatal("No message returned")
- }
- // Result-Code
- eVal := "2001"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
- time.Sleep(2 * time.Second)
- msg = diamClnt.ReceivedMessage(rplyTimeout)
- if msg == nil {
- t.Fatal("No message returned")
- }
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Session-Id"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != sessID {
- t.Errorf("expecting: %s, received: <%s>", sessID, val)
- }
-}
-
-func testDiamItKillEngine(t *testing.T) {
- if err := engine.KillEngine(1000); err != nil {
- t.Error(err)
- }
-}
-
-func testDiamItRAR(t *testing.T) {
- if diamConfigDIR == "dispatchers/diamagent" {
- t.SkipNow()
- }
- // ============================================
- // prevent nil pointer dereference
- // ============================================
- if diamClnt == nil {
- t.Fatal("Diameter client should not be nil")
- }
- if diamClnt.conn == nil {
- t.Fatal("Diameter connection should not be nil")
- }
- // ============================================
- var wait sync.WaitGroup
- wait.Add(1)
- go func() {
- var reply string
- if err := apierRpc.Call(utils.SessionSv1ReAuthorize, &utils.SessionFilter{}, &reply); err != nil {
- t.Error(err)
- }
- wait.Done()
- }()
- rar := diamClnt.ReceivedMessage(rplyTimeout)
- if rar == nil {
- t.Fatal("No message returned")
- }
-
- raa := rar.Answer(2001)
- raa.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8"))
-
- if err := diamClnt.SendMessage(raa); err != nil {
- t.Error(err)
- }
-
- wait.Wait()
-
- m := diam.NewRequest(diam.CreditControl, 4, nil)
- m.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8"))
- m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("192.168.1.1"))
- m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- m.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
- m.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(2))
- m.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(1))
- m.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
- m.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- m.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("voice@DiamItCCRInit"))
- m.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 4, 14, 57, 20, 0, time.UTC)))
- m.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(0)), // Subscription-Id-Type
- diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("1006")), // Subscription-Id-Data
- }})
- m.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
- m.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(301))}})
- m.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(301))}})
- m.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
- AVP: []*diam.AVP{
- diam.NewAVP(831, avp.Mbit, 10415, datatype.UTF8String("1006")), // Calling-Party-Address
- diam.NewAVP(832, avp.Mbit, 10415, datatype.UTF8String("1002")), // Called-Party-Address
- diam.NewAVP(20327, avp.Mbit, 2011, datatype.UTF8String("1002")), // Real-Called-Number
- diam.NewAVP(20339, avp.Mbit, 2011, datatype.Unsigned32(0)), // Charge-Flow-Type
- diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-Vlr-Number
- diam.NewAVP(20303, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-CellID-Or-SAI
- diam.NewAVP(20313, avp.Mbit, 2011, datatype.OctetString("")), // Bearer-Capability
- diam.NewAVP(20321, avp.Mbit, 2011, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8")), // Call-Reference-Number
- diam.NewAVP(20322, avp.Mbit, 2011, datatype.UTF8String("")), // MSC-Address
- diam.NewAVP(20324, avp.Mbit, 2011, datatype.Unsigned32(0)), // Time-Zone
- diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("")), // Called-Party-NP
- diam.NewAVP(20386, avp.Mbit, 2011, datatype.UTF8String("")), // SSP-Time
- },
- }),
- }})
- if err := diamClnt.SendMessage(m); err != nil {
- t.Error(err)
- }
- msg := diamClnt.ReceivedMessage(rplyTimeout)
- if msg == nil {
- t.Fatal("No message returned")
- }
- // Result-Code
- eVal := "2001"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
- // Result-Code
- eVal = "301" // 5 mins of session
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Granted-Service-Unit", "CC-Time"},
- dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
-}
-
-func testDiamItDRR(t *testing.T) {
- if diamConfigDIR == "dispatchers/diamagent" {
- t.SkipNow()
- }
- // ============================================
- // prevent nil pointer dereference
- // ============================================
- if diamClnt == nil {
- t.Fatal("Diameter client should not be nil")
- }
- if diamClnt.conn == nil {
- t.Fatal("Diameter connection should not be nil")
- }
- // ============================================
- var wait sync.WaitGroup
- wait.Add(1)
- go func() {
- var reply string
- if err := apierRpc.Call(utils.SessionSv1DisconnectPeer, &utils.DPRArgs{
- OriginHost: "INTEGRATION_TESTS",
- OriginRealm: "cgrates.org",
- DisconnectCause: 1, // BUSY
- }, &reply); err != nil {
- t.Error(err)
- }
- wait.Done()
- }()
- drr := diamClnt.ReceivedMessage(rplyTimeout)
- if drr == nil {
- t.Fatal("No message returned")
- }
-
- dra := drr.Answer(2001)
- // dra.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("INTEGRATION_TESTS"))
- // dra.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
-
- if err := diamClnt.SendMessage(dra); err != nil {
- t.Error(err)
- }
-
- wait.Wait()
-
- eVal := "1"
- if avps, err := drr.FindAVPsWithPath([]interface{}{avp.DisconnectCause}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
-}
-
-func testDiamItTemplateErr(t *testing.T) {
- ccr := diam.NewRequest(diam.CreditControl, 4, nil)
- ccr.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("TestDmtAgentSendCCRError"))
- ccr.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
- ccr.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- ccr.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
- ccr.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("error@DiamItError"))
- ccr.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(4))
- ccr.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(0))
- ccr.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 5, 11, 43, 10, 0, time.UTC)))
- ccr.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(avp.SubscriptionIDType, avp.Mbit, 0, datatype.Enumerated(0)),
- diam.NewAVP(avp.SubscriptionIDData, avp.Mbit, 0, datatype.UTF8String("1001")), // Subscription-Id-Data
- }})
- ccr.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(avp.SubscriptionIDType, avp.Mbit, 0, datatype.Enumerated(1)),
- diam.NewAVP(avp.SubscriptionIDData, avp.Mbit, 0, datatype.UTF8String("104502200011")), // Subscription-Id-Data
- }})
- ccr.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
- ccr.NewAVP(avp.RequestedAction, avp.Mbit, 0, datatype.Enumerated(0))
- ccr.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(avp.CCTime, avp.Mbit, 0, datatype.Unsigned32(1))}})
- ccr.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{ //
- AVP: []*diam.AVP{
- diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
- AVP: []*diam.AVP{
- diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("22509")), // Calling-Vlr-Number
- diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("4002")), // Called-Party-NP
- },
- }),
- diam.NewAVP(2000, avp.Mbit, 10415, &diam.GroupedAVP{ // SMS-Information
- AVP: []*diam.AVP{
- diam.NewAVP(886, avp.Mbit, 10415, &diam.GroupedAVP{ // Originator-Address
- AVP: []*diam.AVP{
- diam.NewAVP(899, avp.Mbit, 10415, datatype.Enumerated(1)), // Address-Type
- diam.NewAVP(897, avp.Mbit, 10415, datatype.UTF8String("1001")), // Address-Data
- }}),
- diam.NewAVP(1201, avp.Mbit, 10415, &diam.GroupedAVP{ // Recipient-Address
- AVP: []*diam.AVP{
- diam.NewAVP(899, avp.Mbit, 10415, datatype.Enumerated(1)), // Address-Type
- diam.NewAVP(897, avp.Mbit, 10415, datatype.UTF8String("1003")), // Address-Data
- }}),
- },
- }),
- }})
- // ============================================
- // prevent nil pointer dereference
- // ============================================
- if diamClnt == nil {
- t.Fatal("Diameter client should not be nil")
- }
- if diamClnt.conn == nil {
- t.Fatal("Diameter connection should not be nil")
- }
- if ccr == nil {
- t.Fatal("The mesage to diameter should not be nil")
- }
- // ============================================
- if err := diamClnt.SendMessage(ccr); err != nil {
- t.Error(err)
- }
-
- time.Sleep(100 * time.Millisecond)
- msg := diamClnt.ReceivedMessage(rplyTimeout)
-
- if msg == nil {
- t.Fatal("Message should not be nil")
- }
- // Result-Code
- eVal := "5012" // error code diam.UnableToComply
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
-}
-
-func testDiamItEmulateTerminate(t *testing.T) {
- if diamConfigDIR == "dispatchers/diamagent" {
- t.SkipNow()
- }
- var result string
- //add the second charger
- chargerProfile := &apis.ChargerWithAPIOpts{
- ChargerProfile: &engine.ChargerProfile{
- Tenant: "cgrates.com",
- ID: "CustomCharger",
- RunID: "CustomCharger",
- AttributeIDs: []string{"*constant:*req.Category:custom_charger"},
- Weights: utils.DynamicWeights{
- {
- Weight: 20,
- }},
- },
- }
-
- if err := apierRpc.Call(utils.AdminSv1SetChargerProfile, chargerProfile, &result); err != nil {
- t.Error(err)
- } else if result != utils.OK {
- t.Error("Unexpected reply returned", result)
- }
- //add the second charger
- chargerProfile2 := &apis.ChargerWithAPIOpts{
- ChargerProfile: &engine.ChargerProfile{
- Tenant: "cgrates.com",
- ID: "Default",
- RunID: "*default",
- AttributeIDs: []string{"*none"},
- Weights: utils.DynamicWeights{
- {
- Weight: 20,
- }},
- },
- }
-
- if err := apierRpc.Call(utils.AdminSv1SetChargerProfile, chargerProfile2, &result); err != nil {
- t.Error(err)
- } else if result != utils.OK {
- t.Error("Unexpected reply returned", result)
- }
- //set the account
- attrSetBalance := utils.AttrSetBalance{
- Tenant: "cgrates.com",
- Account: "testDiamItEmulateTerminate",
- Value: float64(time.Hour),
- BalanceType: utils.MetaVoice,
- Balance: map[string]interface{}{
- utils.ID: "testDiamItEmulateTerminate",
- utils.Categories: "custom_charger",
- },
- }
- var reply string
- if err := apierRpc.Call(utils.APIerSv2SetBalance, attrSetBalance, &reply); err != nil {
- t.Error(err)
- } else if reply != utils.OK {
- t.Errorf("Received: %s", reply)
- }
- var acnt *engine.Account
- attrs := &utils.AttrGetAccount{Tenant: "cgrates.com", Account: "testDiamItEmulateTerminate"}
- if err := apierRpc.Call(utils.APIerSv2GetAccount, attrs, &acnt); err != nil {
- t.Error(err)
- } else if acnt.BalanceMap[utils.MetaVoice].GetTotalValue() != float64(time.Hour) {
- t.Errorf("Expected: %f, received: %f", float64(time.Hour), acnt.BalanceMap[utils.MetaVoice].GetTotalValue())
- }
-
- m := diam.NewRequest(diam.CreditControl, 4, nil)
- m.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8"))
- m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("192.168.1.1"))
- m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
- m.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
- m.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(1))
- m.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(0))
- m.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
- m.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.com"))
- m.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("voice@DiamItCCRInit"))
- m.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 4, 14, 42, 20, 0, time.UTC)))
- m.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(0)), // Subscription-Id-Type
- diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("testDiamItEmulateTerminate")), // Subscription-Id-Data
- }})
- m.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
- m.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(300))}})
- m.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(0))}})
- m.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{
- AVP: []*diam.AVP{
- diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
- AVP: []*diam.AVP{
- diam.NewAVP(831, avp.Mbit, 10415, datatype.UTF8String("1006")), // Calling-Party-Address
- diam.NewAVP(832, avp.Mbit, 10415, datatype.UTF8String("1002")), // Called-Party-Address
- diam.NewAVP(20327, avp.Mbit, 2011, datatype.UTF8String("1002")), // Real-Called-Number
- diam.NewAVP(20339, avp.Mbit, 2011, datatype.Unsigned32(0)), // Charge-Flow-Type
- diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-Vlr-Number
- diam.NewAVP(20303, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-CellID-Or-SAI
- diam.NewAVP(20313, avp.Mbit, 2011, datatype.OctetString("")), // Bearer-Capability
- diam.NewAVP(20321, avp.Mbit, 2011, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8")), // Call-Reference-Number
- diam.NewAVP(20322, avp.Mbit, 2011, datatype.UTF8String("")), // MSC-Address
- diam.NewAVP(20324, avp.Mbit, 2011, datatype.Unsigned32(0)), // Time-Zone
- diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("")), // Called-Party-NP
- diam.NewAVP(20386, avp.Mbit, 2011, datatype.UTF8String("")), // SSP-Time
- },
- }),
- }})
- // ============================================
- // prevent nil pointer dereference
- // ============================================
- if diamClnt == nil {
- t.Fatal("Diameter client should not be nil")
- }
- if diamClnt.conn == nil {
- t.Fatal("Diameter connection should not be nil")
- }
- if m == nil {
- t.Fatal("The mesage to diameter should not be nil")
- }
- // ============================================
- if err := diamClnt.SendMessage(m); err != nil {
- t.Error(err)
- }
- msg := diamClnt.ReceivedMessage(rplyTimeout)
- if msg == nil {
- t.Fatal("No message returned")
- }
- // Result-Code
- eVal := "2001"
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
- // Result-Code
- eVal = "0" // 0 from sessions
- if avps, err := msg.FindAVPsWithPath([]interface{}{"Granted-Service-Unit", "CC-Time"},
- dict.UndefinedVendorID); err != nil {
- t.Error(err)
- } else if len(avps) == 0 {
- t.Error("Missing AVP")
- } else if val, err := diamAVPAsString(avps[0]); err != nil {
- t.Error(err)
- } else if val != eVal {
- t.Errorf("expecting: %s, received: <%s>", eVal, val)
- }
-
- if err := apierRpc.Call(utils.APIerSv2GetAccount, attrs, &acnt); err != nil {
- t.Error(err)
- } else if acnt.BalanceMap[utils.MetaVoice].GetTotalValue() != float64(time.Hour) {
- t.Errorf("Expected: %f, received: %f", float64(time.Hour), acnt.BalanceMap[utils.MetaVoice].GetTotalValue())
- }
-}
+// import (
+// "flag"
+// "fmt"
+// "net/rpc"
+// "os/exec"
+// "path"
+// "strings"
+// "sync"
+// "testing"
+// "time"
+
+// "github.com/cgrates/birpc/context"
+// "github.com/cgrates/cgrates/apis"
+// "github.com/cgrates/cgrates/config"
+// "github.com/cgrates/cgrates/engine"
+// "github.com/cgrates/cgrates/utils"
+// "github.com/fiorix/go-diameter/v4/diam"
+// "github.com/fiorix/go-diameter/v4/diam/avp"
+// "github.com/fiorix/go-diameter/v4/diam/datatype"
+// "github.com/fiorix/go-diameter/v4/diam/dict"
+// )
+
+// var (
+// interations = flag.Int("iterations", 1, "Number of iterations to do for dry run simulation")
+// replyTimeout = flag.String("reply_timeout", "1s", "Maximum duration to wait for a reply")
+
+// daCfgPath, diamConfigDIR string
+// daCfg *config.CGRConfig
+// apierRpc *rpc.Client
+// diamClnt *DiameterClient
+
+// rplyTimeout time.Duration
+
+// isDispatcherActive bool
+
+// sTestsDiam = []func(t *testing.T){
+// testDiamItInitCfg,
+// testDiamItResetDataDb,
+// testDiamItStartEngine,
+// testDiamItConnectDiameterClient,
+// testDiamItApierRpcConn,
+// testDiamItTPFromFolder,
+// testDiamItDryRun,
+// testDiamItCCRInit,
+// testDiamItCCRUpdate,
+
+// testDiamItRAR,
+
+// testDiamItCCRTerminate,
+// testDiamItCCRSMS,
+// testDiamItCCRMMS,
+
+// testDiamItEmulateTerminate,
+
+// testDiamItTemplateErr,
+// testDiamItCCRInitWithForceDuration,
+
+// testDiamItDRR,
+
+// testDiamItKillEngine,
+// }
+// )
+
+// // Test start here
+// func TestDiamItTcp(t *testing.T) {
+// switch *dbType {
+// case utils.MetaInternal:
+// diamConfigDIR = "diamagent_internal"
+// case utils.MetaMySQL:
+// diamConfigDIR = "diamagent_mysql"
+// case utils.MetaMongo:
+// diamConfigDIR = "diamagent_mongo"
+// case utils.MetaPostgres:
+// t.SkipNow()
+// default:
+// t.Fatal("Unknown Database type")
+// }
+// for _, stest := range sTestsDiam {
+// t.Run(diamConfigDIR, stest)
+// }
+// }
+
+// func TestDiamItDispatcher(t *testing.T) {
+// if *encoding == utils.MetaGOB {
+// t.SkipNow()
+// return
+// }
+// testDiamItResetAllDB(t)
+// isDispatcherActive = true
+// engine.StartEngine(path.Join(*dataDir, "conf", "samples", "dispatchers", "all"), 200)
+// engine.StartEngine(path.Join(*dataDir, "conf", "samples", "dispatchers", "all2"), 200)
+// diamConfigDIR = "dispatchers/diamagent"
+// for _, stest := range sTestsDiam {
+// t.Run(diamConfigDIR, stest)
+// }
+// isDispatcherActive = false
+// }
+
+// func TestDiamItSctp(t *testing.T) {
+// switch *dbType {
+// case utils.MetaInternal:
+// diamConfigDIR = "diamsctpagent_internal"
+// case utils.MetaMySQL:
+// diamConfigDIR = "diamsctpagent_mysql"
+// case utils.MetaMongo:
+// diamConfigDIR = "diamsctpagent_mongo"
+// case utils.MetaPostgres:
+// t.SkipNow()
+// default:
+// t.Fatal("Unknown Database type")
+// }
+// for _, stest := range sTestsDiam {
+// t.Run(diamConfigDIR, stest)
+// }
+// }
+
+// func TestDiamItBiRPC(t *testing.T) {
+// switch *dbType {
+// case utils.MetaInternal:
+// diamConfigDIR = "diamagent_internal_%sbirpc"
+// case utils.MetaMySQL:
+// diamConfigDIR = "diamagent_mysql_%sbirpc"
+// case utils.MetaMongo:
+// diamConfigDIR = "diamagent_mongo_%sbirpc"
+// case utils.MetaPostgres:
+// t.SkipNow()
+// default:
+// t.Fatal("Unknown Database type")
+// }
+// diamConfigDIR = fmt.Sprintf(diamConfigDIR, strings.TrimPrefix(*encoding, utils.Meta))
+// for _, stest := range sTestsDiam {
+// t.Run(diamConfigDIR, stest)
+// }
+// }
+
+// func TestDiamItMaxConn(t *testing.T) {
+// switch *dbType {
+// case utils.MetaInternal:
+// diamConfigDIR = "diamagentmaxconn_internal"
+// case utils.MetaMySQL:
+// diamConfigDIR = "diamagentmaxconn_mysql"
+// case utils.MetaMongo:
+// diamConfigDIR = "diamagentmaxconn_mongo"
+// case utils.MetaPostgres:
+// t.SkipNow()
+// default:
+// t.Fatal("Unknown Database type")
+// }
+// for _, stest := range sTestsDiam[:7] {
+// t.Run(diamConfigDIR, stest)
+// }
+// t.Run(diamConfigDIR, testDiamItDryRunMaxConn)
+// t.Run(diamConfigDIR, testDiamItKillEngine)
+// }
+
+// func TestDiamItSessionDisconnect(t *testing.T) {
+// switch *dbType {
+// case utils.MetaInternal:
+// diamConfigDIR = "diamagent_internal"
+// case utils.MetaMySQL:
+// diamConfigDIR = "diamagent_mysql"
+// case utils.MetaMongo:
+// diamConfigDIR = "diamagent_mongo"
+// case utils.MetaPostgres:
+// t.SkipNow()
+// default:
+// t.Fatal("Unknown Database type")
+// }
+
+// for _, stest := range sTestsDiam[:7] {
+// t.Run(diamConfigDIR, stest)
+// }
+// t.Run(diamConfigDIR, testDiamInitWithSessionDisconnect)
+// t.Run(diamConfigDIR, testDiamItKillEngine)
+// }
+
+// func testDiamItInitCfg(t *testing.T) {
+// daCfgPath = path.Join(*dataDir, "conf", "samples", diamConfigDIR)
+// // Init config first
+// var err error
+// daCfg, err = config.NewCGRConfigFromPath(context.Background(), daCfgPath)
+// if err != nil {
+// t.Fatal(err)
+// }
+// rplyTimeout, _ = utils.ParseDurationWithSecs(*replyTimeout)
+// if isDispatcherActive {
+// daCfg.ListenCfg().RPCJSONListen = ":6012"
+// }
+// }
+
+// func testDiamItResetAllDB(t *testing.T) {
+// cfgPath1 := path.Join(*dataDir, "conf", "samples", "dispatchers", "all")
+// allCfg, err := config.NewCGRConfigFromPath(context.Background(), cfgPath1)
+// if err != nil {
+// t.Fatal(err)
+// }
+// if err := engine.InitDataDB(allCfg); err != nil {
+// t.Fatal(err)
+// }
+
+// cfgPath2 := path.Join(*dataDir, "conf", "samples", "dispatchers", "all2")
+// allCfg2, err := config.NewCGRConfigFromPath(context.Background(), cfgPath2)
+// if err != nil {
+// t.Fatal(err)
+// }
+// if err := engine.InitDataDB(allCfg2); err != nil {
+// t.Fatal(err)
+// }
+
+// }
+
+// // Remove data in both rating and accounting db
+// func testDiamItResetDataDb(t *testing.T) {
+// if err := engine.InitDataDB(daCfg); err != nil {
+// t.Fatal(err)
+// }
+// }
+
+// // Start CGR Engine
+// func testDiamItStartEngine(t *testing.T) {
+// if _, err := engine.StartEngine(daCfgPath, 500); err != nil {
+// t.Fatal(err)
+// }
+// }
+
+// func testDiamItConnectDiameterClient(t *testing.T) {
+// diamClnt, err = NewDiameterClient(daCfg.DiameterAgentCfg().Listen, "INTEGRATION_TESTS",
+// daCfg.DiameterAgentCfg().OriginRealm, daCfg.DiameterAgentCfg().VendorID,
+// daCfg.DiameterAgentCfg().ProductName, utils.DiameterFirmwareRevision,
+// daCfg.DiameterAgentCfg().DictionariesPath, daCfg.DiameterAgentCfg().ListenNet)
+// if err != nil {
+// t.Fatal(err)
+// }
+// }
+
+// // Connect rpc client to rater
+// func testDiamItApierRpcConn(t *testing.T) {
+// var err error
+// apierRpc, err = newRPCClient(daCfg.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 testDiamItTPFromFolder(t *testing.T) {
+// attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "tutorial")}
+// var loadInst utils.LoadInstance
+// if err := apierRpc.Call(utils.APIerSv1LoadTariffPlanFromFolder, attrs, &loadInst); err != nil {
+// t.Error(err)
+// }
+// if isDispatcherActive {
+// testDiamItTPLoadData(t)
+// }
+// time.Sleep(100 * time.Millisecond) // Give time for scheduler to execute topups
+// }
+
+// func testDiamItTPLoadData(t *testing.T) {
+// wchan := make(chan struct{}, 1)
+// go func() {
+// loaderPath, err := exec.LookPath("cgr-loader")
+// if err != nil {
+// t.Error(err)
+// }
+// loader := exec.Command(loaderPath, "-config_path", daCfgPath, "-path", path.Join(*dataDir, "tariffplans", "dispatchers"))
+
+// if err := loader.Start(); err != nil {
+// t.Error(err)
+// }
+// loader.Wait()
+// wchan <- struct{}{}
+// }()
+// select {
+// case <-wchan:
+// case <-time.After(time.Second):
+// t.Errorf("cgr-loader failed: ")
+// }
+// }
+
+// func testDiamItDryRun(t *testing.T) {
+// ccr := diam.NewRequest(diam.CreditControl, 4, nil)
+// ccr.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("cgrates;1451911932;00082"))
+// ccr.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
+// ccr.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// ccr.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// ccr.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
+// ccr.NewAVP(avp.UserName, avp.Mbit, 0, datatype.UTF8String("CGR-DA"))
+// ccr.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
+// ccr.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("TestDiamItDryRun")) // Match specific DryRun profile
+// ccr.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(1))
+// ccr.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(1))
+// ccr.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2016, 1, 5, 11, 30, 10, 0, time.UTC)))
+// ccr.NewAVP(avp.TerminationCause, avp.Mbit, 0, datatype.Enumerated(1))
+// ccr.NewAVP(443, avp.Mbit, 0, &diam.GroupedAVP{ // Subscription-Id
+// AVP: []*diam.AVP{
+// diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(0)), // Subscription-Id-Type
+// diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("1001")), // Subscription-Id-Data
+// }})
+// ccr.NewAVP(443, avp.Mbit, 0, &diam.GroupedAVP{ // Subscription-Id
+// AVP: []*diam.AVP{
+// diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(1)), // Subscription-Id-Type
+// diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("208123456789")), // Subscription-Id-Data
+// }})
+// ccr.NewAVP(439, avp.Mbit, 0, datatype.Unsigned32(0)) // Service-Identifier
+// ccr.NewAVP(437, avp.Mbit, 0, &diam.GroupedAVP{ // Requested-Service-Unit
+// AVP: []*diam.AVP{
+// diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(300)), // CC-Time
+// }})
+// ccr.NewAVP(873, avp.Mbit|avp.Vbit, 10415, &diam.GroupedAVP{ // Service-information
+// AVP: []*diam.AVP{
+// diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
+// AVP: []*diam.AVP{
+// diam.NewAVP(20336, avp.Mbit, 2011, datatype.UTF8String("1001")), // CallingPartyAdress
+// diam.NewAVP(20337, avp.Mbit, 2011, datatype.UTF8String("1002")), // CalledPartyAdress
+// diam.NewAVP(20339, avp.Mbit, 2011, datatype.Unsigned32(0)), // ChargeFlowType
+// diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("33609004940")), // CallingVlrNumber
+// diam.NewAVP(20303, avp.Mbit, 2011, datatype.UTF8String("208104941749984")), // CallingCellID
+// diam.NewAVP(20313, avp.Mbit, 2011, datatype.OctetString("0x8090a3")), // BearerCapability
+// diam.NewAVP(20321, avp.Mbit, 2011, datatype.OctetString("0x401c4132ed665")), // CallreferenceNumber
+// diam.NewAVP(20322, avp.Mbit, 2011, datatype.UTF8String("33609004940")), // MSCAddress
+// diam.NewAVP(20386, avp.Mbit, 2011, datatype.UTF8String("20160501010101")), // SSPTime
+// diam.NewAVP(20938, avp.Mbit, 2011, datatype.OctetString("0x00000001")), // HighLayerCharacteristics
+// diam.NewAVP(20324, avp.Mbit, 2011, datatype.Integer32(8)), // Time-Zone
+// },
+// }),
+// }})
+// ccr.NewAVP(avp.MultipleServicesCreditControl, avp.Mbit, 0, &diam.GroupedAVP{ // Multiple-Services-Credit-Control
+// AVP: []*diam.AVP{
+// diam.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{ // Used-Service-Unit
+// AVP: []*diam.AVP{
+// diam.NewAVP(avp.CCTotalOctets, avp.Mbit, 0, datatype.Unsigned64(7640)), // CC-Total-Octets
+// diam.NewAVP(avp.CCInputOctets, avp.Mbit, 0, datatype.Unsigned64(5337)), // CC-Input-Octets
+// diam.NewAVP(avp.CCOutputOctets, avp.Mbit, 0, datatype.Unsigned64(2303)), // CC-Output-Octets
+// },
+// }),
+// diam.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(65000)), // Service-Identifier
+// diam.NewAVP(avp.RatingGroup, avp.Mbit, 0, datatype.Unsigned32(1)), // Rating-Group
+// diam.NewAVP(avp.ReportingReason, avp.Mbit, 0, datatype.Enumerated(2)), // Reporting-Reason
+// },
+// })
+// ccr.NewAVP(avp.MultipleServicesCreditControl, avp.Mbit, 0, &diam.GroupedAVP{ // Multiple-Services-Credit-Control
+// AVP: []*diam.AVP{
+// diam.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{ // Used-Service-Unit
+// AVP: []*diam.AVP{
+// diam.NewAVP(avp.CCTotalOctets, avp.Mbit, 0, datatype.Unsigned64(3000)), // CC-Total-Octets
+// diam.NewAVP(avp.CCInputOctets, avp.Mbit, 0, datatype.Unsigned64(2000)), // CC-Input-Octets
+// diam.NewAVP(avp.CCOutputOctets, avp.Mbit, 0, datatype.Unsigned64(1000)), // CC-Output-Octets
+// },
+// }),
+// diam.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(65000)), // Service-Identifier
+// diam.NewAVP(avp.RatingGroup, avp.Mbit, 0, datatype.Unsigned32(2)), // Rating-Group
+// diam.NewAVP(avp.ReportingReason, avp.Mbit, 0, datatype.Enumerated(2)), // Reporting-Reason
+// },
+// })
+// if _, err := ccr.NewAVP("Framed-IP-Address", avp.Mbit, 0, datatype.UTF8String("10.228.16.4")); err != nil {
+// t.Error(err)
+// }
+// for i := 0; i < *interations; i++ {
+// // ============================================
+// // prevent nil pointer dereference
+// // ============================================
+// if diamClnt == nil {
+// t.Fatal("Diameter client should not be nil")
+// }
+// if diamClnt.conn == nil {
+// t.Fatal("Diameter connection should not be nil")
+// }
+// if ccr == nil {
+// t.Fatal("The mesage to diameter should not be nil")
+// }
+// // ============================================
+
+// if err := diamClnt.SendMessage(ccr); err != nil {
+// t.Error(err)
+// }
+// msg := diamClnt.ReceivedMessage(rplyTimeout)
+// if msg == nil {
+// t.Fatal("No message returned")
+// }
+// // Result-Code
+// eVal := "2002"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+
+// eVal = "cgrates;1451911932;00082"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Session-Id"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// eVal = "CGR-DA"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Origin-Host"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// eVal = "cgrates.org"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Origin-Realm"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// eVal = "4"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Auth-Application-Id"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// eVal = "1"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"CC-Request-Type"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// eVal = "1"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"CC-Request-Number"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Multiple-Services-Credit-Control", "Rating-Group"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) != 2 {
+// t.Errorf("Unexpected number of Multiple-Services-Credit-Control.Rating-Group : %d", len(avps))
+// } else {
+// if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != "1" {
+// t.Errorf("expecting: 1, received: <%s>", val)
+// }
+// if val, err := diamAVPAsString(avps[1]); err != nil {
+// t.Error(err)
+// } else if val != "2" {
+// t.Errorf("expecting: 2, received: <%s>", val)
+// }
+// }
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Multiple-Services-Credit-Control", "Used-Service-Unit", "CC-Total-Octets"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) != 2 {
+// t.Errorf("Unexpected number of Multiple-Services-Credit-Control.Used-Service-Unit.CC-Total-Octets : %d", len(avps))
+// } else {
+// if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != "7640" {
+// t.Errorf("expecting: 7640, received: <%s>", val)
+// }
+// if val, err := diamAVPAsString(avps[1]); err != nil {
+// t.Error(err)
+// } else if val != "3000" {
+// t.Errorf("expecting: 3000, received: <%s>", val)
+// }
+// }
+// eVal = "6" // sum of items
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Granted-Service-Unit", "CC-Time"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// }
+// }
+
+// func testDiamItDryRunMaxConn(t *testing.T) {
+// ccr := diam.NewRequest(diam.CreditControl, 4, nil)
+// ccr.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("cgrates;1451911932;00082"))
+// ccr.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
+// ccr.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// ccr.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// ccr.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
+// ccr.NewAVP(avp.UserName, avp.Mbit, 0, datatype.UTF8String("CGR-DA"))
+// ccr.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
+// ccr.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("TestDiamItDryRun")) // Match specific DryRun profile
+// ccr.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(1))
+// ccr.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(1))
+// ccr.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2016, 1, 5, 11, 30, 10, 0, time.UTC)))
+// ccr.NewAVP(avp.TerminationCause, avp.Mbit, 0, datatype.Enumerated(1))
+// if _, err := ccr.NewAVP("Framed-IP-Address", avp.Mbit, 0, datatype.UTF8String("10.228.16.4")); err != nil {
+// t.Error(err)
+// }
+// for i := 0; i < *interations; i++ {
+// if err := diamClnt.SendMessage(ccr); err != nil {
+// t.Error(err)
+// }
+// msg := diamClnt.ReceivedMessage(rplyTimeout)
+// if msg == nil {
+// t.Fatal("No message returned")
+// }
+// // Result-Code
+// eVal := "5012"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// eVal = "cgrates;1451911932;00082"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Session-Id"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// eVal = "CGR-DA"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Origin-Host"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// eVal = "cgrates.org"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Origin-Realm"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// }
+// }
+
+// func testDiamItCCRInit(t *testing.T) {
+// m := diam.NewRequest(diam.CreditControl, 4, nil)
+// m.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8"))
+// m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("192.168.1.1"))
+// m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// m.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
+// m.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(1))
+// m.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(0))
+// m.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
+// m.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// m.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("voice@DiamItCCRInit"))
+// m.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 4, 14, 42, 20, 0, time.UTC)))
+// m.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(0)), // Subscription-Id-Type
+// diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("1006")), // Subscription-Id-Data
+// }})
+// m.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
+// m.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(300))}})
+// m.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(0))}})
+// m.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
+// AVP: []*diam.AVP{
+// diam.NewAVP(831, avp.Mbit, 10415, datatype.UTF8String("1006")), // Calling-Party-Address
+// diam.NewAVP(832, avp.Mbit, 10415, datatype.UTF8String("1002")), // Called-Party-Address
+// diam.NewAVP(20327, avp.Mbit, 2011, datatype.UTF8String("1002")), // Real-Called-Number
+// diam.NewAVP(20339, avp.Mbit, 2011, datatype.Unsigned32(0)), // Charge-Flow-Type
+// diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-Vlr-Number
+// diam.NewAVP(20303, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-CellID-Or-SAI
+// diam.NewAVP(20313, avp.Mbit, 2011, datatype.OctetString("")), // Bearer-Capability
+// diam.NewAVP(20321, avp.Mbit, 2011, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8")), // Call-Reference-Number
+// diam.NewAVP(20322, avp.Mbit, 2011, datatype.UTF8String("")), // MSC-Address
+// diam.NewAVP(20324, avp.Mbit, 2011, datatype.Unsigned32(0)), // Time-Zone
+// diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("")), // Called-Party-NP
+// diam.NewAVP(20386, avp.Mbit, 2011, datatype.UTF8String("")), // SSP-Time
+// },
+// }),
+// }})
+// // ============================================
+// // prevent nil pointer dereference
+// // ============================================
+// if diamClnt == nil {
+// t.Fatal("Diameter client should not be nil")
+// }
+// if diamClnt.conn == nil {
+// t.Fatal("Diameter connection should not be nil")
+// }
+// if m == nil {
+// t.Fatal("The mesage to diameter should not be nil")
+// }
+// // ============================================
+// if err := diamClnt.SendMessage(m); err != nil {
+// t.Error(err)
+// }
+// msg := diamClnt.ReceivedMessage(rplyTimeout)
+// if msg == nil {
+// t.Fatal("No message returned")
+// }
+// // Result-Code
+// eVal := "2001"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// // Result-Code
+// eVal = "300" // 5 mins of session
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Granted-Service-Unit", "CC-Time"},
+// dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// }
+
+// func testDiamItCCRInitWithForceDuration(t *testing.T) {
+// m := diam.NewRequest(diam.CreditControl, 4, nil)
+// m.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbfx1"))
+// m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("192.168.1.1"))
+// m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// m.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
+// m.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(1))
+// m.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(0))
+// m.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
+// m.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// m.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("forceDurationVoice@DiamItCCRInit"))
+// m.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 4, 14, 42, 20, 0, time.UTC)))
+// m.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(0)), // Subscription-Id-Type
+// diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("1006")), // Subscription-Id-Data
+// }})
+// m.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
+// m.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(3000000000))}})
+// m.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(0))}})
+// m.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
+// AVP: []*diam.AVP{
+// diam.NewAVP(831, avp.Mbit, 10415, datatype.UTF8String("1006")), // Calling-Party-Address
+// diam.NewAVP(832, avp.Mbit, 10415, datatype.UTF8String("1002")), // Called-Party-Address
+// diam.NewAVP(20327, avp.Mbit, 2011, datatype.UTF8String("1002")), // Real-Called-Number
+// diam.NewAVP(20339, avp.Mbit, 2011, datatype.Unsigned32(0)), // Charge-Flow-Type
+// diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-Vlr-Number
+// diam.NewAVP(20303, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-CellID-Or-SAI
+// diam.NewAVP(20313, avp.Mbit, 2011, datatype.OctetString("")), // Bearer-Capability
+// diam.NewAVP(20321, avp.Mbit, 2011, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8")), // Call-Reference-Number
+// diam.NewAVP(20322, avp.Mbit, 2011, datatype.UTF8String("")), // MSC-Address
+// diam.NewAVP(20324, avp.Mbit, 2011, datatype.Unsigned32(0)), // Time-Zone
+// diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("")), // Called-Party-NP
+// diam.NewAVP(20386, avp.Mbit, 2011, datatype.UTF8String("")), // SSP-Time
+// },
+// }),
+// }})
+// // ============================================
+// // prevent nil pointer dereference
+// // ============================================
+// if diamClnt == nil {
+// t.Fatal("Diameter client should not be nil")
+// }
+// if diamClnt.conn == nil {
+// t.Fatal("Diameter connection should not be nil")
+// }
+// if m == nil {
+// t.Fatal("The mesage to diameter should not be nil")
+// }
+// // ============================================
+// if err := diamClnt.SendMessage(m); err != nil {
+// t.Error(err)
+// }
+// msg := diamClnt.ReceivedMessage(rplyTimeout)
+// if msg == nil {
+// t.Fatal("No message returned")
+// }
+// // Result-Code
+// eVal := "5030"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+
+// }
+
+// func testDiamItCCRUpdate(t *testing.T) {
+// m := diam.NewRequest(diam.CreditControl, 4, nil)
+// m.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8"))
+// m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("192.168.1.1"))
+// m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// m.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
+// m.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(2))
+// m.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(1))
+// m.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
+// m.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// m.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("voice@DiamItCCRInit"))
+// m.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 4, 14, 57, 20, 0, time.UTC)))
+// m.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(0)), // Subscription-Id-Type
+// diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("1006")), // Subscription-Id-Data
+// }})
+// m.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
+// m.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(300))}})
+// m.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(300))}})
+// m.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
+// AVP: []*diam.AVP{
+// diam.NewAVP(831, avp.Mbit, 10415, datatype.UTF8String("1006")), // Calling-Party-Address
+// diam.NewAVP(832, avp.Mbit, 10415, datatype.UTF8String("1002")), // Called-Party-Address
+// diam.NewAVP(20327, avp.Mbit, 2011, datatype.UTF8String("1002")), // Real-Called-Number
+// diam.NewAVP(20339, avp.Mbit, 2011, datatype.Unsigned32(0)), // Charge-Flow-Type
+// diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-Vlr-Number
+// diam.NewAVP(20303, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-CellID-Or-SAI
+// diam.NewAVP(20313, avp.Mbit, 2011, datatype.OctetString("")), // Bearer-Capability
+// diam.NewAVP(20321, avp.Mbit, 2011, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8")), // Call-Reference-Number
+// diam.NewAVP(20322, avp.Mbit, 2011, datatype.UTF8String("")), // MSC-Address
+// diam.NewAVP(20324, avp.Mbit, 2011, datatype.Unsigned32(0)), // Time-Zone
+// diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("")), // Called-Party-NP
+// diam.NewAVP(20386, avp.Mbit, 2011, datatype.UTF8String("")), // SSP-Time
+// },
+// }),
+// }})
+// // ============================================
+// // prevent nil pointer dereference
+// // ============================================
+// if diamClnt == nil {
+// t.Fatal("Diameter client should not be nil")
+// }
+// if diamClnt.conn == nil {
+// t.Fatal("Diameter connection should not be nil")
+// }
+// if m == nil {
+// t.Fatal("The mesage to diameter should not be nil")
+// }
+// // ============================================
+// if err := diamClnt.SendMessage(m); err != nil {
+// t.Error(err)
+// }
+// msg := diamClnt.ReceivedMessage(rplyTimeout)
+// if msg == nil {
+// t.Fatal("No message returned")
+// }
+// // Result-Code
+// eVal := "2001"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// // Result-Code
+// eVal = "300" // 5 mins of session
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Granted-Service-Unit", "CC-Time"},
+// dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// }
+
+// func testDiamItCCRTerminate(t *testing.T) {
+// m := diam.NewRequest(diam.CreditControl, 4, nil)
+// m.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8"))
+// m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("192.168.1.1"))
+// m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// m.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
+// m.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(3))
+// m.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(2))
+// m.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
+// m.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// m.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("voice@DiamItCCRInit"))
+// m.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 4, 15, 12, 20, 0, time.UTC)))
+// m.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(0)), // Subscription-Id-Type
+// diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("1006")), // Subscription-Id-Data
+// }})
+// m.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
+// m.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(0))}})
+// m.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(250))}})
+// m.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
+// AVP: []*diam.AVP{
+// diam.NewAVP(831, avp.Mbit, 10415, datatype.UTF8String("1006")), // Calling-Party-Address
+// diam.NewAVP(832, avp.Mbit, 10415, datatype.UTF8String("1002")), // Called-Party-Address
+// diam.NewAVP(20327, avp.Mbit, 2011, datatype.UTF8String("1002")), // Real-Called-Number
+// diam.NewAVP(20339, avp.Mbit, 2011, datatype.Unsigned32(0)), // Charge-Flow-Type
+// diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-Vlr-Number
+// diam.NewAVP(20303, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-CellID-Or-SAI
+// diam.NewAVP(20313, avp.Mbit, 2011, datatype.OctetString("")), // Bearer-Capability
+// diam.NewAVP(20321, avp.Mbit, 2011, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8")), // Call-Reference-Number
+// diam.NewAVP(20322, avp.Mbit, 2011, datatype.UTF8String("")), // MSC-Address
+// diam.NewAVP(20324, avp.Mbit, 2011, datatype.Unsigned32(0)), // Time-Zone
+// diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("")), // Called-Party-NP
+// diam.NewAVP(20386, avp.Mbit, 2011, datatype.UTF8String("")), // SSP-Time
+// },
+// }),
+// }})
+// // ============================================
+// // prevent nil pointer dereference
+// // ============================================
+// if diamClnt == nil {
+// t.Fatal("Diameter client should not be nil")
+// }
+// if diamClnt.conn == nil {
+// t.Fatal("Diameter connection should not be nil")
+// }
+// if m == nil {
+// t.Fatal("The mesage to diameter should not be nil")
+// }
+// // ============================================
+// if err := diamClnt.SendMessage(m); err != nil {
+// t.Error(err)
+// }
+// msg := diamClnt.ReceivedMessage(rplyTimeout)
+// if msg == nil {
+// t.Fatal("No message returned")
+// }
+// // Result-Code
+// eVal := "2001"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// time.Sleep(time.Duration(*waitRater) * time.Millisecond)
+// var cdrs []*engine.CDR
+// args := utils.RPCCDRsFilterWithAPIOpts{RPCCDRsFilter: &utils.RPCCDRsFilter{RunIDs: []string{utils.MetaRaw}}}
+// if err := apierRpc.Call(utils.CDRsV1GetCDRs, &args, &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 != 550*time.Second {
+// t.Errorf("Unexpected Usage CDR: %+v", cdrs[0])
+// }
+// // in case of sctp we get OriginHost ip1/ip2/ip3/...
+// if !strings.Contains(cdrs[0].OriginHost, "127.0.0.1") {
+// t.Errorf("Unexpected OriginHost CDR: %+v", cdrs[0])
+// }
+// }
+// }
+
+// func testDiamItCCRSMS(t *testing.T) {
+// ccr := diam.NewRequest(diam.CreditControl, 4, nil)
+// ccr.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("TestDmtAgentSendCCRSMS"))
+// ccr.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
+// ccr.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// ccr.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
+// ccr.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("message@DiamItCCRSMS"))
+// ccr.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(4))
+// ccr.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(0))
+// ccr.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 5, 11, 43, 10, 0, time.UTC)))
+// ccr.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(avp.SubscriptionIDType, avp.Mbit, 0, datatype.Enumerated(0)),
+// diam.NewAVP(avp.SubscriptionIDData, avp.Mbit, 0, datatype.UTF8String("1001")), // Subscription-Id-Data
+// }})
+// ccr.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(avp.SubscriptionIDType, avp.Mbit, 0, datatype.Enumerated(1)),
+// diam.NewAVP(avp.SubscriptionIDData, avp.Mbit, 0, datatype.UTF8String("104502200011")), // Subscription-Id-Data
+// }})
+// ccr.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
+// ccr.NewAVP(avp.RequestedAction, avp.Mbit, 0, datatype.Enumerated(0))
+// ccr.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(avp.CCTime, avp.Mbit, 0, datatype.Unsigned32(1))}})
+// ccr.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{ //
+// AVP: []*diam.AVP{
+// diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
+// AVP: []*diam.AVP{
+// diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("22509")), // Calling-Vlr-Number
+// diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("4002")), // Called-Party-NP
+// },
+// }),
+// diam.NewAVP(2000, avp.Mbit, 10415, &diam.GroupedAVP{ // SMS-Information
+// AVP: []*diam.AVP{
+// diam.NewAVP(886, avp.Mbit, 10415, &diam.GroupedAVP{ // Originator-Address
+// AVP: []*diam.AVP{
+// diam.NewAVP(899, avp.Mbit, 10415, datatype.Enumerated(1)), // Address-Type
+// diam.NewAVP(897, avp.Mbit, 10415, datatype.UTF8String("1001")), // Address-Data
+// }}),
+// diam.NewAVP(1201, avp.Mbit, 10415, &diam.GroupedAVP{ // Recipient-Address
+// AVP: []*diam.AVP{
+// diam.NewAVP(899, avp.Mbit, 10415, datatype.Enumerated(1)), // Address-Type
+// diam.NewAVP(897, avp.Mbit, 10415, datatype.UTF8String("1003")), // Address-Data
+// }}),
+// },
+// }),
+// }})
+// // ============================================
+// // prevent nil pointer dereference
+// // ============================================
+// if diamClnt == nil {
+// t.Fatal("Diameter client should not be nil")
+// }
+// if diamClnt.conn == nil {
+// t.Fatal("Diameter connection should not be nil")
+// }
+// if ccr == nil {
+// t.Fatal("The mesage to diameter should not be nil")
+// }
+// // ============================================
+// if err := diamClnt.SendMessage(ccr); err != nil {
+// t.Error(err)
+// }
+
+// time.Sleep(100 * time.Millisecond)
+// diamClnt.ReceivedMessage(rplyTimeout)
+
+// var cdrs []*engine.CDR
+// args := &utils.RPCCDRsFilterWithAPIOpts{RPCCDRsFilter: &utils.RPCCDRsFilter{RunIDs: []string{utils.MetaRaw}, ToRs: []string{utils.MetaSMS}}}
+// if err := apierRpc.Call(utils.CDRsV1GetCDRs, args, &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 != 1 {
+// t.Errorf("Unexpected Usage CDR: %+v", cdrs[0])
+// }
+// }
+
+// func testDiamItCCRMMS(t *testing.T) {
+// ccr := diam.NewRequest(diam.CreditControl, 4, nil)
+// ccr.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("TestDmtAgentSendCCRMMS"))
+// ccr.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
+// ccr.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// ccr.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
+// ccr.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("mms@DiamItCCRMMS"))
+// ccr.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(4))
+// ccr.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(0))
+// ccr.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 5, 11, 43, 10, 0, time.UTC)))
+// ccr.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(avp.SubscriptionIDType, avp.Mbit, 0, datatype.Enumerated(0)),
+// diam.NewAVP(avp.SubscriptionIDData, avp.Mbit, 0, datatype.UTF8String("1001")), // Subscription-Id-Data
+// }})
+// ccr.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(avp.SubscriptionIDType, avp.Mbit, 0, datatype.Enumerated(1)),
+// diam.NewAVP(avp.SubscriptionIDData, avp.Mbit, 0, datatype.UTF8String("104502200011")), // Subscription-Id-Data
+// }})
+// ccr.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
+// ccr.NewAVP(avp.RequestedAction, avp.Mbit, 0, datatype.Enumerated(0))
+// ccr.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(avp.CCTime, avp.Mbit, 0, datatype.Unsigned32(1))}})
+// ccr.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{ //
+// AVP: []*diam.AVP{
+// diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
+// AVP: []*diam.AVP{
+// diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("22509")), // Calling-Vlr-Number
+// diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("4002")), // Called-Party-NP
+// },
+// }),
+// diam.NewAVP(2000, avp.Mbit, 10415, &diam.GroupedAVP{ // SMS-Information
+// AVP: []*diam.AVP{
+// diam.NewAVP(886, avp.Mbit, 10415, &diam.GroupedAVP{ // Originator-Address
+// AVP: []*diam.AVP{
+// diam.NewAVP(899, avp.Mbit, 10415, datatype.Enumerated(1)), // Address-Type
+// diam.NewAVP(897, avp.Mbit, 10415, datatype.UTF8String("1001")), // Address-Data
+// }}),
+// diam.NewAVP(1201, avp.Mbit, 10415, &diam.GroupedAVP{ // Recipient-Address
+// AVP: []*diam.AVP{
+// diam.NewAVP(899, avp.Mbit, 10415, datatype.Enumerated(1)), // Address-Type
+// diam.NewAVP(897, avp.Mbit, 10415, datatype.UTF8String("1003")), // Address-Data
+// }}),
+// },
+// }),
+// }})
+// // ============================================
+// // prevent nil pointer dereference
+// // ============================================
+// if diamClnt == nil {
+// t.Fatal("Diameter client should not be nil")
+// }
+// if diamClnt.conn == nil {
+// t.Fatal("Diameter connection should not be nil")
+// }
+// if ccr == nil {
+// t.Fatal("The mesage to diameter should not be nil")
+// }
+// // ============================================
+// if err := diamClnt.SendMessage(ccr); err != nil {
+// t.Error(err)
+// }
+
+// time.Sleep(100 * time.Millisecond)
+// diamClnt.ReceivedMessage(rplyTimeout)
+
+// var cdrs []*engine.CDR
+// args := &utils.RPCCDRsFilterWithAPIOpts{RPCCDRsFilter: &utils.RPCCDRsFilter{RunIDs: []string{utils.MetaRaw}, ToRs: []string{utils.MetaMMS}}}
+// if err := apierRpc.Call(utils.CDRsV1GetCDRs, args, &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 != 1 {
+// t.Errorf("Unexpected Usage CDR: %+v", cdrs[0])
+// }
+// }
+
+// func testDiamInitWithSessionDisconnect(t *testing.T) {
+// attrSetBalance := utils.AttrSetBalance{Tenant: "cgrates.org",
+// Account: "testDiamInitWithSessionDisconnect",
+// BalanceType: utils.MetaVoice,
+// Value: float64(time.Second),
+// Balance: map[string]interface{}{
+// utils.ID: "testDiamInitWithSessionDisconnect",
+// utils.RatingSubject: "*zero1ms",
+// },
+// }
+// var reply string
+// if err := apierRpc.Call(utils.APIerSv2SetBalance, attrSetBalance, &reply); err != nil {
+// t.Error(err)
+// } else if reply != utils.OK {
+// t.Errorf("Received: %s", reply)
+// }
+// sessID := "bb97be2b9f37c2be9614fff71c8b1d08bdisconnect"
+// m := diam.NewRequest(diam.CreditControl, 4, nil)
+// m.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String(sessID))
+// m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("192.168.1.1"))
+// m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// m.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
+// m.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(1))
+// m.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(1))
+// m.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
+// m.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// m.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("testSessionDisconnect"))
+// m.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 4, 14, 42, 20, 0, time.UTC)))
+// m.NewAVP(avp.UserName, avp.Mbit, 0, datatype.UTF8String("testDiamInitWithSessionDisconnect"))
+// m.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(0)), // Subscription-Id-Type
+// diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("testDiamInitWithSessionDisconnect")), // Subscription-Id-Data
+// }})
+// m.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
+// m.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(300))}})
+// m.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(0))}})
+// m.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
+// AVP: []*diam.AVP{
+// diam.NewAVP(831, avp.Mbit, 10415, datatype.UTF8String("1001")), // Calling-Party-Address
+// diam.NewAVP(832, avp.Mbit, 10415, datatype.UTF8String("1002")), // Called-Party-Address
+// diam.NewAVP(20327, avp.Mbit, 2011, datatype.UTF8String("1002")), // Real-Called-Number
+// diam.NewAVP(20339, avp.Mbit, 2011, datatype.Unsigned32(0)), // Charge-Flow-Type
+// diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-Vlr-Number
+// diam.NewAVP(20303, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-CellID-Or-SAI
+// diam.NewAVP(20313, avp.Mbit, 2011, datatype.OctetString("")), // Bearer-Capability
+// diam.NewAVP(20321, avp.Mbit, 2011, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08bdisconnect")), // Call-Reference-Number
+// diam.NewAVP(20322, avp.Mbit, 2011, datatype.UTF8String("")), // MSC-Address
+// diam.NewAVP(20324, avp.Mbit, 2011, datatype.Unsigned32(0)), // Time-Zone
+// diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("")), // Called-Party-NP
+// diam.NewAVP(20386, avp.Mbit, 2011, datatype.UTF8String("")), // SSP-Time
+// },
+// }),
+// }})
+// // ============================================
+// // prevent nil pointer dereference
+// // ============================================
+// if diamClnt == nil {
+// t.Fatal("Diameter client should not be nil")
+// }
+// if diamClnt.conn == nil {
+// t.Fatal("Diameter connection should not be nil")
+// }
+// if m == nil {
+// t.Fatal("The mesage to diameter should not be nil")
+// }
+// // ============================================
+// if err := diamClnt.SendMessage(m); err != nil {
+// t.Error(err)
+// }
+// msg := diamClnt.ReceivedMessage(rplyTimeout)
+// if msg == nil {
+// t.Fatal("No message returned")
+// }
+// // Result-Code
+// eVal := "2001"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// time.Sleep(2 * time.Second)
+// msg = diamClnt.ReceivedMessage(rplyTimeout)
+// if msg == nil {
+// t.Fatal("No message returned")
+// }
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Session-Id"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != sessID {
+// t.Errorf("expecting: %s, received: <%s>", sessID, val)
+// }
+// }
+
+// func testDiamItKillEngine(t *testing.T) {
+// if err := engine.KillEngine(1000); err != nil {
+// t.Error(err)
+// }
+// }
+
+// func testDiamItRAR(t *testing.T) {
+// if diamConfigDIR == "dispatchers/diamagent" {
+// t.SkipNow()
+// }
+// // ============================================
+// // prevent nil pointer dereference
+// // ============================================
+// if diamClnt == nil {
+// t.Fatal("Diameter client should not be nil")
+// }
+// if diamClnt.conn == nil {
+// t.Fatal("Diameter connection should not be nil")
+// }
+// // ============================================
+// var wait sync.WaitGroup
+// wait.Add(1)
+// go func() {
+// var reply string
+// if err := apierRpc.Call(utils.SessionSv1ReAuthorize, &utils.SessionFilter{}, &reply); err != nil {
+// t.Error(err)
+// }
+// wait.Done()
+// }()
+// rar := diamClnt.ReceivedMessage(rplyTimeout)
+// if rar == nil {
+// t.Fatal("No message returned")
+// }
+
+// raa := rar.Answer(2001)
+// raa.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8"))
+
+// if err := diamClnt.SendMessage(raa); err != nil {
+// t.Error(err)
+// }
+
+// wait.Wait()
+
+// m := diam.NewRequest(diam.CreditControl, 4, nil)
+// m.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8"))
+// m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("192.168.1.1"))
+// m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// m.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
+// m.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(2))
+// m.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(1))
+// m.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
+// m.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// m.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("voice@DiamItCCRInit"))
+// m.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 4, 14, 57, 20, 0, time.UTC)))
+// m.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(0)), // Subscription-Id-Type
+// diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("1006")), // Subscription-Id-Data
+// }})
+// m.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
+// m.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(301))}})
+// m.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(301))}})
+// m.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
+// AVP: []*diam.AVP{
+// diam.NewAVP(831, avp.Mbit, 10415, datatype.UTF8String("1006")), // Calling-Party-Address
+// diam.NewAVP(832, avp.Mbit, 10415, datatype.UTF8String("1002")), // Called-Party-Address
+// diam.NewAVP(20327, avp.Mbit, 2011, datatype.UTF8String("1002")), // Real-Called-Number
+// diam.NewAVP(20339, avp.Mbit, 2011, datatype.Unsigned32(0)), // Charge-Flow-Type
+// diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-Vlr-Number
+// diam.NewAVP(20303, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-CellID-Or-SAI
+// diam.NewAVP(20313, avp.Mbit, 2011, datatype.OctetString("")), // Bearer-Capability
+// diam.NewAVP(20321, avp.Mbit, 2011, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8")), // Call-Reference-Number
+// diam.NewAVP(20322, avp.Mbit, 2011, datatype.UTF8String("")), // MSC-Address
+// diam.NewAVP(20324, avp.Mbit, 2011, datatype.Unsigned32(0)), // Time-Zone
+// diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("")), // Called-Party-NP
+// diam.NewAVP(20386, avp.Mbit, 2011, datatype.UTF8String("")), // SSP-Time
+// },
+// }),
+// }})
+// if err := diamClnt.SendMessage(m); err != nil {
+// t.Error(err)
+// }
+// msg := diamClnt.ReceivedMessage(rplyTimeout)
+// if msg == nil {
+// t.Fatal("No message returned")
+// }
+// // Result-Code
+// eVal := "2001"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// // Result-Code
+// eVal = "301" // 5 mins of session
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Granted-Service-Unit", "CC-Time"},
+// dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// }
+
+// func testDiamItDRR(t *testing.T) {
+// if diamConfigDIR == "dispatchers/diamagent" {
+// t.SkipNow()
+// }
+// // ============================================
+// // prevent nil pointer dereference
+// // ============================================
+// if diamClnt == nil {
+// t.Fatal("Diameter client should not be nil")
+// }
+// if diamClnt.conn == nil {
+// t.Fatal("Diameter connection should not be nil")
+// }
+// // ============================================
+// var wait sync.WaitGroup
+// wait.Add(1)
+// go func() {
+// var reply string
+// if err := apierRpc.Call(utils.SessionSv1DisconnectPeer, &utils.DPRArgs{
+// OriginHost: "INTEGRATION_TESTS",
+// OriginRealm: "cgrates.org",
+// DisconnectCause: 1, // BUSY
+// }, &reply); err != nil {
+// t.Error(err)
+// }
+// wait.Done()
+// }()
+// drr := diamClnt.ReceivedMessage(rplyTimeout)
+// if drr == nil {
+// t.Fatal("No message returned")
+// }
+
+// dra := drr.Answer(2001)
+// // dra.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("INTEGRATION_TESTS"))
+// // dra.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+
+// if err := diamClnt.SendMessage(dra); err != nil {
+// t.Error(err)
+// }
+
+// wait.Wait()
+
+// eVal := "1"
+// if avps, err := drr.FindAVPsWithPath([]interface{}{avp.DisconnectCause}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// }
+
+// func testDiamItTemplateErr(t *testing.T) {
+// ccr := diam.NewRequest(diam.CreditControl, 4, nil)
+// ccr.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("TestDmtAgentSendCCRError"))
+// ccr.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
+// ccr.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// ccr.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
+// ccr.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("error@DiamItError"))
+// ccr.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(4))
+// ccr.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(0))
+// ccr.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 5, 11, 43, 10, 0, time.UTC)))
+// ccr.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(avp.SubscriptionIDType, avp.Mbit, 0, datatype.Enumerated(0)),
+// diam.NewAVP(avp.SubscriptionIDData, avp.Mbit, 0, datatype.UTF8String("1001")), // Subscription-Id-Data
+// }})
+// ccr.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(avp.SubscriptionIDType, avp.Mbit, 0, datatype.Enumerated(1)),
+// diam.NewAVP(avp.SubscriptionIDData, avp.Mbit, 0, datatype.UTF8String("104502200011")), // Subscription-Id-Data
+// }})
+// ccr.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
+// ccr.NewAVP(avp.RequestedAction, avp.Mbit, 0, datatype.Enumerated(0))
+// ccr.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(avp.CCTime, avp.Mbit, 0, datatype.Unsigned32(1))}})
+// ccr.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{ //
+// AVP: []*diam.AVP{
+// diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
+// AVP: []*diam.AVP{
+// diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("22509")), // Calling-Vlr-Number
+// diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("4002")), // Called-Party-NP
+// },
+// }),
+// diam.NewAVP(2000, avp.Mbit, 10415, &diam.GroupedAVP{ // SMS-Information
+// AVP: []*diam.AVP{
+// diam.NewAVP(886, avp.Mbit, 10415, &diam.GroupedAVP{ // Originator-Address
+// AVP: []*diam.AVP{
+// diam.NewAVP(899, avp.Mbit, 10415, datatype.Enumerated(1)), // Address-Type
+// diam.NewAVP(897, avp.Mbit, 10415, datatype.UTF8String("1001")), // Address-Data
+// }}),
+// diam.NewAVP(1201, avp.Mbit, 10415, &diam.GroupedAVP{ // Recipient-Address
+// AVP: []*diam.AVP{
+// diam.NewAVP(899, avp.Mbit, 10415, datatype.Enumerated(1)), // Address-Type
+// diam.NewAVP(897, avp.Mbit, 10415, datatype.UTF8String("1003")), // Address-Data
+// }}),
+// },
+// }),
+// }})
+// // ============================================
+// // prevent nil pointer dereference
+// // ============================================
+// if diamClnt == nil {
+// t.Fatal("Diameter client should not be nil")
+// }
+// if diamClnt.conn == nil {
+// t.Fatal("Diameter connection should not be nil")
+// }
+// if ccr == nil {
+// t.Fatal("The mesage to diameter should not be nil")
+// }
+// // ============================================
+// if err := diamClnt.SendMessage(ccr); err != nil {
+// t.Error(err)
+// }
+
+// time.Sleep(100 * time.Millisecond)
+// msg := diamClnt.ReceivedMessage(rplyTimeout)
+
+// if msg == nil {
+// t.Fatal("Message should not be nil")
+// }
+// // Result-Code
+// eVal := "5012" // error code diam.UnableToComply
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// }
+
+// func testDiamItEmulateTerminate(t *testing.T) {
+// if diamConfigDIR == "dispatchers/diamagent" {
+// t.SkipNow()
+// }
+// var result string
+// //add the second charger
+// chargerProfile := &apis.ChargerWithAPIOpts{
+// ChargerProfile: &engine.ChargerProfile{
+// Tenant: "cgrates.com",
+// ID: "CustomCharger",
+// RunID: "CustomCharger",
+// AttributeIDs: []string{"*constant:*req.Category:custom_charger"},
+// Weights: utils.DynamicWeights{
+// {
+// Weight: 20,
+// }},
+// },
+// }
+
+// if err := apierRpc.Call(utils.AdminSv1SetChargerProfile, chargerProfile, &result); err != nil {
+// t.Error(err)
+// } else if result != utils.OK {
+// t.Error("Unexpected reply returned", result)
+// }
+// //add the second charger
+// chargerProfile2 := &apis.ChargerWithAPIOpts{
+// ChargerProfile: &engine.ChargerProfile{
+// Tenant: "cgrates.com",
+// ID: "Default",
+// RunID: "*default",
+// AttributeIDs: []string{"*none"},
+// Weights: utils.DynamicWeights{
+// {
+// Weight: 20,
+// }},
+// },
+// }
+
+// if err := apierRpc.Call(utils.AdminSv1SetChargerProfile, chargerProfile2, &result); err != nil {
+// t.Error(err)
+// } else if result != utils.OK {
+// t.Error("Unexpected reply returned", result)
+// }
+// //set the account
+// attrSetBalance := utils.AttrSetBalance{
+// Tenant: "cgrates.com",
+// Account: "testDiamItEmulateTerminate",
+// Value: float64(time.Hour),
+// BalanceType: utils.MetaVoice,
+// Balance: map[string]interface{}{
+// utils.ID: "testDiamItEmulateTerminate",
+// utils.Categories: "custom_charger",
+// },
+// }
+// var reply string
+// if err := apierRpc.Call(utils.APIerSv2SetBalance, attrSetBalance, &reply); err != nil {
+// t.Error(err)
+// } else if reply != utils.OK {
+// t.Errorf("Received: %s", reply)
+// }
+// var acnt *engine.Account
+// attrs := &utils.AttrGetAccount{Tenant: "cgrates.com", Account: "testDiamItEmulateTerminate"}
+// if err := apierRpc.Call(utils.APIerSv2GetAccount, attrs, &acnt); err != nil {
+// t.Error(err)
+// } else if acnt.BalanceMap[utils.MetaVoice].GetTotalValue() != float64(time.Hour) {
+// t.Errorf("Expected: %f, received: %f", float64(time.Hour), acnt.BalanceMap[utils.MetaVoice].GetTotalValue())
+// }
+
+// m := diam.NewRequest(diam.CreditControl, 4, nil)
+// m.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8"))
+// m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("192.168.1.1"))
+// m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
+// m.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
+// m.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(1))
+// m.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(0))
+// m.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
+// m.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.com"))
+// m.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("voice@DiamItCCRInit"))
+// m.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 4, 14, 42, 20, 0, time.UTC)))
+// m.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(0)), // Subscription-Id-Type
+// diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("testDiamItEmulateTerminate")), // Subscription-Id-Data
+// }})
+// m.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
+// m.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(300))}})
+// m.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(0))}})
+// m.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{
+// AVP: []*diam.AVP{
+// diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
+// AVP: []*diam.AVP{
+// diam.NewAVP(831, avp.Mbit, 10415, datatype.UTF8String("1006")), // Calling-Party-Address
+// diam.NewAVP(832, avp.Mbit, 10415, datatype.UTF8String("1002")), // Called-Party-Address
+// diam.NewAVP(20327, avp.Mbit, 2011, datatype.UTF8String("1002")), // Real-Called-Number
+// diam.NewAVP(20339, avp.Mbit, 2011, datatype.Unsigned32(0)), // Charge-Flow-Type
+// diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-Vlr-Number
+// diam.NewAVP(20303, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-CellID-Or-SAI
+// diam.NewAVP(20313, avp.Mbit, 2011, datatype.OctetString("")), // Bearer-Capability
+// diam.NewAVP(20321, avp.Mbit, 2011, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8")), // Call-Reference-Number
+// diam.NewAVP(20322, avp.Mbit, 2011, datatype.UTF8String("")), // MSC-Address
+// diam.NewAVP(20324, avp.Mbit, 2011, datatype.Unsigned32(0)), // Time-Zone
+// diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("")), // Called-Party-NP
+// diam.NewAVP(20386, avp.Mbit, 2011, datatype.UTF8String("")), // SSP-Time
+// },
+// }),
+// }})
+// // ============================================
+// // prevent nil pointer dereference
+// // ============================================
+// if diamClnt == nil {
+// t.Fatal("Diameter client should not be nil")
+// }
+// if diamClnt.conn == nil {
+// t.Fatal("Diameter connection should not be nil")
+// }
+// if m == nil {
+// t.Fatal("The mesage to diameter should not be nil")
+// }
+// // ============================================
+// if err := diamClnt.SendMessage(m); err != nil {
+// t.Error(err)
+// }
+// msg := diamClnt.ReceivedMessage(rplyTimeout)
+// if msg == nil {
+// t.Fatal("No message returned")
+// }
+// // Result-Code
+// eVal := "2001"
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+// // Result-Code
+// eVal = "0" // 0 from sessions
+// if avps, err := msg.FindAVPsWithPath([]interface{}{"Granted-Service-Unit", "CC-Time"},
+// dict.UndefinedVendorID); err != nil {
+// t.Error(err)
+// } else if len(avps) == 0 {
+// t.Error("Missing AVP")
+// } else if val, err := diamAVPAsString(avps[0]); err != nil {
+// t.Error(err)
+// } else if val != eVal {
+// t.Errorf("expecting: %s, received: <%s>", eVal, val)
+// }
+
+// if err := apierRpc.Call(utils.APIerSv2GetAccount, attrs, &acnt); err != nil {
+// t.Error(err)
+// } else if acnt.BalanceMap[utils.MetaVoice].GetTotalValue() != float64(time.Hour) {
+// t.Errorf("Expected: %f, received: %f", float64(time.Hour), acnt.BalanceMap[utils.MetaVoice].GetTotalValue())
+// }
+// }
diff --git a/agents/dnsagent_it_test.go b/agents/dnsagent_it_test.go
index f35079f4b..1eb821b5f 100644
--- a/agents/dnsagent_it_test.go
+++ b/agents/dnsagent_it_test.go
@@ -21,300 +21,311 @@ along with this program. If not, see
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)
+// }
+// }
diff --git a/agents/httpagent_it_test.go b/agents/httpagent_it_test.go
index 8fa81470f..a95f27f0e 100644
--- a/agents/httpagent_it_test.go
+++ b/agents/httpagent_it_test.go
@@ -21,358 +21,358 @@ along with this program. If not, see
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(`
-
- 1
- 234/Val1
- 1200
-`)
- 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(`
+//
+// 1
+// 234/Val1
+// 1200
+// `)
+// 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(`
-
- 1
- %v
-`, 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(`
+//
+// 1
+// %v
+// `, 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(`
-
- 123456
- 1
-`)
- 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(`
+//
+// 123456
+// 1
+// `)
+// 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 := `2005-08-26T14:17:34Data528594447700086788510163Silliname0.14000.1400234447700086788China, Peoples Republic of - China Unicom (CU-GSM)4600013245581.33300.14001.33300.1400`
- 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 := `2005-08-26T14:17:34Data528594447700086788510163Silliname0.14000.1400234447700086788China, Peoples Republic of - China Unicom (CU-GSM)4600013245581.33300.14001.33300.1400`
+// 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)
+// }
+// }
diff --git a/agents/lib_test.go b/agents/lib_test.go
index 0f42e0ec2..296b0206a 100644
--- a/agents/lib_test.go
+++ b/agents/lib_test.go
@@ -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")
}
diff --git a/agents/radagent_it_test.go b/agents/radagent_it_test.go
index b6c54f3fe..a31508649 100644
--- a/agents/radagent_it_test.go
+++ b/agents/radagent_it_test.go
@@ -21,724 +21,724 @@ along with this program. If not, see
package agents
-import (
- "fmt"
- "net/rpc"
- "os/exec"
- "path"
- "reflect"
- "testing"
- "time"
+// import (
+// "fmt"
+// "net/rpc"
+// "os/exec"
+// "path"
+// "reflect"
+// "testing"
+// "time"
- "github.com/cgrates/birpc/context"
- "github.com/cgrates/cgrates/config"
- "github.com/cgrates/cgrates/engine"
- "github.com/cgrates/cgrates/sessions"
- "github.com/cgrates/cgrates/utils"
- "github.com/cgrates/radigo"
-)
+// "github.com/cgrates/birpc/context"
+// "github.com/cgrates/cgrates/config"
+// "github.com/cgrates/cgrates/engine"
+// "github.com/cgrates/cgrates/sessions"
+// "github.com/cgrates/cgrates/utils"
+// "github.com/cgrates/radigo"
+// )
-var (
- raonfigDIR string
- raCfgPath string
- raCfg *config.CGRConfig
- raAuthClnt, raAcctClnt *radigo.Client
- raRPC *rpc.Client
+// var (
+// raonfigDIR string
+// raCfgPath string
+// raCfg *config.CGRConfig
+// raAuthClnt, raAcctClnt *radigo.Client
+// raRPC *rpc.Client
- sTestsRadius = []func(t *testing.T){
- testRAitInitCfg,
- testRAitResetDataDb,
- testRAitStartEngine,
- testRAitApierRpcConn,
- testRAitTPFromFolder,
- testRAitAuthPAPSuccess,
- testRAitAuthPAPFail,
- testRAitAuthCHAPSuccess,
- testRAitAuthCHAPFail,
- testRAitAuthMSCHAPV2Success,
- testRAitAuthMSCHAPV2Fail,
- testRAitChallenge,
- testRAitChallengeResponse,
- testRAitAcctStart,
- testRAitAcctStop,
- testRAitStopCgrEngine,
- }
-)
+// sTestsRadius = []func(t *testing.T){
+// testRAitInitCfg,
+// testRAitResetDataDb,
+// testRAitStartEngine,
+// testRAitApierRpcConn,
+// testRAitTPFromFolder,
+// testRAitAuthPAPSuccess,
+// testRAitAuthPAPFail,
+// testRAitAuthCHAPSuccess,
+// testRAitAuthCHAPFail,
+// testRAitAuthMSCHAPV2Success,
+// testRAitAuthMSCHAPV2Fail,
+// testRAitChallenge,
+// testRAitChallengeResponse,
+// testRAitAcctStart,
+// testRAitAcctStop,
+// testRAitStopCgrEngine,
+// }
+// )
-// Test start here
-func TestRAit(t *testing.T) {
- // engine.KillEngine(0)
- switch *dbType {
- case utils.MetaInternal:
- raonfigDIR = "radagent_internal"
- case utils.MetaMySQL:
- raonfigDIR = "radagent_mysql"
- case utils.MetaMongo:
- raonfigDIR = "radagent_mongo"
- case utils.MetaPostgres:
- t.SkipNow()
- default:
- t.Fatal("Unknown Database type")
- }
- if *encoding == utils.MetaGOB {
- raonfigDIR += "_gob"
- }
- for _, stest := range sTestsRadius {
- t.Run(raonfigDIR, stest)
- }
-}
+// // Test start here
+// func TestRAit(t *testing.T) {
+// // engine.KillEngine(0)
+// switch *dbType {
+// case utils.MetaInternal:
+// raonfigDIR = "radagent_internal"
+// case utils.MetaMySQL:
+// raonfigDIR = "radagent_mysql"
+// case utils.MetaMongo:
+// raonfigDIR = "radagent_mongo"
+// case utils.MetaPostgres:
+// t.SkipNow()
+// default:
+// t.Fatal("Unknown Database type")
+// }
+// if *encoding == utils.MetaGOB {
+// raonfigDIR += "_gob"
+// }
+// for _, stest := range sTestsRadius {
+// t.Run(raonfigDIR, stest)
+// }
+// }
-func TestRAitDispatcher(t *testing.T) {
- if *encoding == utils.MetaGOB {
- t.SkipNow()
- return
- }
- isDispatcherActive = true
- engine.StartEngine(path.Join(*dataDir, "conf", "samples", "dispatchers", "all"), 200)
- engine.StartEngine(path.Join(*dataDir, "conf", "samples", "dispatchers", "all2"), 200)
- raonfigDIR = "dispatchers/radagent"
- testRadiusitResetAllDB(t)
- for _, stest := range sTestsRadius {
- t.Run(diamConfigDIR, stest)
- }
- engine.KillEngine(100)
- isDispatcherActive = false
-}
+// func TestRAitDispatcher(t *testing.T) {
+// if *encoding == utils.MetaGOB {
+// t.SkipNow()
+// return
+// }
+// isDispatcherActive = true
+// engine.StartEngine(path.Join(*dataDir, "conf", "samples", "dispatchers", "all"), 200)
+// engine.StartEngine(path.Join(*dataDir, "conf", "samples", "dispatchers", "all2"), 200)
+// raonfigDIR = "dispatchers/radagent"
+// testRadiusitResetAllDB(t)
+// for _, stest := range sTestsRadius {
+// t.Run(diamConfigDIR, stest)
+// }
+// engine.KillEngine(100)
+// isDispatcherActive = false
+// }
-func testRAitInitCfg(t *testing.T) {
- raCfgPath = path.Join(*dataDir, "conf", "samples", raonfigDIR)
- // Init config first
- var err error
- raCfg, err = config.NewCGRConfigFromPath(context.Background(), raCfgPath)
- if err != nil {
- t.Error(err)
- }
- if isDispatcherActive {
- raCfg.ListenCfg().RPCJSONListen = ":6012"
- }
-}
+// func testRAitInitCfg(t *testing.T) {
+// raCfgPath = path.Join(*dataDir, "conf", "samples", raonfigDIR)
+// // Init config first
+// var err error
+// raCfg, err = config.NewCGRConfigFromPath(context.Background(), raCfgPath)
+// if err != nil {
+// t.Error(err)
+// }
+// if isDispatcherActive {
+// raCfg.ListenCfg().RPCJSONListen = ":6012"
+// }
+// }
-func testRadiusitResetAllDB(t *testing.T) {
- cfgPath1 := path.Join(*dataDir, "conf", "samples", "dispatchers", "all")
- allCfg, err := config.NewCGRConfigFromPath(context.Background(), cfgPath1)
- if err != nil {
- t.Fatal(err)
- }
- if err := engine.InitDataDB(allCfg); err != nil {
- t.Fatal(err)
- }
+// func testRadiusitResetAllDB(t *testing.T) {
+// cfgPath1 := path.Join(*dataDir, "conf", "samples", "dispatchers", "all")
+// allCfg, err := config.NewCGRConfigFromPath(context.Background(), cfgPath1)
+// if err != nil {
+// t.Fatal(err)
+// }
+// if err := engine.InitDataDB(allCfg); err != nil {
+// t.Fatal(err)
+// }
-}
+// }
-// Remove data in both rating and accounting db
-func testRAitResetDataDb(t *testing.T) {
- if err := engine.InitDataDB(raCfg); err != nil {
- t.Fatal(err)
- }
-}
+// // Remove data in both rating and accounting db
+// func testRAitResetDataDb(t *testing.T) {
+// if err := engine.InitDataDB(raCfg); err != nil {
+// t.Fatal(err)
+// }
+// }
-// Start CGR Engine
-func testRAitStartEngine(t *testing.T) {
- if _, err := engine.StartEngine(raCfgPath, *waitRater); err != nil {
- t.Fatal(err)
- }
-}
+// // Start CGR Engine
+// func testRAitStartEngine(t *testing.T) {
+// if _, err := engine.StartEngine(raCfgPath, *waitRater); err != nil {
+// t.Fatal(err)
+// }
+// }
-// Connect rpc client to rater
-func testRAitApierRpcConn(t *testing.T) {
- var err error
- raRPC, err = newRPCClient(raCfg.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed
- if err != nil {
- t.Fatal(err)
- }
-}
+// // Connect rpc client to rater
+// func testRAitApierRpcConn(t *testing.T) {
+// var err error
+// raRPC, err = newRPCClient(raCfg.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 testRAitTPFromFolder(t *testing.T) {
- attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "oldtutorial")}
- var loadInst utils.LoadInstance
- if err := raRPC.Call(utils.APIerSv1LoadTariffPlanFromFolder, attrs, &loadInst); err != nil {
- t.Error(err)
- }
- if isDispatcherActive {
- testRadiusitTPLoadData(t)
- }
- time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for scheduler to execute topups
-}
+// // Load the tariff plan, creating accounts and their balances
+// func testRAitTPFromFolder(t *testing.T) {
+// attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "oldtutorial")}
+// var loadInst utils.LoadInstance
+// if err := raRPC.Call(utils.APIerSv1LoadTariffPlanFromFolder, attrs, &loadInst); err != nil {
+// t.Error(err)
+// }
+// if isDispatcherActive {
+// testRadiusitTPLoadData(t)
+// }
+// time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for scheduler to execute topups
+// }
-func testRadiusitTPLoadData(t *testing.T) {
- wchan := make(chan struct{}, 1)
- go func() {
- loaderPath, err := exec.LookPath("cgr-loader")
- if err != nil {
- t.Error(err)
- }
- loader := exec.Command(loaderPath, "-config_path", raCfgPath, "-path", path.Join(*dataDir, "tariffplans", "dispatchers"))
+// func testRadiusitTPLoadData(t *testing.T) {
+// wchan := make(chan struct{}, 1)
+// go func() {
+// loaderPath, err := exec.LookPath("cgr-loader")
+// if err != nil {
+// t.Error(err)
+// }
+// loader := exec.Command(loaderPath, "-config_path", raCfgPath, "-path", path.Join(*dataDir, "tariffplans", "dispatchers"))
- if err := loader.Start(); err != nil {
- t.Error(err)
- }
- loader.Wait()
- wchan <- struct{}{}
- }()
- select {
- case <-wchan:
- case <-time.After(5 * time.Second):
- t.Errorf("cgr-loader failed: ")
- }
-}
+// if err := loader.Start(); err != nil {
+// t.Error(err)
+// }
+// loader.Wait()
+// wchan <- struct{}{}
+// }()
+// select {
+// case <-wchan:
+// case <-time.After(5 * time.Second):
+// t.Errorf("cgr-loader failed: ")
+// }
+// }
-func testRAitAuthPAPSuccess(t *testing.T) {
- if raAuthClnt, err = radigo.NewClient("udp", "127.0.0.1:1812", "CGRateS.org", dictRad, 1, nil); err != nil {
- t.Fatal(err)
- }
- authReq := raAuthClnt.NewRequest(radigo.AccessRequest, 1) // emulates Kamailio packet out of radius_load_caller_avps()
- if err := authReq.AddAVPWithName("User-Name", "1001", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("User-Password", "CGRateSPassword1", ""); err != nil {
- t.Error(err)
- }
- // encode the password as required so we can decode it properly
- authReq.AVPs[1].RawValue = radigo.EncodeUserPassWord([]byte("CGRateSPassword1"), []byte("CGRateS.org"), authReq.Authenticator[:])
- if err := authReq.AddAVPWithName("Service-Type", "SIP-Caller-AVPs", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Sip-From-Tag", "51585361", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
- t.Error(err)
- }
- reply, err := raAuthClnt.SendRequest(authReq)
- if err != nil {
- t.Fatal(err)
- }
- if reply.Code != radigo.AccessAccept {
- t.Errorf("Received reply: %+v", utils.ToJSON(reply))
- }
- if len(reply.AVPs) != 1 { // make sure max duration is received
- t.Errorf("Received AVPs: %+v", utils.ToJSON(reply.AVPs))
- } else if !reflect.DeepEqual([]byte("session_max_time#10800"), reply.AVPs[0].RawValue) {
- t.Errorf("Received: %s", string(reply.AVPs[0].RawValue))
- }
-}
+// func testRAitAuthPAPSuccess(t *testing.T) {
+// if raAuthClnt, err = radigo.NewClient("udp", "127.0.0.1:1812", "CGRateS.org", dictRad, 1, nil); err != nil {
+// t.Fatal(err)
+// }
+// authReq := raAuthClnt.NewRequest(radigo.AccessRequest, 1) // emulates Kamailio packet out of radius_load_caller_avps()
+// if err := authReq.AddAVPWithName("User-Name", "1001", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("User-Password", "CGRateSPassword1", ""); err != nil {
+// t.Error(err)
+// }
+// // encode the password as required so we can decode it properly
+// authReq.AVPs[1].RawValue = radigo.EncodeUserPassWord([]byte("CGRateSPassword1"), []byte("CGRateS.org"), authReq.Authenticator[:])
+// if err := authReq.AddAVPWithName("Service-Type", "SIP-Caller-AVPs", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Sip-From-Tag", "51585361", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
+// t.Error(err)
+// }
+// reply, err := raAuthClnt.SendRequest(authReq)
+// if err != nil {
+// t.Fatal(err)
+// }
+// if reply.Code != radigo.AccessAccept {
+// t.Errorf("Received reply: %+v", utils.ToJSON(reply))
+// }
+// if len(reply.AVPs) != 1 { // make sure max duration is received
+// t.Errorf("Received AVPs: %+v", utils.ToJSON(reply.AVPs))
+// } else if !reflect.DeepEqual([]byte("session_max_time#10800"), reply.AVPs[0].RawValue) {
+// t.Errorf("Received: %s", string(reply.AVPs[0].RawValue))
+// }
+// }
-func testRAitAuthPAPFail(t *testing.T) {
- if raAuthClnt, err = radigo.NewClient("udp", "127.0.0.1:1812", "CGRateS.org", dictRad, 1, nil); err != nil {
- t.Fatal(err)
- }
- authReq := raAuthClnt.NewRequest(radigo.AccessRequest, 1) // emulates Kamailio packet out of radius_load_caller_avps()
- if err := authReq.AddAVPWithName("User-Name", "1001", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("User-Password", "CGRateSPassword2", ""); err != nil {
- t.Error(err)
- }
- // encode the password as required so we can decode it properly
- authReq.AVPs[1].RawValue = radigo.EncodeUserPassWord([]byte("CGRateSPassword2"), []byte("CGRateS.org"), authReq.Authenticator[:])
- if err := authReq.AddAVPWithName("Service-Type", "SIP-Caller-AVPs", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Sip-From-Tag", "51585361", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
- t.Error(err)
- }
- reply, err := raAuthClnt.SendRequest(authReq)
- if err != nil {
- t.Fatal(err)
- }
- if reply.Code != radigo.AccessReject {
- t.Errorf("Received reply: %+v", reply)
- }
- if len(reply.AVPs) != 1 { // make sure max duration is received
- t.Errorf("Received AVPs: %+v", reply.AVPs)
- } else if !reflect.DeepEqual(utils.RadauthFailed, string(reply.AVPs[0].RawValue)) {
- t.Errorf("Received: %s", string(reply.AVPs[0].RawValue))
- }
-}
+// func testRAitAuthPAPFail(t *testing.T) {
+// if raAuthClnt, err = radigo.NewClient("udp", "127.0.0.1:1812", "CGRateS.org", dictRad, 1, nil); err != nil {
+// t.Fatal(err)
+// }
+// authReq := raAuthClnt.NewRequest(radigo.AccessRequest, 1) // emulates Kamailio packet out of radius_load_caller_avps()
+// if err := authReq.AddAVPWithName("User-Name", "1001", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("User-Password", "CGRateSPassword2", ""); err != nil {
+// t.Error(err)
+// }
+// // encode the password as required so we can decode it properly
+// authReq.AVPs[1].RawValue = radigo.EncodeUserPassWord([]byte("CGRateSPassword2"), []byte("CGRateS.org"), authReq.Authenticator[:])
+// if err := authReq.AddAVPWithName("Service-Type", "SIP-Caller-AVPs", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Sip-From-Tag", "51585361", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
+// t.Error(err)
+// }
+// reply, err := raAuthClnt.SendRequest(authReq)
+// if err != nil {
+// t.Fatal(err)
+// }
+// if reply.Code != radigo.AccessReject {
+// t.Errorf("Received reply: %+v", reply)
+// }
+// if len(reply.AVPs) != 1 { // make sure max duration is received
+// t.Errorf("Received AVPs: %+v", reply.AVPs)
+// } else if !reflect.DeepEqual(utils.RadauthFailed, string(reply.AVPs[0].RawValue)) {
+// t.Errorf("Received: %s", string(reply.AVPs[0].RawValue))
+// }
+// }
-func testRAitAuthCHAPSuccess(t *testing.T) {
- if raAuthClnt, err = radigo.NewClient("udp", "127.0.0.1:1812", "CGRateS.org", dictRad, 1, nil); err != nil {
- t.Fatal(err)
- }
- authReq := raAuthClnt.NewRequest(radigo.AccessRequest, 1) // emulates Kamailio packet out of radius_load_caller_avps()
- if err := authReq.AddAVPWithName("User-Name", "1001", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("CHAP-Password", "CGRateSPassword1", ""); err != nil {
- t.Error(err)
- }
- authReq.AVPs[1].RawValue = radigo.EncodeCHAPPassword([]byte("CGRateSPassword1"), authReq.Authenticator[:])
- if err := authReq.AddAVPWithName("Service-Type", "SIP-Caller-AVPs", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Sip-From-Tag", "51585362", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
- t.Error(err)
- }
- reply, err := raAuthClnt.SendRequest(authReq)
- if err != nil {
- t.Fatal(err)
- }
- if reply.Code != radigo.AccessAccept {
- t.Errorf("Received reply: %+v", utils.ToJSON(reply))
- }
- if len(reply.AVPs) != 1 { // make sure max duration is received
- t.Errorf("Received AVPs: %+v", utils.ToJSON(reply.AVPs))
- } else if !reflect.DeepEqual([]byte("session_max_time#10800"), reply.AVPs[0].RawValue) {
- t.Errorf("Received: %s", string(reply.AVPs[0].RawValue))
- }
-}
+// func testRAitAuthCHAPSuccess(t *testing.T) {
+// if raAuthClnt, err = radigo.NewClient("udp", "127.0.0.1:1812", "CGRateS.org", dictRad, 1, nil); err != nil {
+// t.Fatal(err)
+// }
+// authReq := raAuthClnt.NewRequest(radigo.AccessRequest, 1) // emulates Kamailio packet out of radius_load_caller_avps()
+// if err := authReq.AddAVPWithName("User-Name", "1001", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("CHAP-Password", "CGRateSPassword1", ""); err != nil {
+// t.Error(err)
+// }
+// authReq.AVPs[1].RawValue = radigo.EncodeCHAPPassword([]byte("CGRateSPassword1"), authReq.Authenticator[:])
+// if err := authReq.AddAVPWithName("Service-Type", "SIP-Caller-AVPs", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Sip-From-Tag", "51585362", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
+// t.Error(err)
+// }
+// reply, err := raAuthClnt.SendRequest(authReq)
+// if err != nil {
+// t.Fatal(err)
+// }
+// if reply.Code != radigo.AccessAccept {
+// t.Errorf("Received reply: %+v", utils.ToJSON(reply))
+// }
+// if len(reply.AVPs) != 1 { // make sure max duration is received
+// t.Errorf("Received AVPs: %+v", utils.ToJSON(reply.AVPs))
+// } else if !reflect.DeepEqual([]byte("session_max_time#10800"), reply.AVPs[0].RawValue) {
+// t.Errorf("Received: %s", string(reply.AVPs[0].RawValue))
+// }
+// }
-func testRAitAuthCHAPFail(t *testing.T) {
- if raAuthClnt, err = radigo.NewClient("udp", "127.0.0.1:1812", "CGRateS.org", dictRad, 1, nil); err != nil {
- t.Fatal(err)
- }
- authReq := raAuthClnt.NewRequest(radigo.AccessRequest, 1) // emulates Kamailio packet out of radius_load_caller_avps()
- if err := authReq.AddAVPWithName("User-Name", "1001", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("CHAP-Password", "CGRateSPassword2", ""); err != nil {
- t.Error(err)
- }
- authReq.AVPs[1].RawValue = radigo.EncodeCHAPPassword([]byte("CGRateSPassword2"), authReq.Authenticator[:])
- if err := authReq.AddAVPWithName("Service-Type", "SIP-Caller-AVPs", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Sip-From-Tag", "51585362", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
- t.Error(err)
- }
- reply, err := raAuthClnt.SendRequest(authReq)
- if err != nil {
- t.Fatal(err)
- }
- if reply.Code != radigo.AccessReject {
- t.Errorf("Received reply: %+v", reply)
- }
- if len(reply.AVPs) != 1 { // make sure max duration is received
- t.Errorf("Received AVPs: %+v", reply.AVPs)
- } else if !reflect.DeepEqual(utils.RadauthFailed, string(reply.AVPs[0].RawValue)) {
- t.Errorf("Received: %s", string(reply.AVPs[0].RawValue))
- }
-}
+// func testRAitAuthCHAPFail(t *testing.T) {
+// if raAuthClnt, err = radigo.NewClient("udp", "127.0.0.1:1812", "CGRateS.org", dictRad, 1, nil); err != nil {
+// t.Fatal(err)
+// }
+// authReq := raAuthClnt.NewRequest(radigo.AccessRequest, 1) // emulates Kamailio packet out of radius_load_caller_avps()
+// if err := authReq.AddAVPWithName("User-Name", "1001", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("CHAP-Password", "CGRateSPassword2", ""); err != nil {
+// t.Error(err)
+// }
+// authReq.AVPs[1].RawValue = radigo.EncodeCHAPPassword([]byte("CGRateSPassword2"), authReq.Authenticator[:])
+// if err := authReq.AddAVPWithName("Service-Type", "SIP-Caller-AVPs", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Sip-From-Tag", "51585362", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
+// t.Error(err)
+// }
+// reply, err := raAuthClnt.SendRequest(authReq)
+// if err != nil {
+// t.Fatal(err)
+// }
+// if reply.Code != radigo.AccessReject {
+// t.Errorf("Received reply: %+v", reply)
+// }
+// if len(reply.AVPs) != 1 { // make sure max duration is received
+// t.Errorf("Received AVPs: %+v", reply.AVPs)
+// } else if !reflect.DeepEqual(utils.RadauthFailed, string(reply.AVPs[0].RawValue)) {
+// t.Errorf("Received: %s", string(reply.AVPs[0].RawValue))
+// }
+// }
-func testRAitAuthMSCHAPV2Success(t *testing.T) {
- for _, dictPath := range raCfg.RadiusAgentCfg().ClientDictionaries {
- if dictRad, err = radigo.NewDictionaryFromFolderWithRFC2865(dictPath); err != nil {
- return
- }
- }
- if raAuthClnt, err = radigo.NewClient("udp", "127.0.0.1:1812", "CGRateS.org", dictRad, 1, nil); err != nil {
- t.Fatal(err)
- }
- authReq := raAuthClnt.NewRequest(radigo.AccessRequest, 1) // emulates Kamailio packet out of radius_load_caller_avps()
- if err := authReq.AddAVPWithName("User-Name", "1001", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("MS-CHAP-Challenge", string(authReq.Authenticator[:]), "Microsoft"); err != nil {
- t.Error(err)
- }
+// func testRAitAuthMSCHAPV2Success(t *testing.T) {
+// for _, dictPath := range raCfg.RadiusAgentCfg().ClientDictionaries {
+// if dictRad, err = radigo.NewDictionaryFromFolderWithRFC2865(dictPath); err != nil {
+// return
+// }
+// }
+// if raAuthClnt, err = radigo.NewClient("udp", "127.0.0.1:1812", "CGRateS.org", dictRad, 1, nil); err != nil {
+// t.Fatal(err)
+// }
+// authReq := raAuthClnt.NewRequest(radigo.AccessRequest, 1) // emulates Kamailio packet out of radius_load_caller_avps()
+// if err := authReq.AddAVPWithName("User-Name", "1001", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("MS-CHAP-Challenge", string(authReq.Authenticator[:]), "Microsoft"); err != nil {
+// t.Error(err)
+// }
- respVal, err := radigo.GenerateClientMSCHAPResponse(authReq.Authenticator, "1001", "CGRateSPassword1")
- if err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("MS-CHAP-Response", string(respVal), "Microsoft"); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Service-Type", "SIP-Caller-AVPs", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Sip-From-Tag", "51585363", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
- t.Error(err)
- }
- reply, err := raAuthClnt.SendRequest(authReq)
- if err != nil {
- t.Fatal(err)
- }
- if reply.Code != radigo.AccessAccept {
- t.Errorf("Received reply: %+v", utils.ToJSON(reply))
- }
- if len(reply.AVPs) != 2 { // make sure max duration is received
- t.Errorf("Received AVPs: %+v", utils.ToJSON(reply.AVPs))
- } else {
- for _, avp := range reply.AVPs {
- if avp.Number == 26 && len(avp.RawValue) != 49 {
- t.Errorf("Unexpected lenght of MS-CHAP2-Success AVP: %+v", len(avp.RawValue))
- }
- if avp.Number == 225 && !reflect.DeepEqual([]byte("session_max_time#10800"), reply.AVPs[1].RawValue) {
- t.Errorf("Received: %s", string(reply.AVPs[0].RawValue))
- }
- }
- }
+// respVal, err := radigo.GenerateClientMSCHAPResponse(authReq.Authenticator, "1001", "CGRateSPassword1")
+// if err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("MS-CHAP-Response", string(respVal), "Microsoft"); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Service-Type", "SIP-Caller-AVPs", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Sip-From-Tag", "51585363", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
+// t.Error(err)
+// }
+// reply, err := raAuthClnt.SendRequest(authReq)
+// if err != nil {
+// t.Fatal(err)
+// }
+// if reply.Code != radigo.AccessAccept {
+// t.Errorf("Received reply: %+v", utils.ToJSON(reply))
+// }
+// if len(reply.AVPs) != 2 { // make sure max duration is received
+// t.Errorf("Received AVPs: %+v", utils.ToJSON(reply.AVPs))
+// } else {
+// for _, avp := range reply.AVPs {
+// if avp.Number == 26 && len(avp.RawValue) != 49 {
+// t.Errorf("Unexpected lenght of MS-CHAP2-Success AVP: %+v", len(avp.RawValue))
+// }
+// if avp.Number == 225 && !reflect.DeepEqual([]byte("session_max_time#10800"), reply.AVPs[1].RawValue) {
+// t.Errorf("Received: %s", string(reply.AVPs[0].RawValue))
+// }
+// }
+// }
-}
+// }
-func testRAitAuthMSCHAPV2Fail(t *testing.T) {
- for _, dictPath := range raCfg.RadiusAgentCfg().ClientDictionaries {
- if dictRad, err = radigo.NewDictionaryFromFolderWithRFC2865(dictPath); err != nil {
- return
- }
- }
- if raAuthClnt, err = radigo.NewClient("udp", "127.0.0.1:1812", "CGRateS.org", dictRad, 1, nil); err != nil {
- t.Fatal(err)
- }
- authReq := raAuthClnt.NewRequest(radigo.AccessRequest, 1) // emulates Kamailio packet out of radius_load_caller_avps()
- if err := authReq.AddAVPWithName("User-Name", "1001", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("MS-CHAP-Challenge", string(authReq.Authenticator[:]), "Microsoft"); err != nil {
- t.Error(err)
- }
- respVal, err := radigo.GenerateClientMSCHAPResponse(authReq.Authenticator, "1001", "CGRateSPassword2")
- if err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("MS-CHAP-Response", string(respVal), "Microsoft"); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Service-Type", "SIP-Caller-AVPs", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Sip-From-Tag", "51585363", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
- t.Error(err)
- }
- reply, err := raAuthClnt.SendRequest(authReq)
- if err != nil {
- t.Fatal(err)
- }
- if reply.Code != radigo.AccessReject {
- t.Errorf("Received reply: %+v", reply)
- }
- if len(reply.AVPs) != 1 { // make sure max duration is received
- t.Errorf("Received AVPs: %+v", reply.AVPs)
- } else if !reflect.DeepEqual(utils.RadauthFailed, string(reply.AVPs[0].RawValue)) {
- t.Errorf("Received: %s", string(reply.AVPs[0].RawValue))
- }
-}
+// func testRAitAuthMSCHAPV2Fail(t *testing.T) {
+// for _, dictPath := range raCfg.RadiusAgentCfg().ClientDictionaries {
+// if dictRad, err = radigo.NewDictionaryFromFolderWithRFC2865(dictPath); err != nil {
+// return
+// }
+// }
+// if raAuthClnt, err = radigo.NewClient("udp", "127.0.0.1:1812", "CGRateS.org", dictRad, 1, nil); err != nil {
+// t.Fatal(err)
+// }
+// authReq := raAuthClnt.NewRequest(radigo.AccessRequest, 1) // emulates Kamailio packet out of radius_load_caller_avps()
+// if err := authReq.AddAVPWithName("User-Name", "1001", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("MS-CHAP-Challenge", string(authReq.Authenticator[:]), "Microsoft"); err != nil {
+// t.Error(err)
+// }
+// respVal, err := radigo.GenerateClientMSCHAPResponse(authReq.Authenticator, "1001", "CGRateSPassword2")
+// if err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("MS-CHAP-Response", string(respVal), "Microsoft"); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Service-Type", "SIP-Caller-AVPs", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Sip-From-Tag", "51585363", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
+// t.Error(err)
+// }
+// reply, err := raAuthClnt.SendRequest(authReq)
+// if err != nil {
+// t.Fatal(err)
+// }
+// if reply.Code != radigo.AccessReject {
+// t.Errorf("Received reply: %+v", reply)
+// }
+// if len(reply.AVPs) != 1 { // make sure max duration is received
+// t.Errorf("Received AVPs: %+v", reply.AVPs)
+// } else if !reflect.DeepEqual(utils.RadauthFailed, string(reply.AVPs[0].RawValue)) {
+// t.Errorf("Received: %s", string(reply.AVPs[0].RawValue))
+// }
+// }
-func testRAitChallenge(t *testing.T) {
- if raAuthClnt, err = radigo.NewClient("udp", "127.0.0.1:1812", "CGRateS.org", dictRad, 1, nil); err != nil {
- t.Fatal(err)
- }
- authReq := raAuthClnt.NewRequest(radigo.AccessRequest, 1) // emulates Kamailio packet out of radius_load_caller_avps()
- if err := authReq.AddAVPWithName("User-Name", "1001", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Service-Type", "SIP-Caller-AVPs", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Sip-From-Tag", "12345678", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
- t.Error(err)
- }
- reply, err := raAuthClnt.SendRequest(authReq)
- if err != nil {
- t.Fatal(err)
- }
- if reply.Code != radigo.AccessChallenge {
- t.Errorf("Received reply: %+v", utils.ToJSON(reply))
- }
- if len(reply.AVPs) != 1 { // make sure the client receive the message
- t.Errorf("Received AVPs: %+v", utils.ToJSON(reply.AVPs))
- } else if !reflect.DeepEqual([]byte("Missing User-Password"), reply.AVPs[0].RawValue) {
- t.Errorf("Received: %s", string(reply.AVPs[0].RawValue))
- }
-}
+// func testRAitChallenge(t *testing.T) {
+// if raAuthClnt, err = radigo.NewClient("udp", "127.0.0.1:1812", "CGRateS.org", dictRad, 1, nil); err != nil {
+// t.Fatal(err)
+// }
+// authReq := raAuthClnt.NewRequest(radigo.AccessRequest, 1) // emulates Kamailio packet out of radius_load_caller_avps()
+// if err := authReq.AddAVPWithName("User-Name", "1001", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Service-Type", "SIP-Caller-AVPs", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Sip-From-Tag", "12345678", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
+// t.Error(err)
+// }
+// reply, err := raAuthClnt.SendRequest(authReq)
+// if err != nil {
+// t.Fatal(err)
+// }
+// if reply.Code != radigo.AccessChallenge {
+// t.Errorf("Received reply: %+v", utils.ToJSON(reply))
+// }
+// if len(reply.AVPs) != 1 { // make sure the client receive the message
+// t.Errorf("Received AVPs: %+v", utils.ToJSON(reply.AVPs))
+// } else if !reflect.DeepEqual([]byte("Missing User-Password"), reply.AVPs[0].RawValue) {
+// t.Errorf("Received: %s", string(reply.AVPs[0].RawValue))
+// }
+// }
-func testRAitChallengeResponse(t *testing.T) {
- if raAuthClnt, err = radigo.NewClient("udp", "127.0.0.1:1812", "CGRateS.org", dictRad, 1, nil); err != nil {
- t.Fatal(err)
- }
- authReq := raAuthClnt.NewRequest(radigo.AccessRequest, 1) // emulates Kamailio packet out of radius_load_caller_avps()
- if err := authReq.AddAVPWithName("User-Name", "1001", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("User-Password", "CGRateSPassword1", ""); err != nil {
- t.Error(err)
- }
- // encode the password as required so we can decode it properly
- authReq.AVPs[1].RawValue = radigo.EncodeUserPassWord([]byte("CGRateSPassword1"), []byte("CGRateS.org"), authReq.Authenticator[:])
- if err := authReq.AddAVPWithName("Service-Type", "SIP-Caller-AVPs", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Sip-From-Tag", "12345678", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
- t.Error(err)
- }
- if err := authReq.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
- t.Error(err)
- }
- reply, err := raAuthClnt.SendRequest(authReq)
- if err != nil {
- t.Fatal(err)
- }
- if reply.Code != radigo.AccessAccept {
- t.Errorf("Received reply: %+v", utils.ToJSON(reply))
- }
- if len(reply.AVPs) != 1 { // make sure max duration is received
- t.Errorf("Received AVPs: %+v", utils.ToJSON(reply.AVPs))
- } else if !reflect.DeepEqual([]byte("session_max_time#10800"), reply.AVPs[0].RawValue) {
- t.Errorf("Received: %s", string(reply.AVPs[0].RawValue))
- }
-}
+// func testRAitChallengeResponse(t *testing.T) {
+// if raAuthClnt, err = radigo.NewClient("udp", "127.0.0.1:1812", "CGRateS.org", dictRad, 1, nil); err != nil {
+// t.Fatal(err)
+// }
+// authReq := raAuthClnt.NewRequest(radigo.AccessRequest, 1) // emulates Kamailio packet out of radius_load_caller_avps()
+// if err := authReq.AddAVPWithName("User-Name", "1001", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("User-Password", "CGRateSPassword1", ""); err != nil {
+// t.Error(err)
+// }
+// // encode the password as required so we can decode it properly
+// authReq.AVPs[1].RawValue = radigo.EncodeUserPassWord([]byte("CGRateSPassword1"), []byte("CGRateS.org"), authReq.Authenticator[:])
+// if err := authReq.AddAVPWithName("Service-Type", "SIP-Caller-AVPs", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Sip-From-Tag", "12345678", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
+// t.Error(err)
+// }
+// if err := authReq.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
+// t.Error(err)
+// }
+// reply, err := raAuthClnt.SendRequest(authReq)
+// if err != nil {
+// t.Fatal(err)
+// }
+// if reply.Code != radigo.AccessAccept {
+// t.Errorf("Received reply: %+v", utils.ToJSON(reply))
+// }
+// if len(reply.AVPs) != 1 { // make sure max duration is received
+// t.Errorf("Received AVPs: %+v", utils.ToJSON(reply.AVPs))
+// } else if !reflect.DeepEqual([]byte("session_max_time#10800"), reply.AVPs[0].RawValue) {
+// t.Errorf("Received: %s", string(reply.AVPs[0].RawValue))
+// }
+// }
-func testRAitAcctStart(t *testing.T) {
- if raAcctClnt, err = radigo.NewClient("udp", "127.0.0.1:1813", "CGRateS.org", dictRad, 1, nil); err != nil {
- t.Fatal(err)
- }
- req := raAcctClnt.NewRequest(radigo.AccountingRequest, 2) // emulates Kamailio packet for accounting start
- if err := req.AddAVPWithName("Acct-Status-Type", "Start", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Service-Type", "Sip-Session", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Sip-Response-Code", "200", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Sip-Method", "Invite", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Sip-From-Tag", "51585361", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Sip-To-Tag", "75c2f57b", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("User-Name", "1001", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Ascend-User-Acct-Time", "1497106115", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("NAS-Port", "5060", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Acct-Delay-Time", "0", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
- t.Error(err)
- }
- reply, err := raAcctClnt.SendRequest(req)
- if err != nil {
- t.Error(err)
- }
- if reply.Code != radigo.AccountingResponse {
- t.Errorf("Received reply: %+v", reply)
- }
- if len(reply.AVPs) != 0 { // we don't expect AVPs to be populated
- t.Errorf("Received AVPs: %+v", reply.AVPs)
- }
- // Make sure the sessin is managed by SMG
- time.Sleep(10 * time.Millisecond)
- expUsage := 10 * time.Second
- if isDispatcherActive { // no debit interval set on dispatched session
- expUsage = 3 * time.Hour
- }
- var aSessions []*sessions.ExternalSession
- if err := raRPC.Call(utils.SessionSv1GetActiveSessions,
- utils.SessionFilter{
- Filters: []string{
- fmt.Sprintf("*string:~*opts.%s:%s", utils.MetaRunID, utils.MetaDefault),
- fmt.Sprintf("*string:~*req.%s:%s", utils.OriginID, "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0-51585361-75c2f57b"),
- },
- }, &aSessions); err != nil {
- t.Error(err)
- } else if len(aSessions) != 1 {
- t.Errorf("Unexpected number of sessions received: %+v", aSessions)
- } else if aSessions[0].Usage != expUsage {
- t.Errorf("Expecting %v, received usage: %v\nAnd Session: %s ", expUsage, aSessions[0].Usage, utils.ToJSON(aSessions))
- }
-}
+// func testRAitAcctStart(t *testing.T) {
+// if raAcctClnt, err = radigo.NewClient("udp", "127.0.0.1:1813", "CGRateS.org", dictRad, 1, nil); err != nil {
+// t.Fatal(err)
+// }
+// req := raAcctClnt.NewRequest(radigo.AccountingRequest, 2) // emulates Kamailio packet for accounting start
+// if err := req.AddAVPWithName("Acct-Status-Type", "Start", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Service-Type", "Sip-Session", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Sip-Response-Code", "200", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Sip-Method", "Invite", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Event-Timestamp", "1497106115", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Sip-From-Tag", "51585361", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Sip-To-Tag", "75c2f57b", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("User-Name", "1001", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Ascend-User-Acct-Time", "1497106115", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("NAS-Port", "5060", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Acct-Delay-Time", "0", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
+// t.Error(err)
+// }
+// reply, err := raAcctClnt.SendRequest(req)
+// if err != nil {
+// t.Error(err)
+// }
+// if reply.Code != radigo.AccountingResponse {
+// t.Errorf("Received reply: %+v", reply)
+// }
+// if len(reply.AVPs) != 0 { // we don't expect AVPs to be populated
+// t.Errorf("Received AVPs: %+v", reply.AVPs)
+// }
+// // Make sure the sessin is managed by SMG
+// time.Sleep(10 * time.Millisecond)
+// expUsage := 10 * time.Second
+// if isDispatcherActive { // no debit interval set on dispatched session
+// expUsage = 3 * time.Hour
+// }
+// var aSessions []*sessions.ExternalSession
+// if err := raRPC.Call(utils.SessionSv1GetActiveSessions,
+// utils.SessionFilter{
+// Filters: []string{
+// fmt.Sprintf("*string:~*opts.%s:%s", utils.MetaRunID, utils.MetaDefault),
+// fmt.Sprintf("*string:~*req.%s:%s", utils.OriginID, "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0-51585361-75c2f57b"),
+// },
+// }, &aSessions); err != nil {
+// t.Error(err)
+// } else if len(aSessions) != 1 {
+// t.Errorf("Unexpected number of sessions received: %+v", aSessions)
+// } else if aSessions[0].Usage != expUsage {
+// t.Errorf("Expecting %v, received usage: %v\nAnd Session: %s ", expUsage, aSessions[0].Usage, utils.ToJSON(aSessions))
+// }
+// }
-func testRAitAcctStop(t *testing.T) {
- req := raAcctClnt.NewRequest(radigo.AccountingRequest, 3) // emulates Kamailio packet for accounting start
- if err := req.AddAVPWithName("Acct-Status-Type", "Stop", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Service-Type", "Sip-Session", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Sip-Response-Code", "200", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Sip-Method", "Bye", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Event-Timestamp", "1497106119", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Sip-From-Tag", "51585361", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Sip-To-Tag", "75c2f57b", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("User-Name", "1001", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Ascend-User-Acct-Time", "1497106115", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("NAS-Port", "5060", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("Acct-Delay-Time", "0", ""); err != nil {
- t.Error(err)
- }
- if err := req.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
- t.Error(err)
- }
- reply, err := raAcctClnt.SendRequest(req)
- if err != nil {
- t.Error(err)
- }
- if reply.Code != radigo.AccountingResponse {
- t.Errorf("Received reply: %+v", reply)
- }
- if len(reply.AVPs) != 0 { // we don't expect AVPs to be populated
- t.Errorf("Received AVPs: %+v", reply.AVPs)
- }
- // Make sure the sessin was disconnected from SMG
- var aSessions []*sessions.ExternalSession
- if err := raRPC.Call(utils.SessionSv1GetActiveSessions,
- utils.SessionFilter{
- Filters: []string{
- fmt.Sprintf("*string:~*opts.%s:%s", utils.MetaRunID, utils.MetaDefault),
- fmt.Sprintf("*string:~*req.%s:%s", utils.OriginID, "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0-51585361-75c2f57b"),
- },
- }, &aSessions); err == nil || err.Error() != utils.ErrNotFound.Error() {
- t.Error(err)
- }
- time.Sleep(150 * time.Millisecond)
- var cdrs []*engine.ExternalCDR
- args := utils.RPCCDRsFilter{RunIDs: []string{utils.MetaDefault}, DestinationPrefixes: []string{"1002"}}
- if err := raRPC.Call(utils.APIerSv2GetCDRs, &args, &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 != "4s" {
- t.Errorf("Unexpected CDR Usage received, cdr: %v ", cdrs[0])
- }
- if cdrs[0].CostSource != utils.MetaSessionS {
- t.Errorf("Unexpected CDR CostSource received for CDR: %v", cdrs[0])
- }
- if cdrs[0].Cost != 0.01 {
- t.Errorf("Unexpected CDR Cost received for CDR: %v", cdrs[0].Cost)
- }
- if cdrs[0].ExtraFields["RemoteAddr"] != "127.0.0.1" {
- t.Errorf("Unexpected CDR RemoteAddr received for CDR: %+v", utils.ToJSON(cdrs[0]))
- }
- }
-}
+// func testRAitAcctStop(t *testing.T) {
+// req := raAcctClnt.NewRequest(radigo.AccountingRequest, 3) // emulates Kamailio packet for accounting start
+// if err := req.AddAVPWithName("Acct-Status-Type", "Stop", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Service-Type", "Sip-Session", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Sip-Response-Code", "200", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Sip-Method", "Bye", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Event-Timestamp", "1497106119", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Sip-From-Tag", "51585361", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Sip-To-Tag", "75c2f57b", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Acct-Session-Id", "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("User-Name", "1001", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Called-Station-Id", "1002", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Ascend-User-Acct-Time", "1497106115", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("NAS-Port", "5060", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("Acct-Delay-Time", "0", ""); err != nil {
+// t.Error(err)
+// }
+// if err := req.AddAVPWithName("NAS-IP-Address", "127.0.0.1", ""); err != nil {
+// t.Error(err)
+// }
+// reply, err := raAcctClnt.SendRequest(req)
+// if err != nil {
+// t.Error(err)
+// }
+// if reply.Code != radigo.AccountingResponse {
+// t.Errorf("Received reply: %+v", reply)
+// }
+// if len(reply.AVPs) != 0 { // we don't expect AVPs to be populated
+// t.Errorf("Received AVPs: %+v", reply.AVPs)
+// }
+// // Make sure the sessin was disconnected from SMG
+// var aSessions []*sessions.ExternalSession
+// if err := raRPC.Call(utils.SessionSv1GetActiveSessions,
+// utils.SessionFilter{
+// Filters: []string{
+// fmt.Sprintf("*string:~*opts.%s:%s", utils.MetaRunID, utils.MetaDefault),
+// fmt.Sprintf("*string:~*req.%s:%s", utils.OriginID, "e4921177ab0e3586c37f6a185864b71a@0:0:0:0:0:0:0:0-51585361-75c2f57b"),
+// },
+// }, &aSessions); err == nil || err.Error() != utils.ErrNotFound.Error() {
+// t.Error(err)
+// }
+// time.Sleep(150 * time.Millisecond)
+// var cdrs []*engine.ExternalCDR
+// args := utils.RPCCDRsFilter{RunIDs: []string{utils.MetaDefault}, DestinationPrefixes: []string{"1002"}}
+// if err := raRPC.Call(utils.APIerSv2GetCDRs, &args, &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 != "4s" {
+// t.Errorf("Unexpected CDR Usage received, cdr: %v ", cdrs[0])
+// }
+// if cdrs[0].CostSource != utils.MetaSessionS {
+// t.Errorf("Unexpected CDR CostSource received for CDR: %v", cdrs[0])
+// }
+// if cdrs[0].Cost != 0.01 {
+// t.Errorf("Unexpected CDR Cost received for CDR: %v", cdrs[0].Cost)
+// }
+// if cdrs[0].ExtraFields["RemoteAddr"] != "127.0.0.1" {
+// t.Errorf("Unexpected CDR RemoteAddr received for CDR: %+v", utils.ToJSON(cdrs[0]))
+// }
+// }
+// }
-func testRAitStopCgrEngine(t *testing.T) {
- if err := engine.KillEngine(100); err != nil {
- t.Error(err)
- }
-}
+// func testRAitStopCgrEngine(t *testing.T) {
+// if err := engine.KillEngine(100); err != nil {
+// t.Error(err)
+// }
+// }
diff --git a/agents/sipagent_it_test.go b/agents/sipagent_it_test.go
index cffb1bd4b..8f1d50ed8 100644
--- a/agents/sipagent_it_test.go
+++ b/agents/sipagent_it_test.go
@@ -21,196 +21,196 @@ along with this program. If not, see
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\" ;tag=d28739b9\r\nTo: \"1002\" \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\" ;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\" ;tag=d28739b9\r\nTo: \"1002\" \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\" ;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\" ;tag=99f35805\r\nTo: \r\nMax-Forwards: 70\r\nContact: \"1001\" \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\" ;tag=99f35805\r\nTo: \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\" ;tag=99f35805\r\nTo: \r\nMax-Forwards: 70\r\nContact: \"1001\" \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\" ;tag=99f35805\r\nTo: \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\" ;q=0.7; expires=3600;cgr_cost=0.3;cgr_maxusage=30000000000,\"1002\" ;q=0.2;cgr_cost=0.6;cgr_maxusage=30000000000,\"1002\" ;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\" ;q=0.7; expires=3600;cgr_cost=0.3;cgr_maxusage=30000000000,\"1002\" ;q=0.2;cgr_cost=0.6;cgr_maxusage=30000000000,\"1002\" ;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\" ;q=0.7; expires=3600;cgr_cost=0.3;cgr_maxusage=30000000000,\"1002\" ;q=0.2;cgr_cost=0.6;cgr_maxusage=30000000000,\"1002\" ;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\" ;q=0.7; expires=3600;cgr_cost=0.3;cgr_maxusage=30000000000,\"1002\" ;q=0.2;cgr_cost=0.6;cgr_maxusage=30000000000,\"1002\" ;q=0.1;cgr_cost=0.01;cgr_maxusage=30000000000"; received["Contact"] != expected {
+// t.Errorf("Expected %q, received: %q", expected, received["Contact"])
+// }
- if expected := ""; received["P-Charge-Info"] != expected {
- t.Errorf("Expected %q, received: %q", expected, received["P-Charge-Info"])
- }
+// if expected := ""; 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)
+// }
+// }
diff --git a/data/conf/samples/dnsagent_internal/cgrates.json b/data/conf/samples/dnsagent_internal/cgrates.json
index 17f2c02c5..660460edf 100644
--- a/data/conf/samples/dnsagent_internal/cgrates.json
+++ b/data/conf/samples/dnsagent_internal/cgrates.json
@@ -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,
-},
-}
\ No newline at end of file
+ "loaders": [
+ {
+ "id": "*default",
+ "enabled": true,
+ "tenant": "cgrates.org",
+ "lockfile_path": ".cgr.lck",
+ "tp_in_dir": "/usr/share/cgrates/tariffplans/dnsagent",
+ "tp_out_dir": ""
+ }
+ ]
+}