diff --git a/agents/kamevent_test.go b/agents/kamevent_test.go
index 0fe4535fd..b68ddb46c 100644
--- a/agents/kamevent_test.go
+++ b/agents/kamevent_test.go
@@ -191,6 +191,56 @@ func TestKamEvV1AuthorizeArgs(t *testing.T) {
}
}
+func TestKamEvV1AuthorizeArgs2(t *testing.T) {
+ timezone := config.CgrConfig().GeneralCfg().DefaultTimezone
+ kamEv := KamEvent{"event": "CGR_CALL_END",
+ "callid": "46c01a5c249b469e76333fc6bfa87f6a@0:0:0:0:0:0:0:0",
+ "from_tag": "bf71ad59", "to_tag": "7351fecf",
+ "cgr_reqtype": utils.MetaPostpaid, "cgr_account": "1001",
+ "cgr_destination": "1002", "cgr_answertime": "1419839310",
+ "cgr_duration": "3", "cgr_pdd": "4",
+ utils.CGRRoute: "supplier2",
+ utils.CGRDisconnectCause: "200",
+ utils.CGRFlags: "*accounts,*routes,*routes_maxcost:100,*routes_ignore_errors"}
+ sTime, err := utils.ParseTimeDetectLayout(kamEv[utils.AnswerTime], timezone)
+ if err != nil {
+ return
+ }
+ expected := &sessions.V1AuthorizeArgs{
+ GetMaxUsage: true,
+ CGREvent: &utils.CGREvent{
+ Tenant: utils.FirstNonEmpty(kamEv[utils.Tenant],
+ config.CgrConfig().GeneralCfg().DefaultTenant),
+ ID: utils.UUIDSha1Prefix(),
+ Time: &sTime,
+ Event: kamEv.AsMapStringInterface(),
+ },
+ GetRoutes: true,
+ RoutesIgnoreErrors: true,
+ RoutesMaxCost: "100",
+ }
+ rcv := kamEv.V1AuthorizeArgs()
+ if !reflect.DeepEqual(expected.CGREvent.Tenant, rcv.CGREvent.Tenant) {
+ t.Errorf("Expecting: %+v, received: %+v", expected.CGREvent.Tenant, rcv.CGREvent.Tenant)
+ } else if !reflect.DeepEqual(expected.CGREvent.Time, rcv.CGREvent.Time) {
+ t.Errorf("Expecting: %+v, received: %+v", expected.CGREvent.Time, rcv.CGREvent.Time)
+ } else if !reflect.DeepEqual(expected.CGREvent.Event, rcv.CGREvent.Event) {
+ t.Errorf("Expecting: %+v, received: %+v", expected.CGREvent.Event, rcv.CGREvent.Event)
+ } else if !reflect.DeepEqual(expected.CGREvent.Event, rcv.CGREvent.Event) {
+ t.Errorf("Expecting: %+v, received: %+v", expected.CGREvent.Event, rcv.CGREvent.Event)
+ } else if !reflect.DeepEqual(expected.GetMaxUsage, rcv.GetMaxUsage) {
+ t.Errorf("Expecting: %+v, received: %+v", expected.GetMaxUsage, rcv.GetMaxUsage)
+ } else if !reflect.DeepEqual(expected.GetRoutes, rcv.GetRoutes) {
+ t.Errorf("Expecting: %+v, received: %+v", expected.GetRoutes, rcv.GetRoutes)
+ } else if !reflect.DeepEqual(expected.GetAttributes, rcv.GetAttributes) {
+ t.Errorf("Expecting: %+v, received: %+v", expected.GetAttributes, rcv.GetAttributes)
+ } else if !reflect.DeepEqual(expected.RoutesMaxCost, rcv.RoutesMaxCost) {
+ t.Errorf("Expecting: %+v, received: %+v", expected.RoutesMaxCost, rcv.RoutesMaxCost)
+ } else if !reflect.DeepEqual(expected.RoutesIgnoreErrors, rcv.RoutesIgnoreErrors) {
+ t.Errorf("Expecting: %+v, received: %+v", expected.RoutesIgnoreErrors, rcv.RoutesIgnoreErrors)
+ }
+}
+
func TestKamEvAsKamAuthReply(t *testing.T) {
timezone := config.CgrConfig().GeneralCfg().DefaultTimezone
kamEv := KamEvent{"event": "CGR_CALL_END",
diff --git a/docs/diamagent.rst b/docs/diamagent.rst
index ee64741e0..f8ebc5494 100644
--- a/docs/diamagent.rst
+++ b/docs/diamagent.rst
@@ -261,7 +261,7 @@ flags
**\*auth**
Sends the request for authorization on CGRateS.
- Auxiliary flags available: **\*attributes**, **\*thresholds**, **\*stats**, **\*resources**, **\*accounts**, **\*routes**, **\*routes_ignore_errors**, **\*routes_event_cost** which are used to influence the auth behavior on CGRateS side. More info on that can be found on the **SessionS** component's API behavior.
+ Auxiliary flags available: **\*attributes**, **\*thresholds**, **\*stats**, **\*resources**, **\*accounts**, **\*routes**, **\*routes_ignore_errors**, **\*routes_event_cost**, **\*routes_maxcost** which are used to influence the auth behavior on CGRateS side. More info on that can be found on the **SessionS** component's API behavior.
**\*initiate**
Initiates a session out of request on CGRateS side.
@@ -281,7 +281,7 @@ flags
**\*message**
Process the request as individual message charging on CGRateS side.
- Auxiliary flags available: **\*attributes**, **\*thresholds**, **\*stats**, **\*resources**, **\*accounts**, **\*routes**, **\*routes_ignore_errors**, **\*routes_event_cost** which are used to influence the behavior on CGRateS side.
+ Auxiliary flags available: **\*attributes**, **\*thresholds**, **\*stats**, **\*resources**, **\*accounts**, **\*routes**, **\*routes_ignore_errors**, **\*routes_event_cost**, **\*routes_maxcost** which are used to influence the behavior on CGRateS side.
**\*event**
diff --git a/docs/ers.rst b/docs/ers.rst
index 8648a3fa5..5f1240f36 100644
--- a/docs/ers.rst
+++ b/docs/ers.rst
@@ -214,7 +214,7 @@ flags
**\*auth**
Sends the Event for authorization on CGRateS.
- Auxiliary flags available: **\*attributes**, **\*thresholds**, **\*stats**, **\*resources**, **\*accounts**, **\*routes**, **\*routes_ignore_errors**, **\*routes_event_cost** which are used to influence the auth behavior on CGRateS side. More info on that can be found on the **SessionS** component's API behavior.
+ Auxiliary flags available: **\*attributes**, **\*thresholds**, **\*stats**, **\*resources**, **\*accounts**, **\*routes**, **\*routes_ignore_errors**, **\*routes_event_cost**, **\*routes_maxcost** which are used to influence the auth behavior on CGRateS side. More info on that can be found on the **SessionS** component's API behavior.
**\*initiate**
Initiates a session out of Event on CGRateS side.
@@ -234,7 +234,7 @@ flags
**\*message**
Process the Event as individual message charging on CGRateS side.
- Auxiliary flags available: **\*attributes**, **\*thresholds**, **\*stats**, **\*resources**, **\*accounts**, **\*routes**, **\*routes_ignore_errors**, **\*routes_event_cost** which are used to influence the behavior on CGRateS side.
+ Auxiliary flags available: **\*attributes**, **\*thresholds**, **\*stats**, **\*resources**, **\*accounts**, **\*routes**, **\*routes_ignore_errors**, **\*routes_event_cost**, **\*routes_maxcost** which are used to influence the behavior on CGRateS side.
**\*event**
Process the Event as generic event on CGRateS side.
diff --git a/general_tests/session4_it_test.go b/general_tests/session4_it_test.go
index cd350e312..7264b2422 100644
--- a/general_tests/session4_it_test.go
+++ b/general_tests/session4_it_test.go
@@ -129,7 +129,6 @@ func testSes4CDRsProcessCDR(t *testing.T) {
// will make the BalanceInfo nil and result in a panic
args := &engine.ArgV1ProcessEvent{
Flags: []string{utils.MetaRALs, utils.MetaStore, "*routes:false", utils.MetaRerate},
-
CGREvent: utils.CGREvent{
Tenant: "cgrates.org",
Event: map[string]interface{}{
diff --git a/general_tests/sessionroutes_it_test.go b/general_tests/sessionroutes_it_test.go
new file mode 100644
index 000000000..cf4de395a
--- /dev/null
+++ b/general_tests/sessionroutes_it_test.go
@@ -0,0 +1,532 @@
+// +build integration
+
+/*
+Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments
+Copyright (C) ITsysCOM GmbH
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see
+*/
+
+package general_tests
+
+import (
+ "net/rpc"
+ "path"
+ "reflect"
+ "testing"
+ "time"
+
+ "github.com/cgrates/cgrates/config"
+ "github.com/cgrates/cgrates/engine"
+ "github.com/cgrates/cgrates/sessions"
+ "github.com/cgrates/cgrates/utils"
+)
+
+var (
+ sesRoutesCfgDir string
+ sesRoutesCfgPath string
+ sesRoutesCfg *config.CGRConfig
+ sesRoutesRPC *rpc.Client
+
+ sesRoutesTests = []func(t *testing.T){
+ testSesRoutesItLoadConfig,
+ testSesRoutesItResetDataDB,
+ testSesRoutesItResetStorDb,
+ testSesRoutesItStartEngine,
+ testSesRoutesItRPCConn,
+ testSesRoutesItLoadFromFolder,
+
+ testSesRoutesAuthorizeEvent,
+ testSesRoutesProcessMessage,
+ testSesRoutesProcessEvent,
+
+ testSesRoutesItStopCgrEngine,
+ }
+)
+
+func TestSesRoutesItSessions(t *testing.T) {
+ switch *dbType {
+ case utils.MetaInternal:
+ sesRoutesCfgDir = "tutinternal"
+ case utils.MetaMySQL:
+ sesRoutesCfgDir = "tutmysql"
+ case utils.MetaMongo:
+ sesRoutesCfgDir = "tutmongo"
+ case utils.MetaPostgres:
+ t.SkipNow()
+ default:
+ t.Fatal("Unknown Database type")
+ }
+ for _, stest := range sesRoutesTests {
+ t.Run(sesRoutesCfgDir, stest)
+ }
+}
+
+func testSesRoutesItLoadConfig(t *testing.T) {
+ sesRoutesCfgPath = path.Join(*dataDir, "conf", "samples", sesRoutesCfgDir)
+ if sesRoutesCfg, err = config.NewCGRConfigFromPath(sesRoutesCfgPath); err != nil {
+ t.Error(err)
+ }
+}
+
+func testSesRoutesItResetDataDB(t *testing.T) {
+ if err := engine.InitDataDb(sesRoutesCfg); err != nil {
+ t.Fatal(err)
+ }
+}
+
+func testSesRoutesItResetStorDb(t *testing.T) {
+ if err := engine.InitStorDb(sesRoutesCfg); err != nil {
+ t.Fatal(err)
+ }
+}
+
+func testSesRoutesItStartEngine(t *testing.T) {
+ if _, err := engine.StopStartEngine(sesRoutesCfgPath, *waitRater); err != nil {
+ t.Fatal(err)
+ }
+}
+
+func testSesRoutesItRPCConn(t *testing.T) {
+ var err error
+ sesRoutesRPC, err = newRPCClient(sesRoutesCfg.ListenCfg())
+ if err != nil {
+ t.Fatal(err)
+ }
+}
+
+func testSesRoutesItLoadFromFolder(t *testing.T) {
+ var reply string
+ attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "testit")}
+ if err := sesRoutesRPC.Call(utils.APIerSv1LoadTariffPlanFromFolder, attrs, &reply); err != nil {
+ t.Error(err)
+ }
+ time.Sleep(100 * time.Millisecond)
+}
+
+func testSesRoutesAuthorizeEvent(t *testing.T) {
+ cgrEv := &utils.CGREvent{
+ Tenant: "cgrates.org",
+ Event: map[string]interface{}{
+ utils.Source: "testV4CDRsProcessCDR",
+ utils.OriginID: "testV4CDRsProcessCDR",
+ utils.OriginHost: "192.168.1.1",
+ utils.RequestType: utils.MetaPostpaid,
+ utils.Category: utils.Call,
+ utils.AccountField: "1003",
+ utils.Subject: "1003",
+ utils.Destination: "1002",
+ utils.AnswerTime: time.Date(2018, 8, 24, 16, 00, 26, 0, time.UTC),
+ utils.SetupTime: time.Date(2018, 8, 24, 16, 00, 00, 0, time.UTC),
+ utils.Usage: time.Minute,
+ },
+ }
+ args := sessions.NewV1AuthorizeArgs(false, []string{},
+ false, []string{}, false, []string{}, false, false,
+ true, false, false, cgrEv, utils.Paginator{}, false, "")
+
+ var rply sessions.V1AuthorizeReply
+ if err := sesRoutesRPC.Call(utils.SessionSv1AuthorizeEvent, args, &rply); err != nil {
+ t.Fatal(err)
+ }
+ expected := sessions.V1AuthorizeReply{
+ Routes: &engine.SortedRoutes{
+ ProfileID: "ROUTE_LEASTCOST_1",
+ Sorting: "*lc",
+ Count: 3,
+ SortedRoutes: []*engine.SortedRoute{
+ {
+ RouteID: "route3",
+ RouteParameters: "",
+ SortingData: map[string]interface{}{
+ "Cost": 0.0102,
+ "RatingPlanID": "RP_SPECIAL_1002",
+ "Weight": 15.,
+ },
+ }, {
+ RouteID: "route1",
+ RouteParameters: "",
+ SortingData: map[string]interface{}{
+ "Cost": 0.0102,
+ "RatingPlanID": "RP_SPECIAL_1002",
+ "Weight": 10.,
+ },
+ }, {
+ RouteID: "route2",
+ RouteParameters: "",
+ SortingData: map[string]interface{}{
+ "Cost": 1.2,
+ "RatingPlanID": "RP_RETAIL1",
+ "Weight": 20.,
+ },
+ },
+ },
+ },
+ }
+ if !reflect.DeepEqual(rply, expected) {
+ t.Errorf("Expected: %s, received: %s", utils.ToJSON(expected), utils.ToJSON(rply))
+ }
+ args = sessions.NewV1AuthorizeArgs(false, []string{},
+ false, []string{}, false, []string{}, false, false,
+ true, false, false, cgrEv, utils.Paginator{}, false, "2")
+
+ rply = sessions.V1AuthorizeReply{}
+ if err := sesRoutesRPC.Call(utils.SessionSv1ProcessMessage,
+ args, &rply); err != nil {
+ t.Fatal(err)
+ }
+
+ if !reflect.DeepEqual(rply, expected) {
+ t.Errorf("Expected: %s, received: %s", utils.ToJSON(expected), utils.ToJSON(rply))
+ }
+
+ expected = sessions.V1AuthorizeReply{
+ Routes: &engine.SortedRoutes{
+ ProfileID: "ROUTE_LEASTCOST_1",
+ Sorting: "*lc",
+ Count: 2,
+ SortedRoutes: []*engine.SortedRoute{
+ {
+ RouteID: "route3",
+ RouteParameters: "",
+ SortingData: map[string]interface{}{
+ "Cost": 0.0102,
+ "RatingPlanID": "RP_SPECIAL_1002",
+ "Weight": 15.,
+ },
+ }, {
+ RouteID: "route1",
+ RouteParameters: "",
+ SortingData: map[string]interface{}{
+ "Cost": 0.0102,
+ "RatingPlanID": "RP_SPECIAL_1002",
+ "Weight": 10.,
+ },
+ },
+ },
+ },
+ }
+
+ args = sessions.NewV1AuthorizeArgs(false, []string{},
+ false, []string{}, false, []string{}, false, false,
+ true, false, false, cgrEv, utils.Paginator{}, false, "1")
+
+ rply = sessions.V1AuthorizeReply{}
+ if err := sesRoutesRPC.Call(utils.SessionSv1ProcessMessage,
+ args, &rply); err != nil {
+ t.Fatal(err)
+ }
+
+ if !reflect.DeepEqual(rply, expected) {
+ t.Errorf("Expected: %s, received: %s", utils.ToJSON(expected), utils.ToJSON(rply))
+ }
+
+ args = sessions.NewV1AuthorizeArgs(false, []string{},
+ false, []string{}, false, []string{}, false, false,
+ true, false, true, cgrEv, utils.Paginator{}, false, "")
+
+ rply = sessions.V1AuthorizeReply{}
+ if err := sesRoutesRPC.Call(utils.SessionSv1ProcessMessage,
+ args, &rply); err != nil {
+ t.Fatal(err)
+ }
+
+ if !reflect.DeepEqual(rply, expected) {
+ t.Errorf("Expected: %s, received: %s", utils.ToJSON(expected), utils.ToJSON(rply))
+ }
+}
+
+func testSesRoutesProcessMessage(t *testing.T) {
+ cgrEv := &utils.CGREvent{
+ Tenant: "cgrates.org",
+ Event: map[string]interface{}{
+ utils.Source: "testV4CDRsProcessCDR",
+ utils.OriginID: "testV4CDRsProcessCDR",
+ utils.OriginHost: "192.168.1.1",
+ utils.RequestType: utils.MetaPostpaid,
+ utils.Category: utils.Call,
+ utils.AccountField: "1003",
+ utils.Subject: "1003",
+ utils.Destination: "1002",
+ utils.AnswerTime: time.Date(2018, 8, 24, 16, 00, 26, 0, time.UTC),
+ utils.SetupTime: time.Date(2018, 8, 24, 16, 00, 00, 0, time.UTC),
+ utils.Usage: time.Minute,
+ },
+ }
+ args := sessions.NewV1ProcessMessageArgs(false, []string{},
+ false, []string{}, false, []string{}, false, false,
+ true, false, false, cgrEv, utils.Paginator{}, false, "")
+
+ var rply sessions.V1ProcessMessageReply
+ if err := sesRoutesRPC.Call(utils.SessionSv1ProcessMessage,
+ args, &rply); err != nil {
+ t.Fatal(err)
+ }
+ expected := sessions.V1ProcessMessageReply{
+ Routes: &engine.SortedRoutes{
+ ProfileID: "ROUTE_LEASTCOST_1",
+ Sorting: "*lc",
+ Count: 3,
+ SortedRoutes: []*engine.SortedRoute{
+ {
+ RouteID: "route3",
+ RouteParameters: "",
+ SortingData: map[string]interface{}{
+ "Cost": 0.0102,
+ "RatingPlanID": "RP_SPECIAL_1002",
+ "Weight": 15.,
+ },
+ }, {
+ RouteID: "route1",
+ RouteParameters: "",
+ SortingData: map[string]interface{}{
+ "Cost": 0.0102,
+ "RatingPlanID": "RP_SPECIAL_1002",
+ "Weight": 10.,
+ },
+ }, {
+ RouteID: "route2",
+ RouteParameters: "",
+ SortingData: map[string]interface{}{
+ "Cost": 1.2,
+ "RatingPlanID": "RP_RETAIL1",
+ "Weight": 20.,
+ },
+ },
+ },
+ },
+ }
+ if !reflect.DeepEqual(rply, expected) {
+ t.Errorf("Expected: %s, received: %s", utils.ToJSON(expected), utils.ToJSON(rply))
+ }
+
+ args = sessions.NewV1ProcessMessageArgs(false, []string{},
+ false, []string{}, false, []string{}, false, false,
+ true, false, false, cgrEv, utils.Paginator{}, false, "2")
+
+ rply = sessions.V1ProcessMessageReply{}
+ if err := sesRoutesRPC.Call(utils.SessionSv1ProcessMessage,
+ args, &rply); err != nil {
+ t.Fatal(err)
+ }
+
+ if !reflect.DeepEqual(rply, expected) {
+ t.Errorf("Expected: %s, received: %s", utils.ToJSON(expected), utils.ToJSON(rply))
+ }
+
+ expected = sessions.V1ProcessMessageReply{
+ Routes: &engine.SortedRoutes{
+ ProfileID: "ROUTE_LEASTCOST_1",
+ Sorting: "*lc",
+ Count: 2,
+ SortedRoutes: []*engine.SortedRoute{
+ {
+ RouteID: "route3",
+ RouteParameters: "",
+ SortingData: map[string]interface{}{
+ "Cost": 0.0102,
+ "RatingPlanID": "RP_SPECIAL_1002",
+ "Weight": 15.,
+ },
+ }, {
+ RouteID: "route1",
+ RouteParameters: "",
+ SortingData: map[string]interface{}{
+ "Cost": 0.0102,
+ "RatingPlanID": "RP_SPECIAL_1002",
+ "Weight": 10.,
+ },
+ },
+ },
+ },
+ }
+
+ args = sessions.NewV1ProcessMessageArgs(false, []string{},
+ false, []string{}, false, []string{}, false, false,
+ true, false, false, cgrEv, utils.Paginator{}, false, "1")
+
+ rply = sessions.V1ProcessMessageReply{}
+ if err := sesRoutesRPC.Call(utils.SessionSv1ProcessMessage,
+ args, &rply); err != nil {
+ t.Fatal(err)
+ }
+
+ if !reflect.DeepEqual(rply, expected) {
+ t.Errorf("Expected: %s, received: %s", utils.ToJSON(expected), utils.ToJSON(rply))
+ }
+
+ args = sessions.NewV1ProcessMessageArgs(false, []string{},
+ false, []string{}, false, []string{}, false, false,
+ true, false, true, cgrEv, utils.Paginator{}, false, "")
+
+ rply = sessions.V1ProcessMessageReply{}
+ if err := sesRoutesRPC.Call(utils.SessionSv1ProcessMessage,
+ args, &rply); err != nil {
+ t.Fatal(err)
+ }
+
+ if !reflect.DeepEqual(rply, expected) {
+ t.Errorf("Expected: %s, received: %s", utils.ToJSON(expected), utils.ToJSON(rply))
+ }
+}
+
+func testSesRoutesProcessEvent(t *testing.T) {
+ cgrEv := &utils.CGREvent{
+ Tenant: "cgrates.org",
+ Event: map[string]interface{}{
+ utils.Source: "testV4CDRsProcessCDR",
+ utils.OriginID: "testV4CDRsProcessCDR",
+ utils.OriginHost: "192.168.1.1",
+ utils.RequestType: utils.MetaPostpaid,
+ utils.Category: utils.Call,
+ utils.AccountField: "1003",
+ utils.Subject: "1003",
+ utils.Destination: "1002",
+ utils.AnswerTime: time.Date(2018, 8, 24, 16, 00, 26, 0, time.UTC),
+ utils.SetupTime: time.Date(2018, 8, 24, 16, 00, 00, 0, time.UTC),
+ utils.Usage: time.Minute,
+ },
+ }
+ args := sessions.V1ProcessEventArgs{
+ Flags: []string{"*routes"},
+ CGREvent: cgrEv,
+ Paginator: utils.Paginator{},
+ }
+
+ var rply sessions.V1ProcessEventReply
+ if err := sesRoutesRPC.Call(utils.SessionSv1ProcessEvent, args, &rply); err != nil {
+ t.Fatal(err)
+ }
+ expected := sessions.V1ProcessEventReply{
+ Routes: map[string]*engine.SortedRoutes{
+ utils.MetaRaw: {
+ ProfileID: "ROUTE_LEASTCOST_1",
+ Sorting: "*lc",
+ Count: 3,
+ SortedRoutes: []*engine.SortedRoute{
+ {
+ RouteID: "route3",
+ RouteParameters: "",
+ SortingData: map[string]interface{}{
+ "Cost": 0.0102,
+ "RatingPlanID": "RP_SPECIAL_1002",
+ "Weight": 15.,
+ },
+ }, {
+ RouteID: "route1",
+ RouteParameters: "",
+ SortingData: map[string]interface{}{
+ "Cost": 0.0102,
+ "RatingPlanID": "RP_SPECIAL_1002",
+ "Weight": 10.,
+ },
+ }, {
+ RouteID: "route2",
+ RouteParameters: "",
+ SortingData: map[string]interface{}{
+ "Cost": 1.2,
+ "RatingPlanID": "RP_RETAIL1",
+ "Weight": 20.,
+ },
+ },
+ },
+ },
+ },
+ }
+ if !reflect.DeepEqual(rply, expected) {
+ t.Errorf("Expected: %s, received: %s", utils.ToJSON(expected), utils.ToJSON(rply))
+ }
+
+ args = sessions.V1ProcessEventArgs{
+ Flags: []string{"*routes:*maxcost:2"},
+ CGREvent: cgrEv,
+ Paginator: utils.Paginator{},
+ }
+
+ rply = sessions.V1ProcessEventReply{}
+ if err := sesRoutesRPC.Call(utils.SessionSv1ProcessEvent,
+ args, &rply); err != nil {
+ t.Fatal(err)
+ }
+
+ if !reflect.DeepEqual(rply, expected) {
+ t.Errorf("Expected: %s, received: %s", utils.ToJSON(expected), utils.ToJSON(rply))
+ }
+
+ expected = sessions.V1ProcessEventReply{
+ Routes: map[string]*engine.SortedRoutes{
+ utils.MetaRaw: {
+ ProfileID: "ROUTE_LEASTCOST_1",
+ Sorting: "*lc",
+ Count: 2,
+ SortedRoutes: []*engine.SortedRoute{
+ {
+ RouteID: "route3",
+ RouteParameters: "",
+ SortingData: map[string]interface{}{
+ "Cost": 0.0102,
+ "RatingPlanID": "RP_SPECIAL_1002",
+ "Weight": 15.,
+ },
+ }, {
+ RouteID: "route1",
+ RouteParameters: "",
+ SortingData: map[string]interface{}{
+ "Cost": 0.0102,
+ "RatingPlanID": "RP_SPECIAL_1002",
+ "Weight": 10.,
+ },
+ },
+ },
+ },
+ },
+ }
+
+ args = sessions.V1ProcessEventArgs{
+ Flags: []string{"*routes:*maxcost:1"},
+ CGREvent: cgrEv,
+ Paginator: utils.Paginator{},
+ }
+ rply = sessions.V1ProcessEventReply{}
+ if err := sesRoutesRPC.Call(utils.SessionSv1ProcessEvent,
+ args, &rply); err != nil {
+ t.Fatal(err)
+ }
+
+ if !reflect.DeepEqual(rply, expected) {
+ t.Errorf("Expected: %s, received: %s", utils.ToJSON(expected), utils.ToJSON(rply))
+ }
+
+ args = sessions.V1ProcessEventArgs{
+ Flags: []string{"*routes:*event_cost"},
+ CGREvent: cgrEv,
+ Paginator: utils.Paginator{},
+ }
+
+ rply = sessions.V1ProcessEventReply{}
+ if err := sesRoutesRPC.Call(utils.SessionSv1ProcessEvent,
+ args, &rply); err != nil {
+ t.Fatal(err)
+ }
+
+ if !reflect.DeepEqual(rply, expected) {
+ t.Errorf("Expected: %s, received: %s", utils.ToJSON(expected), utils.ToJSON(rply))
+ }
+}
+
+func testSesRoutesItStopCgrEngine(t *testing.T) {
+ if err := engine.KillEngine(100); err != nil {
+ t.Error(err)
+ }
+}
diff --git a/rates/rates_test.go b/rates/rates_test.go
index de2cc2845..79de1365c 100644
--- a/rates/rates_test.go
+++ b/rates/rates_test.go
@@ -504,7 +504,6 @@ func TestV1CostForEventError(t *testing.T) {
expectedErr = "SERVER_ERROR: zero increment to be charged within rate: "
rPrf.Rates["RATE1"].IntervalRates[0].Increment = utils.NewDecimal(0, 0)
if err := rateS.V1CostForEvent(&utils.ArgsCostForEvent{
-
CGREvent: &utils.CGREvent{
Tenant: "cgrates.org",
ID: "RATE_1",
diff --git a/sessions/sessions.go b/sessions/sessions.go
index d7c5e7bac..81ab0f204 100644
--- a/sessions/sessions.go
+++ b/sessions/sessions.go
@@ -1771,7 +1771,7 @@ func NewV1AuthorizeArgs(attrs bool, attributeIDs []string,
ForceDuration: forceDuration,
}
if routesEventCost {
- args.RoutesMaxCost = utils.MetaRoutesEventCost
+ args.RoutesMaxCost = utils.MetaEventCost
} else {
args.RoutesMaxCost = routesMaxCost
}
@@ -2700,7 +2700,7 @@ func NewV1ProcessMessageArgs(attrs bool, attributeIDs []string,
ForceDuration: forceDuration,
}
if routesEventCost {
- args.RoutesMaxCost = utils.MetaRoutesEventCost
+ args.RoutesMaxCost = utils.MetaEventCost
} else {
args.RoutesMaxCost = routesMaxCost
}
@@ -3100,9 +3100,9 @@ func (sS *SessionS) BiRPCv1ProcessEvent(clnt rpcclient.ClientConnector,
ignoreErrors := flags.Has(utils.MetaIgnoreErrors)
var maxCost string
if flags.Has(utils.MetaEventCost) {
- maxCost = utils.MetaRoutesEventCost
+ maxCost = utils.MetaEventCost
} else {
- maxCost = flags.ParamValue(utils.MetaRoutesMaxCost)
+ maxCost = flags.ParamValue(utils.MetaMaxCost)
}
for runID, cgrEv := range getDerivedEvents(events, flags.Has(utils.MetaDerivedReply)) {
routesReply, err := sS.getRoutes(cgrEv.Clone(), args.Paginator, ignoreErrors, maxCost, false)
diff --git a/sessions/sessions_test.go b/sessions/sessions_test.go
index c8e44c992..d12fc7794 100644
--- a/sessions/sessions_test.go
+++ b/sessions/sessions_test.go
@@ -918,7 +918,7 @@ func TestSessionSNewV1AuthorizeArgs(t *testing.T) {
ProcessStats: true,
GetRoutes: false,
RoutesIgnoreErrors: true,
- RoutesMaxCost: utils.MetaRoutesEventCost,
+ RoutesMaxCost: utils.MetaEventCost,
CGREvent: cgrEv,
ForceDuration: true,
}
@@ -938,7 +938,7 @@ func TestSessionSNewV1AuthorizeArgs(t *testing.T) {
ProcessStats: true,
GetRoutes: false,
RoutesIgnoreErrors: true,
- RoutesMaxCost: utils.MetaRoutesEventCost,
+ RoutesMaxCost: utils.MetaEventCost,
CGREvent: cgrEv,
AttributeIDs: []string{"ATTR1", "ATTR2"},
ThresholdIDs: []string{"ID1", "ID2"},
@@ -1167,7 +1167,7 @@ func TestSessionSNewV1ProcessMessageArgs(t *testing.T) {
GetAttributes: true,
CGREvent: cgrEv,
GetRoutes: true,
- RoutesMaxCost: utils.MetaRoutesEventCost,
+ RoutesMaxCost: utils.MetaEventCost,
RoutesIgnoreErrors: true,
ForceDuration: true,
}
@@ -1186,7 +1186,7 @@ func TestSessionSNewV1ProcessMessageArgs(t *testing.T) {
GetAttributes: true,
CGREvent: cgrEv,
GetRoutes: true,
- RoutesMaxCost: utils.MetaRoutesEventCost,
+ RoutesMaxCost: utils.MetaEventCost,
RoutesIgnoreErrors: true,
AttributeIDs: []string{"ATTR1", "ATTR2"},
ThresholdIDs: []string{"ID1", "ID2"},
@@ -1624,7 +1624,7 @@ func TestSessionSNewV1AuthorizeArgsWithOpts(t *testing.T) {
ProcessStats: true,
GetRoutes: false,
RoutesIgnoreErrors: true,
- RoutesMaxCost: utils.MetaRoutesEventCost,
+ RoutesMaxCost: utils.MetaEventCost,
CGREvent: cgrEv,
ForceDuration: true,
}
@@ -1668,7 +1668,7 @@ func TestSessionSNewV1AuthorizeArgsWithOpts2(t *testing.T) {
ProcessStats: true,
GetRoutes: false,
RoutesIgnoreErrors: true,
- RoutesMaxCost: utils.MetaRoutesEventCost,
+ RoutesMaxCost: utils.MetaEventCost,
CGREvent: cgrEv,
ForceDuration: true,
}
diff --git a/utils/consts.go b/utils/consts.go
index 2cd51b864..a8e8b7caf 100755
--- a/utils/consts.go
+++ b/utils/consts.go
@@ -736,6 +736,7 @@ const (
MetaNegativeExports = "*negative_exports"
MetaRoutesEventCost = "*routes_event_cost"
MetaRoutesMaxCost = "*routes_maxcost"
+ MetaMaxCost = "*maxcost"
MetaRoutesIgnoreErrors = "*routes_ignore_errors"
Freeswitch = "freeswitch"
Kamailio = "kamailio"