github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/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 12:09:47</date>
    10  //</624342673557295104>
    11  
    12  //
    13  //
    14  //
    15  //
    16  //
    17  //
    18  //
    19  //
    20  //
    21  //
    22  //
    23  //
    24  //
    25  //
    26  //
    27  
    28  package simulation
    29  
    30  import (
    31  	"context"
    32  	"sync"
    33  	"testing"
    34  	"time"
    35  )
    36  
    37  //
    38  //
    39  //
    40  //
    41  func TestPeerEvents(t *testing.T) {
    42  	sim := New(noopServiceFuncMap)
    43  	defer sim.Close()
    44  
    45  	_, err := sim.AddNodes(2)
    46  	if err != nil {
    47  		t.Fatal(err)
    48  	}
    49  
    50  	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    51  	defer cancel()
    52  	events := sim.PeerEvents(ctx, sim.NodeIDs())
    53  
    54  //
    55  	expectedEventCount := 2
    56  
    57  	var wg sync.WaitGroup
    58  	wg.Add(expectedEventCount)
    59  
    60  	go func() {
    61  		for e := range events {
    62  			if e.Error != nil {
    63  				if e.Error == context.Canceled {
    64  					return
    65  				}
    66  				t.Error(e.Error)
    67  				continue
    68  			}
    69  			wg.Done()
    70  		}
    71  	}()
    72  
    73  	err = sim.ConnectNodesChain(sim.NodeIDs())
    74  	if err != nil {
    75  		t.Fatal(err)
    76  	}
    77  
    78  	wg.Wait()
    79  }
    80  
    81  func TestPeerEventsTimeout(t *testing.T) {
    82  	sim := New(noopServiceFuncMap)
    83  	defer sim.Close()
    84  
    85  	_, err := sim.AddNodes(2)
    86  	if err != nil {
    87  		t.Fatal(err)
    88  	}
    89  
    90  	ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond)
    91  	defer cancel()
    92  	events := sim.PeerEvents(ctx, sim.NodeIDs())
    93  
    94  	done := make(chan struct{})
    95  	go func() {
    96  		for e := range events {
    97  			if e.Error == context.Canceled {
    98  				return
    99  			}
   100  			if e.Error == context.DeadlineExceeded {
   101  				close(done)
   102  				return
   103  			} else {
   104  				t.Fatal(e.Error)
   105  			}
   106  		}
   107  	}()
   108  
   109  	select {
   110  	case <-time.After(time.Second):
   111  		t.Error("no context deadline received")
   112  	case <-done:
   113  //
   114  	}
   115  }
   116