// Tests that fast sync gets disabled as soon as a real block is successfully // imported into the blockchain. func TestFastSyncDisabling(t *testing.T) { // Create a pristine protocol manager, check that fast sync is left enabled pmEmpty := newTestProtocolManagerMust(t, true, 0, nil, nil) if atomic.LoadUint32(&pmEmpty.fastSync) == 0 { t.Fatalf("fast sync disabled on pristine blockchain") } // Create a full protocol manager, check that fast sync gets disabled pmFull := newTestProtocolManagerMust(t, true, 1024, nil, nil) if atomic.LoadUint32(&pmFull.fastSync) == 1 { t.Fatalf("fast sync not disabled on non-empty blockchain") } // Sync up the two peers io1, io2 := p2p.MsgPipe() go pmFull.handle(pmFull.newPeer(63, p2p.NewPeer(discover.NodeID{}, "empty", nil), io2)) go pmEmpty.handle(pmEmpty.newPeer(63, p2p.NewPeer(discover.NodeID{}, "full", nil), io1)) time.Sleep(250 * time.Millisecond) pmEmpty.synchronise(pmEmpty.peers.BestPeer()) // Check that fast sync was disabled if atomic.LoadUint32(&pmEmpty.fastSync) == 1 { t.Fatalf("fast sync not disabled after successful synchronisation") } }
// newTestPeer creates a new peer registered at the given protocol manager. func newTestPeer(name string, version int, pm *ProtocolManager, shake bool) (*testPeer, <-chan error) { // Create a message pipe to communicate through app, net := p2p.MsgPipe() // Generate a random id and create the peer var id discover.NodeID rand.Read(id[:]) peer := pm.newPeer(version, p2p.NewPeer(id, name, nil), net) // Start the peer on a new thread errc := make(chan error, 1) go func() { pm.newPeerCh <- peer errc <- pm.handle(peer) }() tp := &testPeer{ app: app, net: net, peer: peer, } // Execute any implicitly requested handshakes and return if shake { td, head, genesis := pm.blockchain.Status() tp.handshake(nil, td, head, genesis) } return tp, errc }
func newTestPeer(pm *ProtocolManager) (*testPeer, <-chan error) { var id discover.NodeID rand.Read(id[:]) rw1, rw2 := p2p.MsgPipe() peer := pm.newPeer(pm.protVer, pm.netId, p2p.NewPeer(id, "test peer", nil), rw2) errc := make(chan error, 1) go func() { pm.newPeerCh <- peer errc <- pm.handle(peer) }() return &testPeer{rw1, rw2, pm, peer}, errc }
func startTestCluster(n int) []*Whisper { // Create the batch of simulated peers nodes := make([]*p2p.Peer, n) for i := 0; i < n; i++ { nodes[i] = p2p.NewPeer(discover.NodeID{}, "", nil) } whispers := make([]*Whisper, n) for i := 0; i < n; i++ { whispers[i] = New() whispers[i].Start() } // Wire all the peers to the root one for i := 1; i < n; i++ { src, dst := p2p.MsgPipe() go whispers[0].handlePeer(nodes[i], src) go whispers[i].handlePeer(nodes[0], dst) } return whispers }
func startTestPeer() *testPeer { // Create a simulated P2P remote peer and data streams to it remote := p2p.NewPeer(discover.NodeID{}, "", nil) tester, tested := p2p.MsgPipe() // Create a whisper client and connect with it to the tester peer client := New() client.Start() termed := make(chan struct{}) go func() { defer client.Stop() defer close(termed) defer tested.Close() client.handlePeer(remote, tested) }() return &testPeer{ client: client, stream: tester, termed: termed, } }