Updated IT tests in sessions

This commit is contained in:
adragusin
2020-01-22 14:25:52 +02:00
parent f307639646
commit de38e16afe
25 changed files with 1086 additions and 117 deletions

View File

@@ -0,0 +1,54 @@
{
// CGRateS Configuration file
//
// Used in tests
"general": {
"log_level": 7,
},
"data_db": {
"db_type": "*internal",
},
"stor_db": {
"db_type": "*internal",
},
"rals": {
"enabled": true, // enable Rater service: <true|false>
},
"schedulers": {
"enabled": true, // start Scheduler service: <true|false>
},
"cdrs": {
"enabled": true, // start the CDR Server service: <true|false>
},
"attributes": {
"enabled": true,
},
"chargers": {
"enabled": true,
"attributes_conns": ["*internal"],
},
"sessions": {
"enabled": true,
"debit_interval": "1ms", // interval to perform debits on.
"rals_conns": ["*internal"],
"cdrs_conns": ["*internal"],
"chargers_conns": ["*internal"],
},
"apier": {
"scheduler_conns": ["*internal"],
},
}

View File

@@ -0,0 +1,59 @@
{
// CGRateS Configuration file
//
// Used in tests
"general": {
"log_level": 7,
},
"data_db": { // database used to store runtime data (eg: accounts, cdr stats)
"db_type": "mongo", // stor database type to use: <mysql|postgres>
"db_port": 27017, // the port to reach the stordb
"db_name": "datadb",
"db_password": "",
},
"stor_db": {
"db_type": "mongo", // stor database type to use: <mysql|postgres>
"db_port": 27017, // the port to reach the stordb
"db_name": "stordb",
"db_password": "",
},
"rals": {
"enabled": true, // enable Rater service: <true|false>
},
"schedulers": {
"enabled": true, // start Scheduler service: <true|false>
},
"cdrs": {
"enabled": true, // start the CDR Server service: <true|false>
},
"attributes": {
"enabled": true,
},
"chargers": {
"enabled": true,
"attributes_conns": ["*internal"],
},
"sessions": {
"enabled": true,
"debit_interval": "1ms", // interval to perform debits on.
"rals_conns": ["*internal"],
"cdrs_conns": ["*internal"],
"chargers_conns": ["*internal"],
},
"apier": {
"scheduler_conns": ["*internal"],
},
}

View File

@@ -7,6 +7,12 @@
"log_level": 7,
},
"data_db": {
"db_type": "redis",
"db_port": 6379,
"db_name": "10",
},
"stor_db": { // database used to store offline tariff plans and CDRs
"db_password": "CGRateS.org", // password to use when connecting to stordb
},

View File

@@ -0,0 +1,77 @@
{
// CGRateS Configuration file
//
// Used for cgradmin
// Starts rater, scheduler
"general": {
"log_level": 7,
},
"listen": {
"rpc_json": ":2012", // RPC JSON listening address
"rpc_gob": ":2013", // RPC GOB listening address
"http": ":2080", // HTTP listening address
},
"data_db": {
"db_type": "*internal",
},
"stor_db": {
"db_type": "*internal",
},
"rals": {
"enabled": true, // enable Rater service: <true|false>
"max_computed_usage": { // do not compute usage higher than this, prevents memory overload
"*any": "189h",
"*voice": "72h",
"*data": "102400",
"*sms": "10000"
},
},
"schedulers": {
"enabled": true, // start Scheduler service: <true|false>
},
"cdrs": {
"enabled": true, // start the CDR Server service: <true|false>
},
"resources": {
"enabled": true,
"store_interval": "-1",
},
"attributes": {
"enabled": true,
},
"suppliers": {
"enabled": true,
},
"chargers": {
"enabled": true,
"attributes_conns": ["*internal"],
},
"sessions": {
"enabled": true,
"session_ttl": "50ms",
"rals_conns": ["*localhost"],
"cdrs_conns": ["*localhost"],
"chargers_conns": ["*internal"],
"alterable_fields": ["Extra1"],
},
"apier": {
"scheduler_conns": ["*internal"],
},
}

View File

@@ -0,0 +1,84 @@
{
// CGRateS Configuration file
//
// Used for cgradmin
// Starts rater, scheduler
"general": {
"log_level": 7,
},
"listen": {
"rpc_json": ":2012", // RPC JSON listening address
"rpc_gob": ":2013", // RPC GOB listening address
"http": ":2080", // HTTP listening address
},
"rpc_conns": {
"conn1": {
"strategy": "*first",
"conns": [{"address": "127.0.0.1:2013", "transport":"*gob"}],
},
},
"data_db": {
"db_type": "*internal",
},
"stor_db": {
"db_type": "*internal",
},
"rals": {
"enabled": true, // enable Rater service: <true|false>
"max_computed_usage": { // do not compute usage higher than this, prevents memory overload
"*any": "189h",
"*voice": "72h",
"*data": "102400",
"*sms": "10000"
},
},
"schedulers": {
"enabled": true, // start Scheduler service: <true|false>
},
"cdrs": {
"enabled": true, // start the CDR Server service: <true|false>
},
"resources": {
"enabled": true,
"store_interval": "-1",
},
"attributes": {
"enabled": true,
},
"suppliers": {
"enabled": true,
},
"chargers": {
"enabled": true,
"attributes_conns": ["*internal"],
},
"sessions": {
"enabled": true,
"session_ttl": "50ms",
"rals_conns": ["conn1"],
"cdrs_conns": ["conn1"],
"chargers_conns": ["*internal"],
"alterable_fields": ["Extra1"],
},
"apier": {
"scheduler_conns": ["*internal"],
},
}

View File

@@ -0,0 +1,81 @@
{
// CGRateS Configuration file
//
// Used for cgradmin
// Starts rater, scheduler
"general": {
"log_level": 7,
},
"listen": {
"rpc_json": ":2012", // RPC JSON listening address
"rpc_gob": ":2013", // RPC GOB listening address
"http": ":2080", // HTTP listening address
},
"data_db": { // database used to store runtime data (eg: accounts, cdr stats)
"db_type": "mongo", // stor database type to use: <mysql|postgres>
"db_port": 27017, // the port to reach the stordb
"db_name": "datadb",
"db_password": "",
},
"stor_db": {
"db_type": "mongo", // stor database type to use: <mysql|postgres>
"db_port": 27017, // the port to reach the stordb
"db_name": "stordb",
"db_password": "",
},
"rals": {
"enabled": true, // enable Rater service: <true|false>
"max_computed_usage": { // do not compute usage higher than this, prevents memory overload
"*any": "189h",
"*voice": "72h",
"*data": "102400",
"*sms": "10000"
},
},
"schedulers": {
"enabled": true, // start Scheduler service: <true|false>
},
"cdrs": {
"enabled": true, // start the CDR Server service: <true|false>
},
"resources": {
"enabled": true,
},
"attributes": {
"enabled": true,
},
"suppliers": {
"enabled": true,
},
"chargers": {
"enabled": true,
"attributes_conns": ["*internal"],
},
"sessions": {
"enabled": true,
"session_ttl": "50ms",
"rals_conns": ["*localhost"],
"cdrs_conns": ["*localhost"],
"chargers_conns": ["*internal"],
"alterable_fields": ["Extra1"],
},
"apier": {
"scheduler_conns": ["*internal"],
},
}

