blocky/querylog/file_writer_test.go

155 lines
3.4 KiB
Go

package querylog
import (
"bufio"
"encoding/csv"
"errors"
"fmt"
"io"
"io/fs"
"os"
"time"
"github.com/0xERR0R/blocky/helpertest"
"github.com/0xERR0R/blocky/log"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)
var _ = Describe("FileWriter", func() {
var (
tmpDir *helpertest.TmpFolder
err error
writer *FileWriter
)
JustBeforeEach(func() {
tmpDir = helpertest.NewTmpFolder("fileWriter")
})
Describe("CSV writer", func() {
When("target dir does not exist", func() {
It("should return error", func() {
_, err = NewCSVWriter("wrongdir", false, 0)
Expect(err).Should(HaveOccurred())
})
})
When("New log entry was created", func() {
It("should be logged in one file", func() {
writer, err = NewCSVWriter(tmpDir.Path, false, 0)
Expect(err).Should(Succeed())
By("entry for client 1", func() {
writer.Write(&LogEntry{
ClientNames: []string{"client1"},
Start: time.Now(),
DurationMs: 20,
})
})
By("entry for client 2", func() {
writer.Write(&LogEntry{
ClientNames: []string{"client2"},
Start: time.Now(),
DurationMs: 20,
})
})
Eventually(func(g Gomega) int {
return len(readCsv(tmpDir.JoinPath(
fmt.Sprintf("%s_ALL.log", time.Now().Format("2006-01-02")))))
}).Should(Equal(2))
})
It("should be logged in separate files per client", func() {
writer, err = NewCSVWriter(tmpDir.Path, true, 0)
Expect(err).Should(Succeed())
By("entry for client 1", func() {
writer.Write(&LogEntry{
ClientNames: []string{"client1"},
Start: time.Now(),
DurationMs: 20,
})
})
By("entry for client 2", func() {
writer.Write(&LogEntry{
ClientNames: []string{"client2"},
Start: time.Now(),
DurationMs: 20,
})
})
Eventually(func(g Gomega) int {
return len(readCsv(tmpDir.JoinPath(
fmt.Sprintf("%s_client1.log", time.Now().Format("2006-01-02")))))
}).Should(Equal(1))
Eventually(func(g Gomega) int {
return len(readCsv(tmpDir.JoinPath(
fmt.Sprintf("%s_client2.log", time.Now().Format("2006-01-02")))))
}).Should(Equal(1))
})
})
When("Cleanup is called", func() {
It("should delete old files", func() {
writer, err = NewCSVWriter(tmpDir.Path, false, 1)
Expect(err).Should(Succeed())
By("entry today", func() {
writer.Write(&LogEntry{
ClientNames: []string{"client1"},
Start: time.Now(),
DurationMs: 20,
})
})
By("entry 2 days ago", func() {
writer.Write(&LogEntry{
ClientNames: []string{"client1"},
Start: time.Now().AddDate(0, 0, -3),
DurationMs: 20,
})
})
Eventually(func(g Gomega) ([]fs.DirEntry, error) {
return os.ReadDir(tmpDir.Path)
}, "20s", "1s").Should(HaveLen(2))
writer.CleanUp()
Eventually(func(g Gomega) ([]fs.DirEntry, error) {
return os.ReadDir(tmpDir.Path)
}, "20s", "1s").Should(HaveLen(1))
})
})
})
})
func readCsv(file string) [][]string {
var result [][]string
csvFile, err := os.Open(file)
Expect(err).Should(Succeed())
reader := csv.NewReader(bufio.NewReader(csvFile))
reader.Comma = '\t'
for {
line, err := reader.Read()
if errors.Is(err, io.EOF) {
break
} else if err != nil {
log.Log().Fatal("can't read line", err)
}
result = append(result, line)
}
return result
}