25
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]"})