diff --git a/ers/filecsv_it_test.go b/ers/filecsv_it_test.go index 1f18d53aa..7f8d17955 100644 --- a/ers/filecsv_it_test.go +++ b/ers/filecsv_it_test.go @@ -20,9 +20,12 @@ along with this program. If not, see package ers import ( + "fmt" + "io" "net/rpc" "os" "path" + "reflect" "testing" "time" @@ -370,3 +373,143 @@ func testCsvITKillEngine(t *testing.T) { t.Error(err) } } + +func TestFileCSVProcessEvent(t *testing.T) { + cfg := config.NewDefaultCGRConfig() + cfg.ERsCfg().Readers[0].ProcessedPath = "" + fltrs := &engine.FilterS{} + filePath := "/tmp/TestFileCSVProcessEvent/" + 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 := &CSVFileER{ + cgrCfg: cfg, + cfgIdx: 0, + fltrS: fltrs, + rdrDir: "/tmp/ers/out/", + rdrEvents: make(chan *erEvent, 1), + rdrError: make(chan error, 1), + rdrExit: make(chan struct{}), + conReqs: make(chan struct{}, 1), + } + expEvent := &utils.CGREvent{ + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "g", + utils.AnswerTime: "k", + utils.Category: "f", + utils.Destination: "i", + utils.OriginID: "b", + utils.RequestType: "c", + utils.SetupTime: "j", + utils.Subject: "h", + utils.Tenant: "e", + utils.ToR: "ToR", + utils.Usage: "l", + }, + APIOpts: map[string]interface{}{}, + } + 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) + } + select { + case data := <-eR.rdrEvents: + expEvent.ID = data.cgrEvent.ID + expEvent.Time = data.cgrEvent.Time + if !reflect.DeepEqual(data.cgrEvent, expEvent) { + t.Errorf("Expected %v but received %v", utils.ToJSON(expEvent), utils.ToJSON(data.cgrEvent)) + } + case <-time.After(50 * time.Millisecond): + t.Error("Time limit exceeded") + } + if err := os.RemoveAll(filePath); err != nil { + t.Error(err) + } +} + +func TestFileCSVProcessEventError(t *testing.T) { + cfg := config.NewDefaultCGRConfig() + fltrs := &engine.FilterS{} + filePath := "/tmp/TestFileCSVProcessEvent/" + fname := "file1.csv" + eR := &CSVFileER{ + cgrCfg: cfg, + cfgIdx: 0, + fltrS: fltrs, + rdrDir: "/tmp/ers/out/", + rdrEvents: make(chan *erEvent, 1), + rdrError: make(chan error, 1), + rdrExit: make(chan struct{}), + conReqs: make(chan struct{}, 1), + } + eR.conReqs <- struct{}{} + errExpect := "open /tmp/TestFileCSVProcessEvent/file1.csv: no such file or directory" + if err := eR.processFile(filePath, fname); err == nil || err.Error() != errExpect { + t.Errorf("Expected %v but received %v", errExpect, err) + } +} + +func TestFileCSV(t *testing.T) { + cfg := config.NewDefaultCGRConfig() + fltrs := &engine.FilterS{} + eR := &CSVFileER{ + cgrCfg: cfg, + cfgIdx: 0, + fltrS: fltrs, + rdrDir: "/tmp/ers/out/", + rdrEvents: make(chan *erEvent, 1), + rdrError: make(chan error, 1), + rdrExit: make(chan struct{}), + conReqs: make(chan struct{}, 1), + } + eR.conReqs <- struct{}{} + eR.Config().RunDelay = -1 + errExpect := "no such file or directory" + if err := eR.Serve(); err == nil || err.Error() != errExpect { + t.Errorf("Expected %v but received %v", errExpect, err) + } + filePath := "/tmp/ers/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) + } +} + +func TestFileCSVExit(t *testing.T) { + cfg := config.NewDefaultCGRConfig() + fltrs := &engine.FilterS{} + eR := &CSVFileER{ + cgrCfg: cfg, + cfgIdx: 0, + fltrS: fltrs, + rdrDir: "/tmp/ers/out/", + rdrEvents: make(chan *erEvent, 1), + rdrError: make(chan error, 1), + rdrExit: make(chan struct{}), + conReqs: make(chan struct{}, 1), + } + eR.conReqs <- struct{}{} + eR.Config().RunDelay = 1 * time.Millisecond + if err := eR.Serve(); err != nil { + t.Error(err) + } + eR.rdrExit <- struct{}{} +}