diff --git a/agents/radagent_handlr_it_test.go b/agents/radagent_handlr_it_test.go index 168fe8c89..f48705432 100644 --- a/agents/radagent_handlr_it_test.go +++ b/agents/radagent_handlr_it_test.go @@ -22,9 +22,11 @@ package agents import ( "crypto/rand" + "errors" "fmt" "math/big" "net/rpc" + "net/rpc/jsonrpc" "os" "path" "path/filepath" @@ -177,8 +179,7 @@ func testRAHitInitCfg(t *testing.T) { } ` - var folderNameSuffix *big.Int - folderNameSuffix, err = rand.Int(rand.Reader, big.NewInt(10000)) + folderNameSuffix, err := rand.Int(rand.Reader, big.NewInt(10000)) if err != nil { t.Fatalf("could not generate random number for folder name suffix, err: %s", err.Error()) } @@ -225,7 +226,14 @@ func testRAHitStartEngine(t *testing.T) { // Connect rpc client to rater func testRAHitApierRpcConn(t *testing.T) { var err error - raHRPC, err = newRPCClient(raHCfg.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed + switch *utils.Encoding { + case utils.MetaJSON: + raHRPC, err = jsonrpc.Dial(utils.TCP, raHCfg.ListenCfg().RPCJSONListen) + case utils.MetaGOB: + raHRPC, err = rpc.Dial(utils.TCP, raHCfg.ListenCfg().RPCGOBListen) + default: + err = errors.New("UNSUPPORTED_RPC") + } if err != nil { t.Fatal(err) } @@ -271,6 +279,7 @@ cgrates.org,ATTR_RAD,*any,*string:~*req.RadUserName:10011;*prefix:~*req.RadPassw } func testRAHitEmptyValueHandling(t *testing.T) { + var err error if raHAuthClnt, err = radigo.NewClient("udp", "127.0.0.1:1812", "CGRateS.org", dictRad, 1, nil); err != nil { t.Fatal(err) } diff --git a/dispatchers/lib_test.go b/dispatchers/lib_test.go index 8275548fb..c69e99fa7 100644 --- a/dispatchers/lib_test.go +++ b/dispatchers/lib_test.go @@ -1,3 +1,5 @@ +//go:build integration || flaky + /* Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments Copyright (C) ITsysCOM GmbH diff --git a/engine/resources_it_test.go b/engine/resources_it_test.go new file mode 100644 index 000000000..71d462be5 --- /dev/null +++ b/engine/resources_it_test.go @@ -0,0 +1,145 @@ +//go:build integration +// +build integration + +/* +Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments +Copyright (C) ITsysCOM GmbH + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ +package engine + +import ( + "reflect" + "testing" + "time" + + "github.com/cgrates/cgrates/config" + "github.com/cgrates/cgrates/utils" +) + +// TestRSCacheSetGet assurace the presence of private params in cached resource +func TestRSCacheSetGet(t *testing.T) { + if *utils.DBType == utils.MetaInternal { + t.SkipNow() + } + r := &Resource{ + Tenant: "cgrates.org", + ID: "RL", + rPrf: &ResourceProfile{ + Tenant: "cgrates.org", + ID: "RL", + FilterIDs: []string{"FLTR_RES_RL"}, + ActivationInterval: &utils.ActivationInterval{ + ActivationTime: time.Date(2014, 7, 3, 13, 43, 0, 1, time.UTC), + ExpiryTime: time.Date(2014, 7, 3, 13, 43, 0, 1, time.UTC), + }, + AllocationMessage: "ALLOC_RL", + Weight: 50, + Limit: 2, + ThresholdIDs: []string{"TEST_ACTIONS"}, + UsageTTL: time.Duration(1 * time.Millisecond), + }, + Usages: map[string]*ResourceUsage{ + "RU2": { + Tenant: "cgrates.org", + ID: "RU2", + ExpiryTime: time.Date(2014, 7, 3, 13, 43, 0, 1, time.UTC), + Units: 2, + }, + }, + tUsage: utils.Float64Pointer(2), + dirty: utils.BoolPointer(true), + } + Cache.Set(utils.CacheResources, r.TenantID(), r, nil, true, "") + if x, ok := Cache.Get(utils.CacheResources, r.TenantID()); !ok { + t.Error("not in cache") + } else if x == nil { + t.Error("nil resource") + } else if !reflect.DeepEqual(r, x.(*Resource)) { + t.Errorf("Expecting: %+v, received: %+v", r, x) + } +} + +func TestResourceCaching(t *testing.T) { + if *utils.DBType == utils.MetaInternal { + t.SkipNow() + } + //clear the cache + Cache.Clear(nil) + // start fresh with new dataManager + defaultCfg, _ := config.NewDefaultCGRConfig() + data := NewInternalDB(nil, nil, true, defaultCfg.DataDbCfg().Items) + dmRES = NewDataManager(data, config.CgrConfig().CacheCfg(), nil) + + defaultCfg.ResourceSCfg().StoreInterval = 1 + defaultCfg.ResourceSCfg().StringIndexedFields = nil + defaultCfg.ResourceSCfg().PrefixIndexedFields = nil + resService, err = NewResourceService(dmRES, defaultCfg, + &FilterS{dm: dmRES, cfg: defaultCfg}, nil) + if err != nil { + t.Errorf("Error: %+v", err) + } + + resProf := &ResourceProfile{ + Tenant: "cgrates.org", + ID: "ResourceProfileCached", + FilterIDs: []string{"*string:~*req.Account:1001"}, + ActivationInterval: &utils.ActivationInterval{ + ActivationTime: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC), + }, + UsageTTL: time.Duration(-1), + Limit: 10.00, + AllocationMessage: "AllocationMessage", + Weight: 20.00, + ThresholdIDs: []string{utils.META_NONE}, + } + + Cache.Set(utils.CacheResourceProfiles, "cgrates.org:ResourceProfileCached", + resProf, nil, cacheCommit(utils.EmptyString), utils.EmptyString) + + res := &Resource{Tenant: resProf.Tenant, + ID: resProf.ID, + Usages: make(map[string]*ResourceUsage)} + + Cache.Set(utils.CacheResources, "cgrates.org:ResourceProfileCached", + res, nil, cacheCommit(utils.EmptyString), utils.EmptyString) + + resources := Resources{res} + Cache.Set(utils.CacheEventResources, "TestResourceCaching", resources.resIDsMp(), nil, true, "") + + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: utils.UUIDSha1Prefix(), + Event: map[string]any{ + "Account": "1001", + "Destination": "3002"}, + } + + mres, err := resService.matchingResourcesForEvent(ev, + "TestResourceCaching", nil) + if err != nil { + t.Errorf("Error: %+v", err) + } + mres.unlock() + if !reflect.DeepEqual(resources[0].Tenant, mres[0].Tenant) { + t.Errorf("Expecting: %+v, received: %+v", resources[0].Tenant, mres[0].Tenant) + } else if !reflect.DeepEqual(resources[0].ID, mres[0].ID) { + t.Errorf("Expecting: %+v, received: %+v", resources[0].ID, mres[0].ID) + } else if !reflect.DeepEqual(resources[0].rPrf, mres[0].rPrf) { + t.Errorf("Expecting: %+v, received: %+v", resources[0].rPrf, mres[0].rPrf) + } else if !reflect.DeepEqual(resources[0].ttl, mres[0].ttl) { + t.Errorf("Expecting: %+v, received: %+v", resources[0].ttl, mres[0].ttl) + } +} diff --git a/engine/resources_test.go b/engine/resources_test.go index 1f9cd0da5..8cc8b05e0 100644 --- a/engine/resources_test.go +++ b/engine/resources_test.go @@ -325,49 +325,6 @@ func TestResourceAllocateResource(t *testing.T) { } } -// TestRSCacheSetGet assurace the presence of private params in cached resource -func TestRSCacheSetGet(t *testing.T) { - if *utils.DBType == utils.MetaInternal { - t.SkipNow() - } - r := &Resource{ - Tenant: "cgrates.org", - ID: "RL", - rPrf: &ResourceProfile{ - Tenant: "cgrates.org", - ID: "RL", - FilterIDs: []string{"FLTR_RES_RL"}, - ActivationInterval: &utils.ActivationInterval{ - ActivationTime: time.Date(2014, 7, 3, 13, 43, 0, 1, time.UTC), - ExpiryTime: time.Date(2014, 7, 3, 13, 43, 0, 1, time.UTC), - }, - AllocationMessage: "ALLOC_RL", - Weight: 50, - Limit: 2, - ThresholdIDs: []string{"TEST_ACTIONS"}, - UsageTTL: time.Duration(1 * time.Millisecond), - }, - Usages: map[string]*ResourceUsage{ - "RU2": { - Tenant: "cgrates.org", - ID: "RU2", - ExpiryTime: time.Date(2014, 7, 3, 13, 43, 0, 1, time.UTC), - Units: 2, - }, - }, - tUsage: utils.Float64Pointer(2), - dirty: utils.BoolPointer(true), - } - Cache.Set(utils.CacheResources, r.TenantID(), r, nil, true, "") - if x, ok := Cache.Get(utils.CacheResources, r.TenantID()); !ok { - t.Error("not in cache") - } else if x == nil { - t.Error("nil resource") - } else if !reflect.DeepEqual(r, x.(*Resource)) { - t.Errorf("Expecting: %+v, received: %+v", r, x) - } -} - func TestResourcePopulateResourceService(t *testing.T) { defaultCfg, _ := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, true, defaultCfg.DataDbCfg().Items) @@ -734,78 +691,6 @@ func TestResourceIDs(t *testing.T) { } } -func TestResourceCaching(t *testing.T) { - if *utils.DBType == utils.MetaInternal { - t.SkipNow() - } - //clear the cache - Cache.Clear(nil) - // start fresh with new dataManager - defaultCfg, _ := config.NewDefaultCGRConfig() - data := NewInternalDB(nil, nil, true, defaultCfg.DataDbCfg().Items) - dmRES = NewDataManager(data, config.CgrConfig().CacheCfg(), nil) - - defaultCfg.ResourceSCfg().StoreInterval = 1 - defaultCfg.ResourceSCfg().StringIndexedFields = nil - defaultCfg.ResourceSCfg().PrefixIndexedFields = nil - resService, err = NewResourceService(dmRES, defaultCfg, - &FilterS{dm: dmRES, cfg: defaultCfg}, nil) - if err != nil { - t.Errorf("Error: %+v", err) - } - - resProf := &ResourceProfile{ - Tenant: "cgrates.org", - ID: "ResourceProfileCached", - FilterIDs: []string{"*string:~*req.Account:1001"}, - ActivationInterval: &utils.ActivationInterval{ - ActivationTime: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC), - }, - UsageTTL: time.Duration(-1), - Limit: 10.00, - AllocationMessage: "AllocationMessage", - Weight: 20.00, - ThresholdIDs: []string{utils.META_NONE}, - } - - Cache.Set(utils.CacheResourceProfiles, "cgrates.org:ResourceProfileCached", - resProf, nil, cacheCommit(utils.EmptyString), utils.EmptyString) - - res := &Resource{Tenant: resProf.Tenant, - ID: resProf.ID, - Usages: make(map[string]*ResourceUsage)} - - Cache.Set(utils.CacheResources, "cgrates.org:ResourceProfileCached", - res, nil, cacheCommit(utils.EmptyString), utils.EmptyString) - - resources := Resources{res} - Cache.Set(utils.CacheEventResources, "TestResourceCaching", resources.resIDsMp(), nil, true, "") - - ev := &utils.CGREvent{ - Tenant: "cgrates.org", - ID: utils.UUIDSha1Prefix(), - Event: map[string]any{ - "Account": "1001", - "Destination": "3002"}, - } - - mres, err := resService.matchingResourcesForEvent(ev, - "TestResourceCaching", nil) - if err != nil { - t.Errorf("Error: %+v", err) - } - mres.unlock() - if !reflect.DeepEqual(resources[0].Tenant, mres[0].Tenant) { - t.Errorf("Expecting: %+v, received: %+v", resources[0].Tenant, mres[0].Tenant) - } else if !reflect.DeepEqual(resources[0].ID, mres[0].ID) { - t.Errorf("Expecting: %+v, received: %+v", resources[0].ID, mres[0].ID) - } else if !reflect.DeepEqual(resources[0].rPrf, mres[0].rPrf) { - t.Errorf("Expecting: %+v, received: %+v", resources[0].rPrf, mres[0].rPrf) - } else if !reflect.DeepEqual(resources[0].ttl, mres[0].ttl) { - t.Errorf("Expecting: %+v, received: %+v", resources[0].ttl, mres[0].ttl) - } -} - func TestResourcesStoreResourceError(t *testing.T) { Cache.Clear(nil) cfg, _ := config.NewDefaultCGRConfig() diff --git a/ers/kafka_it_test.go b/ers/kafka_it_test.go index d24b4c242..d66ae4a6b 100644 --- a/ers/kafka_it_test.go +++ b/ers/kafka_it_test.go @@ -37,9 +37,9 @@ import ( ) var ( - rdrEvents chan *erEvent - rdrErr chan error - rdrExit chan struct{} + kfkEvents chan *erEvent + kfkErr chan error + kfkExit chan struct{} kfk EventReader ) @@ -99,12 +99,12 @@ func TestKafkaER(t *testing.T) { t.Fatal(err) } - rdrEvents = make(chan *erEvent, 1) - rdrErr = make(chan error, 1) - rdrExit = make(chan struct{}, 1) + kfkEvents = make(chan *erEvent, 1) + kfkErr = make(chan error, 1) + kfkExit = make(chan struct{}, 1) - if kfk, err = NewKafkaER(cfg, 1, rdrEvents, - rdrErr, new(engine.FilterS), rdrExit); err != nil { + if kfk, err = NewKafkaER(cfg, 1, kfkEvents, + kfkErr, new(engine.FilterS), kfkExit); err != nil { t.Fatal(err) } kfk.Serve() @@ -131,9 +131,9 @@ func TestKafkaER(t *testing.T) { }(randomCGRID) select { - case err = <-rdrErr: + case err = <-kfkErr: t.Error(err) - case ev := <-rdrEvents: + case ev := <-kfkEvents: if ev.rdrCfg.ID != "kafka" { t.Errorf("Expected 'kakfa' received `%s`", ev.rdrCfg.ID) } @@ -151,7 +151,7 @@ func TestKafkaER(t *testing.T) { case <-time.After(10 * time.Second): t.Fatal("Timeout") } - rdrExit <- struct{}{} + kfkExit <- struct{}{} // Delete kafka topic diff --git a/ers/lib_test.go b/ers/lib_test.go index e200d90e6..3eda1f90a 100644 --- a/ers/lib_test.go +++ b/ers/lib_test.go @@ -1,3 +1,5 @@ +//go:build integration || flaky + /* Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments Copyright (C) ITsysCOM GmbH diff --git a/ers/sql_it_test.go b/ers/sql_it_test.go index 14499ce21..9579cf97d 100644 --- a/ers/sql_it_test.go +++ b/ers/sql_it_test.go @@ -168,20 +168,26 @@ func testSQLInitDB(t *testing.T) { tx.Commit() } +var ( + sqlEvents chan *erEvent + sqlErr chan error + sqlExit chan struct{} +) + func testSQLReader(t *testing.T) { - rdrEvents = make(chan *erEvent, 1) - rdrErr = make(chan error, 1) - rdrExit = make(chan struct{}, 1) - sqlER, err := NewEventReader(sqlCfg, 1, rdrEvents, rdrErr, new(engine.FilterS), rdrExit) + sqlEvents = make(chan *erEvent, 1) + sqlErr = make(chan error, 1) + sqlExit = make(chan struct{}, 1) + sqlER, err := NewEventReader(sqlCfg, 1, sqlEvents, sqlErr, new(engine.FilterS), sqlExit) if err != nil { t.Fatal(err) } sqlER.Serve() select { - case err = <-rdrErr: + case err = <-sqlErr: t.Error(err) - case ev := <-rdrEvents: + case ev := <-sqlEvents: if ev.rdrCfg.ID != "mysql" { t.Errorf("Expected 'mysql' received `%s`", ev.rdrCfg.ID) } @@ -230,9 +236,9 @@ func testSQLEmptyTable(t *testing.T) { func testSQLReader2(t *testing.T) { select { - case err := <-rdrErr: + case err := <-sqlErr: t.Error(err) - case ev := <-rdrEvents: + case ev := <-sqlEvents: if ev.rdrCfg.ID != "mysql" { t.Errorf("Expected 'mysql' received `%s`", ev.rdrCfg.ID) } @@ -282,7 +288,7 @@ func testSQLPoster(t *testing.T) { } func testSQLStop(t *testing.T) { - rdrExit <- struct{}{} + sqlExit <- struct{}{} db = db.DropTable("cdrs2") if err := db.Close(); err != nil { t.Error(err) diff --git a/general_tests/a1_it_test.go b/general_tests/a1_it_test.go index 51b029d0d..710cdaa59 100644 --- a/general_tests/a1_it_test.go +++ b/general_tests/a1_it_test.go @@ -22,10 +22,8 @@ package general_tests import ( "encoding/json" - "errors" "fmt" "net/rpc" - "net/rpc/jsonrpc" "path" "sync" "testing" @@ -412,14 +410,3 @@ func testA1itStopCgrEngine(t *testing.T) { t.Error(err) } } - -func newRPCClient(cfg *config.ListenCfg) (c *rpc.Client, err error) { - switch *utils.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") - } -} diff --git a/general_tests/destination_combined_it_test.go b/general_tests/destination_combined_it_test.go index ee3d5b018..6fd059145 100644 --- a/general_tests/destination_combined_it_test.go +++ b/general_tests/destination_combined_it_test.go @@ -1,4 +1,5 @@ -//go:build flaky +//go:build integration +// +build integration /* Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments @@ -21,6 +22,7 @@ along with this program. If not, see package general_tests import ( + "net/rpc" "path" "testing" "time" @@ -33,65 +35,70 @@ import ( // Start test wth combines rating plan // destination for 1002 cost 1CNT and *any cost 10CNT +var ( + destCombCfgPath string + destCombCfg *config.CGRConfig + destCombRPC *rpc.Client + destCombConfDIR string + destCombDelay int -var sTestsTutorials2 = []func(t *testing.T){ - testDestinationLoadConfig, - testDestinationResetDB, - testDestinationStartEngine, - testDestinationRpcConn, - testDestinationFromFolder, - testDestinationGetCostFor1002, - testDestinationGetCostFor1003, - testTutorialStopEngine, -} + sTestsDestComb = []func(t *testing.T){ + testDestinationLoadConfig, + testDestinationResetDB, + testDestinationStartEngine, + testDestinationRpcConn, + testDestinationFromFolder, + testDestinationGetCostFor1002, + testDestinationGetCostFor1003, + testDestinationStopEngine, + } +) func TestDestinationCombines(t *testing.T) { switch *utils.DBType { case utils.MetaInternal: - tutorialConfDIR = "tutinternal" + destCombConfDIR = "tutinternal" case utils.MetaMySQL: - tutorialConfDIR = "tutmysql" + destCombConfDIR = "tutmysql" case utils.MetaMongo: - tutorialConfDIR = "tutmongo" + destCombConfDIR = "tutmongo" case utils.MetaPostgres: t.SkipNow() default: t.Fatal("Unknown Database type") } - for _, stest := range sTestsTutorials2 { - t.Run(tutorialConfDIR, stest) + for _, stest := range sTestsDestComb { + t.Run(destCombConfDIR, stest) } } func testDestinationLoadConfig(t *testing.T) { var err error - tutorialCfgPath = path.Join(*utils.DataDir, "conf", "samples", tutorialConfDIR) - if tutorialCfg, err = config.NewCGRConfigFromPath(tutorialCfgPath); err != nil { + destCombCfgPath = path.Join(*utils.DataDir, "conf", "samples", destCombConfDIR) + if destCombCfg, err = config.NewCGRConfigFromPath(destCombCfgPath); err != nil { t.Error(err) } - tutorialDelay = 2000 - } func testDestinationResetDB(t *testing.T) { - if err := engine.InitDataDb(tutorialCfg); err != nil { + if err := engine.InitDataDb(destCombCfg); err != nil { t.Fatal(err) } - if err := engine.InitStorDb(tutorialCfg); err != nil { + if err := engine.InitStorDb(destCombCfg); err != nil { t.Fatal(err) } } func testDestinationStartEngine(t *testing.T) { - if _, err := engine.StopStartEngine(tutorialCfgPath, tutorialDelay); err != nil { + if _, err := engine.StopStartEngine(destCombCfgPath, 2000); err != nil { t.Fatal(err) } } func testDestinationRpcConn(t *testing.T) { var err error - tutorialRpc, err = newRPCClient(tutorialCfg.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed + destCombRPC, err = newRPCClient(destCombCfg.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed if err != nil { t.Fatal("Could not connect to rater: ", err.Error()) } @@ -100,7 +107,7 @@ func testDestinationRpcConn(t *testing.T) { func testDestinationFromFolder(t *testing.T) { var reply string attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*utils.DataDir, "tariffplans", "tp_destination_with_any")} - if err := tutorialRpc.Call(utils.APIerSv1LoadTariffPlanFromFolder, attrs, &reply); err != nil { + if err := destCombRPC.Call(utils.APIerSv1LoadTariffPlanFromFolder, attrs, &reply); err != nil { t.Error(err) } time.Sleep(500 * time.Millisecond) @@ -116,7 +123,7 @@ func testDestinationGetCostFor1002(t *testing.T) { Usage: "1m", } var rply *engine.EventCost - if err := tutorialRpc.Call(utils.APIerSv1GetCost, attrs, &rply); err != nil { + if err := destCombRPC.Call(utils.APIerSv1GetCost, attrs, &rply); err != nil { t.Error("Unexpected nil error received: ", err.Error()) } else if *rply.Cost != 0.01 { t.Errorf("Unexpected cost received: %f", *rply.Cost) @@ -133,9 +140,15 @@ func testDestinationGetCostFor1003(t *testing.T) { Usage: "1m", } var rply *engine.EventCost - if err := tutorialRpc.Call(utils.APIerSv1GetCost, attrs, &rply); err != nil { + if err := destCombRPC.Call(utils.APIerSv1GetCost, attrs, &rply); err != nil { t.Error("Unexpected nil error received: ", err.Error()) } else if *rply.Cost != 0.3 { t.Errorf("Unexpected cost received: %f", *rply.Cost) } } + +func testDestinationStopEngine(t *testing.T) { + if err := engine.KillEngine(2000); err != nil { + t.Error(err) + } +} diff --git a/general_tests/lib_test.go b/general_tests/lib_test.go new file mode 100644 index 000000000..278e36055 --- /dev/null +++ b/general_tests/lib_test.go @@ -0,0 +1,40 @@ +//go:build integration || flaky + +/* +Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments +Copyright (C) ITsysCOM GmbH + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ +package general_tests + +import ( + "errors" + "net/rpc" + "net/rpc/jsonrpc" + + "github.com/cgrates/cgrates/config" + "github.com/cgrates/cgrates/utils" +) + +func newRPCClient(cfg *config.ListenCfg) (c *rpc.Client, err error) { + switch *utils.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") + } +}