1 // Copyright 2014 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
12 func checkDistribution(t
*testing
.T
, data
[]*SRV
, margin
float64) {
14 for _
, srv
:= range data
{
15 sum
+= int(srv
.Weight
)
18 results
:= make(map[string]int)
21 for j
:= 0; j
< count
; j
++ {
22 d
:= make([]*SRV
, len(data
))
24 byPriorityWeight(d
).shuffleByWeight()
26 results
[key
] = results
[key
] + 1
29 actual
:= results
[data
[0].Target
]
30 expected
:= float64(count
) * float64(data
[0].Weight
) / float64(sum
)
31 diff
:= float64(actual
) - expected
32 t
.Logf("actual: %v diff: %v e: %v m: %v", actual
, diff
, expected
, margin
)
36 if diff
> (expected
* margin
) {
37 t
.Errorf("missed target weight: expected %v, %v", expected
, actual
)
41 func testUniformity(t
*testing
.T
, size
int, margin
float64) {
43 data
:= make([]*SRV
, size
)
44 for i
:= 0; i
< size
; i
++ {
45 data
[i
] = &SRV
{Target
: string('a' + i
), Weight
: 1}
47 checkDistribution(t
, data
, margin
)
50 func TestDNSSRVUniformity(t
*testing
.T
) {
51 testUniformity(t
, 2, 0.05)
52 testUniformity(t
, 3, 0.10)
53 testUniformity(t
, 10, 0.20)
54 testWeighting(t
, 0.05)
57 func testWeighting(t
*testing
.T
, margin
float64) {
60 {Target
: "a", Weight
: 60},
61 {Target
: "b", Weight
: 30},
62 {Target
: "c", Weight
: 10},
64 checkDistribution(t
, data
, margin
)
67 func TestWeighting(t
*testing
.T
) {
68 testWeighting(t
, 0.05)
71 // Issue 8434: verify that Temporary returns true on an error when rcode
73 func TestIssue8434(t
*testing
.T
) {
76 rcode
: dnsRcodeServerFailure
,
80 _
, _
, err
:= answer("golang.org", "foo:53", msg
, uint16(dnsTypeSRV
))
82 t
.Fatal("expected an error")
84 if ne
, ok
:= err
.(Error
); !ok
{
85 t
.Fatalf("err = %#v; wanted something supporting net.Error", err
)
86 } else if !ne
.Temporary() {
87 t
.Fatalf("Temporary = false for err = %#v; want Temporary == true", err
)
89 if de
, ok
:= err
.(*DNSError
); !ok
{
90 t
.Fatalf("err = %#v; wanted a *net.DNSError", err
)
91 } else if !de
.IsTemporary
{
92 t
.Fatalf("IsTemporary = false for err = %#v; want IsTemporary == true", err
)
96 // Issue 12778: verify that NXDOMAIN without RA bit errors as
97 // "no such host" and not "server misbehaving"
98 func TestIssue12778(t
*testing
.T
) {
100 dnsMsgHdr
: dnsMsgHdr
{
101 rcode
: dnsRcodeNameError
,
102 recursion_available
: false,
106 _
, _
, err
:= answer("golang.org", "foo:53", msg
, uint16(dnsTypeSRV
))
108 t
.Fatal("expected an error")
110 de
, ok
:= err
.(*DNSError
)
112 t
.Fatalf("err = %#v; wanted a *net.DNSError", err
)
114 if de
.Err
!= errNoSuchHost
.Error() {
115 t
.Fatalf("Err = %#v; wanted %q", de
.Err
, errNoSuchHost
.Error())