AdGuardHome/querylog/qlog_file_test.go

91 lines
2.3 KiB
Go
Raw Normal View History

package querylog
import (
2020-02-20 11:11:33 +00:00
"encoding/binary"
"io"
2020-02-20 11:11:33 +00:00
"io/ioutil"
"net"
"os"
"strings"
"testing"
2020-02-20 11:11:33 +00:00
"time"
"github.com/stretchr/testify/assert"
)
2020-02-20 11:11:33 +00:00
func TestQLogFileEmpty(t *testing.T) {
// TODO: test empty file
}
func TestQLogFileLarge(t *testing.T) {
// TODO: test reading large file
}
2020-02-20 11:11:33 +00:00
func TestQLogFileSeek(t *testing.T) {
// TODO: test seek method on a small file
}
2020-02-20 11:11:33 +00:00
// Check adding and loading (with filtering) entries from disk and memory
func TestQLogFile(t *testing.T) {
testDir := prepareTestDir()
defer func() { _ = os.RemoveAll(testDir) }()
testFile := prepareTestFile(testDir, 2)
// create the new QLogFile instance
2020-02-20 11:11:33 +00:00
q, err := NewQLogFile(testFile)
assert.Nil(t, err)
assert.NotNil(t, q)
// seek to the start
pos, err := q.SeekStart()
assert.Nil(t, err)
assert.True(t, pos > 0)
// read first line
line, err := q.ReadNext()
assert.Nil(t, err)
2020-02-20 11:11:33 +00:00
assert.True(t, strings.Contains(line, "0.0.0.2"), line)
assert.True(t, strings.HasPrefix(line, "{"), line)
assert.True(t, strings.HasSuffix(line, "}"), line)
// read second line
line, err = q.ReadNext()
assert.Nil(t, err)
assert.Equal(t, int64(0), q.position)
2020-02-20 11:11:33 +00:00
assert.True(t, strings.Contains(line, "0.0.0.1"), line)
assert.True(t, strings.HasPrefix(line, "{"), line)
assert.True(t, strings.HasSuffix(line, "}"), line)
// try reading again (there's nothing to read anymore)
line, err = q.ReadNext()
assert.Equal(t, io.EOF, err)
assert.Equal(t, "", line)
}
2020-02-20 11:11:33 +00:00
// prepareTestFile - prepares a test query log file with the specified number of lines
func prepareTestFile(dir string, linesCount int) string {
format := `{"IP":"${IP}","T":"${TIMESTAMP}","QH":"example.org","QT":"A","QC":"IN","Answer":"AAAAAAABAAEAAAAAB2V4YW1wbGUDb3JnAAABAAEHZXhhbXBsZQNvcmcAAAEAAQAAAAAABAECAwQ=","Result":{},"Elapsed":0,"Upstream":"upstream"}`
lineTime, _ := time.Parse(time.RFC3339Nano, "2020-02-18T22:36:35.920973+03:00")
lineIP := uint32(0)
f, _ := ioutil.TempFile(dir, "*.txt")
for i := 0; i < linesCount; i++ {
lineIP += 1
lineTime = lineTime.Add(time.Second)
ip := make(net.IP, 4)
binary.BigEndian.PutUint32(ip, lineIP)
line := format
line = strings.ReplaceAll(line, "${IP}", ip.String())
line = strings.ReplaceAll(line, "${TIMESTAMP}", lineTime.Format(time.RFC3339Nano))
_, _ = f.WriteString(line)
_, _ = f.WriteString("\n")
}
return f.Name()
}