aboutsummaryrefslogtreecommitdiff
path: root/test/compression_scrub_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'test/compression_scrub_test.go')
-rw-r--r--test/compression_scrub_test.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/test/compression_scrub_test.go b/test/compression_scrub_test.go
new file mode 100644
index 000000000..b18f1fe0a
--- /dev/null
+++ b/test/compression_scrub_test.go
@@ -0,0 +1,60 @@
+package test
+
+import (
+ "net"
+ "testing"
+
+ "github.com/miekg/dns"
+)
+
+func TestCompressScrub(t *testing.T) {
+ corefile := `example.org:0 {
+ erratic {
+ drop 0
+ delay 0
+ large
+ }
+ }`
+
+ i, udp, _, err := CoreDNSServerAndPorts(corefile)
+ if err != nil {
+ t.Fatalf("Could not get CoreDNS serving instance: %s", err)
+ }
+ defer i.Stop()
+
+ c, err := net.Dial("udp", udp)
+ if err != nil {
+ t.Fatalf("Could not dial %s", err)
+ }
+ m := new(dns.Msg)
+ m.SetQuestion("example.org.", dns.TypeA)
+ q, _ := m.Pack()
+
+ c.Write(q)
+ buf := make([]byte, 1024)
+ n, err := c.Read(buf)
+ if err != nil || n == 0 {
+ t.Errorf("Expected reply, got: %s", err)
+ return
+ }
+ if n >= 512 {
+ t.Fatalf("Expected returned packet to be < 512, got %d", n)
+ }
+ buf = buf[:n]
+ // If there is compression in the returned packet we should look for compression pointers, if found
+ // the pointers should return to the domain name in the query (the first domain name that's avaiable for
+ // compression. This means we're looking for a combo where the pointers is detected and the offset is 12
+ // the position of the first name after the header. The erratic plugin adds 30 RRs that should all be compressed.
+ found := 0
+ for i := 0; i < len(buf)-1; i++ {
+ if buf[i]&0xC0 == 0xC0 {
+ off := (int(buf[i])^0xC0)<<8 | int(buf[i+1])
+ if off == 12 {
+ found++
+ }
+ }
+ }
+ if found != 30 {
+ t.Errorf("Failed to find all compression pointers in the packet, wanted 30, got %d", found)
+ }
+}