1 // Copyright 2013 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.
5 // +build darwin dragonfly freebsd linux netbsd openbsd solaris
19 func TestTCPLookup(t
*testing
.T
) {
20 if testing
.Short() ||
!*testExternal
{
21 t
.Skip("skipping test to avoid external network")
23 c
, err
:= Dial("tcp", "8.8.8.8:53")
25 t
.Fatalf("Dial failed: %v", err
)
28 cfg
:= &dnsConfig
{timeout
: 10, attempts
: 3}
29 _
, err
= exchange(cfg
, c
, "com.", dnsTypeALL
)
31 t
.Fatalf("exchange failed: %v", err
)
35 type resolvConfTest
struct {
40 quitc
chan chan struct{}
43 func newResolvConfTest(t
*testing
.T
) *resolvConfTest
{
44 dir
, err
:= ioutil
.TempDir("", "resolvConfTest")
46 t
.Fatalf("could not create temp dir: %v", err
)
49 // Disable the default loadConfig
50 onceLoadConfig
.Do(func() {})
55 path
: path
.Join(dir
, "resolv.conf"),
56 quitc
: make(chan chan struct{}),
62 func (r
*resolvConfTest
) Start() {
63 loadConfig(r
.path
, 100*time
.Millisecond
, r
.quitc
)
67 func (r
*resolvConfTest
) SetConf(s
string) {
68 // Make sure the file mtime will be different once we're done here,
69 // even on systems with coarse (1s) mtime resolution.
70 time
.Sleep(time
.Second
)
72 f
, err
:= os
.OpenFile(r
.path
, os
.O_CREATE|os
.O_TRUNC|os
.O_WRONLY
, 0600)
74 r
.Fatalf("failed to create temp file %s: %v", r
.path
, err
)
76 if _
, err
:= io
.WriteString(f
, s
); err
!= nil {
78 r
.Fatalf("failed to write temp file: %v", err
)
83 cfg
.ch
<- struct{}{} // fill buffer
84 cfg
.ch
<- struct{}{} // wait for reload to begin
85 cfg
.ch
<- struct{}{} // wait for reload to complete
89 func (r
*resolvConfTest
) WantServers(want
[]string) {
91 defer cfg
.mu
.RUnlock()
92 if got
:= cfg
.dnsConfig
.servers
; !reflect
.DeepEqual(got
, want
) {
93 r
.Fatalf("Unexpected dns server loaded, got %v want %v", got
, want
)
97 func (r
*resolvConfTest
) Close() {
98 resp
:= make(chan struct{})
101 if err
:= os
.RemoveAll(r
.dir
); err
!= nil {
102 r
.Logf("failed to remove temp dir %s: %v", r
.dir
, err
)
106 func TestReloadResolvConfFail(t
*testing
.T
) {
107 if testing
.Short() ||
!*testExternal
{
108 t
.Skip("skipping test to avoid external network")
111 r
:= newResolvConfTest(t
)
114 // resolv.conf.tmp does not exist yet
116 if _
, err
:= goLookupIP("golang.org"); err
== nil {
117 t
.Fatal("goLookupIP(missing) succeeded")
120 r
.SetConf("nameserver 8.8.8.8")
121 if _
, err
:= goLookupIP("golang.org"); err
!= nil {
122 t
.Fatalf("goLookupIP(missing; good) failed: %v", err
)
125 // Using a bad resolv.conf while we had a good
126 // one before should not update the config
128 if _
, err
:= goLookupIP("golang.org"); err
!= nil {
129 t
.Fatalf("goLookupIP(missing; good; bad) failed: %v", err
)
133 func TestReloadResolvConfChange(t
*testing
.T
) {
134 if testing
.Short() ||
!*testExternal
{
135 t
.Skip("skipping test to avoid external network")
138 r
:= newResolvConfTest(t
)
141 r
.SetConf("nameserver 8.8.8.8")
144 if _
, err
:= goLookupIP("golang.org"); err
!= nil {
145 t
.Fatalf("goLookupIP(good) failed: %v", err
)
147 r
.WantServers([]string{"[8.8.8.8]"})
149 // Using a bad resolv.conf when we had a good one
150 // before should not update the config
152 if _
, err
:= goLookupIP("golang.org"); err
!= nil {
153 t
.Fatalf("goLookupIP(good; bad) failed: %v", err
)
156 // A new good config should get picked up
157 r
.SetConf("nameserver 8.8.4.4")
158 r
.WantServers([]string{"[8.8.4.4]"})