github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/network/hive_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  //</624450113762234368>
    11  
    12  
    13  package network
    14  
    15  import (
    16  	"io/ioutil"
    17  	"log"
    18  	"os"
    19  	"testing"
    20  
    21  	p2ptest "github.com/ethereum/go-ethereum/p2p/testing"
    22  	"github.com/ethereum/go-ethereum/swarm/state"
    23  )
    24  
    25  func newHiveTester(t *testing.T, params *HiveParams, n int, store state.Store) (*bzzTester, *Hive) {
    26  //设置
    27  addr := RandomAddr() //测试的对等地址
    28  	to := NewKademlia(addr.OAddr, NewKadParams())
    29  pp := NewHive(params, to, store) //蜂箱
    30  
    31  	return newBzzBaseTester(t, n, addr, DiscoverySpec, pp.Run), pp
    32  }
    33  
    34  func TestRegisterAndConnect(t *testing.T) {
    35  	params := NewHiveParams()
    36  	s, pp := newHiveTester(t, params, 1, nil)
    37  
    38  	node := s.Nodes[0]
    39  	raddr := NewAddr(node)
    40  	pp.Register(raddr)
    41  
    42  //启动配置单元并等待连接
    43  	err := pp.Start(s.Server)
    44  	if err != nil {
    45  		t.Fatal(err)
    46  	}
    47  	defer pp.Stop()
    48  //检索和广播
    49  	err = s.TestDisconnected(&p2ptest.Disconnect{
    50  		Peer:  s.Nodes[0].ID(),
    51  		Error: nil,
    52  	})
    53  
    54  	if err == nil || err.Error() != "timed out waiting for peers to disconnect" {
    55  		t.Fatalf("expected peer to connect")
    56  	}
    57  }
    58  
    59  func TestHiveStatePersistance(t *testing.T) {
    60  	log.SetOutput(os.Stdout)
    61  
    62  	dir, err := ioutil.TempDir("", "hive_test_store")
    63  	if err != nil {
    64  		panic(err)
    65  	}
    66  	defer os.RemoveAll(dir)
    67  
    68  store, err := state.NewDBStore(dir) //用空的dbstore启动配置单元
    69  	if err != nil {
    70  		t.Fatal(err)
    71  	}
    72  
    73  	params := NewHiveParams()
    74  	s, pp := newHiveTester(t, params, 5, store)
    75  
    76  	peers := make(map[string]bool)
    77  	for _, node := range s.Nodes {
    78  		raddr := NewAddr(node)
    79  		pp.Register(raddr)
    80  		peers[raddr.String()] = true
    81  	}
    82  
    83  //启动配置单元并等待连接
    84  	err = pp.Start(s.Server)
    85  	if err != nil {
    86  		t.Fatal(err)
    87  	}
    88  	pp.Stop()
    89  	store.Close()
    90  
    91  persistedStore, err := state.NewDBStore(dir) //用空的dbstore启动配置单元
    92  	if err != nil {
    93  		t.Fatal(err)
    94  	}
    95  
    96  	s1, pp := newHiveTester(t, params, 1, persistedStore)
    97  
    98  //启动配置单元并等待连接
    99  
   100  	pp.Start(s1.Server)
   101  	i := 0
   102  	pp.Kademlia.EachAddr(nil, 256, func(addr *BzzAddr, po int) bool {
   103  		delete(peers, addr.String())
   104  		i++
   105  		return true
   106  	})
   107  	if i != 5 {
   108  		t.Errorf("invalid number of entries: got %v, want %v", i, 5)
   109  	}
   110  	if len(peers) != 0 {
   111  		t.Fatalf("%d peers left over: %v", len(peers), peers)
   112  	}
   113  }
   114