mirror of https://github.com/ginuerzh/gost
4 changed files with 431 additions and 58 deletions
@ -0,0 +1,221 @@ |
|||||
|
package gost |
||||
|
|
||||
|
import ( |
||||
|
"bytes" |
||||
|
"fmt" |
||||
|
"io" |
||||
|
"testing" |
||||
|
"time" |
||||
|
) |
||||
|
|
||||
|
var dnsTests = []struct { |
||||
|
ns NameServer |
||||
|
host string |
||||
|
pass bool |
||||
|
}{ |
||||
|
{NameServer{Addr: "1.1.1.1"}, "github.com", true}, |
||||
|
{NameServer{Addr: "1.1.1.1:53"}, "github.com", true}, |
||||
|
{NameServer{Addr: "1.1.1.1:53", Protocol: "tcp"}, "github.com", true}, |
||||
|
{NameServer{Addr: "1.1.1.1:853", Protocol: "tls"}, "github.com", true}, |
||||
|
{NameServer{Addr: "1.1.1.1:853", Protocol: "tls", Hostname: "example.com"}, "github.com", false}, |
||||
|
{NameServer{Addr: "1.1.1.1:853", Protocol: "tls", Hostname: "cloudflare-dns.com"}, "github.com", true}, |
||||
|
{NameServer{Addr: "https://cloudflare-dns.com/dns-query", Protocol: "https"}, "github.com", true}, |
||||
|
{NameServer{Addr: "https://1.0.0.1/dns-query", Protocol: "https"}, "github.com", true}, |
||||
|
{NameServer{Addr: "1.1.1.1:12345", Timeout: 1 * time.Second}, "github.com", false}, |
||||
|
{NameServer{Addr: "1.1.1.1:12345", Protocol: "tcp", Timeout: 1 * time.Second}, "github.com", false}, |
||||
|
{NameServer{Addr: "1.1.1.1:12345", Protocol: "tls", Timeout: 1 * time.Second}, "github.com", false}, |
||||
|
{NameServer{Addr: "https://1.0.0.1:12345/dns-query", Protocol: "https", Timeout: 1 * time.Second}, "github.com", false}, |
||||
|
} |
||||
|
|
||||
|
func dnsResolverRoundtrip(t *testing.T, r Resolver, host string) error { |
||||
|
ips, err := r.Resolve(host) |
||||
|
t.Log(host, ips, err) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
func TestDNSResolver(t *testing.T) { |
||||
|
for i, tc := range dnsTests { |
||||
|
tc := tc |
||||
|
t.Run(fmt.Sprintf("#%d", i), func(t *testing.T) { |
||||
|
ns := tc.ns |
||||
|
if err := ns.Init(); err != nil { |
||||
|
t.Error(err) |
||||
|
} |
||||
|
t.Log(ns) |
||||
|
r := NewResolver(0, 0, ns) |
||||
|
err := dnsResolverRoundtrip(t, r, tc.host) |
||||
|
if err != nil { |
||||
|
if tc.pass { |
||||
|
t.Error("got error:", err) |
||||
|
} |
||||
|
} else { |
||||
|
if !tc.pass { |
||||
|
t.Error("should failed") |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
var resolverReloadTests = []struct { |
||||
|
r io.Reader |
||||
|
|
||||
|
timeout time.Duration |
||||
|
ttl time.Duration |
||||
|
domain string |
||||
|
period time.Duration |
||||
|
ns *NameServer |
||||
|
|
||||
|
stopped bool |
||||
|
}{ |
||||
|
{ |
||||
|
r: nil, |
||||
|
}, |
||||
|
{ |
||||
|
r: bytes.NewBufferString(""), |
||||
|
}, |
||||
|
{ |
||||
|
r: bytes.NewBufferString("reload 10s"), |
||||
|
period: 10 * time.Second, |
||||
|
}, |
||||
|
{ |
||||
|
r: bytes.NewBufferString("timeout 10s\nreload 10s\n"), |
||||
|
timeout: 10 * time.Second, |
||||
|
period: 10 * time.Second, |
||||
|
}, |
||||
|
{ |
||||
|
r: bytes.NewBufferString("ttl 10s\ntimeout 10s\nreload 10s\n"), |
||||
|
timeout: 10 * time.Second, |
||||
|
period: 10 * time.Second, |
||||
|
ttl: 10 * time.Second, |
||||
|
}, |
||||
|
{ |
||||
|
r: bytes.NewBufferString("domain example.com\nttl 10s\ntimeout 10s\nreload 10s\n"), |
||||
|
timeout: 10 * time.Second, |
||||
|
period: 10 * time.Second, |
||||
|
ttl: 10 * time.Second, |
||||
|
domain: "example.com", |
||||
|
}, |
||||
|
{ |
||||
|
r: bytes.NewBufferString("1.1.1.1"), |
||||
|
ns: &NameServer{ |
||||
|
Addr: "1.1.1.1", |
||||
|
Timeout: DefaultResolverTimeout, |
||||
|
}, |
||||
|
stopped: true, |
||||
|
}, |
||||
|
{ |
||||
|
r: bytes.NewBufferString("timeout 10s\nsearch\nnameserver \nnameserver 1.1.1.1 udp"), |
||||
|
ns: &NameServer{ |
||||
|
Protocol: "udp", |
||||
|
Addr: "1.1.1.1", |
||||
|
Timeout: 10 * time.Second, |
||||
|
}, |
||||
|
timeout: 10 * time.Second, |
||||
|
stopped: true, |
||||
|
}, |
||||
|
{ |
||||
|
r: bytes.NewBufferString("1.1.1.1 tcp"), |
||||
|
ns: &NameServer{ |
||||
|
Addr: "1.1.1.1", |
||||
|
Protocol: "tcp", |
||||
|
Timeout: DefaultResolverTimeout, |
||||
|
}, |
||||
|
stopped: true, |
||||
|
}, |
||||
|
{ |
||||
|
r: bytes.NewBufferString("1.1.1.1:853 tls cloudflare-dns.com"), |
||||
|
ns: &NameServer{ |
||||
|
Addr: "1.1.1.1:853", |
||||
|
Protocol: "tls", |
||||
|
Hostname: "cloudflare-dns.com", |
||||
|
Timeout: DefaultResolverTimeout, |
||||
|
}, |
||||
|
stopped: true, |
||||
|
}, |
||||
|
{ |
||||
|
r: bytes.NewBufferString("1.1.1.1:853 tls"), |
||||
|
ns: &NameServer{ |
||||
|
Addr: "1.1.1.1:853", |
||||
|
Protocol: "tls", |
||||
|
Timeout: DefaultResolverTimeout, |
||||
|
}, |
||||
|
stopped: true, |
||||
|
}, |
||||
|
{ |
||||
|
r: bytes.NewBufferString("1.0.0.1:53 https"), |
||||
|
stopped: true, |
||||
|
}, |
||||
|
{ |
||||
|
r: bytes.NewBufferString("https://1.0.0.1/dns-query https"), |
||||
|
ns: &NameServer{ |
||||
|
Addr: "https://1.0.0.1/dns-query", |
||||
|
Protocol: "https", |
||||
|
Timeout: DefaultResolverTimeout, |
||||
|
}, |
||||
|
stopped: true, |
||||
|
}, |
||||
|
} |
||||
|
|
||||
|
func TestResolverReload(t *testing.T) { |
||||
|
for i, tc := range resolverReloadTests { |
||||
|
t.Run(fmt.Sprintf("#%d", i), func(t *testing.T) { |
||||
|
r := newResolver(0, 0) |
||||
|
if err := r.Reload(tc.r); err != nil { |
||||
|
t.Error(err) |
||||
|
} |
||||
|
t.Log(r.String()) |
||||
|
if r.Timeout != tc.timeout { |
||||
|
t.Errorf("timeout value should be %v, got %v", |
||||
|
tc.timeout, r.Timeout) |
||||
|
} |
||||
|
if r.TTL != tc.ttl { |
||||
|
t.Errorf("ttl value should be %v, got %v", |
||||
|
tc.ttl, r.TTL) |
||||
|
} |
||||
|
if r.Period() != tc.period { |
||||
|
t.Errorf("period value should be %v, got %v", |
||||
|
tc.period, r.period) |
||||
|
} |
||||
|
if r.domain != tc.domain { |
||||
|
t.Errorf("domain value should be %v, got %v", |
||||
|
tc.domain, r.domain) |
||||
|
} |
||||
|
|
||||
|
var ns *NameServer |
||||
|
if len(r.Servers) > 0 { |
||||
|
ns = &r.Servers[0] |
||||
|
} |
||||
|
|
||||
|
if !compareNameServer(ns, tc.ns) { |
||||
|
t.Errorf("nameserver not equal, should be %v, got %v", |
||||
|
tc.ns, r.Servers) |
||||
|
} |
||||
|
|
||||
|
if tc.stopped { |
||||
|
r.Stop() |
||||
|
} |
||||
|
if r.Stopped() != tc.stopped { |
||||
|
t.Errorf("stopped value should be %v, got %v", |
||||
|
tc.stopped, r.Stopped()) |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func compareNameServer(n1, n2 *NameServer) bool { |
||||
|
if n1 == n2 { |
||||
|
return true |
||||
|
} |
||||
|
if n1 == nil || n2 == nil { |
||||
|
return false |
||||
|
} |
||||
|
return n1.Addr == n2.Addr && |
||||
|
n1.Hostname == n2.Hostname && |
||||
|
n1.Protocol == n2.Protocol && |
||||
|
n1.Timeout == n2.Timeout |
||||
|
} |
||||
Loading…
Reference in new issue