From 2a1059107a0a9eb7f9ffcaec3b96a60b98bc1591 Mon Sep 17 00:00:00 2001
From: Eugene Bujak <hmage@hmage.net>
Date: Wed, 5 Dec 2018 21:33:07 +0300
Subject: [PATCH] dnsforward -- add upstream tests.

---
 dnsforward/upstream_test.go | 84 +++++++++++++++++++++++++++++++++++++
 1 file changed, 84 insertions(+)
 create mode 100644 dnsforward/upstream_test.go

diff --git a/dnsforward/upstream_test.go b/dnsforward/upstream_test.go
new file mode 100644
index 00000000..975c5035
--- /dev/null
+++ b/dnsforward/upstream_test.go
@@ -0,0 +1,84 @@
+package dnsforward
+
+import (
+	"net"
+	"testing"
+
+	"github.com/miekg/dns"
+)
+
+func TestUpstreamDNS(t *testing.T) {
+	upstreams := []string{
+		"8.8.8.8:53",
+		"1.1.1.1",
+		"tcp://1.1.1.1:53",
+		"176.103.130.130:5353",
+	}
+	for _, input := range upstreams {
+		u, err := GetUpstream(input)
+		if err != nil {
+			t.Fatalf("Failed to choose upstream for %s: %s", input, err)
+		}
+
+		checkUpstream(t, u, input)
+	}
+}
+
+func TestUpstreamTLS(t *testing.T) {
+	upstreams := []string{
+		"tls://1.1.1.1",
+		"tls://9.9.9.9:853",
+		"tls://security-filter-dns.cleanbrowsing.org",
+		"tls://adult-filter-dns.cleanbrowsing.org:853",
+	}
+	for _, input := range upstreams {
+		u, err := GetUpstream(input)
+		if err != nil {
+			t.Fatalf("Failed to choose upstream for %s: %s", input, err)
+		}
+
+		checkUpstream(t, u, input)
+	}
+}
+
+func TestUpstreamHTTPS(t *testing.T) {
+	upstreams := []string{
+		"https://cloudflare-dns.com/dns-query",
+		"https://dns.google.com/experimental",
+		"https://doh.cleanbrowsing.org/doh/security-filter/",
+	}
+	for _, input := range upstreams {
+		u, err := GetUpstream(input)
+		if err != nil {
+			t.Fatalf("Failed to choose upstream for %s: %s", input, err)
+		}
+
+		checkUpstream(t, u, input)
+	}
+}
+
+func checkUpstream(t *testing.T, u Upstream, addr string) {
+	t.Helper()
+
+	req := dns.Msg{}
+	req.Id = dns.Id()
+	req.RecursionDesired = true
+	req.Question = []dns.Question{
+		{Name: "google-public-dns-a.google.com.", Qtype: dns.TypeA, Qclass: dns.ClassINET},
+	}
+
+	reply, err := u.Exchange(&req)
+	if err != nil {
+		t.Fatalf("Couldn't talk to upstream %s: %s", addr, err)
+	}
+	if len(reply.Answer) != 1 {
+		t.Fatalf("DNS upstream %s returned reply with wrong number of answers - %d", addr, len(reply.Answer))
+	}
+	if a, ok := reply.Answer[0].(*dns.A); ok {
+		if !net.IPv4(8, 8, 8, 8).Equal(a.A) {
+			t.Fatalf("DNS upstream %s returned wrong answer instead of 8.8.8.8: %v", addr, a.A)
+		}
+	} else {
+		t.Fatalf("DNS upstream %s returned wrong answer type instead of A: %v", addr, reply.Answer[0])
+	}
+}