}
}
+func TestLookupWithIP(t *testing.T) {
+ _, err := LookupIP("")
+ if err == nil {
+ t.Errorf(`LookupIP("") succeeded, should fail`)
+ }
+ _, err = LookupHost("")
+ if err == nil {
+ t.Errorf(`LookupIP("") succeeded, should fail`)
+ }
+
+ // Test that LookupHost and LookupIP, which normally
+ // expect host names, work with IP addresses.
+ for _, tt := range parseIPTests {
+ addrs, err := LookupHost(tt.in)
+ if tt.out != nil {
+ if len(addrs) != 1 || addrs[0] != tt.in || err != nil {
+ t.Errorf("LookupHost(%q) = %v, %v, want %v, nil", tt.in, addrs, err, []string{tt.in})
+ }
+ } else {
+ // We can't control what the host resolver does; if it can resolve, say,
+ // 127.0.0.256 or fe80::1%911 or a host named 'abc', who are we to judge?
+ // Warn about these discrepancies but don't fail the test.
+ if err == nil {
+ t.Logf("warning: LookupHost(%q) = %v, want error", tt.in, addrs)
+ }
+ }
+
+ ips, err := LookupIP(tt.in)
+ if tt.out != nil {
+ if len(ips) != 1 || !reflect.DeepEqual(ips[0], tt.out) || err != nil {
+ t.Errorf("LookupIP(%q) = %v, %v, want %v, nil", tt.in, ips, err, []IP{tt.out})
+ }
+ } else {
+ // We can't control what the host resolver does. See above.
+ if err == nil {
+ t.Logf("warning: LookupIP(%q) = %v, want error", tt.in, ips)
+ }
+ }
+ }
+}
+
func BenchmarkParseIP(b *testing.B) {
testHookUninstaller.Do(uninstallTestHooks)
// LookupHost looks up the given host using the local resolver.
// It returns an array of that host's addresses.
func LookupHost(host string) (addrs []string, err error) {
+ // Make sure that no matter what we do later, host=="" is rejected.
+ // ParseIP, for example, does accept empty strings.
+ if host == "" {
+ return nil, &DNSError{Err: errNoSuchHost.Error(), Name: host}
+ }
+ if ip := ParseIP(host); ip != nil {
+ return []string{host}, nil
+ }
return lookupHost(host)
}
// LookupIP looks up host using the local resolver.
// It returns an array of that host's IPv4 and IPv6 addresses.
func LookupIP(host string) (ips []IP, err error) {
+ // Make sure that no matter what we do later, host=="" is rejected.
+ // ParseIP, for example, does accept empty strings.
+ if host == "" {
+ return nil, &DNSError{Err: errNoSuchHost.Error(), Name: host}
+ }
+ if ip := ParseIP(host); ip != nil {
+ return []IP{ip}, nil
+ }
addrs, err := lookupIPMerge(host)
if err != nil {
return