View File

@@ -0,0 +1,88 @@
{
// CGRateS Configuration file
//
// Used for cgradmin
// Starts rater, scheduler
"general": {
"log_level": 7,
},
"listen": {
"rpc_json": ":2012", // RPC JSON listening address
"rpc_gob": ":2013", // RPC GOB listening address
"http": ":2080", // HTTP listening address
},
"rpc_conns": {
"conn1": {
"strategy": "*first",
"conns": [{"address": "127.0.0.1:2013", "transport":"*gob"}],
},
},
"data_db": { // database used to store runtime data (eg: accounts, cdr stats)
"db_type": "mongo", // stor database type to use: <mysql|postgres>
"db_port": 27017, // the port to reach the stordb
"db_name": "datadb",
"db_password": "",
},
"stor_db": {
"db_type": "mongo", // stor database type to use: <mysql|postgres>
"db_port": 27017, // the port to reach the stordb
"db_name": "stordb",
"db_password": "",
},
"rals": {
"enabled": true, // enable Rater service: <true|false>
"max_computed_usage": { // do not compute usage higher than this, prevents memory overload
"*any": "189h",
"*voice": "72h",
"*data": "102400",
"*sms": "10000"
},
},
"schedulers": {
"enabled": true, // start Scheduler service: <true|false>
},
"cdrs": {
"enabled": true, // start the CDR Server service: <true|false>
},
"resources": {
"enabled": true,
},
"attributes": {
"enabled": true,
},
"suppliers": {
"enabled": true,
},
"chargers": {
"enabled": true,
"attributes_conns": ["*internal"],
},
"sessions": {
"enabled": true,
"session_ttl": "50ms",
"rals_conns": ["conn1"],
"cdrs_conns": ["conn1"],
"chargers_conns": ["*internal"],
"alterable_fields": ["Extra1"],
},
"apier": {
"scheduler_conns": ["*internal"],
},
}

View File

@@ -14,6 +14,12 @@
"http": ":2080", // HTTP listening address
},
"data_db": {
"db_type": "redis",
"db_port": 6379,
"db_name": "10",
},
"stor_db": { // database used to store offline tariff plans and CDRs
"db_password": "CGRateS.org", // password to use when connecting to stordb
},

View File

@@ -21,6 +21,12 @@
},
},
"data_db": {
"db_type": "redis",
"db_port": 6379,
"db_name": "10",
},
"stor_db": { // database used to store offline tariff plans and CDRs
"db_password": "CGRateS.org", // password to use when connecting to stordb
},

View File

@@ -0,0 +1,71 @@
{
// Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments
// Copyright (C) ITsysCOM GmbH
"general": {
"log_level": 7,
"node_id":"MasterReplication",
},
"listen": {
"rpc_json": "127.0.0.1:2012",
"rpc_gob": "127.0.0.1:2013",
"http": "127.0.0.1:2080",
},
"data_db": { // database used to store runtime data (eg: accounts, cdr stats)
"db_type": "mongo", // stor database type to use: <mysql|postgres>
"db_port": 27017, // the port to reach the stordb
"db_name": "datadb",
"db_password": "",
},
"stor_db": {
"db_type": "mongo", // stor database type to use: <mysql|postgres>
"db_port": 27017, // the port to reach the stordb
"db_name": "stordb",
"db_password": "",
},
"rpc_conns": {
"rplConn": {
"strategy": "*broadcast_sync",
"conns": [{"address": "127.0.0.1:22012", "transport": "*json"}],
},
},
"rals": {
"enabled": true,
},
"schedulers": {
"enabled": true,
},
"cdrs": {
"enabled": true,
},
"attributes": {
"enabled": true,
},
"chargers": {
"enabled": true,
"attributes_conns": ["*internal"],
},
"sessions": {
"enabled": true,
"replication_conns": ["rplConn"],
"rals_conns": ["*internal"],
"cdrs_conns": ["*internal"],
"chargers_conns": ["*internal"],
},
"apier": {
"scheduler_conns": ["*internal"],
},
}

View File

@@ -0,0 +1,71 @@
{
// Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments
// Copyright (C) ITsysCOM GmbH
"general": {
"log_level": 7,
"node_id":"MasterReplication",
},
"listen": {
"rpc_json": "127.0.0.1:2012",
"rpc_gob": "127.0.0.1:2013",
"http": "127.0.0.1:2080",
},
"rpc_conns": {
"rplConn": {
"strategy": "*broadcast_sync",
"conns": [{"address": "127.0.0.1:22013", "transport": "*gob"}],
},
},
"data_db": { // database used to store runtime data (eg: accounts, cdr stats)
"db_type": "mongo", // stor database type to use: <mysql|postgres>
"db_port": 27017, // the port to reach the stordb
"db_name": "datadb",
"db_password": "",
},
"stor_db": {
"db_type": "mongo", // stor database type to use: <mysql|postgres>
"db_port": 27017, // the port to reach the stordb
"db_name": "stordb",
"db_password": "",
},
"rals": {
"enabled": true,
},
"schedulers": {
"enabled": true,
},
"cdrs": {
"enabled": true,
},
"attributes": {
"enabled": true,
},
"chargers": {
"enabled": true,
"attributes_conns": ["*internal"],
},
"sessions": {
"enabled": true,
"replication_conns": ["rplConn"],
"rals_conns": ["*internal"],
"cdrs_conns": ["*internal"],
"chargers_conns": ["*internal"],
},
"apier": {
"scheduler_conns": ["*internal"],
},
}

View File

@@ -0,0 +1,76 @@
{
// Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments
// Copyright (C) ITsysCOM GmbH
"general": {
"log_level": 7,
"node_id":"SlaveReplication",
},
"listen": {
"rpc_json": "127.0.0.1:22012", // RPC JSON listening address
"rpc_gob": "127.0.0.1:22013", // RPC GOB listening address
"http": "127.0.0.1:22080", // HTTP listening address
},
"rpc_conns": {
"conn1": {
"strategy": "*first",
"conns": [{"address": "127.0.0.1:22012", "transport":"*json"}],
},
"rplConn": {
"strategy": "*broadcast_sync",
"conns": [{"address": "127.0.0.1:2012", "transport": "*json"}],
}
},
"data_db": { // database used to store runtime data (eg: accounts, cdr stats)
"db_type": "mongo", // stor database type to use: <mysql|postgres>
"db_port": 27017, // the port to reach the stordb
"db_name": "datadb",
"db_password": "",
},
"stor_db": {
"db_type": "mongo", // stor database type to use: <mysql|postgres>
"db_port": 27017, // the port to reach the stordb
"db_name": "stordb",
"db_password": "",
},
"rals": {
"enabled": true, // enable Rater service: <true|false>
},
"cdrs": {
"enabled": true, // start the CDR Server service: <true|false>
},
"schedulers": {
"enabled": true,
},
"attributes": {
"enabled": true,
},
"chargers": {
"enabled": true,
"attributes_conns": ["*internal"],
},
"sessions": {
"enabled": true, // starts SessionManager service: <true|false>
"listen_bijson": "127.0.0.1:22014", // address where to listen for bidirectional JSON-RPC requests
"replication_conns": ["rplConn"],
"rals_conns": ["conn1"],
"cdrs_conns": ["*internal"],
"chargers_conns": ["*internal"],
},
"apier": {
"scheduler_conns": ["*internal"],
},
}

