mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
Coverage tests for ers
This commit is contained in:
committed by
Dan Christian Bogos
parent
a85b87cae7
commit
742bf37366
@@ -21,6 +21,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
package ers
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net/rpc"
|
||||
"os"
|
||||
"path"
|
||||
@@ -566,3 +570,266 @@ func TestPartialCSVServe2(t *testing.T) {
|
||||
t.Errorf("\nExpected <%+v>, \nReceived <%+v>", "no such file or directory", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPartialCSVServe5(t *testing.T) {
|
||||
cfg := config.NewDefaultCGRConfig()
|
||||
fltrs := &engine.FilterS{}
|
||||
eR := &PartialCSVFileER{
|
||||
cgrCfg: cfg,
|
||||
cfgIdx: 0,
|
||||
fltrS: fltrs,
|
||||
rdrDir: "/tmp/partErs1/out",
|
||||
rdrEvents: make(chan *erEvent, 1),
|
||||
rdrError: make(chan error, 1),
|
||||
rdrExit: make(chan struct{}),
|
||||
conReqs: make(chan struct{}, 1),
|
||||
}
|
||||
eR.conReqs <- struct{}{}
|
||||
filePath := "/tmp/partErs1/out"
|
||||
err := os.MkdirAll(filePath, 0777)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
for i := 1; i < 4; i++ {
|
||||
if _, err := os.Create(path.Join(filePath, fmt.Sprintf("file%d.csv", i))); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
}
|
||||
eR.Config().RunDelay = 1 * time.Millisecond
|
||||
if err := eR.Serve(); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
os.Create(path.Join(filePath, "file1.txt"))
|
||||
eR.Config().RunDelay = 1 * time.Millisecond
|
||||
if err := eR.Serve(); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPartialCSVProcessEvent(t *testing.T) {
|
||||
cfg := config.NewDefaultCGRConfig()
|
||||
cfg.ERsCfg().Readers[0].ProcessedPath = ""
|
||||
fltrs := &engine.FilterS{}
|
||||
filePath := "/tmp/TestPartialCSVProcessEvent/"
|
||||
if err := os.MkdirAll(filePath, 0777); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
file, err := os.Create(path.Join(filePath, "file1.csv"))
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
file.Write([]byte(",a,ToR,b,c,d,e,f,g,h,i,j,k,l"))
|
||||
file.Close()
|
||||
eR := &PartialCSVFileER{
|
||||
cgrCfg: cfg,
|
||||
cfgIdx: 0,
|
||||
fltrS: fltrs,
|
||||
rdrDir: "/tmp/partErs1/out",
|
||||
rdrEvents: make(chan *erEvent, 1),
|
||||
rdrError: make(chan error, 1),
|
||||
rdrExit: make(chan struct{}),
|
||||
conReqs: make(chan struct{}, 1),
|
||||
}
|
||||
eR.conReqs <- struct{}{}
|
||||
fname := "file1.csv"
|
||||
errExpect := io.EOF
|
||||
if err := eR.processFile(filePath, fname); err == nil || err != errExpect {
|
||||
t.Errorf("Expected %v but received %v", errExpect, err)
|
||||
}
|
||||
if err := os.RemoveAll(filePath); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
value := []*utils.CGREvent{
|
||||
{
|
||||
Tenant: "cgrates.org",
|
||||
Event: map[string]interface{}{
|
||||
"Partial": true,
|
||||
},
|
||||
},
|
||||
{
|
||||
Tenant: "cgrates2.org",
|
||||
Event: map[string]interface{}{
|
||||
"Partial": true,
|
||||
},
|
||||
},
|
||||
}
|
||||
eR.Config().ProcessedPath = "/tmp"
|
||||
eR.dumpToFile("ID1", value)
|
||||
}
|
||||
|
||||
func TestPartialCSVDumpToFileErr1(t *testing.T) {
|
||||
cfg := config.NewDefaultCGRConfig()
|
||||
fltrs := &engine.FilterS{}
|
||||
var err error
|
||||
utils.Logger, err = utils.Newlogger(utils.MetaStdLog, utils.EmptyString)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
utils.Logger.SetLogLevel(7)
|
||||
buf := new(bytes.Buffer)
|
||||
log.SetOutput(buf)
|
||||
eR := &PartialCSVFileER{
|
||||
cgrCfg: cfg,
|
||||
cfgIdx: 0,
|
||||
fltrS: fltrs,
|
||||
rdrDir: "/tmp/partErs1/out",
|
||||
rdrEvents: make(chan *erEvent, 1),
|
||||
rdrError: make(chan error, 1),
|
||||
rdrExit: make(chan struct{}),
|
||||
conReqs: make(chan struct{}, 1),
|
||||
}
|
||||
eR.conReqs <- struct{}{}
|
||||
value := []*utils.CGREvent{
|
||||
{
|
||||
Event: map[string]interface{}{
|
||||
"Partial": true,
|
||||
},
|
||||
},
|
||||
}
|
||||
//ProcessedPath is not declared in order to trigger the
|
||||
//file creation error
|
||||
eR.dumpToFile("ID1", value)
|
||||
errExpect := "[ERROR] <ERs> Failed creating /var/spool/cgrates/ers/out/.tmp."
|
||||
if rcv := buf.String(); !strings.Contains(rcv, errExpect) {
|
||||
t.Errorf("\nExpected %v but \nreceived %v", errExpect, rcv)
|
||||
}
|
||||
value = []*utils.CGREvent{
|
||||
{
|
||||
Event: map[string]interface{}{
|
||||
//Value is false in order to stop
|
||||
//further execution
|
||||
"Partial": false,
|
||||
},
|
||||
},
|
||||
}
|
||||
eR.dumpToFile("ID1", value)
|
||||
eR.postCDR("ID1", value)
|
||||
}
|
||||
|
||||
func TestPartialCSVDumpToFileErr2(t *testing.T) {
|
||||
cfg := config.NewDefaultCGRConfig()
|
||||
fltrs := &engine.FilterS{}
|
||||
var err error
|
||||
utils.Logger, err = utils.Newlogger(utils.MetaStdLog, utils.EmptyString)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
utils.Logger.SetLogLevel(7)
|
||||
buf := new(bytes.Buffer)
|
||||
log.SetOutput(buf)
|
||||
eR := &PartialCSVFileER{
|
||||
cgrCfg: cfg,
|
||||
cfgIdx: 0,
|
||||
fltrS: fltrs,
|
||||
rdrDir: "/tmp/partErs1/out",
|
||||
rdrEvents: make(chan *erEvent, 1),
|
||||
rdrError: make(chan error, 1),
|
||||
rdrExit: make(chan struct{}),
|
||||
conReqs: make(chan struct{}, 1),
|
||||
}
|
||||
eR.conReqs <- struct{}{}
|
||||
value := []*utils.CGREvent{
|
||||
{
|
||||
Event: map[string]interface{}{
|
||||
//Value of field is string in order to trigger
|
||||
//the converting error
|
||||
"Partial": "notBool",
|
||||
},
|
||||
},
|
||||
}
|
||||
eR.dumpToFile("ID1", value)
|
||||
errExpect := `[WARNING] <ERs> Converting Event : <{"Partial":"notBool"}> to cdr , ignoring due to error: <strconv.ParseBool: parsing "notBool": invalid syntax>`
|
||||
if rcv := buf.String(); !strings.Contains(rcv, errExpect) {
|
||||
t.Errorf("\nExpected %v but \nreceived %v", errExpect, rcv)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPartialCSVDumpToFileErr3(t *testing.T) {
|
||||
cfg := config.NewDefaultCGRConfig()
|
||||
fltrs := &engine.FilterS{}
|
||||
var err error
|
||||
utils.Logger, err = utils.Newlogger(utils.MetaStdLog, utils.EmptyString)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
utils.Logger.SetLogLevel(7)
|
||||
buf := new(bytes.Buffer)
|
||||
log.SetOutput(buf)
|
||||
eR := &PartialCSVFileER{
|
||||
cgrCfg: cfg,
|
||||
cfgIdx: 0,
|
||||
fltrS: fltrs,
|
||||
rdrDir: "/tmp/partErs1/out",
|
||||
rdrEvents: make(chan *erEvent, 1),
|
||||
rdrError: make(chan error, 1),
|
||||
rdrExit: make(chan struct{}),
|
||||
conReqs: make(chan struct{}, 1),
|
||||
}
|
||||
eR.conReqs <- struct{}{}
|
||||
value := []*utils.CGREvent{
|
||||
{
|
||||
Tenant: "cgrates.org",
|
||||
Event: map[string]interface{}{
|
||||
"Partial": true,
|
||||
},
|
||||
},
|
||||
//Added a second event in order to pass the length check
|
||||
{
|
||||
Tenant: "cgrates2.org",
|
||||
Event: map[string]interface{}{
|
||||
"Partial": "notBool",
|
||||
},
|
||||
},
|
||||
}
|
||||
eR.Config().ProcessedPath = "/tmp"
|
||||
eR.dumpToFile("ID1", value)
|
||||
errExpect := `[WARNING] <ERs> Converting Event : <{"Partial":"notBool"}> to cdr , ignoring due to error: <strconv.ParseBool: parsing "notBool": invalid syntax>`
|
||||
if rcv := buf.String(); !strings.Contains(rcv, errExpect) {
|
||||
t.Errorf("\nExpected %v but \nreceived %v", errExpect, rcv)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPartialCSVPostCDR(t *testing.T) {
|
||||
cfg := config.NewDefaultCGRConfig()
|
||||
fltrs := &engine.FilterS{}
|
||||
eR := &PartialCSVFileER{
|
||||
cgrCfg: cfg,
|
||||
cfgIdx: 0,
|
||||
fltrS: fltrs,
|
||||
rdrDir: "/tmp/partErs1/out",
|
||||
rdrEvents: make(chan *erEvent, 1),
|
||||
rdrError: make(chan error, 1),
|
||||
rdrExit: make(chan struct{}),
|
||||
conReqs: make(chan struct{}, 1),
|
||||
}
|
||||
eR.conReqs <- struct{}{}
|
||||
|
||||
value := []*utils.CGREvent{
|
||||
{
|
||||
Tenant: "cgrates.org",
|
||||
Event: map[string]interface{}{
|
||||
"Partial": true,
|
||||
},
|
||||
APIOpts: map[string]interface{}{
|
||||
"Opt1": "testOpt",
|
||||
},
|
||||
},
|
||||
}
|
||||
expEvent := &utils.CGREvent{
|
||||
Tenant: "cgrates.org",
|
||||
Event: value[0].Event,
|
||||
APIOpts: value[0].APIOpts,
|
||||
}
|
||||
eR.postCDR("ID1", nil)
|
||||
eR.postCDR("ID1", value)
|
||||
select {
|
||||
case data := <-eR.rdrEvents:
|
||||
expEvent.ID = data.cgrEvent.ID
|
||||
expEvent.Time = data.cgrEvent.Time
|
||||
if !reflect.DeepEqual(expEvent, data.cgrEvent) {
|
||||
t.Errorf("\nExpected %v but \nreceived %v", expEvent, data.cgrEvent)
|
||||
}
|
||||
case <-time.After(50 * time.Millisecond):
|
||||
t.Error("Time limit exceeded")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -243,3 +243,54 @@ func TestNewJSONReader(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewAMQPReader(t *testing.T) {
|
||||
cfg := config.NewDefaultCGRConfig()
|
||||
fltr := &engine.FilterS{}
|
||||
cfg.ERsCfg().Readers[0].Type = utils.MetaAMQPjsonMap
|
||||
cfg.ERsCfg().Readers[0].ConcurrentReqs = -1
|
||||
exp := &AMQPER{
|
||||
cgrCfg: cfg,
|
||||
cfgIdx: 0,
|
||||
fltrS: fltr,
|
||||
rdrEvents: nil,
|
||||
rdrExit: nil,
|
||||
rdrErr: nil,
|
||||
}
|
||||
exp.dialURL = exp.Config().SourcePath
|
||||
exp.Config().ProcessedPath = ""
|
||||
exp.setOpts(map[string]interface{}{})
|
||||
exp.createPoster()
|
||||
var expected EventReader = exp
|
||||
rcv, err := NewEventReader(cfg, 0, nil, nil, fltr, nil)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
} else if !reflect.DeepEqual(expected, rcv) {
|
||||
t.Errorf("Expected %v but received %v", expected, rcv)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewAMQPv1Reader(t *testing.T) {
|
||||
cfg := config.NewDefaultCGRConfig()
|
||||
fltr := &engine.FilterS{}
|
||||
cfg.ERsCfg().Readers[0].Type = utils.MetaAMQPV1jsonMap
|
||||
cfg.ERsCfg().Readers[0].ConcurrentReqs = -1
|
||||
exp := &AMQPv1ER{
|
||||
cgrCfg: cfg,
|
||||
cfgIdx: 0,
|
||||
fltrS: fltr,
|
||||
rdrEvents: nil,
|
||||
rdrExit: nil,
|
||||
rdrErr: nil,
|
||||
}
|
||||
exp.Config().ProcessedPath = ""
|
||||
exp.Config().Opts = map[string]interface{}{}
|
||||
exp.createPoster()
|
||||
var expected EventReader = exp
|
||||
rcv, err := NewEventReader(cfg, 0, nil, nil, fltr, nil)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
} else if !reflect.DeepEqual(expected, rcv) {
|
||||
t.Errorf("Expected \n%v but received \n%v", expected, rcv)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user