2018-07-31 04:41:27 +00:00
|
|
|
package simulator
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
2018-08-24 04:09:59 +00:00
|
|
|
"io/ioutil"
|
2018-07-31 04:41:27 +00:00
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
2018-09-09 22:15:24 +00:00
|
|
|
"github.com/golang/protobuf/proto"
|
2018-10-05 17:14:50 +00:00
|
|
|
"github.com/prysmaticlabs/prysm/beacon-chain/db"
|
2018-07-31 04:41:27 +00:00
|
|
|
"github.com/prysmaticlabs/prysm/beacon-chain/types"
|
2018-07-31 18:54:45 +00:00
|
|
|
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
|
2018-10-03 01:49:01 +00:00
|
|
|
"github.com/prysmaticlabs/prysm/shared/event"
|
2018-07-31 04:41:27 +00:00
|
|
|
"github.com/prysmaticlabs/prysm/shared/p2p"
|
|
|
|
"github.com/prysmaticlabs/prysm/shared/testutil"
|
2018-08-24 04:09:59 +00:00
|
|
|
"github.com/sirupsen/logrus"
|
2018-07-31 04:41:27 +00:00
|
|
|
logTest "github.com/sirupsen/logrus/hooks/test"
|
|
|
|
)
|
|
|
|
|
2018-08-24 04:09:59 +00:00
|
|
|
func init() {
|
|
|
|
logrus.SetLevel(logrus.DebugLevel)
|
|
|
|
logrus.SetOutput(ioutil.Discard)
|
|
|
|
}
|
|
|
|
|
2018-07-31 04:41:27 +00:00
|
|
|
type mockP2P struct{}
|
|
|
|
|
2018-09-09 22:15:24 +00:00
|
|
|
func (mp *mockP2P) Subscribe(msg proto.Message, channel chan p2p.Message) event.Subscription {
|
2018-07-31 04:41:27 +00:00
|
|
|
return new(event.Feed).Subscribe(channel)
|
|
|
|
}
|
|
|
|
|
2018-09-09 22:15:24 +00:00
|
|
|
func (mp *mockP2P) Broadcast(msg proto.Message) {}
|
2018-07-31 04:41:27 +00:00
|
|
|
|
2018-09-09 22:15:24 +00:00
|
|
|
func (mp *mockP2P) Send(msg proto.Message, peer p2p.Peer) {}
|
2018-07-31 04:41:27 +00:00
|
|
|
|
|
|
|
type mockPOWChainService struct{}
|
|
|
|
|
|
|
|
func (mpow *mockPOWChainService) LatestBlockHash() common.Hash {
|
|
|
|
return common.BytesToHash([]byte{})
|
|
|
|
}
|
|
|
|
|
2018-10-05 17:14:50 +00:00
|
|
|
func setupSimulator(t *testing.T) *Simulator {
|
|
|
|
ctx := context.Background()
|
2018-07-31 04:41:27 +00:00
|
|
|
|
2018-10-05 17:14:50 +00:00
|
|
|
config := db.Config{Path: "", Name: "", InMemory: true}
|
|
|
|
db, err := db.NewDB(config)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("could not setup beaconDB: %v", err)
|
|
|
|
}
|
2018-10-03 01:02:52 +00:00
|
|
|
|
2018-08-18 03:34:56 +00:00
|
|
|
cfg := &Config{
|
|
|
|
Delay: time.Second,
|
|
|
|
BlockRequestBuf: 0,
|
|
|
|
P2P: &mockP2P{},
|
|
|
|
Web3Service: &mockPOWChainService{},
|
|
|
|
BeaconDB: db,
|
2018-10-02 02:04:37 +00:00
|
|
|
EnablePOWChain: true,
|
2018-08-18 03:34:56 +00:00
|
|
|
}
|
2018-10-05 17:14:50 +00:00
|
|
|
|
|
|
|
return NewSimulator(ctx, cfg)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLifecycle(t *testing.T) {
|
|
|
|
hook := logTest.NewGlobal()
|
|
|
|
sim := setupSimulator(t)
|
2018-07-31 04:41:27 +00:00
|
|
|
|
|
|
|
sim.Start()
|
|
|
|
testutil.AssertLogsContain(t, hook, "Starting service")
|
|
|
|
sim.Stop()
|
|
|
|
testutil.AssertLogsContain(t, hook, "Stopping service")
|
|
|
|
|
|
|
|
// The context should have been canceled.
|
|
|
|
if sim.ctx.Err() == nil {
|
|
|
|
t.Error("context was not canceled")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestBroadcastBlockHash(t *testing.T) {
|
|
|
|
hook := logTest.NewGlobal()
|
2018-10-05 17:14:50 +00:00
|
|
|
sim := setupSimulator(t)
|
2018-07-31 04:41:27 +00:00
|
|
|
|
|
|
|
delayChan := make(chan time.Time)
|
|
|
|
exitRoutine := make(chan bool)
|
|
|
|
|
|
|
|
go func() {
|
2018-10-05 17:14:50 +00:00
|
|
|
sim.run(delayChan)
|
2018-07-31 04:41:27 +00:00
|
|
|
<-exitRoutine
|
|
|
|
}()
|
|
|
|
|
|
|
|
delayChan <- time.Time{}
|
2018-10-05 17:14:50 +00:00
|
|
|
sim.cancel()
|
|
|
|
exitRoutine <- true
|
2018-07-31 04:41:27 +00:00
|
|
|
|
|
|
|
testutil.AssertLogsContain(t, hook, "Announcing block hash")
|
|
|
|
|
|
|
|
if len(sim.broadcastedBlockHashes) != 1 {
|
|
|
|
t.Error("Did not store the broadcasted block hash")
|
|
|
|
}
|
|
|
|
hook.Reset()
|
|
|
|
}
|
|
|
|
|
2018-08-05 23:23:31 +00:00
|
|
|
func TestBlockRequest(t *testing.T) {
|
2018-07-31 04:41:27 +00:00
|
|
|
hook := logTest.NewGlobal()
|
2018-10-05 17:14:50 +00:00
|
|
|
sim := setupSimulator(t)
|
2018-07-31 04:41:27 +00:00
|
|
|
|
|
|
|
delayChan := make(chan time.Time)
|
|
|
|
exitRoutine := make(chan bool)
|
|
|
|
|
|
|
|
go func() {
|
2018-10-05 17:14:50 +00:00
|
|
|
sim.run(delayChan)
|
2018-07-31 04:41:27 +00:00
|
|
|
<-exitRoutine
|
|
|
|
}()
|
|
|
|
|
2018-10-10 02:34:50 +00:00
|
|
|
block := types.NewBlock(&pb.BeaconBlock{AncestorHashes: make([][]byte, 32)})
|
2018-07-31 04:41:27 +00:00
|
|
|
h, err := block.Hash()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
data := &pb.BeaconBlockRequest{
|
|
|
|
Hash: h[:],
|
|
|
|
}
|
|
|
|
|
|
|
|
msg := p2p.Message{
|
|
|
|
Peer: p2p.Peer{},
|
|
|
|
Data: data,
|
|
|
|
}
|
|
|
|
|
2018-08-18 03:34:56 +00:00
|
|
|
sim.broadcastedBlocks[h] = block
|
2018-07-31 04:41:27 +00:00
|
|
|
|
|
|
|
sim.blockRequestChan <- msg
|
2018-10-05 17:14:50 +00:00
|
|
|
sim.cancel()
|
2018-07-31 04:41:27 +00:00
|
|
|
exitRoutine <- true
|
|
|
|
|
|
|
|
testutil.AssertLogsContain(t, hook, fmt.Sprintf("Responding to full block request for hash: 0x%x", h))
|
|
|
|
}
|