github.com/arieschain/arieschain@v0.0.0-20191023063405-37c074544356/p2p/netutil/net_test.go (about)

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