aboutsummaryrefslogtreecommitdiffstats
path: root/log/logger_test.go
blob: 1da1eadfc483f5ed38da28d911be77b71059950e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package log

import (
	"net"
	"os"
	"reflect"
	"testing"
	"time"
)

func TestRecord(t *testing.T) {
	logger, err := New(os.Stderr, "test: ", RecordOptions{Database: ":memory:"})
	if err != nil {
		t.Fatal(err)
	}
	logger.Record(net.IPv4(192, 0, 2, 100), 1, "example.com.", "192.0.2.1", "192.0.2.2")
	// Flush queue
	if err := logger.Close(); err != nil {
		t.Fatal(err)
	}
	logEntries, err := logger.db.ReadLog(1)
	if err != nil {
		t.Fatal(err)
	}
	if want, got := 2, len(logEntries); want != got {
		t.Errorf("len(entries) = %d, want %d", got, want)
	}
}

func TestAnswerMerging(t *testing.T) {
	logger, err := New(os.Stderr, "test: ", RecordOptions{Database: ":memory:"})
	if err != nil {
		t.Fatal(err)
	}
	now := time.Date(2006, 1, 2, 15, 4, 5, 0, time.UTC)
	logger.Now = func() time.Time { return now }
	logger.Record(net.IPv4(192, 0, 2, 100), 1, "example.com.", "192.0.2.1", "192.0.2.2")
	// Flush queue
	if err := logger.Close(); err != nil {
		t.Fatal(err)
	}
	// Multi-answer log entry is merged
	got, err := logger.Get(1)
	if err != nil {
		t.Fatal(err)
	}
	want := []Entry{{
		Time:       now,
		RemoteAddr: net.IPv4(192, 0, 2, 100),
		Qtype:      1,
		Question:   "example.com.",
		Answers:    []string{"192.0.2.2", "192.0.2.1"},
	}}
	if !reflect.DeepEqual(want, got) {
		t.Errorf("Get(1) = %+v, want %+v", got, want)
	}
}

func TestLogPruning(t *testing.T) {
	logger, err := New(os.Stderr, "test: ", RecordOptions{
		Database:       ":memory:",
		ExpiryInterval: 10 * time.Millisecond,
		TTL:            time.Hour,
	})
	if err != nil {
		t.Fatal(err)
	}
	tt := time.Now()
	logger.Now = func() time.Time { return tt }
	logger.Record(net.IPv4(192, 0, 2, 100), 1, "example.com.", "192.0.2.1")

	// Wait until queue is flushed
	ts := time.Now()
	var entries []Entry
	for len(entries) == 0 {
		entries, err = logger.Get(1)
		if err != nil {
			t.Fatal(err)
		}
		time.Sleep(10 * time.Millisecond)
		if time.Since(ts) > 2*time.Second {
			t.Fatal("timed out waiting for log entry to be written")
		}
	}

	// Advance time beyond log TTL
	tt = tt.Add(time.Hour).Add(time.Second)
	for len(entries) > 0 {
		entries, err = logger.Get(1)
		if err != nil {
			t.Fatal(err)
		}
		time.Sleep(10 * time.Millisecond)
		if time.Since(ts) > 2*time.Second {
			t.Fatal("timed out waiting for log entry to be removed")
		}
	}
}