View File

@@ -0,0 +1,75 @@
{
// Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments
// Copyright (C) ITsysCOM GmbH
"general": {
"log_level": 7,
"node_id":"SlaveReplication",
},
"listen": {
"rpc_json": "127.0.0.1:22012", // RPC JSON listening address
"rpc_gob": "127.0.0.1:22013", // RPC GOB listening address
"http": "127.0.0.1:22080", // HTTP listening address
},
"data_db": { // database used to store runtime data (eg: accounts, cdr stats)
"db_type": "mongo", // stor database type to use: <mysql|postgres>
"db_port": 27017, // the port to reach the stordb
"db_name": "datadb",
"db_password": "",
},
"stor_db": {
"db_type": "mongo", // stor database type to use: <mysql|postgres>
"db_port": 27017, // the port to reach the stordb
"db_name": "stordb",
"db_password": "",
},
"rals": {
"enabled": true, // enable Rater service: <true|false>
},
"cdrs": {
"enabled": true, // start the CDR Server service: <true|false>
},
"schedulers": {
"enabled": true,
},
"attributes": {
"enabled": true,
},
"rpc_conns": {
"conn1": {
"strategy": "*first",
"conns": [{"address": "127.0.0.1:22013", "transport":"*gob"}],
},
"rplConn": {
"strategy": "*broadcast_sync",
"conns": [{"address": "127.0.0.1:2013", "transport": "*gob"}],
}
},
"chargers": {
"enabled": true,
"attributes_conns": ["*internal"],
},
"sessions": {
"enabled": true, // starts SessionManager service: <true|false>
"listen_bijson": "127.0.0.1:22014", // address where to listen for bidirectional JSON-RPC requests
"replication_conns": ["rplConn"],
"rals_conns": ["conn1"],
"cdrs_conns": ["*internal"],
"chargers_conns": ["*internal"],
},
"apier": {
"scheduler_conns": ["*internal"],
},
}

View File

@@ -25,6 +25,9 @@ gnr_internal=$?
echo 'go test github.com/cgrates/cgrates/agents -tags=integration -dbtype=*internal'
go test github.com/cgrates/cgrates/agents -tags=integration -dbtype=*internal
agts_internal=$?
echo 'go test github.com/cgrates/cgrates/sessions -tags=integration -dbtype=*internal'
go test github.com/cgrates/cgrates/sessions -tags=integration -dbtype=*internal
smg_internal=$?
# SQL
echo 'go test github.com/cgrates/cgrates/apier/v1 -tags=integration -dbtype=*sql'
go test github.com/cgrates/cgrates/apier/v1 -tags=integration -dbtype=*sql
@@ -47,6 +50,9 @@ gnr_sql=$?
echo 'go test github.com/cgrates/cgrates/agents -tags=integration -dbtype=*sql'
go test github.com/cgrates/cgrates/agents -tags=integration -dbtype=*sql
agts_sql=$?
echo 'go test github.com/cgrates/cgrates/sessions -tags=integration -dbtype=*sql'
go test github.com/cgrates/cgrates/sessions -tags=integration -dbtype=*sql
smg_sql=$?
# Mongo
echo 'go test github.com/cgrates/cgrates/apier/v1 -tags=integration -dbtype=*mongo'
go test github.com/cgrates/cgrates/apier/v1 -tags=integration -dbtype=*mongo
@@ -69,6 +75,9 @@ gnr_mongo=$?
echo 'go test github.com/cgrates/cgrates/agents -tags=integration -dbtype=*mongo'
go test github.com/cgrates/cgrates/agents -tags=integration -dbtype=*mongo
agts_mongo=$?
echo 'go test github.com/cgrates/cgrates/sessions -tags=integration -dbtype=*mongo'
go test github.com/cgrates/cgrates/sessions -tags=integration -dbtype=*mongo
smg_mongo=$?
# Postgres
echo 'go test github.com/cgrates/cgrates/apier/v1 -tags=integration -dbtype=*postgres'
go test github.com/cgrates/cgrates/apier/v1 -tags=integration -dbtype=*postgres
@@ -91,24 +100,24 @@ gnr_postgres=$?
echo 'go test github.com/cgrates/cgrates/agents -tags=integration -dbtype=*postgres'
go test github.com/cgrates/cgrates/agents -tags=integration -dbtype=*postgres
agts_postgres=$?
echo 'go test github.com/cgrates/cgrates/sessions -tags=integration -dbtype=*postgres'
go test github.com/cgrates/cgrates/sessions -tags=integration -dbtype=*postgres
smg_postgres=$?
echo 'go test github.com/cgrates/cgrates/config -tags=integration'
go test github.com/cgrates/cgrates/config -tags=integration
cfg=$?
#All
echo 'go test github.com/cgrates/cgrates/sessions -tags=integration'
go test github.com/cgrates/cgrates/sessions -tags=integration
smg=$?
echo 'go test github.com/cgrates/cgrates/migrator -tags=integration'
go test github.com/cgrates/cgrates/migrator -tags=integration
mgr=$?
echo 'go test github.com/cgrates/cgrates/dispatchers -tags=integration'
go test github.com/cgrates/cgrates/dispatchers -tags=integration
dis=$?
echo 'go test github.com/cgrates/cgrates/services -tags=integration'
go test github.com/cgrates/cgrates/services -tags=integration
srv=$?
#All
echo 'go test github.com/cgrates/cgrates/dispatchers -tags=integration'
go test github.com/cgrates/cgrates/dispatchers -tags=integration
dis=$?
echo 'go test github.com/cgrates/cgrates/apier/v1 -tags=offline'
go test github.com/cgrates/cgrates/apier/v1 -tags=offline
offline=$?

View File

