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