github.com/c12o16h1/go/src@v0.0.0-20200114212001-5a151c0f00ed/net/conf_test.go (about) 1 // Copyright 2015 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. 4 5 // +build darwin dragonfly freebsd linux netbsd openbsd solaris 6 7 package net 8 9 import ( 10 "os" 11 "strings" 12 "testing" 13 ) 14 15 type nssHostTest struct { 16 host string 17 localhost string 18 want hostLookupOrder 19 } 20 21 func nssStr(s string) *nssConf { return parseNSSConf(strings.NewReader(s)) } 22 23 // represents a dnsConfig returned by parsing a nonexistent resolv.conf 24 var defaultResolvConf = &dnsConfig{ 25 servers: defaultNS, 26 ndots: 1, 27 timeout: 5, 28 attempts: 2, 29 err: os.ErrNotExist, 30 } 31 32 func TestConfHostLookupOrder(t *testing.T) { 33 tests := []struct { 34 name string 35 c *conf 36 resolver *Resolver 37 hostTests []nssHostTest 38 }{ 39 { 40 name: "force", 41 c: &conf{ 42 forceCgoLookupHost: true, 43 nss: nssStr("foo: bar"), 44 resolv: defaultResolvConf, 45 }, 46 hostTests: []nssHostTest{ 47 {"foo.local", "myhostname", hostLookupCgo}, 48 {"google.com", "myhostname", hostLookupCgo}, 49 }, 50 }, 51 { 52 name: "netgo_dns_before_files", 53 c: &conf{ 54 netGo: true, 55 nss: nssStr("hosts: dns files"), 56 resolv: defaultResolvConf, 57 }, 58 hostTests: []nssHostTest{ 59 {"x.com", "myhostname", hostLookupDNSFiles}, 60 }, 61 }, 62 { 63 name: "netgo_fallback_on_cgo", 64 c: &conf{ 65 netGo: true, 66 nss: nssStr("hosts: dns files something_custom"), 67 resolv: defaultResolvConf, 68 }, 69 hostTests: []nssHostTest{ 70 {"x.com", "myhostname", hostLookupFilesDNS}, 71 }, 72 }, 73 { 74 name: "ubuntu_trusty_avahi", 75 c: &conf{ 76 nss: nssStr("hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4"), 77 resolv: defaultResolvConf, 78 }, 79 hostTests: []nssHostTest{ 80 {"foo.local", "myhostname", hostLookupCgo}, 81 {"foo.local.", "myhostname", hostLookupCgo}, 82 {"foo.LOCAL", "myhostname", hostLookupCgo}, 83 {"foo.LOCAL.", "myhostname", hostLookupCgo}, 84 {"google.com", "myhostname", hostLookupFilesDNS}, 85 }, 86 }, 87 { 88 name: "freebsdlinux_no_resolv_conf", 89 c: &conf{ 90 goos: "freebsd", 91 nss: nssStr("foo: bar"), 92 resolv: defaultResolvConf, 93 }, 94 hostTests: []nssHostTest{{"google.com", "myhostname", hostLookupFilesDNS}}, 95 }, 96 // On OpenBSD, no resolv.conf means no DNS. 97 { 98 name: "openbsd_no_resolv_conf", 99 c: &conf{ 100 goos: "openbsd", 101 resolv: defaultResolvConf, 102 }, 103 hostTests: []nssHostTest{{"google.com", "myhostname", hostLookupFiles}}, 104 }, 105 { 106 name: "solaris_no_nsswitch", 107 c: &conf{ 108 goos: "solaris", 109 nss: &nssConf{err: os.ErrNotExist}, 110 resolv: defaultResolvConf, 111 }, 112 hostTests: []nssHostTest{{"google.com", "myhostname", hostLookupCgo}}, 113 }, 114 { 115 name: "openbsd_lookup_bind_file", 116 c: &conf{ 117 goos: "openbsd", 118 resolv: &dnsConfig{lookup: []string{"bind", "file"}}, 119 }, 120 hostTests: []nssHostTest{ 121 {"google.com", "myhostname", hostLookupDNSFiles}, 122 {"foo.local", "myhostname", hostLookupDNSFiles}, 123 }, 124 }, 125 { 126 name: "openbsd_lookup_file_bind", 127 c: &conf{ 128 goos: "openbsd", 129 resolv: &dnsConfig{lookup: []string{"file", "bind"}}, 130 }, 131 hostTests: []nssHostTest{{"google.com", "myhostname", hostLookupFilesDNS}}, 132 }, 133 { 134 name: "openbsd_lookup_bind", 135 c: &conf{ 136 goos: "openbsd", 137 resolv: &dnsConfig{lookup: []string{"bind"}}, 138 }, 139 hostTests: []nssHostTest{{"google.com", "myhostname", hostLookupDNS}}, 140 }, 141 { 142 name: "openbsd_lookup_file", 143 c: &conf{ 144 goos: "openbsd", 145 resolv: &dnsConfig{lookup: []string{"file"}}, 146 }, 147 hostTests: []nssHostTest{{"google.com", "myhostname", hostLookupFiles}}, 148 }, 149 { 150 name: "openbsd_lookup_yp", 151 c: &conf{ 152 goos: "openbsd", 153 resolv: &dnsConfig{lookup: []string{"file", "bind", "yp"}}, 154 }, 155 hostTests: []nssHostTest{{"google.com", "myhostname", hostLookupCgo}}, 156 }, 157 { 158 name: "openbsd_lookup_two", 159 c: &conf{ 160 goos: "openbsd", 161 resolv: &dnsConfig{lookup: []string{"file", "foo"}}, 162 }, 163 hostTests: []nssHostTest{{"google.com", "myhostname", hostLookupCgo}}, 164 }, 165 { 166 name: "openbsd_lookup_empty", 167 c: &conf{ 168 goos: "openbsd", 169 resolv: &dnsConfig{lookup: nil}, 170 }, 171 hostTests: []nssHostTest{{"google.com", "myhostname", hostLookupDNSFiles}}, 172 }, 173 // glibc lacking an nsswitch.conf, per 174 // https://www.gnu.org/software/libc/manual/html_node/Notes-on-NSS-Configuration-File.html 175 { 176 name: "linux_no_nsswitch.conf", 177 c: &conf{ 178 goos: "linux", 179 nss: &nssConf{err: os.ErrNotExist}, 180 resolv: defaultResolvConf, 181 }, 182 hostTests: []nssHostTest{{"google.com", "myhostname", hostLookupDNSFiles}}, 183 }, 184 { 185 name: "files_mdns_dns", 186 c: &conf{ 187 nss: nssStr("hosts: files mdns dns"), 188 resolv: defaultResolvConf, 189 }, 190 hostTests: []nssHostTest{ 191 {"x.com", "myhostname", hostLookupFilesDNS}, 192 {"x.local", "myhostname", hostLookupCgo}, 193 }, 194 }, 195 { 196 name: "dns_special_hostnames", 197 c: &conf{ 198 nss: nssStr("hosts: dns"), 199 resolv: defaultResolvConf, 200 }, 201 hostTests: []nssHostTest{ 202 {"x.com", "myhostname", hostLookupDNS}, 203 {"x\\.com", "myhostname", hostLookupCgo}, // punt on weird glibc escape 204 {"foo.com%en0", "myhostname", hostLookupCgo}, // and IPv6 zones 205 }, 206 }, 207 { 208 name: "mdns_allow", 209 c: &conf{ 210 nss: nssStr("hosts: files mdns dns"), 211 resolv: defaultResolvConf, 212 hasMDNSAllow: true, 213 }, 214 hostTests: []nssHostTest{ 215 {"x.com", "myhostname", hostLookupCgo}, 216 {"x.local", "myhostname", hostLookupCgo}, 217 }, 218 }, 219 { 220 name: "files_dns", 221 c: &conf{ 222 nss: nssStr("hosts: files dns"), 223 resolv: defaultResolvConf, 224 }, 225 hostTests: []nssHostTest{ 226 {"x.com", "myhostname", hostLookupFilesDNS}, 227 {"x", "myhostname", hostLookupFilesDNS}, 228 {"x.local", "myhostname", hostLookupCgo}, 229 }, 230 }, 231 { 232 name: "dns_files", 233 c: &conf{ 234 nss: nssStr("hosts: dns files"), 235 resolv: defaultResolvConf, 236 }, 237 hostTests: []nssHostTest{ 238 {"x.com", "myhostname", hostLookupDNSFiles}, 239 {"x", "myhostname", hostLookupDNSFiles}, 240 {"x.local", "myhostname", hostLookupCgo}, 241 }, 242 }, 243 { 244 name: "something_custom", 245 c: &conf{ 246 nss: nssStr("hosts: dns files something_custom"), 247 resolv: defaultResolvConf, 248 }, 249 hostTests: []nssHostTest{ 250 {"x.com", "myhostname", hostLookupCgo}, 251 }, 252 }, 253 { 254 name: "myhostname", 255 c: &conf{ 256 nss: nssStr("hosts: files dns myhostname"), 257 resolv: defaultResolvConf, 258 }, 259 hostTests: []nssHostTest{ 260 {"x.com", "myhostname", hostLookupFilesDNS}, 261 {"myhostname", "myhostname", hostLookupCgo}, 262 {"myHostname", "myhostname", hostLookupCgo}, 263 {"myhostname.dot", "myhostname.dot", hostLookupCgo}, 264 {"myHostname.dot", "myhostname.dot", hostLookupCgo}, 265 {"gateway", "myhostname", hostLookupCgo}, 266 {"Gateway", "myhostname", hostLookupCgo}, 267 {"localhost", "myhostname", hostLookupCgo}, 268 {"Localhost", "myhostname", hostLookupCgo}, 269 {"anything.localhost", "myhostname", hostLookupCgo}, 270 {"Anything.localhost", "myhostname", hostLookupCgo}, 271 {"localhost.localdomain", "myhostname", hostLookupCgo}, 272 {"Localhost.Localdomain", "myhostname", hostLookupCgo}, 273 {"anything.localhost.localdomain", "myhostname", hostLookupCgo}, 274 {"Anything.Localhost.Localdomain", "myhostname", hostLookupCgo}, 275 {"somehostname", "myhostname", hostLookupFilesDNS}, 276 {"", "myhostname", hostLookupFilesDNS}, // Issue 13623 277 }, 278 }, 279 { 280 name: "ubuntu14.04.02", 281 c: &conf{ 282 nss: nssStr("hosts: files myhostname mdns4_minimal [NOTFOUND=return] dns mdns4"), 283 resolv: defaultResolvConf, 284 }, 285 hostTests: []nssHostTest{ 286 {"x.com", "myhostname", hostLookupFilesDNS}, 287 {"somehostname", "myhostname", hostLookupFilesDNS}, 288 {"myhostname", "myhostname", hostLookupCgo}, 289 }, 290 }, 291 // Debian Squeeze is just "dns,files", but lists all 292 // the default criteria for dns, but then has a 293 // non-standard but redundant notfound=return for the 294 // files. 295 { 296 name: "debian_squeeze", 297 c: &conf{ 298 nss: nssStr("hosts: dns [success=return notfound=continue unavail=continue tryagain=continue] files [notfound=return]"), 299 resolv: defaultResolvConf, 300 }, 301 hostTests: []nssHostTest{ 302 {"x.com", "myhostname", hostLookupDNSFiles}, 303 {"somehostname", "myhostname", hostLookupDNSFiles}, 304 }, 305 }, 306 { 307 name: "resolv.conf-unknown", 308 c: &conf{ 309 nss: nssStr("foo: bar"), 310 resolv: &dnsConfig{servers: defaultNS, ndots: 1, timeout: 5, attempts: 2, unknownOpt: true}, 311 }, 312 hostTests: []nssHostTest{{"google.com", "myhostname", hostLookupCgo}}, 313 }, 314 // Android should always use cgo. 315 { 316 name: "android", 317 c: &conf{ 318 goos: "android", 319 nss: nssStr(""), 320 resolv: defaultResolvConf, 321 }, 322 hostTests: []nssHostTest{ 323 {"x.com", "myhostname", hostLookupCgo}, 324 }, 325 }, 326 // Issue 24393: make sure "Resolver.PreferGo = true" acts like netgo. 327 { 328 name: "resolver-prefergo", 329 resolver: &Resolver{PreferGo: true}, 330 c: &conf{ 331 goos: "darwin", 332 forceCgoLookupHost: true, // always true for darwin 333 resolv: defaultResolvConf, 334 nss: nssStr(""), 335 netCgo: true, 336 }, 337 hostTests: []nssHostTest{ 338 {"localhost", "myhostname", hostLookupFilesDNS}, 339 }, 340 }, 341 } 342 343 origGetHostname := getHostname 344 defer func() { getHostname = origGetHostname }() 345 346 for _, tt := range tests { 347 for _, ht := range tt.hostTests { 348 getHostname = func() (string, error) { return ht.localhost, nil } 349 350 gotOrder := tt.c.hostLookupOrder(tt.resolver, ht.host) 351 if gotOrder != ht.want { 352 t.Errorf("%s: hostLookupOrder(%q) = %v; want %v", tt.name, ht.host, gotOrder, ht.want) 353 } 354 } 355 } 356 357 } 358 359 func TestSystemConf(t *testing.T) { 360 systemConf() 361 }