github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/network/simulation/events_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:43</date>
    10  //</624450114299105280>
    11  
    12  
    13  package simulation
    14  
    15  import (
    16  	"context"
    17  	"sync"
    18  	"testing"
    19  	"time"
    20  )
    21  
    22  //testpeerEvents创建模拟,添加两个节点,
    23  //注册对等事件,连接链中的节点
    24  //并等待连接事件的数量
    25  //被接受。
    26  func TestPeerEvents(t *testing.T) {
    27  	sim := New(noopServiceFuncMap)
    28  	defer sim.Close()
    29  
    30  	_, err := sim.AddNodes(2)
    31  	if err != nil {
    32  		t.Fatal(err)
    33  	}
    34  
    35  	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    36  	defer cancel()
    37  	events := sim.PeerEvents(ctx, sim.NodeIDs())
    38  
    39  //两个节点->两个连接事件
    40  	expectedEventCount := 2
    41  
    42  	var wg sync.WaitGroup
    43  	wg.Add(expectedEventCount)
    44  
    45  	go func() {
    46  		for e := range events {
    47  			if e.Error != nil {
    48  				if e.Error == context.Canceled {
    49  					return
    50  				}
    51  				t.Error(e.Error)
    52  				continue
    53  			}
    54  			wg.Done()
    55  		}
    56  	}()
    57  
    58  	err = sim.Net.ConnectNodesChain(sim.NodeIDs())
    59  	if err != nil {
    60  		t.Fatal(err)
    61  	}
    62  
    63  	wg.Wait()
    64  }
    65  
    66  func TestPeerEventsTimeout(t *testing.T) {
    67  	sim := New(noopServiceFuncMap)
    68  	defer sim.Close()
    69  
    70  	_, err := sim.AddNodes(2)
    71  	if err != nil {
    72  		t.Fatal(err)
    73  	}
    74  
    75  	ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond)
    76  	defer cancel()
    77  	events := sim.PeerEvents(ctx, sim.NodeIDs())
    78  
    79  	done := make(chan struct{})
    80  	errC := make(chan error)
    81  	go func() {
    82  		for e := range events {
    83  			if e.Error == context.Canceled {
    84  				return
    85  			}
    86  			if e.Error == context.DeadlineExceeded {
    87  				close(done)
    88  				return
    89  			} else {
    90  				errC <- e.Error
    91  			}
    92  		}
    93  	}()
    94  
    95  	select {
    96  	case <-time.After(time.Second):
    97  		t.Fatal("no context deadline received")
    98  	case err := <-errC:
    99  		t.Fatal(err)
   100  	case <-done:
   101  //一切正常,检测到上下文截止时间
   102  	}
   103  }
   104