From 56dced241ae2eb99a51cde67465f36d3251c2099 Mon Sep 17 00:00:00 2001 From: porosnicuadrian Date: Tue, 5 Jan 2021 18:03:45 +0200 Subject: [PATCH] Coverage tests in loaders --- loaders/loader_it_test.go | 250 ++++++++++++++++++++++++++++++++++++++ loaders/loaders_test.go | 33 +++++ 2 files changed, 283 insertions(+) create mode 100644 loaders/loaders_test.go diff --git a/loaders/loader_it_test.go b/loaders/loader_it_test.go index cc86b1a0f..2d1f9f440 100644 --- a/loaders/loader_it_test.go +++ b/loaders/loader_it_test.go @@ -57,6 +57,11 @@ var ( testLoaderMoveFiles, testLoaderMoveFilesMatchingFiles, testLoaderMoveFilesRenameError, + testProcessFile, + testProcessFileLockFolder, + testProcessFileUnableToOpen, + testProcessFileRenameError, + testAllFilesPresentEmptyCSV, testLoaderLoadAttributes, testLoaderVerifyOutDir, testLoaderCheckAttributes, @@ -729,3 +734,248 @@ func testLoaderMoveFilesRenameError(t *testing.T) { t.Error(err) } } + +func testProcessFile(t *testing.T) { + flPath := "/tmp/testProcessFile" + if err := os.MkdirAll(flPath, 0777); err != nil { + t.Error(err) + } + file, err := os.Create(path.Join(flPath, utils.ResourcesCsv)) + if err != nil { + t.Error(err) + } + file.Write([]byte(` +#Tenant[0],ID[1] +cgrates.org,NewRes1 +`)) + file.Close() + + data := engine.NewInternalDB(nil, nil, true) + ldr := &Loader{ + ldrID: "testProcessFile", + dm: engine.NewDataManager(data, config.CgrConfig().CacheCfg(), nil), + fieldSep: utils.FIELDS_SEP, + tpInDir: flPath, + tpOutDir: "/tmp", + lockFilename: utils.ResourcesCsv, + bufLoaderData: make(map[string][]LoaderData), + timezone: "UTC", + } + ldr.dataTpls = map[string][]*config.FCTemplate{ + utils.MetaResources: { + {Tag: "Tenant", + Path: "Tenant", + Type: utils.META_COMPOSED, + Value: config.NewRSRParsersMustCompile("~*req.0", utils.INFIELD_SEP), + Mandatory: true}, + {Tag: "ID", + Path: "ID", + Type: utils.META_COMPOSED, + Value: config.NewRSRParsersMustCompile("~*req.1", utils.INFIELD_SEP), + Mandatory: true}, + }, + } + + //loader file is empty (loaderType will be empty) + if err := ldr.processFile("unusedValue", utils.ResourcesCsv); err != nil { + t.Error(err) + } + + resCsv := ` +#Tenant[0],ID[1] +cgrates.org,NewRes1 +` + rdr := ioutil.NopCloser(strings.NewReader(resCsv)) + + ldr.rdrs = map[string]map[string]*openedCSVFile{ + utils.MetaResources: { + utils.ResourcesCsv: &openedCSVFile{ + fileName: utils.ResourcesCsv, + rdr: rdr, + }, + }, + } + + expRes := &engine.ResourceProfile{ + Tenant: "cgrates.org", + ID: "NewRes1", + FilterIDs: []string{}, + ThresholdIDs: []string{}, + } + + //successfully processed the file + if err := ldr.processFile("unusedValue", utils.ResourcesCsv); err != nil { + t.Error(err) + } + + //get ResourceProfile and compare + if rcv, err := ldr.dm.GetResourceProfile(expRes.Tenant, expRes.ID, true, true, utils.NonTransactional); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(rcv, expRes) { + t.Errorf("Expected %+v, received %+v", utils.ToJSON(expRes), utils.ToJSON(rcv)) + } + + if err := ldr.dm.RemoveResourceProfile(expRes.Tenant, expRes.ID, utils.NonTransactional, true); err != nil { + t.Error(err) + } + + //cannot move file when tpOutDir is empty + ldr.tpOutDir = utils.EmptyString + if err := ldr.processFile("unusedValue", utils.ResourcesCsv); err != nil { + t.Error(err) + } + + if err := os.Remove(path.Join("/tmp", utils.ResourcesCsv)); err != nil { + t.Error(err) + } else if err := os.Remove(flPath); err != nil { + t.Error(err) + } +} + +func testProcessFileLockFolder(t *testing.T) { + flPath := "/tmp/testProcessFileLockFolder" + if err := os.MkdirAll(flPath, 0777); err != nil { + t.Error(err) + } + _, err := os.Create(path.Join(flPath, utils.ResourcesCsv)) + if err != nil { + t.Error(err) + } + + ldr := &Loader{ + ldrID: "testProcessFileLockFolder", + tpInDir: flPath, + tpOutDir: "/tmp", + } + + ldr.rdrs = map[string]map[string]*openedCSVFile{ + utils.MetaResources: { + utils.ResourcesCsv: &openedCSVFile{ + fileName: utils.ResourcesCsv, + }, + }, + } + + //unable to lock the folder, because lockFileName is missing + expected := "open /tmp/testProcessFileLockFolder: is a directory" + if err := ldr.processFile("unusedValue", utils.ResourcesCsv); err == nil || err.Error() != expected { + t.Errorf("Expected %+v, received %+v", expected, err) + } + + if err := os.Remove(path.Join(flPath, utils.ResourcesCsv)); err != nil { + t.Error(err) + } else if err := os.Remove(flPath); err != nil { + t.Error(err) + } +} + +func testProcessFileUnableToOpen(t *testing.T) { + flPath := "/tmp/testProcessFileUnableToOpen" + if err := os.MkdirAll(flPath, 0777); err != nil { + t.Error(err) + } + + ldr := &Loader{ + ldrID: "testProcessFile", + tpInDir: flPath, + fieldSep: ",", + lockFilename: utils.MetaResources, + } + resCsv := ` +#Tenant[0],ID[1] +cgrates.org,NewRes1 +` + rdr := ioutil.NopCloser(strings.NewReader(resCsv)) + + ldr.rdrs = map[string]map[string]*openedCSVFile{ + utils.MetaResources: { + `resources`: &openedCSVFile{ + fileName: utils.ResourcesCsv, + rdr: rdr, + }, + }, + } + + //unable to lock the folder, because lockFileName is missing + expected := "open /tmp/testProcessFileUnableToOpen/resources: no such file or directory" + if err := ldr.processFile("unusedValue", `resources`); err == nil || err.Error() != expected { + t.Errorf("Expected %+v, received %+v", expected, err) + } + + if err := os.Remove(flPath); err != nil { + t.Error(err) + } +} + +func testProcessFileRenameError(t *testing.T) { + flPath1 := "/tmp/testProcessFileLockFolder" + if err := os.MkdirAll(flPath1, 0777); err != nil { + t.Error(err) + } + data := engine.NewInternalDB(nil, nil, true) + ldr := &Loader{ + ldrID: "testProcessFileRenameError", + dm: engine.NewDataManager(data, config.CgrConfig().CacheCfg(), nil), + fieldSep: utils.FIELDS_SEP, + tpInDir: flPath1, + tpOutDir: "INEXISTING_FILE", + lockFilename: utils.ResourcesCsv, + bufLoaderData: make(map[string][]LoaderData), + timezone: "UTC", + } + ldr.dataTpls = map[string][]*config.FCTemplate{ + utils.MetaResources: { + {Tag: "Tenant", + Path: "Tenant", + Type: utils.META_COMPOSED, + Value: config.NewRSRParsersMustCompile("~*req.0", utils.INFIELD_SEP), + Mandatory: true}, + {Tag: "ID", + Path: "ID", + Type: utils.META_COMPOSED, + Value: config.NewRSRParsersMustCompile("~*req.1", utils.INFIELD_SEP), + Mandatory: true}, + }, + } + + resCsv := ` +#Tenant[0],ID[1] +cgrates.org,NewRes1 +` + rdr := ioutil.NopCloser(strings.NewReader(resCsv)) + + ldr.rdrs = map[string]map[string]*openedCSVFile{ + utils.MetaResources: { + utils.ResourcesCsv: &openedCSVFile{ + fileName: utils.ResourcesCsv, + rdr: rdr, + }, + }, + } + + expected := "rename /tmp/testProcessFileLockFolder/Resources.csv INEXISTING_FILE/Resources.csv: no such file or directory" + if err := ldr.processFile("unusedValue", utils.ResourcesCsv); err == nil || err.Error() != expected { + t.Errorf("Expected %+v, received %+v", expected, err) + } + + if err := os.Remove(flPath1); err != nil { + t.Error(err) + } +} + +func testAllFilesPresentEmptyCSV(t *testing.T) { + ldr := &Loader{ + ldrID: "testProcessFileRenameError", + lockFilename: utils.ResourcesCsv, + bufLoaderData: make(map[string][]LoaderData), + timezone: "UTC", + } + ldr.rdrs = map[string]map[string]*openedCSVFile{ + utils.MetaResources: { + utils.ResourcesCsv: nil, + }, + } + if rcv := ldr.allFilesPresent(utils.MetaResources); rcv { + t.Errorf("Expecting false") + } +} diff --git a/loaders/loaders_test.go b/loaders/loaders_test.go new file mode 100644 index 000000000..c5792394b --- /dev/null +++ b/loaders/loaders_test.go @@ -0,0 +1,33 @@ +/* +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 loaders + +import "testing" + +func TestV1ReloadUnknownLoader(t *testing.T) { + ldr := &Loader{} + ldrs := &LoaderService{ldrs: map[string]*Loader{ + "INVALID_LOADER": ldr, + }} + var reply string + expected := "UNKNOWN_LOADER: LOADER1" + if err := ldrs.V1Load(&ArgsProcessFolder{LoaderID: "LOADER1"}, &reply); err == nil || err.Error() != expected { + t.Errorf("Expected %+v, received %+v", expected, err) + } +}