mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
1388 lines
36 KiB
Go
1388 lines
36 KiB
Go
//go:build flaky
|
|
|
|
/*
|
|
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 Affero 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 Affero General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>
|
|
*/
|
|
|
|
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"os/exec"
|
|
"path"
|
|
"reflect"
|
|
"sort"
|
|
"testing"
|
|
|
|
"github.com/cgrates/birpc/context"
|
|
"github.com/cgrates/cgrates/config"
|
|
"github.com/cgrates/cgrates/engine"
|
|
"github.com/cgrates/cgrates/utils"
|
|
)
|
|
|
|
var (
|
|
cnslItCfgPath string
|
|
cnslItDirPath string
|
|
cnslItCfg *config.CGRConfig
|
|
cnslItTests = []func(t *testing.T){
|
|
testConsoleItLoadConfig,
|
|
testConsoleItInitDataDB,
|
|
|
|
testConsoleItStartEngine,
|
|
testConsoleItLoadTP,
|
|
testConsoleItCacheClear,
|
|
testConsoleItThreshold,
|
|
testConsoleItThresholdsProfileIds,
|
|
testConsoleItThresholdsProfileSet,
|
|
testConsoleItThresholdsProfile,
|
|
testConsoleItThresholdsProcessEvent,
|
|
testConsoleItThresholdsForEvent,
|
|
testConsoleItRatesProfileSet,
|
|
testConsoleItRatesProfileIds,
|
|
testConsoleItResourcesProfileIds,
|
|
testConsoleItResourcesProfile,
|
|
testConsoleItResourcesRelease,
|
|
testConsoleItResourcesProfileSet,
|
|
testConsoleItResourcesForEvent,
|
|
testConsoleItResourcesAllocate,
|
|
testConsoleItResources,
|
|
testConsoleItResourcesAuthorize,
|
|
testConsoleItRouteProfileIds,
|
|
testConsoleItRoutesProfilesForEvent,
|
|
testConsoleItRoutesProfile,
|
|
testConsoleItRoutes,
|
|
testConsoleItCacheReload,
|
|
testConsoleItAttributesProfileIds,
|
|
testConsoleItAttributesProfileSet,
|
|
testConsoleItFilterIds,
|
|
testConsoleItFilterSet,
|
|
testConsoleItAccountsSet,
|
|
testConsoleItCacheHasItem,
|
|
testConsoleItStatsMetrics,
|
|
testConsoleItStatsProfileSet,
|
|
testConsoleItStatsProfile,
|
|
testConsoleItStatsForEvent,
|
|
testConsoleItStatsProfileIds,
|
|
testConsoleItStatsProcessEvent,
|
|
testConsoleItGetJsonSection,
|
|
testConsoleItStatus,
|
|
testConsoleItCacheRemoveItem,
|
|
testConsoleItFilter,
|
|
testConsoleItPing,
|
|
testConsoleItReloadConfig,
|
|
testConsoleItCacheStats,
|
|
testConsoleItKillEngine,
|
|
}
|
|
)
|
|
|
|
func TestConsoleItTests(t *testing.T) {
|
|
switch *utils.DBType {
|
|
case utils.MetaInternal:
|
|
t.SkipNow()
|
|
case utils.MetaRedis:
|
|
cnslItDirPath = "tutredis"
|
|
case utils.MetaMySQL:
|
|
cnslItDirPath = "tutmysql"
|
|
case utils.MetaMongo:
|
|
cnslItDirPath = "tutmongo"
|
|
case utils.MetaPostgres:
|
|
t.SkipNow()
|
|
default:
|
|
t.Fatal("Unknown database type")
|
|
}
|
|
for _, test := range cnslItTests {
|
|
t.Run("TestConsoleItTests", test)
|
|
}
|
|
}
|
|
|
|
func testConsoleItLoadConfig(t *testing.T) {
|
|
var err error
|
|
cnslItCfgPath = path.Join(*utils.DataDir, "conf", "samples", cnslItDirPath)
|
|
if cnslItCfg, err = config.NewCGRConfigFromPath(context.Background(), cnslItCfgPath); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func testConsoleItInitDataDB(t *testing.T) {
|
|
if err := engine.InitDB(cnslItCfg); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func testConsoleItStartEngine(t *testing.T) {
|
|
if _, err := engine.StartEngine(cnslItCfgPath, *utils.WaitRater); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func testConsoleItLoadTP(t *testing.T) {
|
|
cmd := exec.Command("cgr-loader", "-config_path="+cnslItCfgPath, "-path="+path.Join(*utils.DataDir, "tariffplans", "tutorial"))
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func testConsoleItCacheClear(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "cache_clear")
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := "OK"
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItThresholdsProfileIds(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "thresholds_profile_ids", `Tenant="cgrates.org"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := []string{"THD_ACNT_1001", "THD_ACNT_1002"}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv []string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
sort.Strings(rcv)
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
|
|
}
|
|
|
|
func testConsoleItResourcesProfileIds(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "resources_profile_ids", "Tenant", "cgrates.org")
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := []string{"ResGroup1"}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv []string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
sort.Strings(rcv)
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItRatesProfileSet(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "rates_profile_set", `Tenant="cgrates.org"`, `ID="123"`, `Rates={"RT_WEEK":{"ID":"RT_WEEK"}}`)
|
|
output := bytes.NewBuffer(nil)
|
|
expected := "OK"
|
|
cmd.Stdout = output
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %s \n but received \n %s", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItRouteProfileIds(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "route_profile_ids", "Tenant", "cgrates.org")
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := []string{"ROUTE_ACNT_1001", "ROUTE_ACNT_1002", "ROUTE_ACNT_1003"}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv []string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
sort.Strings(rcv)
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItCacheReload(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "cache_reload", "Tenant", "cgrates.org")
|
|
output := bytes.NewBuffer(nil)
|
|
expected := "OK"
|
|
cmd.Stdout = output
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %s \n but received \n %s", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItFilterIds(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "filter_ids", "Tenant", "cgrates.org")
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := []string{"FLTR_ACNT_1001", "FLTR_ACNT_1001_1002", "FLTR_ACNT_1002", "FLTR_ACNT_1003", "FLTR_ACNT_1003_1001", "FLTR_DST_FS", "FLTR_RES"}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv []string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
sort.Strings(rcv)
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItCacheHasItem(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "cache_has_item", "Tenant", "cgrates.org")
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := false
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv bool
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %v \n but received \n %v", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItStatsMetrics(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "stats_metrics", `ID="Stats2"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := map[string]any{
|
|
"*tcc": "N/A",
|
|
"*tcd": "N/A",
|
|
}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv map[string]any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItGetJsonSection(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "get_json_section", `Sections=["cores"]`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := map[string]any{
|
|
"cores": map[string]any{
|
|
"caps": 0.,
|
|
"caps_stats_interval": "0",
|
|
"caps_strategy": "*busy",
|
|
"shutdown_timeout": "1s",
|
|
},
|
|
}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv map[string]any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %v \n but received \n %+v", utils.ToJSON(expected), utils.ToJSON(rcv))
|
|
}
|
|
}
|
|
|
|
func testConsoleItResourcesAuthorize(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "resources_authorize", `Tenant="cgrates.org"`, `ID="123"`, `Event={"Account":"1001"}`, `UsageID="usageID"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := "ResGroup1"
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItStatsProfileSet(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "stats_profile_set", `Tenant="cgrates.org"`, `ID="123"`)
|
|
output := bytes.NewBuffer(nil)
|
|
expected := "OK"
|
|
cmd.Stdout = output
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %s \n but received \n %s", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItResourcesRelease(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "resources_release", `Tenant="cgrates.org"`, `ID="123"`, `Event={"Account":"1001"}`, `UsageID="usageID"`)
|
|
output := bytes.NewBuffer(nil)
|
|
expected := "OK"
|
|
cmd.Stdout = output
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %s \n but received \n %s", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItRoutesProfilesForEvent(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "routes_profiles_for_event", `ID="123"`, `Event={"Account":"1001"}`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := []utils.RouteProfile{
|
|
{
|
|
Tenant: "cgrates.org",
|
|
ID: "ROUTE_ACNT_1001",
|
|
FilterIDs: []string{"FLTR_ACNT_1001"},
|
|
Sorting: "*weight",
|
|
SortingParameters: []string{},
|
|
Routes: []*utils.Route{
|
|
{
|
|
ID: "route1",
|
|
FilterIDs: nil,
|
|
AccountIDs: nil,
|
|
RateProfileIDs: nil,
|
|
ResourceIDs: nil,
|
|
StatIDs: nil,
|
|
Weights: utils.DynamicWeights{{Weight: 10.}},
|
|
Blockers: utils.DynamicBlockers{
|
|
{
|
|
Blocker: false,
|
|
},
|
|
},
|
|
RouteParameters: "",
|
|
},
|
|
{
|
|
ID: "route2",
|
|
FilterIDs: nil,
|
|
AccountIDs: nil,
|
|
RateProfileIDs: nil,
|
|
ResourceIDs: nil,
|
|
StatIDs: nil,
|
|
Weights: utils.DynamicWeights{{Weight: 20.}},
|
|
Blockers: utils.DynamicBlockers{
|
|
{
|
|
Blocker: false,
|
|
},
|
|
},
|
|
RouteParameters: "",
|
|
},
|
|
},
|
|
Weights: utils.DynamicWeights{{Weight: 20.}},
|
|
},
|
|
}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv []utils.RouteProfile
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(err)
|
|
}
|
|
sort.Slice(rcv[0].Routes, func(i, j int) bool {
|
|
return rcv[0].Routes[i].ID < rcv[0].Routes[j].ID
|
|
})
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %s \n but received \n %s", utils.ToJSON(expected), utils.ToJSON(rcv))
|
|
}
|
|
}
|
|
|
|
func testConsoleItStatsProfile(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "stats_profile", `Tenant="cgrates.org"`, `ID="Stats2"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := map[string]any{
|
|
"Blocker": true,
|
|
"FilterIDs": []any{"FLTR_ACNT_1001_1002"},
|
|
"ID": "Stats2",
|
|
"Metrics": []any{
|
|
map[string]any{
|
|
"FilterIDs": nil,
|
|
"MetricID": "*tcc",
|
|
},
|
|
map[string]any{
|
|
"FilterIDs": nil,
|
|
"MetricID": "*tcd",
|
|
},
|
|
},
|
|
"MinItems": 0.,
|
|
"QueueLength": 100.,
|
|
"Stored": false,
|
|
"TTL": "-1ns",
|
|
"Tenant": "cgrates.org",
|
|
"ThresholdIDs": []any{"*none"},
|
|
"Weight": 30.,
|
|
}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv map[string]any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(err)
|
|
}
|
|
sort.Slice(rcv["Metrics"].([]any), func(i, j int) bool {
|
|
return utils.IfaceAsString((rcv["Metrics"].([]any)[i].(map[string]any))["MetricID"]) < utils.IfaceAsString((rcv["Metrics"].([]any)[j].(map[string]any))["MetricID"])
|
|
})
|
|
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %v \n but received \n %v", utils.ToJSON(expected), utils.ToJSON(rcv))
|
|
}
|
|
}
|
|
|
|
func testConsoleItRoutesProfile(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "routes_profile", `Tenant="cgrates.org"`, `ID="ROUTE_ACNT_1001"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := utils.RouteProfile{
|
|
Tenant: "cgrates.org",
|
|
ID: "ROUTE_ACNT_1001",
|
|
FilterIDs: []string{"FLTR_ACNT_1001"},
|
|
Sorting: "*weight",
|
|
SortingParameters: []string{},
|
|
Routes: []*utils.Route{
|
|
{
|
|
ID: "route1",
|
|
FilterIDs: nil,
|
|
AccountIDs: nil,
|
|
RateProfileIDs: nil,
|
|
ResourceIDs: nil,
|
|
StatIDs: nil,
|
|
Weights: utils.DynamicWeights{{Weight: 10.}},
|
|
Blockers: utils.DynamicBlockers{
|
|
{
|
|
Blocker: false,
|
|
},
|
|
},
|
|
RouteParameters: "",
|
|
},
|
|
{
|
|
ID: "route2",
|
|
FilterIDs: nil,
|
|
AccountIDs: nil,
|
|
RateProfileIDs: nil,
|
|
ResourceIDs: nil,
|
|
StatIDs: nil,
|
|
Weights: utils.DynamicWeights{{Weight: 20.}},
|
|
Blockers: utils.DynamicBlockers{
|
|
{
|
|
Blocker: false,
|
|
},
|
|
},
|
|
RouteParameters: "",
|
|
},
|
|
},
|
|
Weights: utils.DynamicWeights{{Weight: 20.}},
|
|
}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv utils.RouteProfile
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Log(output.String())
|
|
t.Error(err)
|
|
}
|
|
sort.Slice(rcv.Routes, func(i, j int) bool {
|
|
return rcv.Routes[i].ID < rcv.Routes[j].ID
|
|
})
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %s \n but received \n %s", utils.ToJSON(expected), utils.ToJSON(rcv))
|
|
}
|
|
}
|
|
|
|
/* Snooze is different everytime, it uses current time */
|
|
func testConsoleItThreshold(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "threshold", `Tenant="cgrates.org"`, `ID="THD_ACNT_1001"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := map[string]any{
|
|
"Hits": 0.,
|
|
"ID": "THD_ACNT_1001",
|
|
"Snooze": "0001-01-01T00:00:00Z",
|
|
"Tenant": "cgrates.org",
|
|
}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv map[string]any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %s \n but received \n %s", utils.ToJSON(expected), utils.ToJSON(rcv))
|
|
}
|
|
}
|
|
|
|
func testConsoleItThresholdsProfileSet(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "thresholds_profile_set", `Tenant="cgrates.org"`, `ID="123"`)
|
|
output := bytes.NewBuffer(nil)
|
|
expected := "OK"
|
|
cmd.Stdout = output
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %s \n but received \n %s", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItThresholdsProfile(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "thresholds_profile", `Tenant="cgrates.org"`, `ID="THD_ACNT_1001"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := map[string]any{
|
|
"ActionProfileIDs": []any{"ACT_LOG_WARNING"},
|
|
"Async": true,
|
|
"Blocker": false,
|
|
"FilterIDs": []any{"FLTR_ACNT_1001"},
|
|
"ID": "THD_ACNT_1001",
|
|
"MaxHits": 1.,
|
|
"MinHits": 1.,
|
|
"MinSleep": "1s",
|
|
"Tenant": "cgrates.org",
|
|
"Weight": 10.,
|
|
}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv map[string]any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+v \n but received \n %+v", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItRatesProfileIds(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "rates_profile_ids", `Tenant="cgrates.org"`)
|
|
output := bytes.NewBuffer(nil)
|
|
expected := []any{"123"}
|
|
cmd.Stdout = output
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv []any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Log(output.String())
|
|
t.Error(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+v \n but received \n %+v", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItStatsProfileIds(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "stats_profile_ids", `Tenant="cgrates.org"`)
|
|
output := bytes.NewBuffer(nil)
|
|
expected := []any{"123", "Stats2", "Stats2_1"}
|
|
cmd.Stdout = output
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv []any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(err)
|
|
}
|
|
sort.Slice(rcv, func(i, j int) bool {
|
|
return rcv[i].(string) < rcv[j].(string)
|
|
})
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+v \n but received \n %+v", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItStatus(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "status")
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func testConsoleItCacheStats(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "cache_stats")
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := map[string]any{
|
|
"*account_filter_indexes": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*accounts": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*action_profile_filter_indexes": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*action_profiles": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*apiban": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*attribute_filter_indexes": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*attribute_profiles": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*caps_events": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*cdr_ids": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*cdrs": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*charger_filter_indexes": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*charger_profiles": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*closed_sessions": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*default": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*diameter_messages": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*event_charges": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*event_resources": map[string]any{
|
|
"Items": 1.,
|
|
"Groups": 0.,
|
|
},
|
|
"*filters": map[string]any{
|
|
"Items": 3.,
|
|
"Groups": 0.,
|
|
},
|
|
"*load_ids": map[string]any{
|
|
"Items": 13.,
|
|
"Groups": 0.,
|
|
},
|
|
"*rate_filter_indexes": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*rate_profile_filter_indexes": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*rate_profiles": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*replication_hosts": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*resource_filter_indexes": map[string]any{
|
|
"Items": 2.,
|
|
"Groups": 1.,
|
|
},
|
|
"*resource_profiles": map[string]any{
|
|
"Items": 2.,
|
|
"Groups": 0.,
|
|
},
|
|
"*resources": map[string]any{
|
|
"Items": 2.,
|
|
"Groups": 0.,
|
|
},
|
|
"*reverse_filter_indexes": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*route_filter_indexes": map[string]any{
|
|
"Items": 3.,
|
|
"Groups": 1.,
|
|
},
|
|
"*route_profiles": map[string]any{
|
|
"Items": 1.,
|
|
"Groups": 0.,
|
|
},
|
|
"*rpc_connections": map[string]any{
|
|
"Items": 2.,
|
|
"Groups": 0.,
|
|
},
|
|
"*rpc_responses": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*session_costs": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*stat_filter_indexes": map[string]any{
|
|
"Items": 2.,
|
|
"Groups": 1.,
|
|
},
|
|
"*statqueue_profiles": map[string]any{
|
|
"Items": 2.,
|
|
"Groups": 0.,
|
|
},
|
|
"*statqueues": map[string]any{
|
|
"Items": 2.,
|
|
"Groups": 0.,
|
|
},
|
|
"*stir": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*threshold_filter_indexes": map[string]any{
|
|
"Items": 9.,
|
|
"Groups": 1.,
|
|
},
|
|
"*threshold_profiles": map[string]any{
|
|
"Items": 2.,
|
|
"Groups": 0.,
|
|
},
|
|
"*thresholds": map[string]any{
|
|
"Items": 2.,
|
|
"Groups": 0.,
|
|
},
|
|
"*tp_accounts": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*tp_action_profiles": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*tp_attributes": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*tp_chargers": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*tp_filters": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*tp_rate_profiles": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*tp_resources": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*tp_routes": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*tp_stats": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*tp_thresholds": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*uch": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
"*versions": map[string]any{
|
|
"Items": 0.,
|
|
"Groups": 0.,
|
|
},
|
|
}
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv map[string]any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+v \n but received \n %+v", utils.ToJSON(expected), utils.ToJSON(rcv))
|
|
}
|
|
}
|
|
|
|
func testConsoleItResourcesProfileSet(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "resources_profile_set", `ID="123"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := "OK"
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItResourcesAllocate(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "resources_allocate", `Tenant="cgrates.org"`, `ID="123"`, `Event={"Account":"1001"}`, `UsageID="usageID"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := "ResGroup1"
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItResourcesForEvent(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "resources_for_event", `Tenant="cgrates.org"`, `ID="123"`, `Event={"Account":"1001"}`, `UsageID="usageID"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := []any{
|
|
map[string]any{
|
|
"Tenant": "cgrates.org",
|
|
"ID": "ResGroup1",
|
|
"Usages": map[string]any{},
|
|
"TTLIdx": nil,
|
|
},
|
|
map[string]any{
|
|
"Tenant": "cgrates.org",
|
|
"ID": "123",
|
|
"Usages": map[string]any{},
|
|
"TTLIdx": nil,
|
|
},
|
|
}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv []any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItAttributesProfileIds(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "attributes_profile_ids", `Tenant="cgrates.org"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := []any{"ATTR_1001_SESSIONAUTH", "ATTR_1001_SIMPLEAUTH", "ATTR_1002_SESSIONAUTH", "ATTR_1002_SIMPLEAUTH", "ATTR_1003_SESSIONAUTH", "ATTR_1003_SIMPLEAUTH", "ATTR_ACC_ALIAS"}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv []any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
sort.Slice(rcv, func(i, j int) bool {
|
|
return rcv[i].(string) < rcv[j].(string)
|
|
})
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+v \n but received \n %+v", utils.ToJSON(expected), utils.ToJSON(rcv))
|
|
}
|
|
}
|
|
|
|
func testConsoleItThresholdsProcessEvent(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "thresholds_process_event", `ID="123"`, `Event={"Account":"1001"}`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := []any{"123", "THD_ACNT_1001"}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv []any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
sort.Slice(rcv, func(i, j int) bool {
|
|
return rcv[i].(string) < rcv[j].(string)
|
|
})
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+v \n but received \n %+v", utils.ToJSON(expected), utils.ToJSON(rcv))
|
|
}
|
|
}
|
|
|
|
func testConsoleItCacheRemoveItem(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "cache_remove_item")
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := "OK"
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItFilterSet(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "filter_set", `ID="123"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := "OK"
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItResources(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "resources", `ID="ResGroup1"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := map[string]any{
|
|
"Tenant": "cgrates.org",
|
|
"ID": "ResGroup1",
|
|
"Usages": map[string]any{
|
|
"usageID": map[string]any{
|
|
"Tenant": "cgrates.org",
|
|
"ID": "usageID",
|
|
"ExpiryTime": "0001-01-01T00:00:00Z",
|
|
"Units": 0.,
|
|
},
|
|
},
|
|
"TTLIdx": nil,
|
|
}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv map[string]any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItResourcesProfile(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "resources_profile", `ID="ResGroup1"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := map[string]any{
|
|
"AllocationMessage": "",
|
|
"Blocker": false,
|
|
"FilterIDs": []any{"FLTR_RES"},
|
|
"ID": "ResGroup1",
|
|
"Limit": 7.,
|
|
"Stored": true,
|
|
"Tenant": "cgrates.org",
|
|
"ThresholdIDs": []any{"*none"},
|
|
"UsageTTL": "-1ns",
|
|
"Weight": 10.,
|
|
}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv map[string]any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItAccountsSet(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "accounts_set", `ID="123"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := "OK"
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItRoutes(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "routes", `ID="ROUTE_ACNT_1001"`, `Event={"Account":"1001"}`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := []any{
|
|
map[string]any{
|
|
"ProfileID": "ROUTE_ACNT_1001",
|
|
"Sorting": "*weight",
|
|
"Routes": []any{
|
|
map[string]any{
|
|
"RouteID": "route2",
|
|
"RouteParameters": "",
|
|
"SortingData": map[string]any{
|
|
"Weight": 20.,
|
|
},
|
|
},
|
|
map[string]any{
|
|
"RouteID": "route1",
|
|
"RouteParameters": "",
|
|
"SortingData": map[string]any{
|
|
"Weight": 10.,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv []any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
sort.Slice(rcv, func(i, j int) bool {
|
|
return utils.IfaceAsString((rcv[0].(map[string]any)["Routes"].([]any)[i].(map[string]any)["RouteID"])) < utils.IfaceAsString((rcv[0].(map[string]any)["Routes"].([]any)[j].(map[string]any)["RouteID"]))
|
|
// return utils.IfaceAsString((rcv["Metrics"].([]any)[i].(map[string]any))["MetricID"]) < utils.IfaceAsString((rcv["Metrics"].([]any)[j].(map[string]any))["MetricID"])
|
|
})
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+v \n but received \n %+v", utils.ToJSON(expected), utils.ToJSON(rcv))
|
|
}
|
|
}
|
|
|
|
func testConsoleItFilter(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "filter", `ID="FLTR_RES"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := map[string]any{
|
|
"Tenant": "cgrates.org",
|
|
"ID": "FLTR_RES",
|
|
"Rules": []any{
|
|
map[string]any{
|
|
"Type": "*string",
|
|
"Element": "~*req.Account",
|
|
"Values": []any{"1001", "1002", "1003"},
|
|
},
|
|
},
|
|
}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv map[string]any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+v \n but received \n %+v", utils.ToJSON(expected), utils.ToJSON(rcv))
|
|
}
|
|
}
|
|
|
|
/* Snooze is different everytime, it uses current time */
|
|
func testConsoleItThresholdsForEvent(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "thresholds_for_event", `Tenant="cgrates.org"`, `ID="123"`, `Event={"Account":"1001"}`, `UsageID="usageID"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := []any{
|
|
map[string]any{
|
|
"Tenant": "cgrates.org",
|
|
"ID": "123",
|
|
"Hits": 1.,
|
|
"Snooze": "",
|
|
},
|
|
}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv []any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
rcv[0].(map[string]any)["Snooze"] = ""
|
|
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+v \n but received \n %+v", utils.ToJSON(expected), utils.ToJSON(rcv))
|
|
}
|
|
}
|
|
|
|
func testConsoleItStatsForEvent(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "stats_for_event", `Tenant="cgrates.org"`, `ID="Stats2"`, `Event={"Account":"1001"}`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := []any{"123"}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv []any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+v \n but received \n %+v", utils.ToJSON(expected), utils.ToJSON(rcv))
|
|
}
|
|
}
|
|
|
|
func testConsoleItStatsProcessEvent(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "stats_process_event", `Tenant="cgrates.org"`, `ID="123"`, `Event={"Account":"1001"}`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := []any{"123"}
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv []any
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+v \n but received \n %+v", utils.ToJSON(expected), utils.ToJSON(rcv))
|
|
}
|
|
}
|
|
|
|
func testConsoleItReloadConfig(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "reload_config", `Section="general"`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := "OK"
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItAttributesProfileSet(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "attributes_profile_set", `Tenant="cgrates.org"`, `ID="attrID"`, `Attributes=[{"Path":"*req.Account", "Value":"1001"}]`)
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := "OK"
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItPing(t *testing.T) {
|
|
cmd := exec.Command("cgr-console", "ping", "attributes")
|
|
output := bytes.NewBuffer(nil)
|
|
cmd.Stdout = output
|
|
expected := "Pong"
|
|
if err := cmd.Run(); err != nil {
|
|
t.Log(cmd.Args)
|
|
t.Log(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
var rcv string
|
|
if err := json.NewDecoder(output).Decode(&rcv); err != nil {
|
|
t.Error(output.String())
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(rcv, expected) {
|
|
t.Fatalf("Expected %+q \n but received \n %+q", expected, rcv)
|
|
}
|
|
}
|
|
|
|
func testConsoleItKillEngine(t *testing.T) {
|
|
if err := engine.KillEngine(*utils.WaitRater); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|