diff --git a/querylog/qlog_file_test.go b/querylog/qlog_file_test.go index 3d6d2600..6ba5780f 100644 --- a/querylog/qlog_file_test.go +++ b/querylog/qlog_file_test.go @@ -1,34 +1,38 @@ package querylog import ( + "encoding/binary" "io" + "io/ioutil" + "net" "os" "strings" "testing" + "time" "github.com/stretchr/testify/assert" ) +func TestQLogFileEmpty(t *testing.T) { + // TODO: test empty file +} + +func TestQLogFileLarge(t *testing.T) { + // TODO: test reading large file +} + +func TestQLogFileSeek(t *testing.T) { + // TODO: test seek method on a small file +} + // Check adding and loading (with filtering) entries from disk and memory func TestQLogFile(t *testing.T) { - conf := Config{ - Enabled: true, - Interval: 1, - MemSize: 100, - } - conf.BaseDir = prepareTestDir() - defer func() { _ = os.RemoveAll(conf.BaseDir) }() - l := newQueryLog(conf) - - // add disk entries - addEntry(l, "example.org", "1.2.3.4", "0.1.2.4") - addEntry(l, "example.org", "1.2.3.4", "0.1.2.5") - - // write to disk - _ = l.flushLogBuffer(true) + testDir := prepareTestDir() + defer func() { _ = os.RemoveAll(testDir) }() + testFile := prepareTestFile(testDir, 2) // create the new QLogFile instance - q, err := NewQLogFile(l.logFile) + q, err := NewQLogFile(testFile) assert.Nil(t, err) assert.NotNil(t, q) @@ -40,7 +44,7 @@ func TestQLogFile(t *testing.T) { // read first line line, err := q.ReadNext() assert.Nil(t, err) - assert.True(t, strings.Contains(line, "0.1.2.5"), line) + 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) @@ -48,7 +52,7 @@ func TestQLogFile(t *testing.T) { line, err = q.ReadNext() assert.Nil(t, err) assert.Equal(t, int64(0), q.position) - assert.True(t, strings.Contains(line, "0.1.2.4"), line) + 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) @@ -57,3 +61,30 @@ func TestQLogFile(t *testing.T) { assert.Equal(t, io.EOF, err) assert.Equal(t, "", line) } + +// 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() +}