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