github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/p2p/netutil/net_test.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 19:16:41</date>
    10  //</624450105453318144>
    11  
    12  
    13  package netutil
    14  
    15  import (
    16  	"fmt"
    17  	"net"
    18  	"reflect"
    19  	"testing"
    20  	"testing/quick"
    21  
    22  	"github.com/davecgh/go-spew/spew"
    23  )
    24  
    25  func TestParseNetlist(t *testing.T) {
    26  	var tests = []struct {
    27  		input    string
    28  		wantErr  error
    29  		wantList *Netlist
    30  	}{
    31  		{
    32  			input:    "",
    33  			wantList: &Netlist{},
    34  		},
    35  		{
    36  			input:    "127.0.0.0/8",
    37  			wantErr:  nil,
    38  			wantList: &Netlist{{IP: net.IP{127, 0, 0, 0}, Mask: net.CIDRMask(8, 32)}},
    39  		},
    40  		{
    41  			input:   "127.0.0.0/44",
    42  			wantErr: &net.ParseError{Type: "CIDR address", Text: "127.0.0.0/44"},
    43  		},
    44  		{
    45  			input: "127.0.0.0/16, 23.23.23.23/24,",
    46  			wantList: &Netlist{
    47  				{IP: net.IP{127, 0, 0, 0}, Mask: net.CIDRMask(16, 32)},
    48  				{IP: net.IP{23, 23, 23, 0}, Mask: net.CIDRMask(24, 32)},
    49  			},
    50  		},
    51  	}
    52  
    53  	for _, test := range tests {
    54  		l, err := ParseNetlist(test.input)
    55  		if !reflect.DeepEqual(err, test.wantErr) {
    56  			t.Errorf("%q: got error %q, want %q", test.input, err, test.wantErr)
    57  			continue
    58  		}
    59  		if !reflect.DeepEqual(l, test.wantList) {
    60  			spew.Dump(l)
    61  			spew.Dump(test.wantList)
    62  			t.Errorf("%q: got %v, want %v", test.input, l, test.wantList)
    63  		}
    64  	}
    65  }
    66  
    67  func TestNilNetListContains(t *testing.T) {
    68  	var list *Netlist
    69  	checkContains(t, list.Contains, nil, []string{"1.2.3.4"})
    70  }
    71  
    72  func TestIsLAN(t *testing.T) {
    73  	checkContains(t, IsLAN,
    74  []string{ //包括
    75  			"0.0.0.0",
    76  			"0.2.0.8",
    77  			"127.0.0.1",
    78  			"10.0.1.1",
    79  			"10.22.0.3",
    80  			"172.31.252.251",
    81  			"192.168.1.4",
    82  			"fe80::f4a1:8eff:fec5:9d9d",
    83  			"febf::ab32:2233",
    84  			"fc00::4",
    85  		},
    86  []string{ //排除
    87  			"192.0.2.1",
    88  			"1.0.0.0",
    89  			"172.32.0.1",
    90  			"fec0::2233",
    91  		},
    92  	)
    93  }
    94  
    95  func TestIsSpecialNetwork(t *testing.T) {
    96  	checkContains(t, IsSpecialNetwork,
    97  []string{ //包括
    98  			"192.0.2.1",
    99  			"192.0.2.44",
   100  			"2001:db8:85a3:8d3:1319:8a2e:370:7348",
   101  			"255.255.255.255",
   102  "224.0.0.22", //IPv4组播
   103  "ff05::1:3",  //IPv6组播
   104  		},
   105  []string{ //排除
   106  			"192.0.3.1",
   107  			"1.0.0.0",
   108  			"172.32.0.1",
   109  			"fec0::2233",
   110  		},
   111  	)
   112  }
   113  
   114  func checkContains(t *testing.T, fn func(net.IP) bool, inc, exc []string) {
   115  	for _, s := range inc {
   116  		if !fn(parseIP(s)) {
   117  			t.Error("returned false for included address", s)
   118  		}
   119  	}
   120  	for _, s := range exc {
   121  		if fn(parseIP(s)) {
   122  			t.Error("returned true for excluded address", s)
   123  		}
   124  	}
   125  }
   126  
   127  func parseIP(s string) net.IP {
   128  	ip := net.ParseIP(s)
   129  	if ip == nil {
   130  		panic("invalid " + s)
   131  	}
   132  	return ip
   133  }
   134  
   135  func TestCheckRelayIP(t *testing.T) {
   136  	tests := []struct {
   137  		sender, addr string
   138  		want         error
   139  	}{
   140  		{"127.0.0.1", "0.0.0.0", errUnspecified},
   141  		{"192.168.0.1", "0.0.0.0", errUnspecified},
   142  		{"23.55.1.242", "0.0.0.0", errUnspecified},
   143  		{"127.0.0.1", "255.255.255.255", errSpecial},
   144  		{"192.168.0.1", "255.255.255.255", errSpecial},
   145  		{"23.55.1.242", "255.255.255.255", errSpecial},
   146  		{"192.168.0.1", "127.0.2.19", errLoopback},
   147  		{"23.55.1.242", "192.168.0.1", errLAN},
   148  
   149  		{"127.0.0.1", "127.0.2.19", nil},
   150  		{"127.0.0.1", "192.168.0.1", nil},
   151  		{"127.0.0.1", "23.55.1.242", nil},
   152  		{"192.168.0.1", "192.168.0.1", nil},
   153  		{"192.168.0.1", "23.55.1.242", nil},
   154  		{"23.55.1.242", "23.55.1.242", nil},
   155  	}
   156  
   157  	for _, test := range tests {
   158  		err := CheckRelayIP(parseIP(test.sender), parseIP(test.addr))
   159  		if err != test.want {
   160  			t.Errorf("%s from %s: got %q, want %q", test.addr, test.sender, err, test.want)
   161  		}
   162  	}
   163  }
   164  
   165  func BenchmarkCheckRelayIP(b *testing.B) {
   166  	sender := parseIP("23.55.1.242")
   167  	addr := parseIP("23.55.1.2")
   168  	for i := 0; i < b.N; i++ {
   169  		CheckRelayIP(sender, addr)
   170  	}
   171  }
   172  
   173  func TestSameNet(t *testing.T) {
   174  	tests := []struct {
   175  		ip, other string
   176  		bits      uint
   177  		want      bool
   178  	}{
   179  		{"0.0.0.0", "0.0.0.0", 32, true},
   180  		{"0.0.0.0", "0.0.0.1", 0, true},
   181  		{"0.0.0.0", "0.0.0.1", 31, true},
   182  		{"0.0.0.0", "0.0.0.1", 32, false},
   183  		{"0.33.0.1", "0.34.0.2", 8, true},
   184  		{"0.33.0.1", "0.34.0.2", 13, true},
   185  		{"0.33.0.1", "0.34.0.2", 15, false},
   186  	}
   187  
   188  	for _, test := range tests {
   189  		if ok := SameNet(test.bits, parseIP(test.ip), parseIP(test.other)); ok != test.want {
   190  			t.Errorf("SameNet(%d, %s, %s) == %t, want %t", test.bits, test.ip, test.other, ok, test.want)
   191  		}
   192  	}
   193  }
   194  
   195  func ExampleSameNet() {
   196  //这将返回true,因为IP在相同的/24网络中:
   197  	fmt.Println(SameNet(24, net.IP{127, 0, 0, 1}, net.IP{127, 0, 0, 3}))
   198  //此调用返回错误:
   199  	fmt.Println(SameNet(24, net.IP{127, 3, 0, 1}, net.IP{127, 5, 0, 3}))
   200  //输出:
   201  //真
   202  //假
   203  }
   204  
   205  func TestDistinctNetSet(t *testing.T) {
   206  	ops := []struct {
   207  		add, remove string
   208  		fails       bool
   209  	}{
   210  		{add: "127.0.0.1"},
   211  		{add: "127.0.0.2"},
   212  		{add: "127.0.0.3", fails: true},
   213  		{add: "127.32.0.1"},
   214  		{add: "127.32.0.2"},
   215  		{add: "127.32.0.3", fails: true},
   216  		{add: "127.33.0.1", fails: true},
   217  		{add: "127.34.0.1"},
   218  		{add: "127.34.0.2"},
   219  		{add: "127.34.0.3", fails: true},
   220  //为地址腾出空间,然后重新添加。
   221  		{remove: "127.0.0.1"},
   222  		{add: "127.0.0.3"},
   223  		{add: "127.0.0.3", fails: true},
   224  	}
   225  
   226  	set := DistinctNetSet{Subnet: 15, Limit: 2}
   227  	for _, op := range ops {
   228  		var desc string
   229  		if op.add != "" {
   230  			desc = fmt.Sprintf("Add(%s)", op.add)
   231  			if ok := set.Add(parseIP(op.add)); ok != !op.fails {
   232  				t.Errorf("%s == %t, want %t", desc, ok, !op.fails)
   233  			}
   234  		} else {
   235  			desc = fmt.Sprintf("Remove(%s)", op.remove)
   236  			set.Remove(parseIP(op.remove))
   237  		}
   238  		t.Logf("%s: %v", desc, set)
   239  	}
   240  }
   241  
   242  func TestDistinctNetSetAddRemove(t *testing.T) {
   243  	cfg := &quick.Config{}
   244  	fn := func(ips []net.IP) bool {
   245  		s := DistinctNetSet{Limit: 3, Subnet: 2}
   246  		for _, ip := range ips {
   247  			s.Add(ip)
   248  		}
   249  		for _, ip := range ips {
   250  			s.Remove(ip)
   251  		}
   252  		return s.Len() == 0
   253  	}
   254  
   255  	if err := quick.Check(fn, cfg); err != nil {
   256  		t.Fatal(err)
   257  	}
   258  }
   259