|  | // Copyright 2009 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package net | 
|  |  | 
|  | import ( | 
|  | "reflect" | 
|  | "strings" | 
|  | "testing" | 
|  | ) | 
|  |  | 
|  | type staticHostEntry struct { | 
|  | in  string | 
|  | out []string | 
|  | } | 
|  |  | 
|  | var lookupStaticHostTests = []struct { | 
|  | name string | 
|  | ents []staticHostEntry | 
|  | }{ | 
|  | { | 
|  | "testdata/hosts", | 
|  | []staticHostEntry{ | 
|  | {"odin", []string{"127.0.0.2", "127.0.0.3", "::2"}}, | 
|  | {"thor", []string{"127.1.1.1"}}, | 
|  | {"ullr", []string{"127.1.1.2"}}, | 
|  | {"ullrhost", []string{"127.1.1.2"}}, | 
|  | {"localhost", []string{"fe80::1%lo0"}}, | 
|  | }, | 
|  | }, | 
|  | { | 
|  | "testdata/singleline-hosts", // see golang.org/issue/6646 | 
|  | []staticHostEntry{ | 
|  | {"odin", []string{"127.0.0.2"}}, | 
|  | }, | 
|  | }, | 
|  | { | 
|  | "testdata/ipv4-hosts", // see golang.org/issue/8996 | 
|  | []staticHostEntry{ | 
|  | {"localhost", []string{"127.0.0.1", "127.0.0.2", "127.0.0.3"}}, | 
|  | {"localhost.localdomain", []string{"127.0.0.3"}}, | 
|  | }, | 
|  | }, | 
|  | { | 
|  | "testdata/ipv6-hosts", // see golang.org/issue/8996 | 
|  | []staticHostEntry{ | 
|  | {"localhost", []string{"::1", "fe80::1", "fe80::2%lo0", "fe80::3%lo0"}}, | 
|  | {"localhost.localdomain", []string{"fe80::3%lo0"}}, | 
|  | }, | 
|  | }, | 
|  | { | 
|  | "testdata/case-hosts", // see golang.org/issue/12806 | 
|  | []staticHostEntry{ | 
|  | {"PreserveMe", []string{"127.0.0.1", "::1"}}, | 
|  | {"PreserveMe.local", []string{"127.0.0.1", "::1"}}, | 
|  | }, | 
|  | }, | 
|  | } | 
|  |  | 
|  | func TestLookupStaticHost(t *testing.T) { | 
|  | defer func(orig string) { testHookHostsPath = orig }(testHookHostsPath) | 
|  |  | 
|  | for _, tt := range lookupStaticHostTests { | 
|  | testHookHostsPath = tt.name | 
|  | for _, ent := range tt.ents { | 
|  | testStaticHost(t, tt.name, ent) | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | func testStaticHost(t *testing.T, hostsPath string, ent staticHostEntry) { | 
|  | ins := []string{ent.in, absDomainName([]byte(ent.in)), strings.ToLower(ent.in), strings.ToUpper(ent.in)} | 
|  | for _, in := range ins { | 
|  | addrs := lookupStaticHost(in) | 
|  | if !reflect.DeepEqual(addrs, ent.out) { | 
|  | t.Errorf("%s, lookupStaticHost(%s) = %v; want %v", hostsPath, in, addrs, ent.out) | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | var lookupStaticAddrTests = []struct { | 
|  | name string | 
|  | ents []staticHostEntry | 
|  | }{ | 
|  | { | 
|  | "testdata/hosts", | 
|  | []staticHostEntry{ | 
|  | {"255.255.255.255", []string{"broadcasthost"}}, | 
|  | {"127.0.0.2", []string{"odin"}}, | 
|  | {"127.0.0.3", []string{"odin"}}, | 
|  | {"::2", []string{"odin"}}, | 
|  | {"127.1.1.1", []string{"thor"}}, | 
|  | {"127.1.1.2", []string{"ullr", "ullrhost"}}, | 
|  | {"fe80::1%lo0", []string{"localhost"}}, | 
|  | }, | 
|  | }, | 
|  | { | 
|  | "testdata/singleline-hosts", // see golang.org/issue/6646 | 
|  | []staticHostEntry{ | 
|  | {"127.0.0.2", []string{"odin"}}, | 
|  | }, | 
|  | }, | 
|  | { | 
|  | "testdata/ipv4-hosts", // see golang.org/issue/8996 | 
|  | []staticHostEntry{ | 
|  | {"127.0.0.1", []string{"localhost"}}, | 
|  | {"127.0.0.2", []string{"localhost"}}, | 
|  | {"127.0.0.3", []string{"localhost", "localhost.localdomain"}}, | 
|  | }, | 
|  | }, | 
|  | { | 
|  | "testdata/ipv6-hosts", // see golang.org/issue/8996 | 
|  | []staticHostEntry{ | 
|  | {"::1", []string{"localhost"}}, | 
|  | {"fe80::1", []string{"localhost"}}, | 
|  | {"fe80::2%lo0", []string{"localhost"}}, | 
|  | {"fe80::3%lo0", []string{"localhost", "localhost.localdomain"}}, | 
|  | }, | 
|  | }, | 
|  | { | 
|  | "testdata/case-hosts", // see golang.org/issue/12806 | 
|  | []staticHostEntry{ | 
|  | {"127.0.0.1", []string{"PreserveMe", "PreserveMe.local"}}, | 
|  | {"::1", []string{"PreserveMe", "PreserveMe.local"}}, | 
|  | }, | 
|  | }, | 
|  | } | 
|  |  | 
|  | func TestLookupStaticAddr(t *testing.T) { | 
|  | defer func(orig string) { testHookHostsPath = orig }(testHookHostsPath) | 
|  |  | 
|  | for _, tt := range lookupStaticAddrTests { | 
|  | testHookHostsPath = tt.name | 
|  | for _, ent := range tt.ents { | 
|  | testStaticAddr(t, tt.name, ent) | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | func testStaticAddr(t *testing.T, hostsPath string, ent staticHostEntry) { | 
|  | hosts := lookupStaticAddr(ent.in) | 
|  | for i := range ent.out { | 
|  | ent.out[i] = absDomainName([]byte(ent.out[i])) | 
|  | } | 
|  | if !reflect.DeepEqual(hosts, ent.out) { | 
|  | t.Errorf("%s, lookupStaticAddr(%s) = %v; want %v", hostsPath, ent.in, hosts, ent.out) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestHostCacheModification(t *testing.T) { | 
|  | // Ensure that programs can't modify the internals of the host cache. | 
|  | // See https://golang.org/issues/14212. | 
|  | defer func(orig string) { testHookHostsPath = orig }(testHookHostsPath) | 
|  |  | 
|  | testHookHostsPath = "testdata/ipv4-hosts" | 
|  | ent := staticHostEntry{"localhost", []string{"127.0.0.1", "127.0.0.2", "127.0.0.3"}} | 
|  | testStaticHost(t, testHookHostsPath, ent) | 
|  | // Modify the addresses return by lookupStaticHost. | 
|  | addrs := lookupStaticHost(ent.in) | 
|  | for i := range addrs { | 
|  | addrs[i] += "junk" | 
|  | } | 
|  | testStaticHost(t, testHookHostsPath, ent) | 
|  |  | 
|  | testHookHostsPath = "testdata/ipv6-hosts" | 
|  | ent = staticHostEntry{"::1", []string{"localhost"}} | 
|  | testStaticAddr(t, testHookHostsPath, ent) | 
|  | // Modify the hosts return by lookupStaticAddr. | 
|  | hosts := lookupStaticAddr(ent.in) | 
|  | for i := range hosts { | 
|  | hosts[i] += "junk" | 
|  | } | 
|  | testStaticAddr(t, testHookHostsPath, ent) | 
|  | } |