From 5ecd940207b9f8a4c3dc1c185ef922e9310217bc Mon Sep 17 00:00:00 2001 From: TeoV Date: Wed, 29 Jul 2020 16:28:18 +0300 Subject: [PATCH] Add integration test for move RateProfiles --- migrator/migrator.go | 2 + migrator/rateprofiles.go | 2 +- migrator/rateprofiles_it_test.go | 256 +++++++++++++++++++++++++++++++ 3 files changed, 259 insertions(+), 1 deletion(-) create mode 100644 migrator/rateprofiles_it_test.go diff --git a/migrator/migrator.go b/migrator/migrator.go index bf0992556..c93e348c8 100755 --- a/migrator/migrator.go +++ b/migrator/migrator.go @@ -142,6 +142,8 @@ func (m *Migrator) Migrate(taskIDs []string) (err error, stats map[string]int) { err = m.migrateTimings() case utils.MetaResources: err = m.migrateResources() + case utils.MetaRateProfiles: + err = m.migrateRateProfiles() case MetaAliases: err = m.migrateAlias() case utils.MetaUsers: diff --git a/migrator/rateprofiles.go b/migrator/rateprofiles.go index 9e7eb8c3c..3571cdbd1 100644 --- a/migrator/rateprofiles.go +++ b/migrator/rateprofiles.go @@ -85,7 +85,7 @@ func (m *Migrator) migrateRateProfiles() (err error) { if err == utils.ErrNoMoreData || !migrated { break } - m.stats[utils.RatingPlan]++ + m.stats[utils.RateProfiles]++ } // All done, update version wtih current one if err = m.setVersions(utils.RateProfiles); err != nil { diff --git a/migrator/rateprofiles_it_test.go b/migrator/rateprofiles_it_test.go new file mode 100644 index 000000000..b7613f0fd --- /dev/null +++ b/migrator/rateprofiles_it_test.go @@ -0,0 +1,256 @@ +// +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 migrator + +import ( + "log" + "path" + "reflect" + "testing" + "time" + + "github.com/cgrates/cgrates/config" + "github.com/cgrates/cgrates/engine" + "github.com/cgrates/cgrates/utils" +) + +var ( + ratePrfPathIn string + ratePrfPathOut string + ratePrfCfgIn *config.CGRConfig + ratePrfCfgOut *config.CGRConfig + ratePrfMigrator *Migrator + ratePrfAction string +) + +var sTestsRatePrfIT = []func(t *testing.T){ + testRatePrfITConnect, + testRatePrfITFlush, + testRatePrfITMigrateAndMove, +} + +func TestRatePrfITMove1(t *testing.T) { + var err error + ratePrfPathIn = path.Join(*dataDir, "conf", "samples", "tutmongo") + ratePrfCfgIn, err = config.NewCGRConfigFromPath(ratePrfPathIn) + if err != nil { + t.Fatal(err) + } + ratePrfPathOut = path.Join(*dataDir, "conf", "samples", "tutmysql") + ratePrfCfgOut, err = config.NewCGRConfigFromPath(ratePrfPathOut) + if err != nil { + t.Fatal(err) + } + ratePrfAction = utils.Move + for _, stest := range sTestsRatePrfIT { + t.Run("TestRatePrfITMove", stest) + } + ratePrfMigrator.Close() +} + +func TestRatePrfITMove2(t *testing.T) { + var err error + ratePrfPathIn = path.Join(*dataDir, "conf", "samples", "tutmysql") + ratePrfCfgIn, err = config.NewCGRConfigFromPath(ratePrfPathIn) + if err != nil { + t.Fatal(err) + } + ratePrfPathOut = path.Join(*dataDir, "conf", "samples", "tutmongo") + ratePrfCfgOut, err = config.NewCGRConfigFromPath(ratePrfPathOut) + if err != nil { + t.Fatal(err) + } + ratePrfAction = utils.Move + for _, stest := range sTestsRatePrfIT { + t.Run("TestRatePrfITMove", stest) + } + ratePrfMigrator.Close() +} + +func TestRatePrfITMoveEncoding(t *testing.T) { + var err error + ratePrfPathIn = path.Join(*dataDir, "conf", "samples", "tutmongo") + ratePrfCfgIn, err = config.NewCGRConfigFromPath(ratePrfPathIn) + if err != nil { + t.Fatal(err) + } + ratePrfPathOut = path.Join(*dataDir, "conf", "samples", "tutmongojson") + ratePrfCfgOut, err = config.NewCGRConfigFromPath(ratePrfPathOut) + if err != nil { + t.Fatal(err) + } + ratePrfAction = utils.Move + for _, stest := range sTestsRatePrfIT { + t.Run("TestRatePrfITMoveEncoding", stest) + } + ratePrfMigrator.Close() +} + +func TestRatePrfITMoveEncoding2(t *testing.T) { + var err error + ratePrfPathIn = path.Join(*dataDir, "conf", "samples", "tutmysql") + ratePrfCfgIn, err = config.NewCGRConfigFromPath(ratePrfPathIn) + if err != nil { + t.Fatal(err) + } + ratePrfPathOut = path.Join(*dataDir, "conf", "samples", "tutmysqljson") + ratePrfCfgOut, err = config.NewCGRConfigFromPath(ratePrfPathOut) + if err != nil { + t.Fatal(err) + } + ratePrfAction = utils.Move + for _, stest := range sTestsRatePrfIT { + t.Run("TestRatePrfITMoveEncoding2", stest) + } + ratePrfMigrator.Close() +} + +func testRatePrfITConnect(t *testing.T) { + dataDBIn, err := NewMigratorDataDB(ratePrfCfgIn.DataDbCfg().DataDbType, + ratePrfCfgIn.DataDbCfg().DataDbHost, ratePrfCfgIn.DataDbCfg().DataDbPort, + ratePrfCfgIn.DataDbCfg().DataDbName, ratePrfCfgIn.DataDbCfg().DataDbUser, + ratePrfCfgIn.DataDbCfg().DataDbPass, ratePrfCfgIn.GeneralCfg().DBDataEncoding, + config.CgrConfig().CacheCfg(), "", ratePrfCfgIn.DataDbCfg().Items) + if err != nil { + log.Fatal(err) + } + dataDBOut, err := NewMigratorDataDB(ratePrfCfgOut.DataDbCfg().DataDbType, + ratePrfCfgOut.DataDbCfg().DataDbHost, ratePrfCfgOut.DataDbCfg().DataDbPort, + ratePrfCfgOut.DataDbCfg().DataDbName, ratePrfCfgOut.DataDbCfg().DataDbUser, + ratePrfCfgOut.DataDbCfg().DataDbPass, ratePrfCfgOut.GeneralCfg().DBDataEncoding, + config.CgrConfig().CacheCfg(), "", ratePrfCfgOut.DataDbCfg().Items) + if err != nil { + log.Fatal(err) + } + if reflect.DeepEqual(ratePrfPathIn, ratePrfPathOut) { + ratePrfMigrator, err = NewMigrator(dataDBIn, dataDBOut, nil, nil, + false, true, false, false) + } else { + ratePrfMigrator, err = NewMigrator(dataDBIn, dataDBOut, nil, nil, + false, false, false, false) + } + if err != nil { + log.Fatal(err) + } +} + +func testRatePrfITFlush(t *testing.T) { + if err := ratePrfMigrator.dmOut.DataManager().DataDB().Flush(""); err != nil { + t.Error(err) + } + if isEmpty, err := ratePrfMigrator.dmOut.DataManager().DataDB().IsDBEmpty(); err != nil { + t.Error(err) + } else if isEmpty != true { + t.Errorf("\nExpecting: true got :%+v", isEmpty) + } + if err := engine.SetDBVersions(ratePrfMigrator.dmOut.DataManager().DataDB()); err != nil { + t.Error("Error ", err.Error()) + } + if err := ratePrfMigrator.dmIN.DataManager().DataDB().Flush(""); err != nil { + t.Error(err) + } + if isEmpty, err := ratePrfMigrator.dmIN.DataManager().DataDB().IsDBEmpty(); err != nil { + t.Error(err) + } else if isEmpty != true { + t.Errorf("\nExpecting: true got :%+v", isEmpty) + } + if err := engine.SetDBVersions(ratePrfMigrator.dmIN.DataManager().DataDB()); err != nil { + t.Error("Error ", err.Error()) + } +} + +func testRatePrfITMigrateAndMove(t *testing.T) { + rPrf := &engine.RateProfile{ + Tenant: "cgrates.org", + ID: "RP1", + FilterIDs: []string{"*string:~*req.Subject:1001"}, + Weight: 0, + ConnectFee: 0.1, + RoundingMethod: "*up", + RoundingDecimals: 4, + MinCost: 0.1, + MaxCost: 0.6, + MaxCostStrategy: "*free", + Rates: map[string]*engine.Rate{ + "FIRST_GI": { + ID: "FIRST_GI", + FilterIDs: []string{"*gi:~*req.Usage:0"}, + Weight: 0, + IntervalRates: []*engine.IntervalRate{ + { + Value: 0.12, + Unit: time.Duration(1 * time.Minute), + Increment: time.Duration(1 * time.Minute), + }, + }, + Blocker: false, + }, + "SECOND_GI": { + ID: "SECOND_GI", + FilterIDs: []string{"*gi:~*req.Usage:1m"}, + Weight: 10, + IntervalRates: []*engine.IntervalRate{ + { + Value: 0.06, + Unit: time.Duration(1 * time.Minute), + Increment: time.Duration(1 * time.Second), + }, + }, + Blocker: false, + }, + }, + } + switch ratePrfAction { + case utils.Migrate: // for the moment only one version of rate profiles exists + case utils.Move: + if err := ratePrfMigrator.dmIN.DataManager().SetRateProfile(rPrf, true); err != nil { + t.Error(err) + } + currentVersion := engine.CurrentDataDBVersions() + err := ratePrfMigrator.dmIN.DataManager().DataDB().SetVersions(currentVersion, false) + if err != nil { + t.Error("Error when setting version for RatePrf ", err.Error()) + } + + _, err = ratePrfMigrator.dmOut.DataManager().GetRateProfile("cgrates.org", "RP1", false, false, utils.NonTransactional) + if err != utils.ErrNotFound { + t.Error(err) + } + + err, _ = ratePrfMigrator.Migrate([]string{utils.MetaRateProfiles}) + if err != nil { + t.Error("Error when migrating RatePrf ", err.Error()) + } + ratePrfult, err := ratePrfMigrator.dmOut.DataManager().GetRateProfile("cgrates.org", "RP1", false, false, utils.NonTransactional) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(ratePrfult, rPrf) { + t.Errorf("Expecting: %+v, received: %+v", rPrf, ratePrfult) + } + ratePrfult, err = ratePrfMigrator.dmIN.DataManager().GetRateProfile("cgrates.org", "RP1", false, false, utils.NonTransactional) + if err != utils.ErrNotFound { + t.Error(err) + } else if ratePrfMigrator.stats[utils.RateProfiles] != 1 { + t.Errorf("Expected 1, recived: %v", ratePrfMigrator.stats[utils.RateProfiles]) + } + } +}