@@ -41,14 +41,14 @@ var (
accMigrator *Migrator
accAction string
dataDir = flag.String("data_dir", "/usr/share/cgrates", "CGR data dir path here")
sTestsAccIT = []func(t *testing.T){
testAccITConnect,
testAccITFlush,
testAccITMigrateAndMove,
}
)
var sTestsAccIT = []func(t *testing.T){
testAccITConnect,
testAccITFlush,
testAccITMigrateAndMove,
}
func TestAccountMigrateITRedis(t *testing.T) {
var err error
accPathIn = path.Join(*dataDir, "conf", "samples", "tutmysql")

47
sessions/lib_test.go Normal file
View File

@@ -0,0 +1,47 @@
/*
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 <http://www.gnu.org/licenses/>
*/
package sessions
import (
"errors"
"flag"
"net/rpc"
"net/rpc/jsonrpc"
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/utils"
)
var (
dataDir = flag.String("data_dir", "/usr/share/cgrates", "CGR data dir path here")
waitRater = flag.Int("wait_rater", 500, "Number of miliseconds to wait for rater to start and cache")
encoding = flag.String("rpc", utils.MetaJSON, "what encoding whould be uused for rpc comunication")
dbType = flag.String("dbtype", utils.MetaInternal, "The type of DataBase (Internal/Mongo/mySql)")
)
func newRPCClient(cfg *config.ListenCfg) (c *rpc.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)
default:
return nil, errors.New("UNSUPPORTED_RPC")
}
}

View File

