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": "" + } + ] +}