...
Run Format

Source file src/net/hosts_test.go

Documentation: net

     1  // Copyright 2009 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  package net
     6  
     7  import (
     8  	"reflect"
     9  	"strings"
    10  	"testing"
    11  )
    12  
    13  type staticHostEntry struct {
    14  	in  string
    15  	out []string
    16  }
    17  
    18  var lookupStaticHostTests = []struct {
    19  	name string
    20  	ents []staticHostEntry
    21  }{
    22  	{
    23  		"testdata/hosts",
    24  		[]staticHostEntry{
    25  			{"odin", []string{"127.0.0.2", "127.0.0.3", "::2"}},
    26  			{"thor", []string{"127.1.1.1"}},
    27  			{"ullr", []string{"127.1.1.2"}},
    28  			{"ullrhost", []string{"127.1.1.2"}},
    29  			{"localhost", []string{"fe80::1%lo0"}},
    30  		},
    31  	},
    32  	{
    33  		"testdata/singleline-hosts", // see golang.org/issue/6646
    34  		[]staticHostEntry{
    35  			{"odin", []string{"127.0.0.2"}},
    36  		},
    37  	},
    38  	{
    39  		"testdata/ipv4-hosts", // see golang.org/issue/8996
    40  		[]staticHostEntry{
    41  			{"localhost", []string{"127.0.0.1", "127.0.0.2", "127.0.0.3"}},
    42  			{"localhost.localdomain", []string{"127.0.0.3"}},
    43  		},
    44  	},
    45  	{
    46  		"testdata/ipv6-hosts", // see golang.org/issue/8996
    47  		[]staticHostEntry{
    48  			{"localhost", []string{"::1", "fe80::1", "fe80::2%lo0", "fe80::3%lo0"}},
    49  			{"localhost.localdomain", []string{"fe80::3%lo0"}},
    50  		},
    51  	},
    52  	{
    53  		"testdata/case-hosts", // see golang.org/issue/12806
    54  		[]staticHostEntry{
    55  			{"PreserveMe", []string{"127.0.0.1", "::1"}},
    56  			{"PreserveMe.local", []string{"127.0.0.1", "::1"}},
    57  		},
    58  	},
    59  }
    60  
    61  func TestLookupStaticHost(t *testing.T) {
    62  	defer func(orig string) { testHookHostsPath = orig }(testHookHostsPath)
    63  
    64  	for _, tt := range lookupStaticHostTests {
    65  		testHookHostsPath = tt.name
    66  		for _, ent := range tt.ents {
    67  			testStaticHost(t, tt.name, ent)
    68  		}
    69  	}
    70  }
    71  
    72  func testStaticHost(t *testing.T, hostsPath string, ent staticHostEntry) {
    73  	ins := []string{ent.in, absDomainName([]byte(ent.in)), strings.ToLower(ent.in), strings.ToUpper(ent.in)}
    74  	for _, in := range ins {
    75  		addrs := lookupStaticHost(in)
    76  		if !reflect.DeepEqual(addrs, ent.out) {
    77  			t.Errorf("%s, lookupStaticHost(%s) = %v; want %v", hostsPath, in, addrs, ent.out)
    78  		}
    79  	}
    80  }
    81  
    82  var lookupStaticAddrTests = []struct {
    83  	name string
    84  	ents []staticHostEntry
    85  }{
    86  	{
    87  		"testdata/hosts",
    88  		[]staticHostEntry{
    89  			{"255.255.255.255", []string{"broadcasthost"}},
    90  			{"127.0.0.2", []string{"odin"}},
    91  			{"127.0.0.3", []string{"odin"}},
    92  			{"::2", []string{"odin"}},
    93  			{"127.1.1.1", []string{"thor"}},
    94  			{"127.1.1.2", []string{"ullr", "ullrhost"}},
    95  			{"fe80::1%lo0", []string{"localhost"}},
    96  		},
    97  	},
    98  	{
    99  		"testdata/singleline-hosts", // see golang.org/issue/6646
   100  		[]staticHostEntry{
   101  			{"127.0.0.2", []string{"odin"}},
   102  		},
   103  	},
   104  	{
   105  		"testdata/ipv4-hosts", // see golang.org/issue/8996
   106  		[]staticHostEntry{
   107  			{"127.0.0.1", []string{"localhost"}},
   108  			{"127.0.0.2", []string{"localhost"}},
   109  			{"127.0.0.3", []string{"localhost", "localhost.localdomain"}},
   110  		},
   111  	},
   112  	{
   113  		"testdata/ipv6-hosts", // see golang.org/issue/8996
   114  		[]staticHostEntry{
   115  			{"::1", []string{"localhost"}},
   116  			{"fe80::1", []string{"localhost"}},
   117  			{"fe80::2%lo0", []string{"localhost"}},
   118  			{"fe80::3%lo0", []string{"localhost", "localhost.localdomain"}},
   119  		},
   120  	},
   121  	{
   122  		"testdata/case-hosts", // see golang.org/issue/12806
   123  		[]staticHostEntry{
   124  			{"127.0.0.1", []string{"PreserveMe", "PreserveMe.local"}},
   125  			{"::1", []string{"PreserveMe", "PreserveMe.local"}},
   126  		},
   127  	},
   128  }
   129  
   130  func TestLookupStaticAddr(t *testing.T) {
   131  	defer func(orig string) { testHookHostsPath = orig }(testHookHostsPath)
   132  
   133  	for _, tt := range lookupStaticAddrTests {
   134  		testHookHostsPath = tt.name
   135  		for _, ent := range tt.ents {
   136  			testStaticAddr(t, tt.name, ent)
   137  		}
   138  	}
   139  }
   140  
   141  func testStaticAddr(t *testing.T, hostsPath string, ent staticHostEntry) {
   142  	hosts := lookupStaticAddr(ent.in)
   143  	for i := range ent.out {
   144  		ent.out[i] = absDomainName([]byte(ent.out[i]))
   145  	}
   146  	if !reflect.DeepEqual(hosts, ent.out) {
   147  		t.Errorf("%s, lookupStaticAddr(%s) = %v; want %v", hostsPath, ent.in, hosts, ent.out)
   148  	}
   149  }
   150  
   151  func TestHostCacheModification(t *testing.T) {
   152  	// Ensure that programs can't modify the internals of the host cache.
   153  	// See https://golang.org/issues/14212.
   154  	defer func(orig string) { testHookHostsPath = orig }(testHookHostsPath)
   155  
   156  	testHookHostsPath = "testdata/ipv4-hosts"
   157  	ent := staticHostEntry{"localhost", []string{"127.0.0.1", "127.0.0.2", "127.0.0.3"}}
   158  	testStaticHost(t, testHookHostsPath, ent)
   159  	// Modify the addresses return by lookupStaticHost.
   160  	addrs := lookupStaticHost(ent.in)
   161  	for i := range addrs {
   162  		addrs[i] += "junk"
   163  	}
   164  	testStaticHost(t, testHookHostsPath, ent)
   165  
   166  	testHookHostsPath = "testdata/ipv6-hosts"
   167  	ent = staticHostEntry{"::1", []string{"localhost"}}
   168  	testStaticAddr(t, testHookHostsPath, ent)
   169  	// Modify the hosts return by lookupStaticAddr.
   170  	hosts := lookupStaticAddr(ent.in)
   171  	for i := range hosts {
   172  		hosts[i] += "junk"
   173  	}
   174  	testStaticAddr(t, testHookHostsPath, ent)
   175  }
   176  

View as plain text