github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/p2p/netutil/net_test.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 //版权所有2016 Go Ethereum作者 10 //此文件是Go以太坊库的一部分。 11 // 12 //Go-Ethereum库是免费软件:您可以重新分发它和/或修改 13 //根据GNU发布的较低通用公共许可证的条款 14 //自由软件基金会,或者许可证的第3版,或者 15 //(由您选择)任何更高版本。 16 // 17 //Go以太坊图书馆的发行目的是希望它会有用, 18 //但没有任何保证;甚至没有 19 //适销性或特定用途的适用性。见 20 //GNU较低的通用公共许可证,了解更多详细信息。 21 // 22 //你应该收到一份GNU较低级别的公共许可证副本 23 //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。 24 25 package netutil 26 27 import ( 28 "fmt" 29 "net" 30 "reflect" 31 "testing" 32 "testing/quick" 33 34 "github.com/davecgh/go-spew/spew" 35 ) 36 37 func TestParseNetlist(t *testing.T) { 38 var tests = []struct { 39 input string 40 wantErr error 41 wantList *Netlist 42 }{ 43 { 44 input: "", 45 wantList: &Netlist{}, 46 }, 47 { 48 input: "127.0.0.0/8", 49 wantErr: nil, 50 wantList: &Netlist{{IP: net.IP{127, 0, 0, 0}, Mask: net.CIDRMask(8, 32)}}, 51 }, 52 { 53 input: "127.0.0.0/44", 54 wantErr: &net.ParseError{Type: "CIDR address", Text: "127.0.0.0/44"}, 55 }, 56 { 57 input: "127.0.0.0/16, 23.23.23.23/24,", 58 wantList: &Netlist{ 59 {IP: net.IP{127, 0, 0, 0}, Mask: net.CIDRMask(16, 32)}, 60 {IP: net.IP{23, 23, 23, 0}, Mask: net.CIDRMask(24, 32)}, 61 }, 62 }, 63 } 64 65 for _, test := range tests { 66 l, err := ParseNetlist(test.input) 67 if !reflect.DeepEqual(err, test.wantErr) { 68 t.Errorf("%q: got error %q, want %q", test.input, err, test.wantErr) 69 continue 70 } 71 if !reflect.DeepEqual(l, test.wantList) { 72 spew.Dump(l) 73 spew.Dump(test.wantList) 74 t.Errorf("%q: got %v, want %v", test.input, l, test.wantList) 75 } 76 } 77 } 78 79 func TestNilNetListContains(t *testing.T) { 80 var list *Netlist 81 checkContains(t, list.Contains, nil, []string{"1.2.3.4"}) 82 } 83 84 func TestIsLAN(t *testing.T) { 85 checkContains(t, IsLAN, 86 []string{ //包括 87 "0.0.0.0", 88 "0.2.0.8", 89 "127.0.0.1", 90 "10.0.1.1", 91 "10.22.0.3", 92 "172.31.252.251", 93 "192.168.1.4", 94 "fe80::f4a1:8eff:fec5:9d9d", 95 "febf::ab32:2233", 96 "fc00::4", 97 }, 98 []string{ //排除 99 "192.0.2.1", 100 "1.0.0.0", 101 "172.32.0.1", 102 "fec0::2233", 103 }, 104 ) 105 } 106 107 func TestIsSpecialNetwork(t *testing.T) { 108 checkContains(t, IsSpecialNetwork, 109 []string{ //包括 110 "192.0.2.1", 111 "192.0.2.44", 112 "2001:db8:85a3:8d3:1319:8a2e:370:7348", 113 "255.255.255.255", 114 "224.0.0.22", //IPv4组播 115 "ff05::1:3", //IPv6组播 116 }, 117 []string{ //排除 118 "192.0.3.1", 119 "1.0.0.0", 120 "172.32.0.1", 121 "fec0::2233", 122 }, 123 ) 124 } 125 126 func checkContains(t *testing.T, fn func(net.IP) bool, inc, exc []string) { 127 for _, s := range inc { 128 if !fn(parseIP(s)) { 129 t.Error("returned false for included address", s) 130 } 131 } 132 for _, s := range exc { 133 if fn(parseIP(s)) { 134 t.Error("returned true for excluded address", s) 135 } 136 } 137 } 138 139 func parseIP(s string) net.IP { 140 ip := net.ParseIP(s) 141 if ip == nil { 142 panic("invalid " + s) 143 } 144 return ip 145 } 146 147 func TestCheckRelayIP(t *testing.T) { 148 tests := []struct { 149 sender, addr string 150 want error 151 }{ 152 {"127.0.0.1", "0.0.0.0", errUnspecified}, 153 {"192.168.0.1", "0.0.0.0", errUnspecified}, 154 {"23.55.1.242", "0.0.0.0", errUnspecified}, 155 {"127.0.0.1", "255.255.255.255", errSpecial}, 156 {"192.168.0.1", "255.255.255.255", errSpecial}, 157 {"23.55.1.242", "255.255.255.255", errSpecial}, 158 {"192.168.0.1", "127.0.2.19", errLoopback}, 159 {"23.55.1.242", "192.168.0.1", errLAN}, 160 161 {"127.0.0.1", "127.0.2.19", nil}, 162 {"127.0.0.1", "192.168.0.1", nil}, 163 {"127.0.0.1", "23.55.1.242", nil}, 164 {"192.168.0.1", "192.168.0.1", nil}, 165 {"192.168.0.1", "23.55.1.242", nil}, 166 {"23.55.1.242", "23.55.1.242", nil}, 167 } 168 169 for _, test := range tests { 170 err := CheckRelayIP(parseIP(test.sender), parseIP(test.addr)) 171 if err != test.want { 172 t.Errorf("%s from %s: got %q, want %q", test.addr, test.sender, err, test.want) 173 } 174 } 175 } 176 177 func BenchmarkCheckRelayIP(b *testing.B) { 178 sender := parseIP("23.55.1.242") 179 addr := parseIP("23.55.1.2") 180 for i := 0; i < b.N; i++ { 181 CheckRelayIP(sender, addr) 182 } 183 } 184 185 func TestSameNet(t *testing.T) { 186 tests := []struct { 187 ip, other string 188 bits uint 189 want bool 190 }{ 191 {"0.0.0.0", "0.0.0.0", 32, true}, 192 {"0.0.0.0", "0.0.0.1", 0, true}, 193 {"0.0.0.0", "0.0.0.1", 31, true}, 194 {"0.0.0.0", "0.0.0.1", 32, false}, 195 {"0.33.0.1", "0.34.0.2", 8, true}, 196 {"0.33.0.1", "0.34.0.2", 13, true}, 197 {"0.33.0.1", "0.34.0.2", 15, false}, 198 } 199 200 for _, test := range tests { 201 if ok := SameNet(test.bits, parseIP(test.ip), parseIP(test.other)); ok != test.want { 202 t.Errorf("SameNet(%d, %s, %s) == %t, want %t", test.bits, test.ip, test.other, ok, test.want) 203 } 204 } 205 } 206 207 func ExampleSameNet() { 208 //这将返回true,因为IP在相同的/24网络中: 209 fmt.Println(SameNet(24, net.IP{127, 0, 0, 1}, net.IP{127, 0, 0, 3})) 210 //此调用返回错误: 211 fmt.Println(SameNet(24, net.IP{127, 3, 0, 1}, net.IP{127, 5, 0, 3})) 212 //输出: 213 //真 214 //假 215 } 216 217 func TestDistinctNetSet(t *testing.T) { 218 ops := []struct { 219 add, remove string 220 fails bool 221 }{ 222 {add: "127.0.0.1"}, 223 {add: "127.0.0.2"}, 224 {add: "127.0.0.3", fails: true}, 225 {add: "127.32.0.1"}, 226 {add: "127.32.0.2"}, 227 {add: "127.32.0.3", fails: true}, 228 {add: "127.33.0.1", fails: true}, 229 {add: "127.34.0.1"}, 230 {add: "127.34.0.2"}, 231 {add: "127.34.0.3", fails: true}, 232 //为地址腾出空间,然后重新添加。 233 {remove: "127.0.0.1"}, 234 {add: "127.0.0.3"}, 235 {add: "127.0.0.3", fails: true}, 236 } 237 238 set := DistinctNetSet{Subnet: 15, Limit: 2} 239 for _, op := range ops { 240 var desc string 241 if op.add != "" { 242 desc = fmt.Sprintf("Add(%s)", op.add) 243 if ok := set.Add(parseIP(op.add)); ok != !op.fails { 244 t.Errorf("%s == %t, want %t", desc, ok, !op.fails) 245 } 246 } else { 247 desc = fmt.Sprintf("Remove(%s)", op.remove) 248 set.Remove(parseIP(op.remove)) 249 } 250 t.Logf("%s: %v", desc, set) 251 } 252 } 253 254 func TestDistinctNetSetAddRemove(t *testing.T) { 255 cfg := &quick.Config{} 256 fn := func(ips []net.IP) bool { 257 s := DistinctNetSet{Limit: 3, Subnet: 2} 258 for _, ip := range ips { 259 s.Add(ip) 260 } 261 for _, ip := range ips { 262 s.Remove(ip) 263 } 264 return s.Len() == 0 265 } 266 267 if err := quick.Check(fn, cfg); err != nil { 268 t.Fatal(err) 269 } 270 }