diff options
| -rw-r--r-- | rescached_test.go | 49 | ||||
| -rw-r--r-- | response.go | 3 | ||||
| -rw-r--r-- | response_test.go | 89 |
3 files changed, 141 insertions, 0 deletions
diff --git a/rescached_test.go b/rescached_test.go new file mode 100644 index 0000000..581592d --- /dev/null +++ b/rescached_test.go @@ -0,0 +1,49 @@ +// Copyright 2019, Shulhan <ms@kilabit.info>. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package rescached + +import ( + "log" + "os" + "testing" + + "github.com/shuLhan/share/lib/debug" + "github.com/shuLhan/share/lib/dns" +) + +func TestMain(m *testing.M) { + // Make debug counted on coverage + debug.Value = 2 + + // Add response for testing non-expired message, so we can check if + // response.message.SubTTL work as expected. + msg := dns.NewMessage() + msg.Packet = []byte{ + // Header + 0x8c, 0xdb, 0x81, 0x80, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + // Question + 0x07, 0x6b, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x74, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x00, + 0x00, 0x01, 0x00, 0x01, + // Answer + 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x00, 0x01, 0x68, + 0x00, 0x04, + 0x67, 0xc8, 0x04, 0xa2, + // OPT + 0x00, 0x00, 0x29, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + err := msg.Unpack() + if err != nil { + log.Fatal(err) + } + + res := newResponse(msg) + _testResponses = append(_testResponses, res) + + os.Exit(m.Run()) +} diff --git a/response.go b/response.go index 8d149df..e4c384c 100644 --- a/response.go +++ b/response.go @@ -36,6 +36,9 @@ func newResponse(msg *dns.Message) *response { } } +// +// AccessedAt return the timestamp when response last accessed in cache. +// func (res *response) AccessedAt() int64 { return atomic.LoadInt64(&res.accessedAt) } diff --git a/response_test.go b/response_test.go index 4c15c86..2edeca5 100644 --- a/response_test.go +++ b/response_test.go @@ -5,10 +5,16 @@ package rescached import ( + "testing" + "time" + "github.com/shuLhan/share/lib/dns" + "github.com/shuLhan/share/lib/test" ) var _testResponses = []*response{{ // nolint + accessedAt: 0, + receivedAt: 0, message: &dns.Message{ Packet: []byte{1}, Header: &dns.SectionHeader{ @@ -24,6 +30,8 @@ var _testResponses = []*response{{ // nolint }}, }, }, { + accessedAt: 1, + receivedAt: time.Now().Unix() - 1, message: &dns.Message{ Packet: []byte{2}, Header: &dns.SectionHeader{ @@ -39,6 +47,7 @@ var _testResponses = []*response{{ // nolint }}, }, }, { + accessedAt: 2, message: &dns.Message{ Packet: []byte{1, 1}, Header: &dns.SectionHeader{ @@ -54,3 +63,83 @@ var _testResponses = []*response{{ // nolint }}, }, }} + +func TestResponseAccessedAt(t *testing.T) { + cases := []struct { + desc string + res *response + exp int64 + }{{ + desc: "With accessedAt is 0", + res: _testResponses[0], + }, { + desc: "With accessedAt is 1", + res: _testResponses[1], + exp: 1, + }, { + desc: "With accessedAt is 2", + res: _testResponses[2], + exp: 2, + }} + + for _, c := range cases { + t.Log(c.desc) + + test.Assert(t, "AccessedAt", c.exp, c.res.AccessedAt(), true) + } +} + +func TestResponseCheckExpiration(t *testing.T) { + cases := []struct { + desc string + res *response + exp bool + }{{ + desc: "With local response", + res: _testResponses[0], + exp: false, + }, { + desc: "With one answer expired", + res: _testResponses[1], + exp: true, + }, { + desc: "With no expiration", + res: _testResponses[3], + exp: false, + }} + + for _, c := range cases { + t.Log(c.desc) + + test.Assert(t, "checkExpiration", c.exp, + c.res.checkExpiration(), true) + } +} + +func TestResponseUpdate(t *testing.T) { + res := _testResponses[0] + orgMsg := res.message + + cases := []struct { + desc string + msg *dns.Message + exp *dns.Message + }{{ + desc: "With empty message", + exp: _testResponses[0].message, + }, { + desc: "With non empty message", + msg: _testResponses[2].message, + exp: nil, + }} + + for _, c := range cases { + t.Log(c.desc) + + got := res.update(c.msg) + + test.Assert(t, "update", c.exp, got, true) + } + + res.message = orgMsg +} |
