From 8db2b850379bbc6aac5c95493fa500396d87d2a8 Mon Sep 17 00:00:00 2001 From: adragusin Date: Thu, 16 Jan 2020 18:07:02 +0200 Subject: [PATCH] Updated IT tests/Updated systemd file (fixes #1859) --- cmd/cgr-engine/cgr-engine.go | 2 +- config/config_defaults.go | 2 +- config/config_json_test.go | 2 +- config/config_test.go | 2 +- .../samples/filters_internal/cgrates.json | 71 +++++++++ data/conf/samples/filters_mongo/cgrates.json | 76 +++++++++ data/conf/samples/filters_mysql/cgrates.json | 73 +++++++++ .../cgrates.json | 2 +- .../multiplecdrc_fwexport.json | 141 +++++++++++++++++ .../multiplecdrc_fwexport.json | 146 ++++++++++++++++++ .../multiplecdrc_fwexport.json | 137 ++++++++++++++++ .../samples/rpccaching_internal/cgrates.json | 76 +++++++++ .../samples/rpccaching_mongo/cgrates.json | 82 ++++++++++ .../cgrates.json | 0 general_tests/cdre_it_test.go | 32 ++-- general_tests/cdrs_internal_it_test.go | 20 ++- general_tests/cdrs_it_test.go | 19 ++- general_tests/cdrs_processevent_it_test.go | 69 ++++----- general_tests/data_it_test.go | 15 +- general_tests/destination_combined_it_test.go | 15 +- general_tests/filters_it_test.go | 14 +- general_tests/multiplecdrc_it_test.go | 17 +- general_tests/resourcesv1_it_test.go | 44 +++--- general_tests/rpccaching_it_test.go | 70 +++++---- general_tests/session2_it_test.go | 22 +-- general_tests/session3_it_test.go | 15 +- general_tests/session_it_test.go | 17 +- general_tests/sessionrefund_it_test.go | 17 +- general_tests/supplier_it_test.go | 20 ++- general_tests/tp_it_test.go | 17 +- general_tests/tutorial2_it_test.go | 19 ++- general_tests/tutorial_it_test.go | 20 ++- packages/debian/cgrates.service | 15 +- 33 files changed, 1115 insertions(+), 174 deletions(-) create mode 100644 data/conf/samples/filters_internal/cgrates.json create mode 100644 data/conf/samples/filters_mongo/cgrates.json create mode 100644 data/conf/samples/filters_mysql/cgrates.json rename data/conf/samples/{internal_ttl => internal_ttl_internal}/cgrates.json (94%) create mode 100644 data/conf/samples/multiplecdrc_internal/multiplecdrc_fwexport.json create mode 100644 data/conf/samples/multiplecdrc_mongo/multiplecdrc_fwexport.json create mode 100644 data/conf/samples/multiplecdrc_mysql/multiplecdrc_fwexport.json create mode 100644 data/conf/samples/rpccaching_internal/cgrates.json create mode 100644 data/conf/samples/rpccaching_mongo/cgrates.json rename data/conf/samples/{rpccaching => rpccaching_mysql}/cgrates.json (100%) diff --git a/cmd/cgr-engine/cgr-engine.go b/cmd/cgr-engine/cgr-engine.go index 9f86338ff..7b8468797 100644 --- a/cmd/cgr-engine/cgr-engine.go +++ b/cmd/cgr-engine/cgr-engine.go @@ -55,7 +55,7 @@ var ( singlecpu = cgrEngineFlags.Bool("singlecpu", false, "Run on single CPU core") syslogger = cgrEngineFlags.String("logger", "", "logger <*syslog|*stdout>") nodeID = cgrEngineFlags.String("node_id", "", "The node ID of the engine") - logLevel = cgrEngineFlags.Int("log_level", -1, "Log level (0-emergency to 7-debug)") + logLevel = cgrEngineFlags.Int("log_level", 6, "Log level (0-emergency to 7-debug)") cfg *config.CGRConfig ) diff --git a/config/config_defaults.go b/config/config_defaults.go index 27409cc7f..956ae1073 100755 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -217,7 +217,7 @@ const CGRATES_CFG_JSON = ` "*diameter_messages": {"limit": -1, "ttl": "3h", "static_ttl": false}, // diameter messages caching "*rpc_responses": {"limit": 0, "ttl": "2s", "static_ttl": false}, // RPC responses caching "*closed_sessions": {"limit": -1, "ttl": "10s", "static_ttl": false}, // closed sessions cached for CDRs - "*cdr_ids": {"limit": -1, "ttl": "", "static_ttl": false}, // protects CDRs against double-charging + "*cdr_ids": {"limit": -1, "ttl": "10m", "static_ttl": false}, // protects CDRs against double-charging "*load_ids": {"limit": -1, "ttl": "", "static_ttl": false, "precache": false}, // control the load_ids for items "*rpc_connections": {"limit": -1, "ttl": "", "static_ttl": false}, // RPC connections caching }, diff --git a/config/config_json_test.go b/config/config_json_test.go index 7922f3e59..46bdfc90d 100755 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -161,7 +161,7 @@ func TestCacheJsonCfg(t *testing.T) { utils.CacheClosedSessions: &CacheParamJsonCfg{Limit: utils.IntPointer(-1), Ttl: utils.StringPointer("10s"), Static_ttl: utils.BoolPointer(false)}, utils.CacheCDRIDs: &CacheParamJsonCfg{Limit: utils.IntPointer(-1), - Ttl: utils.StringPointer(""), Static_ttl: utils.BoolPointer(false)}, + Ttl: utils.StringPointer("10m"), Static_ttl: utils.BoolPointer(false)}, utils.CacheLoadIDs: &CacheParamJsonCfg{Limit: utils.IntPointer(-1), Ttl: utils.StringPointer(""), Static_ttl: utils.BoolPointer(false), Precache: utils.BoolPointer(false)}, diff --git a/config/config_test.go b/config/config_test.go index a09a45bc9..64ecf6832 100755 --- a/config/config_test.go +++ b/config/config_test.go @@ -724,7 +724,7 @@ func TestCgrCfgJSONDefaultsCacheCFG(t *testing.T) { utils.CacheClosedSessions: &CacheParamCfg{Limit: -1, TTL: time.Duration(10 * time.Second), StaticTTL: false}, utils.CacheCDRIDs: &CacheParamCfg{Limit: -1, - TTL: time.Duration(0), StaticTTL: false}, + TTL: time.Duration(10 * time.Minute), StaticTTL: false}, utils.CacheLoadIDs: &CacheParamCfg{Limit: -1, TTL: time.Duration(0), StaticTTL: false, Precache: false}, utils.CacheRPCConnections: &CacheParamCfg{Limit: -1, diff --git a/data/conf/samples/filters_internal/cgrates.json b/data/conf/samples/filters_internal/cgrates.json new file mode 100644 index 000000000..4f809155b --- /dev/null +++ b/data/conf/samples/filters_internal/cgrates.json @@ -0,0 +1,71 @@ +{ +// CGRateS Configuration file +// + + +"general": { + "log_level": 7, + "node_id": "CGRFilterS", +}, + + +"listen": { + "rpc_json": ":2012", + "rpc_gob": ":2013", + "http": ":2080", +}, + + +"data_db": { + "db_type": "*internal", +}, + + +"stor_db": { + "db_type": "*internal", +}, + + +"rals": { + "enabled": true, + "thresholds_conns": ["*localhost"], +}, + +"schedulers": { + "enabled": true, +}, + +"filters": { + "stats_conns": ["*localhost"], + "resources_conns": ["*localhost"], + "rals_conns": ["*localhost"], +}, + + +"resources": { + "enabled": true, + "indexed_selects":false, + "store_interval": "-1", +}, + + +"stats": { + "enabled": true, + "indexed_selects":false, + "store_interval": "-1", +}, + + +"thresholds": { + "enabled": true, + "indexed_selects":false, + "store_interval": "-1", +}, + +"apier": { + "caches_conns":["*localhost"], + "scheduler_conns": ["*internal"], +}, + + +} diff --git a/data/conf/samples/filters_mongo/cgrates.json b/data/conf/samples/filters_mongo/cgrates.json new file mode 100644 index 000000000..26d0b7c66 --- /dev/null +++ b/data/conf/samples/filters_mongo/cgrates.json @@ -0,0 +1,76 @@ +{ +// CGRateS Configuration file +// + + +"general": { + "log_level": 7, + "node_id": "CGRFilterS", +}, + + +"listen": { + "rpc_json": ":2012", + "rpc_gob": ":2013", + "http": ":2080", +}, + + + +"data_db": { + "db_type": "mongo", + "db_name": "10", + "db_port": 27017, +}, + + +"stor_db": { + "db_type": "mongo", + "db_name": "cgrates", + "db_port": 27017, +}, + + +"rals": { + "enabled": true, + "thresholds_conns": ["*localhost"], +}, + +"schedulers": { + "enabled": true, +}, + +"filters": { + "stats_conns": ["*localhost"], + "resources_conns": ["*localhost"], + "rals_conns": ["*localhost"], +}, + + +"resources": { + "enabled": true, + "indexed_selects":false, + "store_interval": "1s", +}, + + +"stats": { + "enabled": true, + "indexed_selects":false, + "store_interval": "1s", +}, + + +"thresholds": { + "enabled": true, + "indexed_selects":false, + "store_interval": "1s", +}, + +"apier": { + "caches_conns":["*localhost"], + "scheduler_conns": ["*internal"], +}, + + +} diff --git a/data/conf/samples/filters_mysql/cgrates.json b/data/conf/samples/filters_mysql/cgrates.json new file mode 100644 index 000000000..50cb3cd4d --- /dev/null +++ b/data/conf/samples/filters_mysql/cgrates.json @@ -0,0 +1,73 @@ +{ +// CGRateS Configuration file +// + + +"general": { + "log_level": 7, + "node_id": "CGRFilterS", +}, + + +"listen": { + "rpc_json": ":2012", + "rpc_gob": ":2013", + "http": ":2080", +}, + + +"data_db": { // database used to store runtime data (eg: accounts, cdr stats) + "db_type": "redis", // data_db type: + "db_port": 6379, // data_db port to reach the database + "db_name": "10", // data_db database name to connect to +}, + + +"stor_db": { + "db_password": "CGRateS.org", +}, + + +"rals": { + "enabled": true, + "thresholds_conns": ["*localhost"], +}, + +"schedulers": { + "enabled": true, +}, + +"filters": { + "stats_conns": ["*localhost"], + "resources_conns": ["*localhost"], + "rals_conns": ["*localhost"], +}, + + +"resources": { + "enabled": true, + "indexed_selects":false, + "store_interval": "1s", +}, + + +"stats": { + "enabled": true, + "indexed_selects":false, + "store_interval": "1s", +}, + + +"thresholds": { + "enabled": true, + "indexed_selects":false, + "store_interval": "1s", +}, + +"apier": { + "caches_conns":["*localhost"], + "scheduler_conns": ["*internal"], +}, + + +} diff --git a/data/conf/samples/internal_ttl/cgrates.json b/data/conf/samples/internal_ttl_internal/cgrates.json similarity index 94% rename from data/conf/samples/internal_ttl/cgrates.json rename to data/conf/samples/internal_ttl_internal/cgrates.json index 578ba71a7..90ae87bd1 100644 --- a/data/conf/samples/internal_ttl/cgrates.json +++ b/data/conf/samples/internal_ttl_internal/cgrates.json @@ -19,7 +19,7 @@ "stor_db": { - "db_type": "*internal", + "db_type": "*internal", "items":{ "cdrs": {"ttl": "2s"} } diff --git a/data/conf/samples/multiplecdrc_internal/multiplecdrc_fwexport.json b/data/conf/samples/multiplecdrc_internal/multiplecdrc_fwexport.json new file mode 100644 index 000000000..276f8c492 --- /dev/null +++ b/data/conf/samples/multiplecdrc_internal/multiplecdrc_fwexport.json @@ -0,0 +1,141 @@ +{ +// CGRateS Configuration file +// +// Used in mediator_local_test +// Starts rater, cdrs and mediator connecting over internal channel + +"data_db": { + "db_type": "*internal", +}, + + +"stor_db": { + "db_type": "*internal", +}, +"rals": { + "enabled": true, // enable Rater service: +}, + +"schedulers": { + "enabled": true, // start Scheduler service: +}, + +"cdrs": { + "enabled": true, // start the CDR Server service: +}, + +"chargers": { + "enabled": true, +}, + +"cdrc": [ + { + "id": "CDRC-CSV1", + "enabled": true, // enable CDR client functionality + "cdr_in_path": "/tmp/cgrates/cdrc1/in", // absolute path towards the directory where the CDRs are stored + "cdr_out_path": "/tmp/cgrates/cdrc1/out", // absolute path towards the directory where processed CDRs will be moved + "cdr_source_id": "csv1", // free form field, tag identifying the source of the CDRs within CDRS database + }, + { + "id": "CDRC-CSV2", + "enabled": true, // enable CDR client functionality + "cdr_in_path": "/tmp/cgrates/cdrc2/in", // absolute path towards the directory where the CDRs are stored + "cdr_out_path": "/tmp/cgrates/cdrc2/out", // absolute path towards the directory where processed CDRs will be moved + "cdr_source_id": "csv2", // free form field, tag identifying the source of the CDRs within CDRS database + "content_fields":[ // import template, tag will match internally CDR field, in case of .csv value will be represented by index of the field value + {"cdr_field_id": "tor", "value": "~7:s/^(voice|data|sms|generic)$/*$1/"}, + {"cdr_field_id": "accid", "value": "0"}, + {"cdr_field_id": "reqtype", "value": "^rated"}, + {"cdr_field_id": "direction", "value": "^*out"}, + {"cdr_field_id": "tenant", "value": "^cgrates.org"}, + {"cdr_field_id": "category", "value": "~7:s/^voice$/call/"}, + {"cdr_field_id": "account", "value": "3"}, + {"cdr_field_id": "subject", "value": "3"}, + {"cdr_field_id": "destination", "value": "~5:s/^0([1-9]\\d+)$/+49$1/"}, + {"cdr_field_id": "setup_time", "value": "1"}, + {"cdr_field_id": "answer_time", "value": "1"}, + {"cdr_field_id": "usage", "value": "~9:s/^(\\d+)$/${1}s/"}, + ], + }, + { + "id": "CDRC-CSV3", + "enabled": true, // enable CDR client functionality + "field_separator": ";", // separator used in case of csv files + "cdr_in_path": "/tmp/cgrates/cdrc3/in", // absolute path towards the directory where the CDRs are stored + "cdr_out_path": "/tmp/cgrates/cdrc3/out", // absolute path towards the directory where processed CDRs will be moved + "cdr_source_id": "csv3", // free form field, tag identifying the source of the CDRs within CDRS database + "content_fields":[ // import template, tag will match internally CDR field, in case of .csv value will be represented by index of the field value + {"cdr_field_id": "tor", "value": "^*voice"}, + {"cdr_field_id": "accid", "value": "~3:s/^(\\d{2})\\.(\\d{2})\\.(\\d{4})\\s{2}(\\d{2}):(\\d{2}):(\\d{2})$/$1$2$3$4$5$6/"}, + {"cdr_field_id": "reqtype", "value": "^rated"}, + {"cdr_field_id": "direction", "value": "^*out"}, + {"cdr_field_id": "tenant", "value": "^cgrates.org"}, + {"cdr_field_id": "category", "value": "^call"}, + {"cdr_field_id": "account", "value": "~0:s/^([1-9]\\d+)$/+$1/"}, + {"cdr_field_id": "subject", "value": "~0:s/^([1-9]\\d+)$/+$1/"}, + {"cdr_field_id": "destination", "value": "~1:s/^([1-9]\\d+)$/+$1/"}, + {"cdr_field_id": "setup_time", "value": "4"}, + {"cdr_field_id": "answer_time", "value": "4"}, + {"cdr_field_id": "usage", "value": "~6:s/^(\\d+)$/${1}s/"}, + ], + } +], + +"cdre": { + "CDRE-FW1": { + "export_format": "*file_fwv", + "field_separator": "", + "header_fields": [ + {"tag": "ToR", "type": "constant", "value": "10", "width": 2}, + {"tag": "Filler1", "type": "filler", "width": 3}, + {"tag": "FileType", "type": "constant", "value": "SIP", "width": 3}, + {"tag": "FileSeqNr", "type": "metatag", "value": "export_id", "padding": "zeroleft", "width": 5}, + {"tag": "LastCdr", "type": "metatag", "value": "last_cdr_atime", "layout": "020106150405", "width": 12}, + {"tag": "FileCreationfTime", "type": "metatag", "value": "time_now", "layout": "020106150405", "width": 12}, + {"tag": "FileVersion", "type": "constant", "value": "01", "width": 2}, + {"tag": "Filler2", "type": "filler", "width": 105}, + ], // template of the exported header fields + "content_fields": [ // template of the exported content fields + {"tag": "ToR", "type": "constant", "value": "20", "width": 2}, + {"tag": "Subject", "type": "cdrfield", "value": "subject", "width": 12, "padding": "right", "mandatory": true}, + {"tag": "ConnectionNumber", "type": "constant", "value": "00000", "width": 5}, + {"tag": "CallerId", "type": "cdrfield", "value": "~callerid:s/\\+(\\d+)/00$1/", "strip": "xright", "width": 15, "padding": "right"}, + {"tag": "Destination", "type": "cdrfield", "value": "~destination:s/^\\+311400(\\d+)/$1/:s/^\\+311412\\d\\d112/112/:s/^\\+31(\\d+)/0$1/:s/^\\+(\\d+)/00$1/", + "strip": "xright", "width": 24, "padding": "right", "mandatory": true}, + {"tag": "TypeOfService", "type": "constant", "value": "00", "width": 2}, + {"tag": "ServiceId", "type": "constant", "value": "11", "width": 4, "padding": "right"}, + {"tag": "AnswerTime", "type": "cdrfield", "value": "answer_time", "layout": "020106150405", "width": 12, "mandatory": true}, + {"tag": "Usage", "type": "cdrfield", "value": "usage", "layout": "seconds", "width": 6, "padding": "right", "mandatory": true}, + {"tag": "DataCounter", "type": "filler", "width": 6}, + {"tag": "VatCode", "type": "constant", "value": "1", "width": 1}, + {"tag": "NetworkId", "type": "constant", "value": "S1", "width": 2}, + {"tag": "DestinationSubId", "type": "cdrfield", "value": "~cost_details:s/MatchedDestId:.+_(\\w{5})/$1/:s/(\\w{6})/$1/", "width": 5}, + {"tag": "NetworkSubtype", "type": "constant", "value": "3", "width": 1, "padding": "left"}, + {"tag": "CgrId", "type": "cdrfield", "value": "cgrid", "strip": "xleft", "width": 16, "padding": "right", "mandatory": true}, + {"tag": "FillerVolume1", "type": "filler", "width": 8}, + {"tag": "FillerVolume2", "type": "filler", "width": 8}, + {"tag": "DestinationSubId", "type": "cdrfield", "value": "~cost_details:s/MatchedDestId:.+_(\\w{5})/$1/:s/(\\w{6})/$1/", "width": 5}, + {"tag": "Cost", "type": "cdrfield", "value": "cost", "padding": "zeroleft", "width": 9}, + {"tag": "MaskDestination", "type": "metatag", "value": "mask_destination", "width": 1}, + ], + "trailer_fields": [ + {"tag": "ToR", "type": "constant", "value": "90", "width": 2}, + {"tag": "Filler1", "type": "filler", "width": 3}, + {"tag": "FileType", "type": "constant", "value": "SIP", "width": 3}, + {"tag": "FileSeqNr", "type": "metatag", "value": "export_id", "padding": "zeroleft", "width": 5}, + {"tag": "TotalRecords", "type": "metatag", "value": "cdrs_number", "padding": "zeroleft", "width": 6}, + {"tag": "TotalDuration", "type": "metatag", "value": "cdrs_duration", "padding": "zeroleft", "width": 8}, + {"tag": "FirstCdrTime", "type": "metatag", "value": "first_cdr_atime", "layout": "020106150405", "width": 12}, + {"tag": "LastCdrTime", "type": "metatag", "value": "last_cdr_atime", "layout": "020106150405", "width": 12}, + {"tag": "Filler1", "type": "filler", "width": 93}, + ], // template of the exported trailer fields + } +}, + + +"apier": { + "scheduler_conns": ["*internal"], +}, + + +} diff --git a/data/conf/samples/multiplecdrc_mongo/multiplecdrc_fwexport.json b/data/conf/samples/multiplecdrc_mongo/multiplecdrc_fwexport.json new file mode 100644 index 000000000..b9bdfe204 --- /dev/null +++ b/data/conf/samples/multiplecdrc_mongo/multiplecdrc_fwexport.json @@ -0,0 +1,146 @@ +{ +// CGRateS Configuration file +// +// Used in mediator_local_test +// Starts rater, cdrs and mediator connecting over internal channel + +"data_db": { + "db_type": "mongo", + "db_name": "10", + "db_port": 27017, +}, + + +"stor_db": { + "db_type": "mongo", + "db_name": "cgrates", + "db_port": 27017, +}, + +"rals": { + "enabled": true, // enable Rater service: +}, + +"schedulers": { + "enabled": true, // start Scheduler service: +}, + +"cdrs": { + "enabled": true, // start the CDR Server service: +}, + +"chargers": { + "enabled": true, +}, + +"cdrc": [ + { + "id": "CDRC-CSV1", + "enabled": true, // enable CDR client functionality + "cdr_in_path": "/tmp/cgrates/cdrc1/in", // absolute path towards the directory where the CDRs are stored + "cdr_out_path": "/tmp/cgrates/cdrc1/out", // absolute path towards the directory where processed CDRs will be moved + "cdr_source_id": "csv1", // free form field, tag identifying the source of the CDRs within CDRS database + }, + { + "id": "CDRC-CSV2", + "enabled": true, // enable CDR client functionality + "cdr_in_path": "/tmp/cgrates/cdrc2/in", // absolute path towards the directory where the CDRs are stored + "cdr_out_path": "/tmp/cgrates/cdrc2/out", // absolute path towards the directory where processed CDRs will be moved + "cdr_source_id": "csv2", // free form field, tag identifying the source of the CDRs within CDRS database + "content_fields":[ // import template, tag will match internally CDR field, in case of .csv value will be represented by index of the field value + {"cdr_field_id": "tor", "value": "~7:s/^(voice|data|sms|generic)$/*$1/"}, + {"cdr_field_id": "accid", "value": "0"}, + {"cdr_field_id": "reqtype", "value": "^rated"}, + {"cdr_field_id": "direction", "value": "^*out"}, + {"cdr_field_id": "tenant", "value": "^cgrates.org"}, + {"cdr_field_id": "category", "value": "~7:s/^voice$/call/"}, + {"cdr_field_id": "account", "value": "3"}, + {"cdr_field_id": "subject", "value": "3"}, + {"cdr_field_id": "destination", "value": "~5:s/^0([1-9]\\d+)$/+49$1/"}, + {"cdr_field_id": "setup_time", "value": "1"}, + {"cdr_field_id": "answer_time", "value": "1"}, + {"cdr_field_id": "usage", "value": "~9:s/^(\\d+)$/${1}s/"}, + ], + }, + { + "id": "CDRC-CSV3", + "enabled": true, // enable CDR client functionality + "field_separator": ";", // separator used in case of csv files + "cdr_in_path": "/tmp/cgrates/cdrc3/in", // absolute path towards the directory where the CDRs are stored + "cdr_out_path": "/tmp/cgrates/cdrc3/out", // absolute path towards the directory where processed CDRs will be moved + "cdr_source_id": "csv3", // free form field, tag identifying the source of the CDRs within CDRS database + "content_fields":[ // import template, tag will match internally CDR field, in case of .csv value will be represented by index of the field value + {"cdr_field_id": "tor", "value": "^*voice"}, + {"cdr_field_id": "accid", "value": "~3:s/^(\\d{2})\\.(\\d{2})\\.(\\d{4})\\s{2}(\\d{2}):(\\d{2}):(\\d{2})$/$1$2$3$4$5$6/"}, + {"cdr_field_id": "reqtype", "value": "^rated"}, + {"cdr_field_id": "direction", "value": "^*out"}, + {"cdr_field_id": "tenant", "value": "^cgrates.org"}, + {"cdr_field_id": "category", "value": "^call"}, + {"cdr_field_id": "account", "value": "~0:s/^([1-9]\\d+)$/+$1/"}, + {"cdr_field_id": "subject", "value": "~0:s/^([1-9]\\d+)$/+$1/"}, + {"cdr_field_id": "destination", "value": "~1:s/^([1-9]\\d+)$/+$1/"}, + {"cdr_field_id": "setup_time", "value": "4"}, + {"cdr_field_id": "answer_time", "value": "4"}, + {"cdr_field_id": "usage", "value": "~6:s/^(\\d+)$/${1}s/"}, + ], + } +], + +"cdre": { + "CDRE-FW1": { + "export_format": "*file_fwv", + "field_separator": "", + "header_fields": [ + {"tag": "ToR", "type": "constant", "value": "10", "width": 2}, + {"tag": "Filler1", "type": "filler", "width": 3}, + {"tag": "FileType", "type": "constant", "value": "SIP", "width": 3}, + {"tag": "FileSeqNr", "type": "metatag", "value": "export_id", "padding": "zeroleft", "width": 5}, + {"tag": "LastCdr", "type": "metatag", "value": "last_cdr_atime", "layout": "020106150405", "width": 12}, + {"tag": "FileCreationfTime", "type": "metatag", "value": "time_now", "layout": "020106150405", "width": 12}, + {"tag": "FileVersion", "type": "constant", "value": "01", "width": 2}, + {"tag": "Filler2", "type": "filler", "width": 105}, + ], // template of the exported header fields + "content_fields": [ // template of the exported content fields + {"tag": "ToR", "type": "constant", "value": "20", "width": 2}, + {"tag": "Subject", "type": "cdrfield", "value": "subject", "width": 12, "padding": "right", "mandatory": true}, + {"tag": "ConnectionNumber", "type": "constant", "value": "00000", "width": 5}, + {"tag": "CallerId", "type": "cdrfield", "value": "~callerid:s/\\+(\\d+)/00$1/", "strip": "xright", "width": 15, "padding": "right"}, + {"tag": "Destination", "type": "cdrfield", "value": "~destination:s/^\\+311400(\\d+)/$1/:s/^\\+311412\\d\\d112/112/:s/^\\+31(\\d+)/0$1/:s/^\\+(\\d+)/00$1/", + "strip": "xright", "width": 24, "padding": "right", "mandatory": true}, + {"tag": "TypeOfService", "type": "constant", "value": "00", "width": 2}, + {"tag": "ServiceId", "type": "constant", "value": "11", "width": 4, "padding": "right"}, + {"tag": "AnswerTime", "type": "cdrfield", "value": "answer_time", "layout": "020106150405", "width": 12, "mandatory": true}, + {"tag": "Usage", "type": "cdrfield", "value": "usage", "layout": "seconds", "width": 6, "padding": "right", "mandatory": true}, + {"tag": "DataCounter", "type": "filler", "width": 6}, + {"tag": "VatCode", "type": "constant", "value": "1", "width": 1}, + {"tag": "NetworkId", "type": "constant", "value": "S1", "width": 2}, + {"tag": "DestinationSubId", "type": "cdrfield", "value": "~cost_details:s/MatchedDestId:.+_(\\w{5})/$1/:s/(\\w{6})/$1/", "width": 5}, + {"tag": "NetworkSubtype", "type": "constant", "value": "3", "width": 1, "padding": "left"}, + {"tag": "CgrId", "type": "cdrfield", "value": "cgrid", "strip": "xleft", "width": 16, "padding": "right", "mandatory": true}, + {"tag": "FillerVolume1", "type": "filler", "width": 8}, + {"tag": "FillerVolume2", "type": "filler", "width": 8}, + {"tag": "DestinationSubId", "type": "cdrfield", "value": "~cost_details:s/MatchedDestId:.+_(\\w{5})/$1/:s/(\\w{6})/$1/", "width": 5}, + {"tag": "Cost", "type": "cdrfield", "value": "cost", "padding": "zeroleft", "width": 9}, + {"tag": "MaskDestination", "type": "metatag", "value": "mask_destination", "width": 1}, + ], + "trailer_fields": [ + {"tag": "ToR", "type": "constant", "value": "90", "width": 2}, + {"tag": "Filler1", "type": "filler", "width": 3}, + {"tag": "FileType", "type": "constant", "value": "SIP", "width": 3}, + {"tag": "FileSeqNr", "type": "metatag", "value": "export_id", "padding": "zeroleft", "width": 5}, + {"tag": "TotalRecords", "type": "metatag", "value": "cdrs_number", "padding": "zeroleft", "width": 6}, + {"tag": "TotalDuration", "type": "metatag", "value": "cdrs_duration", "padding": "zeroleft", "width": 8}, + {"tag": "FirstCdrTime", "type": "metatag", "value": "first_cdr_atime", "layout": "020106150405", "width": 12}, + {"tag": "LastCdrTime", "type": "metatag", "value": "last_cdr_atime", "layout": "020106150405", "width": 12}, + {"tag": "Filler1", "type": "filler", "width": 93}, + ], // template of the exported trailer fields + } +}, + + +"apier": { + "scheduler_conns": ["*internal"], +}, + + +} diff --git a/data/conf/samples/multiplecdrc_mysql/multiplecdrc_fwexport.json b/data/conf/samples/multiplecdrc_mysql/multiplecdrc_fwexport.json new file mode 100644 index 000000000..0de8dc003 --- /dev/null +++ b/data/conf/samples/multiplecdrc_mysql/multiplecdrc_fwexport.json @@ -0,0 +1,137 @@ +{ +// CGRateS Configuration file +// +// Used in mediator_local_test +// Starts rater, cdrs and mediator connecting over internal channel + +"stor_db": { // database used to store offline tariff plans and CDRs + "db_password": "CGRateS.org", // password to use when connecting to stordb +}, + +"rals": { + "enabled": true, // enable Rater service: +}, + +"schedulers": { + "enabled": true, // start Scheduler service: +}, + +"cdrs": { + "enabled": true, // start the CDR Server service: +}, + +"chargers": { + "enabled": true, +}, + +"cdrc": [ + { + "id": "CDRC-CSV1", + "enabled": true, // enable CDR client functionality + "cdr_in_path": "/tmp/cgrates/cdrc1/in", // absolute path towards the directory where the CDRs are stored + "cdr_out_path": "/tmp/cgrates/cdrc1/out", // absolute path towards the directory where processed CDRs will be moved + "cdr_source_id": "csv1", // free form field, tag identifying the source of the CDRs within CDRS database + }, + { + "id": "CDRC-CSV2", + "enabled": true, // enable CDR client functionality + "cdr_in_path": "/tmp/cgrates/cdrc2/in", // absolute path towards the directory where the CDRs are stored + "cdr_out_path": "/tmp/cgrates/cdrc2/out", // absolute path towards the directory where processed CDRs will be moved + "cdr_source_id": "csv2", // free form field, tag identifying the source of the CDRs within CDRS database + "content_fields":[ // import template, tag will match internally CDR field, in case of .csv value will be represented by index of the field value + {"cdr_field_id": "tor", "value": "~7:s/^(voice|data|sms|generic)$/*$1/"}, + {"cdr_field_id": "accid", "value": "0"}, + {"cdr_field_id": "reqtype", "value": "^rated"}, + {"cdr_field_id": "direction", "value": "^*out"}, + {"cdr_field_id": "tenant", "value": "^cgrates.org"}, + {"cdr_field_id": "category", "value": "~7:s/^voice$/call/"}, + {"cdr_field_id": "account", "value": "3"}, + {"cdr_field_id": "subject", "value": "3"}, + {"cdr_field_id": "destination", "value": "~5:s/^0([1-9]\\d+)$/+49$1/"}, + {"cdr_field_id": "setup_time", "value": "1"}, + {"cdr_field_id": "answer_time", "value": "1"}, + {"cdr_field_id": "usage", "value": "~9:s/^(\\d+)$/${1}s/"}, + ], + }, + { + "id": "CDRC-CSV3", + "enabled": true, // enable CDR client functionality + "field_separator": ";", // separator used in case of csv files + "cdr_in_path": "/tmp/cgrates/cdrc3/in", // absolute path towards the directory where the CDRs are stored + "cdr_out_path": "/tmp/cgrates/cdrc3/out", // absolute path towards the directory where processed CDRs will be moved + "cdr_source_id": "csv3", // free form field, tag identifying the source of the CDRs within CDRS database + "content_fields":[ // import template, tag will match internally CDR field, in case of .csv value will be represented by index of the field value + {"cdr_field_id": "tor", "value": "^*voice"}, + {"cdr_field_id": "accid", "value": "~3:s/^(\\d{2})\\.(\\d{2})\\.(\\d{4})\\s{2}(\\d{2}):(\\d{2}):(\\d{2})$/$1$2$3$4$5$6/"}, + {"cdr_field_id": "reqtype", "value": "^rated"}, + {"cdr_field_id": "direction", "value": "^*out"}, + {"cdr_field_id": "tenant", "value": "^cgrates.org"}, + {"cdr_field_id": "category", "value": "^call"}, + {"cdr_field_id": "account", "value": "~0:s/^([1-9]\\d+)$/+$1/"}, + {"cdr_field_id": "subject", "value": "~0:s/^([1-9]\\d+)$/+$1/"}, + {"cdr_field_id": "destination", "value": "~1:s/^([1-9]\\d+)$/+$1/"}, + {"cdr_field_id": "setup_time", "value": "4"}, + {"cdr_field_id": "answer_time", "value": "4"}, + {"cdr_field_id": "usage", "value": "~6:s/^(\\d+)$/${1}s/"}, + ], + } +], + +"cdre": { + "CDRE-FW1": { + "export_format": "*file_fwv", + "field_separator": "", + "header_fields": [ + {"tag": "ToR", "type": "constant", "value": "10", "width": 2}, + {"tag": "Filler1", "type": "filler", "width": 3}, + {"tag": "FileType", "type": "constant", "value": "SIP", "width": 3}, + {"tag": "FileSeqNr", "type": "metatag", "value": "export_id", "padding": "zeroleft", "width": 5}, + {"tag": "LastCdr", "type": "metatag", "value": "last_cdr_atime", "layout": "020106150405", "width": 12}, + {"tag": "FileCreationfTime", "type": "metatag", "value": "time_now", "layout": "020106150405", "width": 12}, + {"tag": "FileVersion", "type": "constant", "value": "01", "width": 2}, + {"tag": "Filler2", "type": "filler", "width": 105}, + ], // template of the exported header fields + "content_fields": [ // template of the exported content fields + {"tag": "ToR", "type": "constant", "value": "20", "width": 2}, + {"tag": "Subject", "type": "cdrfield", "value": "subject", "width": 12, "padding": "right", "mandatory": true}, + {"tag": "ConnectionNumber", "type": "constant", "value": "00000", "width": 5}, + {"tag": "CallerId", "type": "cdrfield", "value": "~callerid:s/\\+(\\d+)/00$1/", "strip": "xright", "width": 15, "padding": "right"}, + {"tag": "Destination", "type": "cdrfield", "value": "~destination:s/^\\+311400(\\d+)/$1/:s/^\\+311412\\d\\d112/112/:s/^\\+31(\\d+)/0$1/:s/^\\+(\\d+)/00$1/", + "strip": "xright", "width": 24, "padding": "right", "mandatory": true}, + {"tag": "TypeOfService", "type": "constant", "value": "00", "width": 2}, + {"tag": "ServiceId", "type": "constant", "value": "11", "width": 4, "padding": "right"}, + {"tag": "AnswerTime", "type": "cdrfield", "value": "answer_time", "layout": "020106150405", "width": 12, "mandatory": true}, + {"tag": "Usage", "type": "cdrfield", "value": "usage", "layout": "seconds", "width": 6, "padding": "right", "mandatory": true}, + {"tag": "DataCounter", "type": "filler", "width": 6}, + {"tag": "VatCode", "type": "constant", "value": "1", "width": 1}, + {"tag": "NetworkId", "type": "constant", "value": "S1", "width": 2}, + {"tag": "DestinationSubId", "type": "cdrfield", "value": "~cost_details:s/MatchedDestId:.+_(\\w{5})/$1/:s/(\\w{6})/$1/", "width": 5}, + {"tag": "NetworkSubtype", "type": "constant", "value": "3", "width": 1, "padding": "left"}, + {"tag": "CgrId", "type": "cdrfield", "value": "cgrid", "strip": "xleft", "width": 16, "padding": "right", "mandatory": true}, + {"tag": "FillerVolume1", "type": "filler", "width": 8}, + {"tag": "FillerVolume2", "type": "filler", "width": 8}, + {"tag": "DestinationSubId", "type": "cdrfield", "value": "~cost_details:s/MatchedDestId:.+_(\\w{5})/$1/:s/(\\w{6})/$1/", "width": 5}, + {"tag": "Cost", "type": "cdrfield", "value": "cost", "padding": "zeroleft", "width": 9}, + {"tag": "MaskDestination", "type": "metatag", "value": "mask_destination", "width": 1}, + ], + "trailer_fields": [ + {"tag": "ToR", "type": "constant", "value": "90", "width": 2}, + {"tag": "Filler1", "type": "filler", "width": 3}, + {"tag": "FileType", "type": "constant", "value": "SIP", "width": 3}, + {"tag": "FileSeqNr", "type": "metatag", "value": "export_id", "padding": "zeroleft", "width": 5}, + {"tag": "TotalRecords", "type": "metatag", "value": "cdrs_number", "padding": "zeroleft", "width": 6}, + {"tag": "TotalDuration", "type": "metatag", "value": "cdrs_duration", "padding": "zeroleft", "width": 8}, + {"tag": "FirstCdrTime", "type": "metatag", "value": "first_cdr_atime", "layout": "020106150405", "width": 12}, + {"tag": "LastCdrTime", "type": "metatag", "value": "last_cdr_atime", "layout": "020106150405", "width": 12}, + {"tag": "Filler1", "type": "filler", "width": 93}, + ], // template of the exported trailer fields + } +}, + + +"apier": { + "scheduler_conns": ["*internal"], +}, + + +} diff --git a/data/conf/samples/rpccaching_internal/cgrates.json b/data/conf/samples/rpccaching_internal/cgrates.json new file mode 100644 index 000000000..3ccc3870d --- /dev/null +++ b/data/conf/samples/rpccaching_internal/cgrates.json @@ -0,0 +1,76 @@ +{ + +"general": { + "log_level": 7, + "reply_timeout": "10s", // consider connection down for replies taking longer than this value +}, + +"listen": { + "rpc_json": ":2012", + "rpc_gob": ":2013", + "http": ":2080", +}, + + +"data_db": { + "db_type": "*internal", +}, + + +"stor_db": { + "db_type": "*internal", +}, + +"caches":{ + "*rpc_responses": {"limit": -1, "ttl": "1s"}, +}, + + +"rals": { + "enabled": true, +}, + + +"schedulers": { + "enabled": true, +}, + + +"cdrs": { + "enabled": true, + "session_cost_retries": 2, // number of queries to session_costs before recalculating CDR +}, + + +"attributes": { + "enabled": true, +}, + + +"chargers": { + "enabled": true, + "attributes_conns": ["*internal"], +}, + + +"thresholds": { + "enabled": true, + "store_interval": "-1", +}, + + +"sessions": { + "enabled": true, + "chargers_conns": ["*internal"], + "rals_conns": ["*internal"], + "cdrs_conns": ["*internal"], + "attributes_conns": ["*internal"], +}, + + +"apier": { + "scheduler_conns": ["*internal"], +}, + + +} \ No newline at end of file diff --git a/data/conf/samples/rpccaching_mongo/cgrates.json b/data/conf/samples/rpccaching_mongo/cgrates.json new file mode 100644 index 000000000..bd4899bb5 --- /dev/null +++ b/data/conf/samples/rpccaching_mongo/cgrates.json @@ -0,0 +1,82 @@ +{ + +"general": { + "log_level": 7, + "reply_timeout": "10s", // consider connection down for replies taking longer than this value +}, + +"listen": { + "rpc_json": ":2012", + "rpc_gob": ":2013", + "http": ":2080", +}, + + +"data_db": { + "db_type": "mongo", + "db_name": "10", + "db_port": 27017, +}, + + +"stor_db": { + "db_type": "mongo", + "db_name": "cgrates", + "db_port": 27017, +}, + + + +"caches":{ + "*rpc_responses": {"limit": -1, "ttl": "1s"}, +}, + + +"rals": { + "enabled": true, +}, + + +"schedulers": { + "enabled": true, +}, + + +"cdrs": { + "enabled": true, + "session_cost_retries": 2, // number of queries to session_costs before recalculating CDR +}, + + +"attributes": { + "enabled": true, +}, + + +"chargers": { + "enabled": true, + "attributes_conns": ["*internal"], +}, + + +"thresholds": { + "enabled": true, + "store_interval": "1s", +}, + + +"sessions": { + "enabled": true, + "chargers_conns": ["*internal"], + "rals_conns": ["*internal"], + "cdrs_conns": ["*internal"], + "attributes_conns": ["*internal"], +}, + + +"apier": { + "scheduler_conns": ["*internal"], +}, + + +} \ No newline at end of file diff --git a/data/conf/samples/rpccaching/cgrates.json b/data/conf/samples/rpccaching_mysql/cgrates.json similarity index 100% rename from data/conf/samples/rpccaching/cgrates.json rename to data/conf/samples/rpccaching_mysql/cgrates.json diff --git a/general_tests/cdre_it_test.go b/general_tests/cdre_it_test.go index 5c34bd2d9..5fc0c958b 100644 --- a/general_tests/cdre_it_test.go +++ b/general_tests/cdre_it_test.go @@ -33,11 +33,9 @@ import ( ) var ( - cdreCfgPath string cdreCfg *config.CGRConfig cdreRPC *rpc.Client - cdreDataDir = "/usr/share/cgrates" - cdreDelay int + cdreCfgPath string cdreConfigDIR string sTestsCDRE = []func(t *testing.T){ @@ -54,15 +52,20 @@ var ( } ) -func TestCDREITMySql(t *testing.T) { - cdreConfigDIR = "tutmysql" - for _, stest := range sTestsCDRE { - t.Run(cdreConfigDIR, stest) +func TestCDREIT(t *testing.T) { + switch *dbType { + case utils.MetaInternal: + cdreConfigDIR = "tutinternal" + case utils.MetaSQL: + cdreConfigDIR = "tutmysql" + case utils.MetaMongo: + cdreConfigDIR = "tutmongonew" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") } -} -func TestCDREITMongo(t *testing.T) { - cdreConfigDIR = "tutmongonew" for _, stest := range sTestsCDRE { t.Run(cdreConfigDIR, stest) } @@ -70,13 +73,12 @@ func TestCDREITMongo(t *testing.T) { func testCDREInitCfg(t *testing.T) { var err error - cdreCfgPath = path.Join(cdreDataDir, "conf", "samples", cdreConfigDIR) + cdreCfgPath = path.Join(*dataDir, "conf", "samples", cdreConfigDIR) cdreCfg, err = config.NewCGRConfigFromPath(cdreCfgPath) if err != nil { t.Error(err) } - cdreCfg.DataFolderPath = cdreDataDir - cdreDelay = 1000 + cdreCfg.DataFolderPath = *dataDir } func testCDREInitDataDb(t *testing.T) { @@ -92,7 +94,7 @@ func testCDREResetStorDb(t *testing.T) { } func testCDREStartEngine(t *testing.T) { - if _, err := engine.StopStartEngine(cdreCfgPath, cdreDelay); err != nil { + if _, err := engine.StopStartEngine(cdreCfgPath, *waitRater); err != nil { t.Fatal(err) } } @@ -182,7 +184,7 @@ func testCDREExport(t *testing.T) { } func testCDREStopEngine(t *testing.T) { - if err := engine.KillEngine(cdreDelay); err != nil { + if err := engine.KillEngine(*waitRater); err != nil { t.Error(err) } } diff --git a/general_tests/cdrs_internal_it_test.go b/general_tests/cdrs_internal_it_test.go index dd62f5251..3ebc71434 100644 --- a/general_tests/cdrs_internal_it_test.go +++ b/general_tests/cdrs_internal_it_test.go @@ -35,6 +35,7 @@ import ( var ( cdrsIntCfgPath string + cdrsIntCfgDIR string cdrsIntCfg *config.CGRConfig cdrsIntRPC *rpc.Client @@ -49,20 +50,31 @@ var ( // This test is valid only for internal // to test the ttl for cdrs -func TestCdrsIntITMySql(t *testing.T) { +func TestCdrsIntIT(t *testing.T) { + switch *dbType { + case utils.MetaInternal: + cdrsIntCfgDIR = "internal_ttl_internal" + case utils.MetaSQL: + t.SkipNow() + case utils.MetaMongo: + t.SkipNow() + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") + } for _, stest := range sTestsCdrsInt { - t.Run("TestCdrsIntITMySql", stest) + t.Run(cdrsIntCfgDIR, stest) } } func testCdrsIntInitCfg(t *testing.T) { var err error - cdrsIntCfgPath = path.Join(cdreDataDir, "conf", "samples", "internal_ttl") + cdrsIntCfgPath = path.Join(*dataDir, "conf", "samples", cdrsIntCfgDIR) cdrsIntCfg, err = config.NewCGRConfigFromPath(cdrsIntCfgPath) if err != nil { t.Error(err) } - cdrsIntCfg.DataFolderPath = cdreDataDir } func testCdrsIntStartEngine(t *testing.T) { diff --git a/general_tests/cdrs_it_test.go b/general_tests/cdrs_it_test.go index 7d010b323..bac09b65c 100644 --- a/general_tests/cdrs_it_test.go +++ b/general_tests/cdrs_it_test.go @@ -79,15 +79,20 @@ var ( ) // Tests starting here -func TestCDRsITMySQL(t *testing.T) { - cdrsConfDIR = "cdrsv2mysql" - for _, stest := range sTestsCDRsIT { - t.Run(cdrsConfDIR, stest) +func TestCDRsIT(t *testing.T) { + switch *dbType { + case utils.MetaInternal: + cdrsConfDIR = "cdrsv2internal" + case utils.MetaSQL: + cdrsConfDIR = "cdrsv2mysql" + case utils.MetaMongo: + cdrsConfDIR = "cdrsv2mongo" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") } -} -func TestCDRsITMongo(t *testing.T) { - cdrsConfDIR = "cdrsv2mongo" for _, stest := range sTestsCDRsIT { t.Run(cdrsConfDIR, stest) } diff --git a/general_tests/cdrs_processevent_it_test.go b/general_tests/cdrs_processevent_it_test.go index 8eabebf04..9452a8b72 100644 --- a/general_tests/cdrs_processevent_it_test.go +++ b/general_tests/cdrs_processevent_it_test.go @@ -38,45 +38,44 @@ import ( "github.com/cgrates/cgrates/utils" ) -var pecdrsCfgPath string -var pecdrsCfg *config.CGRConfig -var pecdrsRpc *rpc.Client -var pecdrsConfDIR string +var ( + pecdrsCfgPath string + pecdrsConfDIR string + pecdrsCfg *config.CGRConfig + pecdrsRpc *rpc.Client -var sTestsCDRsIT_ProcessEvent = []func(t *testing.T){ - testV1CDRsInitConfig, - testV1CDRsInitDataDb, - testV1CDRsInitCdrDb, - testV1CDRsStartEngine, - testV1CDRsRpcConn, - testV1CDRsLoadTariffPlanFromFolder, - testV1CDRsProcessEventExport, - testV1CDRsProcessEventAttrS, - testV1CDRsProcessEventChrgS, - testV1CDRsProcessEventRalS, - testV1CDRsProcessEventSts, - testV1CDRsProcessEventStore, - testV1CDRsProcessEventThreshold, - testV1CDRsProcessEventExportCheck, - testV1CDRsKillEngine, -} - -func TestCDRsITPEInternal(t *testing.T) { - pecdrsConfDIR = "cdrsv1processevent" - for _, stest := range sTestsCDRsIT_ProcessEvent { - t.Run(pecdrsConfDIR, stest) + sTestsCDRsIT_ProcessEvent = []func(t *testing.T){ + testV1CDRsInitConfig, + testV1CDRsInitDataDb, + testV1CDRsInitCdrDb, + testV1CDRsStartEngine, + testV1CDRsRpcConn, + testV1CDRsLoadTariffPlanFromFolder, + testV1CDRsProcessEventExport, + testV1CDRsProcessEventAttrS, + testV1CDRsProcessEventChrgS, + testV1CDRsProcessEventRalS, + testV1CDRsProcessEventSts, + testV1CDRsProcessEventStore, + testV1CDRsProcessEventThreshold, + testV1CDRsProcessEventExportCheck, + testV1CDRsKillEngine, } -} +) -func TestCDRsITPEMongo(t *testing.T) { - pecdrsConfDIR = "cdrsv1processeventmongo" - for _, stest := range sTestsCDRsIT_ProcessEvent { - t.Run(pecdrsConfDIR, stest) +func TestCDRsITPE(t *testing.T) { + switch *dbType { + case utils.MetaInternal: + pecdrsConfDIR = "cdrsv1processevent" + case utils.MetaSQL: + pecdrsConfDIR = "cdrsv1processeventmysql" + case utils.MetaMongo: + pecdrsConfDIR = "cdrsv1processeventmongo" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") } -} - -func TestCDRsITPEMySql(t *testing.T) { - pecdrsConfDIR = "cdrsv1processeventmysql" for _, stest := range sTestsCDRsIT_ProcessEvent { t.Run(pecdrsConfDIR, stest) } diff --git a/general_tests/data_it_test.go b/general_tests/data_it_test.go index f55deb8ee..469973317 100644 --- a/general_tests/data_it_test.go +++ b/general_tests/data_it_test.go @@ -60,8 +60,19 @@ var ( ) // Test start here -func TestDataITMongo(t *testing.T) { - dataConfDIR = "tutmongo" +func TestDataIT(t *testing.T) { + switch *dbType { + case utils.MetaInternal: + dataConfDIR = "tutinternal" + case utils.MetaSQL: + dataConfDIR = "tutmysql" + case utils.MetaMongo: + dataConfDIR = "tutmongo" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") + } for _, stest := range sTestsData { t.Run(dataConfDIR, stest) } diff --git a/general_tests/destination_combined_it_test.go b/general_tests/destination_combined_it_test.go index 344b71093..113480e9f 100644 --- a/general_tests/destination_combined_it_test.go +++ b/general_tests/destination_combined_it_test.go @@ -45,8 +45,19 @@ var sTestsTutorials2 = []func(t *testing.T){ testTutorialStopEngine, } -func TestDestinationCombinesMySQL(t *testing.T) { - tutorialConfDIR = "tutmysql" +func TestDestinationCombines(t *testing.T) { + switch *dbType { + case utils.MetaInternal: + tutorialConfDIR = "tutinternal" + case utils.MetaSQL: + tutorialConfDIR = "tutmysql" + case utils.MetaMongo: + tutorialConfDIR = "tutmongo" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") + } for _, stest := range sTestsTutorials2 { t.Run(tutorialConfDIR, stest) } diff --git a/general_tests/filters_it_test.go b/general_tests/filters_it_test.go index 69b5d8379..45b0bf3b2 100644 --- a/general_tests/filters_it_test.go +++ b/general_tests/filters_it_test.go @@ -59,7 +59,19 @@ var ( // Test start here func TestFltrIT(t *testing.T) { - fltrConfDIR = "filters" + switch *dbType { + case utils.MetaInternal: + fltrConfDIR = "filters_internal" + case utils.MetaSQL: + fltrConfDIR = "filters_mysql" + case utils.MetaMongo: + fltrConfDIR = "filters_mongo" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") + } + for _, stest := range sTestsFltr { t.Run(fltrConfDIR, stest) } diff --git a/general_tests/multiplecdrc_it_test.go b/general_tests/multiplecdrc_it_test.go index b4405e9a4..6638bfc7c 100644 --- a/general_tests/multiplecdrc_it_test.go +++ b/general_tests/multiplecdrc_it_test.go @@ -36,6 +36,7 @@ import ( var ( cfgPath string + cfgDIR string cfg *config.CGRConfig rater *rpc.Client @@ -57,14 +58,26 @@ var ( ) func TestMCDRC(t *testing.T) { + switch *dbType { + case utils.MetaInternal: + cfgDIR = "multiplecdrc_internal" + case utils.MetaSQL: + cfgDIR = "multiplecdrc_mysql" + case utils.MetaMongo: + cfgDIR = "multiplecdrc_mongo" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") + } for _, stest := range sTestMCDRC { - t.Run("TestsMCDRC", stest) + t.Run(cfgDIR, stest) } } func testMCDRCLoadConfig(t *testing.T) { var err error - cfgPath = path.Join(*dataDir, "conf", "samples", "multiplecdrc") + cfgPath = path.Join(*dataDir, "conf", "samples", cfgDIR) if cfg, err = config.NewCGRConfigFromPath(cfgPath); err != nil { t.Error(err) } diff --git a/general_tests/resourcesv1_it_test.go b/general_tests/resourcesv1_it_test.go index aadc2a434..b34bfbb4e 100644 --- a/general_tests/resourcesv1_it_test.go +++ b/general_tests/resourcesv1_it_test.go @@ -36,30 +36,34 @@ var ( rlsV1Cfg *config.CGRConfig rlsV1Rpc *rpc.Client rlsV1ConfDIR string //run tests for specific configuration + + sTestsRLSV1 = []func(t *testing.T){ + testV1RsLoadConfig, + testV1RsInitDataDb, + testV1RsResetStorDb, + testV1RsStartEngine, + testV1RsRpcConn, + testV1RsSetProfile, + testV1RsAllocate, + testV1RsAuthorize, + testV1RsStopEngine, + } ) -var sTestsRLSV1 = []func(t *testing.T){ - testV1RsLoadConfig, - testV1RsInitDataDb, - testV1RsResetStorDb, - testV1RsStartEngine, - testV1RsRpcConn, - testV1RsSetProfile, - testV1RsAllocate, - testV1RsAuthorize, - testV1RsStopEngine, -} - //Test start here -func TestRsV1ITMySQL(t *testing.T) { - rlsV1ConfDIR = "tutmysql" - for _, stest := range sTestsRLSV1 { - t.Run(rlsV1ConfDIR, stest) +func TestRsV1IT(t *testing.T) { + switch *dbType { + case utils.MetaInternal: + rlsV1ConfDIR = "tutinternal" + case utils.MetaSQL: + rlsV1ConfDIR = "tutmysql" + case utils.MetaMongo: + rlsV1ConfDIR = "tutmongo" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") } -} - -func TestRsV1ITMongo(t *testing.T) { - rlsV1ConfDIR = "tutmongo" for _, stest := range sTestsRLSV1 { t.Run(rlsV1ConfDIR, stest) } diff --git a/general_tests/rpccaching_it_test.go b/general_tests/rpccaching_it_test.go index 9ab9ea56e..a672c0df1 100644 --- a/general_tests/rpccaching_it_test.go +++ b/general_tests/rpccaching_it_test.go @@ -38,39 +38,51 @@ var ( rpcCfg *config.CGRConfig rpcRpc *rpc.Client rpcConfDIR string //run tests for specific configuration -) -var sTestsRPCMethods = []func(t *testing.T){ - testRPCMethodsLoadConfig, - testRPCMethodsInitDataDb, - testRPCMethodsResetStorDb, - testRPCMethodsStartEngine, - testRPCMethodsRpcConn, - testRPCMethodsFromFolder, - testRPCMethodsAddData, - testRPCMethodsAuthorizeSession, - testRPCMethodsInitSession, - testRPCMethodsUpdateSession, - testRPCMethodsTerminateSession, - testRPCMethodsProcessCDR, - testRPCMethodsProcessEvent, - // reset the storDB and dataDB - testRPCMethodsInitDataDb, - testRPCMethodsResetStorDb, - testRPCMethodsCdrsProcessCDR, - testRPCMethodsCdrsStoreSessionCost, - //reset the storDB and dataDB - testRPCMethodsInitDataDb, - testRPCMethodsResetStorDb, - testRPCMethodsLoadData, - testRPCMethodsResponderDebit, - testRPCMethodsResponderMaxDebit, - testRPCMethodsStopEngine, -} + sTestsRPCMethods = []func(t *testing.T){ + testRPCMethodsLoadConfig, + testRPCMethodsInitDataDb, + testRPCMethodsResetStorDb, + testRPCMethodsStartEngine, + testRPCMethodsRpcConn, + testRPCMethodsFromFolder, + testRPCMethodsAddData, + testRPCMethodsAuthorizeSession, + testRPCMethodsInitSession, + testRPCMethodsUpdateSession, + testRPCMethodsTerminateSession, + testRPCMethodsProcessCDR, + testRPCMethodsProcessEvent, + // reset the storDB and dataDB + testRPCMethodsInitDataDb, + testRPCMethodsResetStorDb, + testRPCMethodsCdrsProcessCDR, + testRPCMethodsCdrsStoreSessionCost, + //reset the storDB and dataDB + testRPCMethodsInitDataDb, + testRPCMethodsResetStorDb, + testRPCMethodsLoadData, + testRPCMethodsResponderDebit, + testRPCMethodsResponderMaxDebit, + testRPCMethodsStopEngine, + } +) // Test start here func TestRPCMethods(t *testing.T) { - rpcConfDIR = "rpccaching" + switch *dbType { + case utils.MetaInternal: + rpcConfDIR = "rpccaching_internal" + case utils.MetaSQL: + rpcConfDIR = "rpccaching_mysql" + case utils.MetaMongo: + rpcConfDIR = "rpccaching_mongo" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") + } + for _, stest := range sTestsRPCMethods { t.Run(rpcConfDIR, stest) } diff --git a/general_tests/session2_it_test.go b/general_tests/session2_it_test.go index 7448c9880..abf5f1115 100644 --- a/general_tests/session2_it_test.go +++ b/general_tests/session2_it_test.go @@ -51,17 +51,21 @@ var ( } ) -func TestSes2ItTutMongo(t *testing.T) { - ses2CfgDir = "tutmongo" - for _, stest := range ses2Tests { - t.Run("TestSesItTutMongo", stest) +func TestSes2It(t *testing.T) { + switch *dbType { + case utils.MetaInternal: + ses2CfgDir = "tutinternal" + case utils.MetaSQL: + ses2CfgDir = "tutmysql" + case utils.MetaMongo: + ses2CfgDir = "tutmongo" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") } -} - -func TestSes2ItTutMysql(t *testing.T) { - ses2CfgDir = "tutmysql" for _, stest := range ses2Tests { - t.Run("TestSesItTutMysql", stest) + t.Run(ses2CfgDir, stest) } } diff --git a/general_tests/session3_it_test.go b/general_tests/session3_it_test.go index 10361a143..477458baf 100644 --- a/general_tests/session3_it_test.go +++ b/general_tests/session3_it_test.go @@ -64,9 +64,20 @@ var ( ) func TestSes3ItSessions(t *testing.T) { - ses3CfgDir = "sessions" + switch *dbType { + case utils.MetaInternal: + ses3CfgDir = "sessions_internal" + case utils.MetaSQL: + ses3CfgDir = "sessions_mysql" + case utils.MetaMongo: + ses3CfgDir = "sessions_mongo" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") + } for _, stest := range ses3Tests { - t.Run("TestSes3ItTutMysql", stest) + t.Run(ses3CfgDir, stest) } } diff --git a/general_tests/session_it_test.go b/general_tests/session_it_test.go index 6ae234f9c..a7cac7137 100644 --- a/general_tests/session_it_test.go +++ b/general_tests/session_it_test.go @@ -33,6 +33,7 @@ import ( var ( sesCfgPath string + sesCfgDIR string sesCfg *config.CGRConfig sesRPC *rpc.Client sesAccount = "refundAcc" @@ -53,14 +54,26 @@ var ( ) func TestSesIt(t *testing.T) { + switch *dbType { + case utils.MetaInternal: + sesCfgDIR = "tutinternal" + case utils.MetaSQL: + sesCfgDIR = "tutmysql_internal" + case utils.MetaMongo: + sesCfgDIR = "tutmongo" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") + } for _, stest := range sTestSesIt { - t.Run("TestSesIT", stest) + t.Run(sesCfgDIR, stest) } } // test for 0 balance with session terminate with 1s usage func testSesItLoadConfig(t *testing.T) { - sesCfgPath = path.Join(*dataDir, "conf", "samples", "tutmysql_internal") + sesCfgPath = path.Join(*dataDir, "conf", "samples", sesCfgDIR) if sesCfg, err = config.NewCGRConfigFromPath(sesCfgPath); err != nil { t.Error(err) } diff --git a/general_tests/sessionrefund_it_test.go b/general_tests/sessionrefund_it_test.go index 6c24b3c8d..a5747797c 100644 --- a/general_tests/sessionrefund_it_test.go +++ b/general_tests/sessionrefund_it_test.go @@ -33,6 +33,7 @@ import ( var ( srCfgPath string + srCfgDIR string srCfg *config.CGRConfig srrpc *rpc.Client sraccount = "refundAcc" @@ -56,13 +57,25 @@ var ( ) func TestSrIt(t *testing.T) { + switch *dbType { + case utils.MetaInternal: + srCfgDIR = "tutinternal" + case utils.MetaSQL: + srCfgDIR = "tutmysql_internal" + case utils.MetaMongo: + srCfgDIR = "tutmongo" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") + } for _, stest := range sTestSrIt { - t.Run("sTestSrIt", stest) + t.Run(srCfgDIR, stest) } } func testSrItLoadConfig(t *testing.T) { - srCfgPath = path.Join(*dataDir, "conf", "samples", "tutmongo") + srCfgPath = path.Join(*dataDir, "conf", "samples", srCfgDIR) if srCfg, err = config.NewCGRConfigFromPath(srCfgPath); err != nil { t.Error(err) } diff --git a/general_tests/supplier_it_test.go b/general_tests/supplier_it_test.go index 9a7891220..2bfc5a89d 100644 --- a/general_tests/supplier_it_test.go +++ b/general_tests/supplier_it_test.go @@ -61,15 +61,19 @@ var ( ) // Test start here -func TestSuplSV1ITMySQL(t *testing.T) { - splSv1ConfDIR = "tutmysql" - for _, stest := range sTestsSupplierSV1 { - t.Run(splSv1ConfDIR, stest) +func TestSuplSV1IT(t *testing.T) { + switch *dbType { + case utils.MetaInternal: + splSv1ConfDIR = "tutinternal" + case utils.MetaSQL: + splSv1ConfDIR = "tutmysql" + case utils.MetaMongo: + splSv1ConfDIR = "tutmongo" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") } -} - -func TestSuplSV1ITMongo(t *testing.T) { - splSv1ConfDIR = "tutmongo" for _, stest := range sTestsSupplierSV1 { t.Run(splSv1ConfDIR, stest) } diff --git a/general_tests/tp_it_test.go b/general_tests/tp_it_test.go index b77ec6fd8..8174ebf82 100644 --- a/general_tests/tp_it_test.go +++ b/general_tests/tp_it_test.go @@ -35,6 +35,7 @@ import ( var ( tpCfgPath string + tpCfgDIR string tpCfg *config.CGRConfig tpRPC *rpc.Client tpLoadInst utils.LoadInstance // Share load information between tests @@ -62,12 +63,24 @@ var ( ) func TestTp(t *testing.T) { + switch *dbType { + case utils.MetaInternal: + tpCfgDIR = "tutinternal" + case utils.MetaSQL: + tpCfgDIR = "tutmysql" + case utils.MetaMongo: + tpCfgDIR = "tutmongo" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") + } for _, stest := range sTestTp { - t.Run("TestTp", stest) + t.Run(tpCfgDIR, stest) } } func testTpInitCfg(t *testing.T) { - tpCfgPath = path.Join(*dataDir, "conf", "samples", "tutmysql") + tpCfgPath = path.Join(*dataDir, "conf", "samples", tpCfgDIR) // Init config first var err error tpCfg, err = config.NewCGRConfigFromPath(tpCfgPath) diff --git a/general_tests/tutorial2_it_test.go b/general_tests/tutorial2_it_test.go index d0ec4067c..14f251d3b 100644 --- a/general_tests/tutorial2_it_test.go +++ b/general_tests/tutorial2_it_test.go @@ -53,15 +53,20 @@ var sTutTests = []func(t *testing.T){ } //Test start here -func TestTutorial2MySQL(t *testing.T) { - tutCfgDir = "tutmysql2" - for _, stest := range sTutTests { - t.Run(tutCfgDir, stest) +func TestTutorial2(t *testing.T) { + switch *dbType { + case utils.MetaInternal: + tutCfgDir = "tutinternal" + case utils.MetaSQL: + tutCfgDir = "tutmysql2" + case utils.MetaMongo: + tutCfgDir = "tutmongo2" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") } -} -func TestTutorial2Mongo(t *testing.T) { - tutCfgDir = "tutmongo2" for _, stest := range sTutTests { t.Run(tutCfgDir, stest) } diff --git a/general_tests/tutorial_it_test.go b/general_tests/tutorial_it_test.go index 000639f73..4311ebb22 100644 --- a/general_tests/tutorial_it_test.go +++ b/general_tests/tutorial_it_test.go @@ -63,15 +63,19 @@ func TestTutorialMongoAtlas(t *testing.T) { } } -func TestTutorialMongo(t *testing.T) { - tutorialConfDIR = "tutmongo" - for _, stest := range sTestsTutorials { - t.Run(tutorialConfDIR, stest) +func TestTutorial(t *testing.T) { + switch *dbType { + case utils.MetaInternal: + tutorialConfDIR = "tutinternal" + case utils.MetaSQL: + tutorialConfDIR = "tutmysql" + case utils.MetaMongo: + tutorialConfDIR = "tutmongo" + case utils.MetaPostgres: + t.SkipNow() + default: + t.Fatal("Unknown Database type") } -} - -func TestTutorialMySQL(t *testing.T) { - tutorialConfDIR = "tutmysql" for _, stest := range sTestsTutorials { t.Run(tutorialConfDIR, stest) } diff --git a/packages/debian/cgrates.service b/packages/debian/cgrates.service index d8b86a39b..23003e7b5 100644 --- a/packages/debian/cgrates.service +++ b/packages/debian/cgrates.service @@ -1,22 +1,13 @@ -# Stop dance for nginx +# Stop dance for cgrates # ======================= -# -# ExecStop sends SIGSTOP (graceful stop) to the nginx process. -# If, after 5s (--retry QUIT/5) nginx is still running, systemd takes control -# and sends SIGTERM (fast shutdown) to the main process. -# After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends -# SIGKILL to all the remaining processes in the process group (KillMode=mixed). -# -# nginx signals reference doc: -# http://nginx.org/en/docs/control.html -# + [Unit] Description=Control CGRateS - carrier grade real-time charging system After=network.target [Service] Type=simple -EnvironmentFile=-/etc/default/cgrates +EnvironmentFile=/etc/default/cgrates ExecStart=/usr/bin/cgr-engine $DAEMON_OPTS KillMode=mixed User=cgrates