]> Cypherpunks repositories - gostls13.git/commitdiff
net: add test for lookupIPDeadline
authorMikio Hara <mikioh.mikioh@gmail.com>
Tue, 28 Oct 2014 07:20:49 +0000 (16:20 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Tue, 28 Oct 2014 07:20:49 +0000 (16:20 +0900)
Just to confirm the fix, by typing the follwing:
go test -run=TestLookupIPDeadline -dnsflood or
go test -run=TestLookupIPDeadline -dnsflood -tags netgo

Update #8602

LGTM=iant
R=iant
CC=golang-codereviews
https://golang.org/cl/166740043

src/net/z_last_test.go

index 4f6a54a560acab2f44c446983fbbe0702029b7cd..716c103db26bf78344e624cdf570a3b0ec37bd7d 100644 (file)
@@ -8,6 +8,7 @@ import (
        "flag"
        "fmt"
        "testing"
+       "time"
 )
 
 var testDNSFlood = flag.Bool("dnsflood", false, "whether to test dns query flooding")
@@ -35,3 +36,64 @@ func TestDNSThreadLimit(t *testing.T) {
 
        // If we're still here, it worked.
 }
+
+func TestLookupIPDeadline(t *testing.T) {
+       if !*testDNSFlood {
+               t.Skip("test disabled; use -dnsflood to enable")
+       }
+
+       const N = 5000
+       const timeout = 3 * time.Second
+       c := make(chan error, 2*N)
+       for i := 0; i < N; i++ {
+               name := fmt.Sprintf("%d.net-test.golang.org", i)
+               go func() {
+                       _, err := lookupIPDeadline(name, time.Now().Add(timeout/2))
+                       c <- err
+               }()
+               go func() {
+                       _, err := lookupIPDeadline(name, time.Now().Add(timeout))
+                       c <- err
+               }()
+       }
+       qstats := struct {
+               succeeded, failed         int
+               timeout, temporary, other int
+               unknown                   int
+       }{}
+       deadline := time.After(timeout + time.Second)
+       for i := 0; i < 2*N; i++ {
+               select {
+               case <-deadline:
+                       t.Fatal("deadline exceeded")
+               case err := <-c:
+                       switch err := err.(type) {
+                       case nil:
+                               qstats.succeeded++
+                       case Error:
+                               qstats.failed++
+                               if err.Timeout() {
+                                       qstats.timeout++
+                               }
+                               if err.Temporary() {
+                                       qstats.temporary++
+                               }
+                               if !err.Timeout() && !err.Temporary() {
+                                       qstats.other++
+                               }
+                       default:
+                               qstats.failed++
+                               qstats.unknown++
+                       }
+               }
+       }
+
+       // A high volume of DNS queries for sub-domain of golang.org
+       // would be coordinated by authoritative or recursive server,
+       // or stub resolver which implements query-response rate
+       // limitation, so we can expect some query successes and more
+       // failures including timeout, temporary and other here.
+       // As a rule, unknown must not be shown but it might possibly
+       // happen due to issue 4856 for now.
+       t.Logf("%v succeeded, %v failed (%v timeout, %v temporary, %v other, %v unknown)", qstats.succeeded, qstats.failed, qstats.timeout, qstats.temporary, qstats.other, qstats.unknown)
+}