import (
"flag"
+ "fmt"
"strings"
"testing"
+ "time"
)
var testExternal = flag.Bool("external", true, "allow use of external networks during long test")
}
}
}
+
+var testDNSFlood = flag.Bool("dnsflood", false, "whether to test dns query flooding")
+
+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)
+}
+++ /dev/null
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
- "flag"
- "fmt"
- "testing"
- "time"
-)
-
-var testDNSFlood = flag.Bool("dnsflood", false, "whether to test dns query flooding")
-
-func TestDNSThreadLimit(t *testing.T) {
- if !*testDNSFlood {
- t.Skip("test disabled; use -dnsflood to enable")
- }
-
- const N = 10000
- c := make(chan int, N)
- for i := 0; i < N; i++ {
- go func(i int) {
- LookupIP(fmt.Sprintf("%d.net-test.golang.org", i))
- c <- 1
- }(i)
- }
- // Don't bother waiting for the stragglers; stop at 0.9 N.
- for i := 0; i < N*9/10; i++ {
- if i%100 == 0 {
- //println("TestDNSThreadLimit:", i)
- }
- <-c
- }
-
- // 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)
-}