@@ -33,12 +33,43 @@ import (
var (
sessionsBiRPCCfgPath string
sessionsBiRPCCfgDIR string
sessionsBiRPCCfg *config.CGRConfig
sessionsBiRPC *rpc2.Client
disconnectEvChan = make(chan *utils.AttrDisconnectSession, 1)
err error
sessionsTests = []func(t *testing.T){
testSessionsBiRPCInitCfg,
testSessionsBiRPCResetDataDb,
testSessionsBiRPCResetStorDb,
testSessionsBiRPCStartEngine,
testSessionsBiRPCApierRpcConn,
testSessionsBiRPCTPFromFolder,
testSessionsBiRPCSessionAutomaticDisconnects,
testSessionsBiRPCSessionOriginatorTerminate,
testSessionsBiRPCStopCgrEngine,
}
)
// Tests starts here
func TestSessionsBiRPC(t *testing.T) {
switch *dbType {
case utils.MetaInternal:
sessionsBiRPCCfgDIR = "smg_automatic_debits_internal"
case utils.MetaSQL:
sessionsBiRPCCfgDIR = "smg_automatic_debits_mysql"
case utils.MetaMongo:
sessionsBiRPCCfgDIR = "smg_automatic_debits_mongo"
case utils.MetaPostgres:
t.SkipNow()
default:
t.Fatal("Unknown Database type")
}
for _, stest := range sessionsTests {
t.Run(sessionsBiRPCCfgDIR, stest)
}
}
func handleDisconnectSession(clnt *rpc2.Client,
args *utils.AttrDisconnectSession, reply *string) error {
disconnectEvChan <- args
@@ -46,8 +77,8 @@ func handleDisconnectSession(clnt *rpc2.Client,
return nil
}
func TestSessionsBiRPCInitCfg(t *testing.T) {
sessionsBiRPCCfgPath = path.Join(*dataDir, "conf", "samples", "smg_automatic_debits")
func testSessionsBiRPCInitCfg(t *testing.T) {
sessionsBiRPCCfgPath = path.Join(*dataDir, "conf", "samples", sessionsBiRPCCfgDIR)
// Init config first
sessionsBiRPCCfg, err = config.NewCGRConfigFromPath(sessionsBiRPCCfgPath)
if err != nil {
@@ -58,28 +89,28 @@ func TestSessionsBiRPCInitCfg(t *testing.T) {
}
// Remove data in both rating and accounting db
func TestSessionsBiRPCResetDataDb(t *testing.T) {
func testSessionsBiRPCResetDataDb(t *testing.T) {
if err := engine.InitDataDb(sessionsBiRPCCfg); err != nil {
t.Fatal(err)
}
}
// Wipe out the cdr database
func TestSessionsBiRPCResetStorDb(t *testing.T) {
func testSessionsBiRPCResetStorDb(t *testing.T) {
if err := engine.InitStorDb(sessionsBiRPCCfg); err != nil {
t.Fatal(err)
}
}
// Start CGR Engine
func TestSessionsBiRPCStartEngine(t *testing.T) {
func testSessionsBiRPCStartEngine(t *testing.T) {
if _, err := engine.StopStartEngine(sessionsBiRPCCfgPath, *waitRater); err != nil {
t.Fatal(err)
}
}
// Connect rpc client to rater
func TestSessionsBiRPCApierRpcConn(t *testing.T) {
func testSessionsBiRPCApierRpcConn(t *testing.T) {
clntHandlers := map[string]interface{}{utils.SessionSv1DisconnectSession: handleDisconnectSession}
dummyClnt, err := utils.NewBiJSONrpcClient(sessionsBiRPCCfg.SessionSCfg().ListenBijson,
clntHandlers)
@@ -97,7 +128,7 @@ func TestSessionsBiRPCApierRpcConn(t *testing.T) {
}
// Load the tariff plan, creating accounts and their balances
func TestSessionsBiRPCTPFromFolder(t *testing.T) {
func testSessionsBiRPCTPFromFolder(t *testing.T) {
attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "oldtutorial")}
var loadInst utils.LoadInstance
if err := sessionsRPC.Call(utils.ApierV2LoadTariffPlanFromFolder, attrs, &loadInst); err != nil {
@@ -106,7 +137,7 @@ func TestSessionsBiRPCTPFromFolder(t *testing.T) {
time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for scheduler to execute topups
}
func TestSessionsBiRPCSessionAutomaticDisconnects(t *testing.T) {
func testSessionsBiRPCSessionAutomaticDisconnects(t *testing.T) {
// Create a balance with 1 second inside and rating increments of 1ms (to be compatible with debit interval)
attrSetBalance := utils.AttrSetBalance{Tenant: "cgrates.org",
Account: "TestSessionsBiRPCSessionAutomaticDisconnects",
@@ -232,7 +263,7 @@ func TestSessionsBiRPCSessionAutomaticDisconnects(t *testing.T) {
}
}
func TestSessionsBiRPCSessionOriginatorTerminate(t *testing.T) {
func testSessionsBiRPCSessionOriginatorTerminate(t *testing.T) {
attrSetBalance := utils.AttrSetBalance{
Tenant: "cgrates.org",
Account: "TestSessionsBiRPCSessionOriginatorTerminate",
@@ -350,7 +381,7 @@ func TestSessionsBiRPCSessionOriginatorTerminate(t *testing.T) {
}
}
func TestSessionsBiRPCStopCgrEngine(t *testing.T) {
func testSessionsBiRPCStopCgrEngine(t *testing.T) {
if err := sessionsBiRPC.Close(); err != nil { // Close the connection so we don't get EOF warnings from client
t.Error(err)
}

View File

@@ -30,16 +30,54 @@ import (
"github.com/cgrates/cgrates/utils"
)
var dataCfgPath string
var dataCfg *config.CGRConfig
var sDataRPC *rpc.Client
var (
dataCfgPath string
dataCfgDIR string
dataCfg *config.CGRConfig
sDataRPC *rpc.Client
func TestSessionsDataInitCfg(t *testing.T) {
dataCfgPath = path.Join(*dataDir, "conf", "samples", "smg")
if *encoding == utils.MetaGOB {
dataCfgPath = path.Join(*dataDir, "conf", "samples", "smg_gob")
SessionsDataTests = []func(t *testing.T){
testSessionsDataInitCfg,
testSessionsDataResetDataDb,
testSessionsDataResetStorDb,
testSessionsDataStartEngine,
testSessionsDataApierRpcConn,
testSessionsDataTPFromFolder,
testSessionsDataLastUsedData,
testSessionsDataLastUsedMultipleUpdates,
testSessionsDataTTLExpired,
testSessionsDataTTLExpMultiUpdates,
testSessionsDataMultipleDataNoUsage,
testSessionsDataTTLUsageProtection,
testSessionsDataTTKillEngine,
}
// Init config first
)
// Tests starts here
func TestSessionsData(t *testing.T) {
switch *dbType {
case utils.MetaInternal:
dataCfgDIR = "smg_internal"
case utils.MetaSQL:
dataCfgDIR = "smg_mysql"
case utils.MetaMongo:
dataCfgDIR = "smg_mongo"
case utils.MetaPostgres:
t.SkipNow()
default:
t.Fatal("Unknown Database type")
}
if *encoding == utils.MetaGOB {
dataCfgDIR += "_gob"
}
for _, stest := range SessionsDataTests {
t.Run(dataCfgDIR, stest)
}
}
// Init config first
func testSessionsDataInitCfg(t *testing.T) {
dataCfgPath = path.Join(*dataDir, "conf", "samples", dataCfgDIR)
var err error
dataCfg, err = config.NewCGRConfigFromPath(dataCfgPath)
if err != nil {
@@ -50,28 +88,28 @@ func TestSessionsDataInitCfg(t *testing.T) {
}
// Remove data in both rating and accounting db
func TestSessionsDataResetDataDb(t *testing.T) {
func testSessionsDataResetDataDb(t *testing.T) {
if err := engine.InitDataDb(dataCfg); err != nil {
t.Fatal(err)
}
}
// Wipe out the cdr database
func TestSessionsDataResetStorDb(t *testing.T) {
func testSessionsDataResetStorDb(t *testing.T) {
if err := engine.InitStorDb(dataCfg); err != nil {
t.Fatal(err)
}
}
// Start CGR Engine
func TestSessionsDataStartEngine(t *testing.T) {
func testSessionsDataStartEngine(t *testing.T) {
if _, err := engine.StopStartEngine(dataCfgPath, *waitRater); err != nil {
t.Fatal(err)
}
}
// Connect rpc client to rater
func TestSessionsDataApierRpcConn(t *testing.T) {
func testSessionsDataApierRpcConn(t *testing.T) {
var err error
sDataRPC, err = newRPCClient(dataCfg.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed
if err != nil {
@@ -80,7 +118,7 @@ func TestSessionsDataApierRpcConn(t *testing.T) {
}
// Load the tariff plan, creating accounts and their balances
func TestSessionsDataTPFromFolder(t *testing.T) {
func testSessionsDataTPFromFolder(t *testing.T) {
attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "oldtutorial")}
var loadInst utils.LoadInstance
if err := sDataRPC.Call(utils.ApierV2LoadTariffPlanFromFolder, attrs, &loadInst); err != nil {
@@ -89,7 +127,7 @@ func TestSessionsDataTPFromFolder(t *testing.T) {
time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for scheduler to execute topups
}
func TestSessionsDataLastUsedData(t *testing.T) {
func testSessionsDataLastUsedData(t *testing.T) {
var acnt *engine.Account
attrs := &utils.AttrGetAccount{Tenant: "cgrates.org", Account: "1001"}
eAcntVal := 102400.0
@@ -230,7 +268,7 @@ func TestSessionsDataLastUsedData(t *testing.T) {
}
}
func TestSessionsDataLastUsedMultipleUpdates(t *testing.T) {
func testSessionsDataLastUsedMultipleUpdates(t *testing.T) {
var acnt *engine.Account
acntAttrs := &utils.AttrGetAccount{Tenant: "cgrates.org",
Account: "TestSessionsDataLastUsedMultipleData"}
@@ -505,7 +543,7 @@ func TestSessionsDataLastUsedMultipleUpdates(t *testing.T) {
}
}
func TestSessionsDataTTLExpired(t *testing.T) {
func testSessionsDataTTLExpired(t *testing.T) {
var acnt *engine.Account
acntAttrs := &utils.AttrGetAccount{Tenant: "cgrates.org",
Account: "TestSessionsDataTTLExpired"}
@@ -579,7 +617,7 @@ func TestSessionsDataTTLExpired(t *testing.T) {
}
}
func TestSessionsDataTTLExpMultiUpdates(t *testing.T) {
func testSessionsDataTTLExpMultiUpdates(t *testing.T) {
var acnt *engine.Account
acntAttrs := &utils.AttrGetAccount{
@@ -708,7 +746,7 @@ func TestSessionsDataTTLExpMultiUpdates(t *testing.T) {
}
}
func TestSessionsDataMultipleDataNoUsage(t *testing.T) {
func testSessionsDataMultipleDataNoUsage(t *testing.T) {
var acnt *engine.Account
acntAttrs := &utils.AttrGetAccount{Tenant: "cgrates.org",
Account: "TestSessionsDataTTLExpMultiUpdates"}
@@ -916,7 +954,7 @@ func TestSessionsDataMultipleDataNoUsage(t *testing.T) {
// TestSessionsDataTTLUsageProtection makes sure that original TTL (50ms)
// limits the additional debit without overloading memory
func TestSessionsDataTTLUsageProtection(t *testing.T) {
func testSessionsDataTTLUsageProtection(t *testing.T) {
var acnt *engine.Account
acntAttrs := &utils.AttrGetAccount{Tenant: "cgrates.org",
Account: "TestSessionsDataTTLUsageProtection"}
@@ -993,7 +1031,7 @@ func TestSessionsDataTTLUsageProtection(t *testing.T) {
}
}
func TestSessionsDataTTKillEngine(t *testing.T) {
func testSessionsDataTTKillEngine(t *testing.T) {
if err := engine.KillEngine(100); err != nil {
t.Error(err)
}

View File

@@ -31,16 +31,51 @@ import (
"github.com/cgrates/cgrates/utils"
)
var sItCfgPath string
var sItCfg *config.CGRConfig
var sItRPC *rpc.Client
var (
sItCfgPath string
sItCfgDIR string
sItCfg *config.CGRConfig
sItRPC *rpc.Client
func TestSessionsItInitCfg(t *testing.T) {
sItCfgPath = path.Join(*dataDir, "conf", "samples", "smg")
if *encoding == utils.MetaGOB {
dataCfgPath = path.Join(*dataDir, "conf", "samples", "smg_gob")
sessionsITtests = []func(t *testing.T){
testSessionsItInitCfg,
testSessionsItResetDataDb,
testSessionsItResetStorDb,
testSessionsItStartEngine,
testSessionsItApierRpcConn,
testSessionsItTPFromFolder,
testSessionsItTerminatUnexist,
testSessionsItUpdateUnexist,
testSessionsItTerminatePassive,
testSessionsItEventCostCompressing,
testSessionsItStopCgrEngine,
}
// Init config first
)
func TestSessionsIt(t *testing.T) {
switch *dbType {
case utils.MetaInternal:
sItCfgDIR = "smg_internal"
case utils.MetaSQL:
sItCfgDIR = "smg_mysql"
case utils.MetaMongo:
sItCfgDIR = "smg_mongo"
case utils.MetaPostgres:
t.SkipNow()
default:
t.Fatal("Unknown Database type")
}
if *encoding == utils.MetaGOB {
sItCfgDIR += "_gob"
}
for _, stest := range sessionsITtests {
t.Run(sItCfgDIR, stest)
}
}
// Init config firs
func testSessionsItInitCfg(t *testing.T) {
sItCfgPath = path.Join(*dataDir, "conf", "samples", sItCfgDIR)
var err error
sItCfg, err = config.NewCGRConfigFromPath(sItCfgPath)
if err != nil {
@@ -51,28 +86,28 @@ func TestSessionsItInitCfg(t *testing.T) {
}
// Remove data in both rating and accounting db
func TestSessionsItResetDataDb(t *testing.T) {
func testSessionsItResetDataDb(t *testing.T) {
if err := engine.InitDataDb(sItCfg); err != nil {
t.Fatal(err)
}
}
// Wipe out the cdr database
func TestSessionsItResetStorDb(t *testing.T) {
func testSessionsItResetStorDb(t *testing.T) {
if err := engine.InitStorDb(sItCfg); err != nil {
t.Fatal(err)
}
}
// Start CGR Engine
func TestSessionsItStartEngine(t *testing.T) {
func testSessionsItStartEngine(t *testing.T) {
if _, err := engine.StopStartEngine(sItCfgPath, *waitRater); err != nil {
t.Fatal(err)
}
}
// Connect rpc client to rater
func TestSessionsItApierRpcConn(t *testing.T) {
func testSessionsItApierRpcConn(t *testing.T) {
var err error
sItRPC, err = newRPCClient(sItCfg.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed
if err != nil {
@@ -81,7 +116,7 @@ func TestSessionsItApierRpcConn(t *testing.T) {
}
// Load the tariff plan, creating accounts and their balances
func TestSessionsItTPFromFolder(t *testing.T) {
func testSessionsItTPFromFolder(t *testing.T) {
attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "tutorial")}
var loadInst utils.LoadInstance
if err := sItRPC.Call(utils.ApierV2LoadTariffPlanFromFolder, attrs, &loadInst); err != nil {
@@ -90,7 +125,7 @@ func TestSessionsItTPFromFolder(t *testing.T) {
time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for scheduler to execute topups
}
func TestSessionsItTerminatUnexist(t *testing.T) {
func testSessionsItTerminatUnexist(t *testing.T) {
var acnt *engine.Account
attrs := &utils.AttrGetAccount{Tenant: "cgrates.org", Account: "1001"}
eAcntVal := 10.0
@@ -163,7 +198,7 @@ func TestSessionsItTerminatUnexist(t *testing.T) {
}
func TestSessionsItUpdateUnexist(t *testing.T) {
func testSessionsItUpdateUnexist(t *testing.T) {
var acnt *engine.Account
attrs := &utils.AttrGetAccount{Tenant: "cgrates.org", Account: "1001"}
eAcntVal := 9.299800
@@ -241,7 +276,7 @@ func TestSessionsItUpdateUnexist(t *testing.T) {
}
}
func TestSessionsItTerminatePassive(t *testing.T) {
func testSessionsItTerminatePassive(t *testing.T) {
//create the event for session
sEv := engine.NewMapEvent(map[string]interface{}{
utils.EVENT_NAME: "UpdateEvent",
@@ -335,7 +370,7 @@ func TestSessionsItTerminatePassive(t *testing.T) {
}
func TestSessionsItEventCostCompressing(t *testing.T) {
func testSessionsItEventCostCompressing(t *testing.T) {
attrSetBalance := utils.AttrSetBalance{
Tenant: "cgrates.org",
Account: "TestSessionsItEventCostCompressing",
@@ -445,7 +480,7 @@ func TestSessionsItEventCostCompressing(t *testing.T) {
}
func TestSessionsItStopCgrEngine(t *testing.T) {
func testSessionsItStopCgrEngine(t *testing.T) {
if err := engine.KillEngine(*waitRater); err != nil {
t.Error(err)
}

View File

@@ -31,31 +31,66 @@ import (
"github.com/cgrates/cgrates/utils"
)
var smgRplcMasterCfgPath, smgRplcSlaveCfgPath string
var smgRplcMasterCfg, smgRplcSlaveCfg *config.CGRConfig
var smgRplcMstrRPC, smgRplcSlvRPC *rpc.Client
var (
smgRplcMasterCfgPath, smgRplcSlaveCfgPath string
smgRplcMasterCfgDIR, smgRplcSlaveCfgDIR string
smgRplcMasterCfg, smgRplcSlaveCfg *config.CGRConfig
smgRplcMstrRPC, smgRplcSlvRPC *rpc.Client
func TestSessionSRplInitCfg(t *testing.T) {
smgRplcMasterCfgPath = path.Join(*dataDir, "conf", "samples", "smgreplcmaster")
if *encoding == utils.MetaGOB {
smgRplcMasterCfgPath = path.Join(*dataDir, "conf", "samples", "smgreplcmaster_gob")
SessionsRplTests = []func(t *testing.T){
testSessionSRplInitCfg,
testSessionSRplResetDB,
testSessionSRplStartEngine,
testSessionSRplApierRpcConn,
testSessionSRplTPFromFolder,
testSessionSRplInitiate,
testSessionSRplUpdate,
testSessionSRplTerminate,
testSessionSRplManualReplicate,
testSessionSRplActivateSessions,
testSessionSRplStopCgrEngine,
}
)
func TestSessionSRpl(t *testing.T) {
switch *dbType {
case utils.MetaInternal:
t.SkipNow()
case utils.MetaSQL:
smgRplcMasterCfgDIR = "smgreplcmaster_mysql"
smgRplcSlaveCfgDIR = "smgreplcslave_mysql"
case utils.MetaMongo:
smgRplcMasterCfgDIR = "smgreplcmaster_mongo"
smgRplcSlaveCfgDIR = "smgreplcslave_mongo"
case utils.MetaPostgres:
t.SkipNow()
default:
t.Fatal("Unknown Database type")
}
if *encoding == utils.MetaGOB {
smgRplcMasterCfgDIR += "_gob"
smgRplcSlaveCfgDIR += "_gob"
}
for _, stest := range SessionsRplTests {
t.Run(*dbType, stest)
}
}
func testSessionSRplInitCfg(t *testing.T) {
smgRplcMasterCfgPath = path.Join(*dataDir, "conf", "samples", smgRplcMasterCfgDIR)
if smgRplcMasterCfg, err = config.NewCGRConfigFromPath(smgRplcMasterCfgPath); err != nil {
t.Fatal(err)
}
smgRplcMasterCfg.DataFolderPath = *dataDir // Share DataFolderPath through config towards StoreDb for Flush()
config.SetCgrConfig(smgRplcMasterCfg)
smgRplcSlaveCfgPath = path.Join(*dataDir, "conf", "samples", "smgreplcslave")
if *encoding == utils.MetaGOB {
smgRplcSlaveCfgPath = path.Join(*dataDir, "conf", "samples", "smgreplcslave_gob")
}
smgRplcSlaveCfgPath = path.Join(*dataDir, "conf", "samples", smgRplcSlaveCfgDIR)
if smgRplcSlaveCfg, err = config.NewCGRConfigFromPath(smgRplcSlaveCfgPath); err != nil {
t.Fatal(err)
}
}
// Remove data in both rating and accounting db
func TestSessionSRplResetDB(t *testing.T) {
func testSessionSRplResetDB(t *testing.T) {
if err := engine.InitDataDb(smgRplcMasterCfg); err != nil {
t.Fatal(err)
}
@@ -65,7 +100,7 @@ func TestSessionSRplResetDB(t *testing.T) {
}
// Start CGR Engine
func TestSessionSRplStartEngine(t *testing.T) {
func testSessionSRplStartEngine(t *testing.T) {
if _, err := engine.StopStartEngine(smgRplcSlaveCfgPath, *waitRater); err != nil { // Start slave before master
t.Fatal(err)
}
@@ -75,7 +110,7 @@ func TestSessionSRplStartEngine(t *testing.T) {
}
// Connect rpc client to rater
func TestSessionSRplApierRpcConn(t *testing.T) {
func testSessionSRplApierRpcConn(t *testing.T) {
if smgRplcMstrRPC, err = newRPCClient(smgRplcMasterCfg.ListenCfg()); err != nil {
t.Fatal(err)
}
@@ -85,7 +120,7 @@ func TestSessionSRplApierRpcConn(t *testing.T) {
}
// Load the tariff plan, creating accounts and their balances
func TestSessionSRplTPFromFolder(t *testing.T) {
func testSessionSRplTPFromFolder(t *testing.T) {
attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "oldtutorial")}
var loadInst utils.LoadInstance
if err := smgRplcMstrRPC.Call(utils.ApierV2LoadTariffPlanFromFolder, attrs, &loadInst); err != nil {
@@ -94,7 +129,7 @@ func TestSessionSRplTPFromFolder(t *testing.T) {
time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for scheduler to execute topups
}
func TestSessionSRplInitiate(t *testing.T) {
func testSessionSRplInitiate(t *testing.T) {
var aSessions []*ExternalSession
//make sure we don't have active sessions on master and passive on slave
if err := smgRplcMstrRPC.Call(utils.SessionSv1GetActiveSessions,
@@ -170,7 +205,7 @@ func TestSessionSRplInitiate(t *testing.T) {
}
}
func TestSessionSRplUpdate(t *testing.T) {
func testSessionSRplUpdate(t *testing.T) {
//update the session on slave so the session should became active
usage := time.Duration(1 * time.Minute)
argsUpdate := &V1UpdateSessionArgs{
@@ -250,7 +285,7 @@ func TestSessionSRplUpdate(t *testing.T) {
}
}
func TestSessionSRplTerminate(t *testing.T) {
func testSessionSRplTerminate(t *testing.T) {
args := &V1TerminateSessionArgs{
TerminateSession: true,
CGREvent: &utils.CGREvent{
@@ -305,7 +340,7 @@ func TestSessionSRplTerminate(t *testing.T) {
}
}
func TestSessionSRplManualReplicate(t *testing.T) {
func testSessionSRplManualReplicate(t *testing.T) {
masterProc, err := engine.StopStartEngine(smgRplcMasterCfgPath, *waitRater)
if err != nil { // Kill both and start Master
t.Fatal(err)
@@ -458,7 +493,7 @@ func TestSessionSRplManualReplicate(t *testing.T) {
}
}
func TestSessionSRplActivateSessions(t *testing.T) {
func testSessionSRplActivateSessions(t *testing.T) {
var aSessions []*ExternalSession
var reply string
// Activate first session (with ID: ede927f8e42318a8db02c0f74adc2d9e16770339)
@@ -510,7 +545,7 @@ func TestSessionSRplActivateSessions(t *testing.T) {
}
}
func TestSessionSRplStopCgrEngine(t *testing.T) {
func testSessionSRplStopCgrEngine(t *testing.T) {
if err := engine.KillEngine(1000); err != nil {
t.Error(err)
}

View File

@@ -20,11 +20,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package sessions
import (
"errors"
"flag"
"fmt"
"net/rpc"
"net/rpc/jsonrpc"
"path"
"testing"
"time"
@@ -35,31 +32,54 @@ import (
)
var (
waitRater = flag.Int("wait_rater", 150, "Number of miliseconds to wait for rater to start and cache")
dataDir = flag.String("data_dir", "/usr/share/cgrates", "CGR data dir path here")
voiceCfgPath string
voiceCfgDIR string
voiceCfg *config.CGRConfig
sessionsRPC *rpc.Client
encoding = flag.String("rpc", utils.MetaJSON, "what encoding whould be uused for rpc comunication")
sessionsVoiceTests = []func(t *testing.T){
testSessionsVoiceInitCfg,
testSessionsVoiceResetDataDb,
testSessionsVoiceResetStorDb,
testSessionsVoiceStartEngine,
testSessionsVoiceApierRpcConn,
testSessionsVoiceTPFromFolder,
testSessionsVoiceMonetaryRefund,
testSessionsVoiceVoiceRefund,
testSessionsVoiceMixedRefund,
testSessionsVoiceLastUsed,
testSessionsVoiceLastUsedEnd,
testSessionsVoiceLastUsedNotFixed,
testSessionsVoiceSessionTTL,
testSessionsVoiceSessionTTLWithRelocate,
testSessionsVoiceRelocateWithOriginIDPrefix,
testSessionsVoiceStopCgrEngine,
}
)
func newRPCClient(cfg *config.ListenCfg) (c *rpc.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)
func TestSessionsVoice(t *testing.T) {
switch *dbType {
case utils.MetaInternal:
voiceCfgDIR = "smg_internal"
case utils.MetaSQL:
voiceCfgDIR = "smg_mysql"
case utils.MetaMongo:
voiceCfgDIR = "smg_mongo"
case utils.MetaPostgres:
t.SkipNow()
default:
return nil, errors.New("UNSUPPORTED_RPC")
t.Fatal("Unknown Database type")
}
if *encoding == utils.MetaGOB {
voiceCfgDIR += "_gob"
}
for _, stest := range sessionsVoiceTests {
t.Run(voiceCfgDIR, stest)
}
}
func TestSessionsVoiceInitCfg(t *testing.T) {
voiceCfgPath = path.Join(*dataDir, "conf", "samples", "smg")
if *encoding == utils.MetaGOB {
dataCfgPath = path.Join(*dataDir, "conf", "samples", "smg_gob")
}
func testSessionsVoiceInitCfg(t *testing.T) {
voiceCfgPath = path.Join(*dataDir, "conf", "samples", voiceCfgDIR)
// Init config first
var err error
voiceCfg, err = config.NewCGRConfigFromPath(voiceCfgPath)
@@ -71,28 +91,28 @@ func TestSessionsVoiceInitCfg(t *testing.T) {
}
// Remove data in both rating and accounting db
func TestSessionsVoiceResetDataDb(t *testing.T) {
func testSessionsVoiceResetDataDb(t *testing.T) {
if err := engine.InitDataDb(voiceCfg); err != nil {
t.Fatal(err)
}
}
// Wipe out the cdr database
func TestSessionsVoiceResetStorDb(t *testing.T) {
func testSessionsVoiceResetStorDb(t *testing.T) {
if err := engine.InitStorDb(voiceCfg); err != nil {
t.Fatal(err)
}
}
// Start CGR Engine
func TestSessionsVoiceStartEngine(t *testing.T) {
func testSessionsVoiceStartEngine(t *testing.T) {
if _, err := engine.StopStartEngine(voiceCfgPath, *waitRater); err != nil {
t.Fatal(err)
}
}
// Connect rpc client to rater
func TestSessionsVoiceApierRpcConn(t *testing.T) {
func testSessionsVoiceApierRpcConn(t *testing.T) {
var err error
sessionsRPC, err = newRPCClient(voiceCfg.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed
if err != nil {
@@ -101,7 +121,7 @@ func TestSessionsVoiceApierRpcConn(t *testing.T) {
}
// Load the tariff plan, creating accounts and their balances
func TestSessionsVoiceTPFromFolder(t *testing.T) {
func testSessionsVoiceTPFromFolder(t *testing.T) {
attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "oldtutorial")}
var loadInst utils.LoadInstance
if err := sessionsRPC.Call(utils.ApierV2LoadTariffPlanFromFolder, attrs, &loadInst); err != nil {
@@ -110,7 +130,7 @@ func TestSessionsVoiceTPFromFolder(t *testing.T) {
time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for scheduler to execute topups
}
func TestSessionsVoiceMonetaryRefund(t *testing.T) {
func testSessionsVoiceMonetaryRefund(t *testing.T) {
usage := time.Duration(1*time.Minute + 30*time.Second)
initArgs := &V1InitSessionArgs{
InitSession: true,
@@ -187,7 +207,7 @@ func TestSessionsVoiceMonetaryRefund(t *testing.T) {
}
}
func TestSessionsVoiceVoiceRefund(t *testing.T) {
func testSessionsVoiceVoiceRefund(t *testing.T) {
usage := time.Duration(1*time.Minute + 30*time.Second)
initArgs := &V1InitSessionArgs{
InitSession: true,
@@ -266,7 +286,7 @@ func TestSessionsVoiceVoiceRefund(t *testing.T) {
}
}
func TestSessionsVoiceMixedRefund(t *testing.T) {
func testSessionsVoiceMixedRefund(t *testing.T) {
var acnt *engine.Account
attrs := &utils.AttrGetAccount{Tenant: "cgrates.org", Account: "1001"}
if err := sessionsRPC.Call(utils.ApierV2GetAccount, attrs, &acnt); err != nil {
@@ -360,7 +380,7 @@ func TestSessionsVoiceMixedRefund(t *testing.T) {
//t.Logf("After voice: %f", acnt.BalanceMap[utils.VOICE].GetTotalValue())
}
func TestSessionsVoiceLastUsed(t *testing.T) {
func testSessionsVoiceLastUsed(t *testing.T) {
var acnt *engine.Account
attrs := &utils.AttrGetAccount{Tenant: "cgrates.org", Account: "1001"}
eAcntVal := 8.790000
@@ -521,7 +541,7 @@ func TestSessionsVoiceLastUsed(t *testing.T) {
}
}
func TestSessionsVoiceLastUsedEnd(t *testing.T) {
func testSessionsVoiceLastUsedEnd(t *testing.T) {
var acnt *engine.Account
attrs := &utils.AttrGetAccount{Tenant: "cgrates.org", Account: "1001"}
eAcntVal := 7.59000
@@ -643,7 +663,7 @@ func TestSessionsVoiceLastUsedEnd(t *testing.T) {
}
}
func TestSessionsVoiceLastUsedNotFixed(t *testing.T) {
func testSessionsVoiceLastUsedNotFixed(t *testing.T) {
var acnt *engine.Account
attrs := &utils.AttrGetAccount{Tenant: "cgrates.org", Account: "1001"}
eAcntVal := 6.59000
@@ -765,7 +785,7 @@ func TestSessionsVoiceLastUsedNotFixed(t *testing.T) {
}
}
func TestSessionsVoiceSessionTTL(t *testing.T) {
func testSessionsVoiceSessionTTL(t *testing.T) {
var acnt *engine.Account
attrs := &utils.AttrGetAccount{Tenant: "cgrates.org", Account: "1001"}
eAcntVal := 5.590000
@@ -919,7 +939,7 @@ func TestSessionsVoiceSessionTTL(t *testing.T) {
}
}
func TestSessionsVoiceSessionTTLWithRelocate(t *testing.T) {
func testSessionsVoiceSessionTTLWithRelocate(t *testing.T) {
attrSetBalance := utils.AttrSetBalance{
Tenant: "cgrates.org",
Account: "TestTTLWithRelocate",
@@ -1092,7 +1112,7 @@ func TestSessionsVoiceSessionTTLWithRelocate(t *testing.T) {
}
}
func TestSessionsVoiceRelocateWithOriginIDPrefix(t *testing.T) {
func testSessionsVoiceRelocateWithOriginIDPrefix(t *testing.T) {
attrSetBalance := utils.AttrSetBalance{
Tenant: "cgrates.org",
Account: "TestRelocateWithOriginIDPrefix",
@@ -1346,7 +1366,7 @@ func TestSMGDataDerivedChargingNoCredit(t *testing.T) {
*/
// ToDo: Add test for ChargeEvent with derived charging, one with debit possible and second not so we see refund and error.CreditInsufficient showing up.
func TestSessionsVoiceStopCgrEngine(t *testing.T) {
func testSessionsVoiceStopCgrEngine(t *testing.T) {
if err := engine.KillEngine(1000); err != nil {
t.Error(err)
}