From f80923baa4fa7f850c6e926df2ad30372ea2435b Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 27 Jun 2020 14:50:14 +0200 Subject: [PATCH] Make resolver testing configurable --- resolver/resolver-pooled.go | 4 +- resolver/resolver-tcp_test.go | 72 ------------------------ resolver/resolver_test.go | 101 ++++++++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+), 75 deletions(-) delete mode 100644 resolver/resolver-tcp_test.go create mode 100644 resolver/resolver_test.go diff --git a/resolver/resolver-pooled.go b/resolver/resolver-pooled.go index 6a21e951..aed6c5a9 100644 --- a/resolver/resolver-pooled.go +++ b/resolver/resolver-pooled.go @@ -11,14 +11,12 @@ import ( "github.com/safing/portbase/utils" ) -const ( +var ( defaultClientTTL = 5 * time.Minute defaultRequestTimeout = 3 * time.Second // dns query defaultConnectTimeout = 5 * time.Second // tcp/tls connectionEOLGracePeriod = 7 * time.Second -) -var ( localAddrFactory func(network string) net.Addr ) diff --git a/resolver/resolver-tcp_test.go b/resolver/resolver-tcp_test.go deleted file mode 100644 index 082322ae..00000000 --- a/resolver/resolver-tcp_test.go +++ /dev/null @@ -1,72 +0,0 @@ -package resolver - -import ( - "context" - "fmt" - "io" - "os" - "runtime/pprof" - "sync" - "testing" - "time" - - "github.com/miekg/dns" -) - -func testTCPQuery(t *testing.T, wg *sync.WaitGroup, rc ResolverConn, q *Query) { - start := time.Now() - _, err := rc.Query(context.TODO(), q) - if err != nil { - t.Logf("client failed: %s", err) //nolint:staticcheck - wg.Done() - return - } - t.Logf("resolved %s in %s", q.FQDN, time.Since(start)) - wg.Done() -} - -func TestTCPResolver(t *testing.T) { - // skip if short - this test depends on the Internet and might fail randomly - if testing.Short() { - t.Skip() - } - - go func() { - time.Sleep(15 * time.Second) - fmt.Fprintln(os.Stderr, "===== TAKING TOO LONG FOR SHUTDOWN =====") - printStackTo(os.Stderr) - os.Exit(1) - }() - - // create separate resolver for this test - resolver, _, err := createResolver("dot://9.9.9.9:853?verify=dns.quad9.net&name=Quad9&blockedif=empty", "config") - // resolver, _, err := createResolver("dot://1.1.1.2:853?verify=cloudflare-dns.com&name=Cloudflare&blockedif=zeroip", "config") - if err != nil { - t.Fatal(err) - } - - started := time.Now() - - wg := &sync.WaitGroup{} - wg.Add(100) - for i := 0; i < 100; i++ { - go testTCPQuery(t, wg, resolver.Conn, &Query{ //nolint:staticcheck - FQDN: <-domainFeed, - QType: dns.Type(dns.TypeA), - }) - } - wg.Wait() - - t.Logf("time taken: %s", time.Since(started)) -} - -func printStackTo(writer io.Writer) { - fmt.Fprintln(writer, "=== PRINTING TRACES ===") - fmt.Fprintln(writer, "=== GOROUTINES ===") - _ = pprof.Lookup("goroutine").WriteTo(writer, 1) - fmt.Fprintln(writer, "=== BLOCKING ===") - _ = pprof.Lookup("block").WriteTo(writer, 1) - fmt.Fprintln(writer, "=== MUTEXES ===") - _ = pprof.Lookup("mutex").WriteTo(writer, 1) - fmt.Fprintln(writer, "=== END TRACES ===") -} diff --git a/resolver/resolver_test.go b/resolver/resolver_test.go new file mode 100644 index 00000000..d8d6dcff --- /dev/null +++ b/resolver/resolver_test.go @@ -0,0 +1,101 @@ +package resolver + +import ( + "context" + "flag" + "sync" + "testing" + "time" + + "github.com/safing/portbase/log" + + "github.com/miekg/dns" +) + +var ( + testResolver string + silencingTraceCtx, _ = log.AddTracer(context.Background()) +) + +func init() { + flag.StringVar( + &testResolver, + "resolver", + "dot://9.9.9.9:853?verify=dns.quad9.net&name=Quad9&blockedif=empty", + "set custom resolver for testing", + ) +} + +func startQuery(t *testing.T, wg *sync.WaitGroup, rc ResolverConn, q *Query) { + start := time.Now() + _, err := rc.Query(silencingTraceCtx, q) + if err != nil { + t.Logf("client failed: %s", err) //nolint:staticcheck + wg.Done() + return + } + t.Logf("resolved %s in %s", q.FQDN, time.Since(start)) + wg.Done() +} + +func TestSingleResolving(t *testing.T) { + // skip if short - this test depends on the Internet and might fail randomly + if testing.Short() { + t.Skip() + } + + defaultRequestTimeout = 30 * time.Second + + // create separate resolver for this test + resolver, _, err := createResolver(testResolver, "config") + + if err != nil { + t.Fatal(err) + } + t.Logf("running bulk query test with resolver %s", resolver.Server) + + started := time.Now() + + wg := &sync.WaitGroup{} + wg.Add(100) + for i := 0; i < 100; i++ { + startQuery(t, wg, resolver.Conn, &Query{ //nolint:staticcheck + FQDN: <-domainFeed, + QType: dns.Type(dns.TypeA), + }) + } + wg.Wait() + + t.Logf("total time taken: %s", time.Since(started)) +} + +func TestBulkResolving(t *testing.T) { + // skip if short - this test depends on the Internet and might fail randomly + if testing.Short() { + t.Skip() + } + + defaultRequestTimeout = 30 * time.Second + + // create separate resolver for this test + resolver, _, err := createResolver(testResolver, "config") + + if err != nil { + t.Fatal(err) + } + t.Logf("running bulk query test with resolver %s", resolver.Server) + + started := time.Now() + + wg := &sync.WaitGroup{} + wg.Add(100) + for i := 0; i < 100; i++ { + go startQuery(t, wg, resolver.Conn, &Query{ //nolint:staticcheck + FQDN: <-domainFeed, + QType: dns.Type(dns.TypeA), + }) + } + wg.Wait() + + t.Logf("total time taken: %s", time.Since(started)) +}