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"