github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/p2p/nat/nat_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 12:09:44</date> 10 //</624342659040808960> 11 12 13 package nat 14 15 import ( 16 "net" 17 "testing" 18 "time" 19 ) 20 21 //此测试检查自动发现是否挂起并返回 22 //多个goroutine调用其方法时的一致结果 23 //同时地。 24 func TestAutoDiscRace(t *testing.T) { 25 ad := startautodisc("thing", func() Interface { 26 time.Sleep(500 * time.Millisecond) 27 return extIP{33, 44, 55, 66} 28 }) 29 30 //生成一些对ad.externalIP的并发调用。 31 type rval struct { 32 ip net.IP 33 err error 34 } 35 results := make(chan rval, 50) 36 for i := 0; i < cap(results); i++ { 37 go func() { 38 ip, err := ad.ExternalIP() 39 results <- rval{ip, err} 40 }() 41 } 42 43 //检查他们是否都在截止日期内返回正确的结果。 44 deadline := time.After(2 * time.Second) 45 for i := 0; i < cap(results); i++ { 46 select { 47 case <-deadline: 48 t.Fatal("deadline exceeded") 49 case rval := <-results: 50 if rval.err != nil { 51 t.Errorf("result %d: unexpected error: %v", i, rval.err) 52 } 53 wantIP := net.IP{33, 44, 55, 66} 54 if !rval.ip.Equal(wantIP) { 55 t.Errorf("result %d: got IP %v, want %v", i, rval.ip, wantIP) 56 } 57 } 58 } 59 } 60