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