7 "github.com/bytom/bytom/netsync/peers"
8 "github.com/bytom/bytom/protocol/bc"
9 "github.com/bytom/bytom/protocol/bc/types"
10 "github.com/bytom/bytom/protocol/casper"
16 func (pm *peerMgr) IsBanned(ip string, level byte, reason string) bool {
20 func (pm *peerMgr) StopPeerGracefully(string) {
28 func newChain() *chain {
29 blocks := make([]uint64, 1, 1)
36 func (c *chain) BestBlockHeight() uint64 {
37 return c.blocks[len(c.blocks)-1]
40 func (c *chain) GetHeaderByHash(*bc.Hash) (*types.BlockHeader, error) {
44 func (c *chain) ProcessBlock(block *types.Block) (bool, error) {
45 c.blocks = append(c.blocks, block.Height)
49 func (c *chain) ProcessBlockVerification(*casper.Verification) error {
53 func TestBlockFetcher(t *testing.T) {
54 peers := peers.NewPeerSet(&peerMgr{})
55 testCase := []struct {
62 BlockHeader: types.BlockHeader{
72 BlockHeader: types.BlockHeader{
82 BlockHeader: types.BlockHeader{
92 BlockHeader: types.BlockHeader{
102 BlockHeader: types.BlockHeader{
112 BlockHeader: types.BlockHeader{
122 BlockHeader: types.BlockHeader{
130 fetcher := newBlockFetcher(newChain(), peers)
131 go fetcher.blockProcessorLoop()
132 for i, c := range testCase {
133 fetcher.processNewBlock(c.blockMsg)
134 time.Sleep(10 * time.Millisecond)
135 chainHeight := fetcher.chain.BestBlockHeight()
136 if chainHeight != c.height {
137 t.Fatalf("test block fetcher error. index %d expected chain height %d but got %d", i, chainHeight, c.height)
142 func TestAddBlockMsg(t *testing.T) {
143 peers := peers.NewPeerSet(&peerMgr{})
145 testCase := []struct {
146 blocksMsg []*blockMsg
154 blocksMsg: []*blockMsg{
157 BlockHeader: types.BlockHeader{
165 BlockHeader: types.BlockHeader{
173 BlockHeader: types.BlockHeader{
187 blocksMsg: []*blockMsg{
190 BlockHeader: types.BlockHeader{
199 BlockHeader: types.BlockHeader{
208 BlockHeader: types.BlockHeader{
217 BlockHeader: types.BlockHeader{
231 // test msg height does not meet the requirements
233 blocksMsg: []*blockMsg{
236 BlockHeader: types.BlockHeader{
245 BlockHeader: types.BlockHeader{
254 BlockHeader: types.BlockHeader{
263 BlockHeader: types.BlockHeader{
278 for i, c := range testCase {
279 fetcher := newBlockFetcher(newChain(), peers)
280 for _, msg := range c.blocksMsg {
281 fetcher.add(msg, c.limit)
284 if fetcher.queue.Size() != c.queueSize {
285 t.Fatalf("index: %d queue size err got %d: want %d", i, fetcher.queue.Size(), c.queueSize)
288 if len(fetcher.msgSet) != c.msgSetSize {
289 t.Fatalf("index: %d msg set size err got %d: want %d", i, len(fetcher.msgSet), c.msgSetSize)
292 if fetcher.msgCounter[testPeer] != c.msgCounter {
293 t.Fatalf("index: %d peer msg counter err got %d: want %d", i, fetcher.msgCounter[testPeer], c.msgCounter)