1package dns
2
3import (
4	"io/ioutil"
5	"os"
6	"path/filepath"
7	"testing"
8)
9
10const normal string = `
11# Comment
12domain somedomain.com
13nameserver 10.28.10.2
14nameserver 11.28.10.1
15`
16
17const missingNewline string = `
18domain somedomain.com
19nameserver 10.28.10.2
20nameserver 11.28.10.1` // <- NOTE: NO newline.
21
22func testConfig(t *testing.T, data string) {
23	tempDir, err := ioutil.TempDir("", "")
24	if err != nil {
25		t.Fatalf("tempDir: %v", err)
26	}
27	defer os.RemoveAll(tempDir)
28
29	path := filepath.Join(tempDir, "resolv.conf")
30	if err := ioutil.WriteFile(path, []byte(data), 0644); err != nil {
31		t.Fatalf("writeFile: %v", err)
32	}
33	cc, err := ClientConfigFromFile(path)
34	if err != nil {
35		t.Errorf("error parsing resolv.conf: %v", err)
36	}
37	if l := len(cc.Servers); l != 2 {
38		t.Errorf("incorrect number of nameservers detected: %d", l)
39	}
40	if l := len(cc.Search); l != 1 {
41		t.Errorf("domain directive not parsed correctly: %v", cc.Search)
42	} else {
43		if cc.Search[0] != "somedomain.com" {
44			t.Errorf("domain is unexpected: %v", cc.Search[0])
45		}
46	}
47}
48
49func TestNameserver(t *testing.T)          { testConfig(t, normal) }
50func TestMissingFinalNewLine(t *testing.T) { testConfig(t, missingNewline) }
51
52func TestNameList(t *testing.T) {
53	cfg := ClientConfig{
54		Ndots: 1,
55	}
56	// fqdn should be only result returned
57	names := cfg.NameList("miek.nl.")
58	if len(names) != 1 {
59		t.Errorf("NameList returned != 1 names: %v", names)
60	} else if names[0] != "miek.nl." {
61		t.Errorf("NameList didn't return sent fqdn domain: %v", names[0])
62	}
63
64	cfg.Search = []string{
65		"test",
66	}
67	// Sent domain has NDots and search
68	names = cfg.NameList("miek.nl")
69	if len(names) != 2 {
70		t.Errorf("NameList returned != 2 names: %v", names)
71	} else if names[0] != "miek.nl." {
72		t.Errorf("NameList didn't return sent domain first: %v", names[0])
73	} else if names[1] != "miek.nl.test." {
74		t.Errorf("NameList didn't return search last: %v", names[1])
75	}
76
77	cfg.Ndots = 2
78	// Sent domain has less than NDots and search
79	names = cfg.NameList("miek.nl")
80	if len(names) != 2 {
81		t.Errorf("NameList returned != 2 names: %v", names)
82	} else if names[0] != "miek.nl.test." {
83		t.Errorf("NameList didn't return search first: %v", names[0])
84	} else if names[1] != "miek.nl." {
85		t.Errorf("NameList didn't return sent domain last: %v", names[1])
86	}
87}
88