aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rescached_test.go49
-rw-r--r--response.go3
-rw-r--r--response_test.go89
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
+}