7 "github.com/vapor/netsync/peers"
8 "github.com/vapor/protocol/bc"
9 "github.com/vapor/protocol/bc/types"
15 func (pm *peerMgr) IsBanned(ip string, level byte, reason string) bool {
19 func (pm *peerMgr) StopPeerGracefully(string) {
27 func newChain() *chain {
28 blocks := make([]uint64, 1, 1)
35 func (c *chain) BestBlockHeight() uint64 {
36 return c.blocks[len(c.blocks)-1]
39 func (c *chain) GetHeaderByHash(*bc.Hash) (*types.BlockHeader, error) {
43 func (c *chain) ProcessBlock(block *types.Block) (bool, error) {
44 c.blocks = append(c.blocks, block.Height)
48 func (c *chain) ProcessBlockSignature(signature, pubkey []byte, blockHash *bc.Hash) error {
52 func TestBlockFetcher(t *testing.T) {
53 peers := peers.NewPeerSet(&peerMgr{})
54 testCase := []struct {
61 BlockHeader: types.BlockHeader{
71 BlockHeader: types.BlockHeader{
81 BlockHeader: types.BlockHeader{
91 BlockHeader: types.BlockHeader{
101 BlockHeader: types.BlockHeader{
111 BlockHeader: types.BlockHeader{
121 BlockHeader: types.BlockHeader{
129 fetcher := newBlockFetcher(newChain(), peers)
130 go fetcher.blockProcessorLoop()
131 for i, c := range testCase {
132 fetcher.processNewBlock(c.blockMsg)
133 time.Sleep(10 * time.Millisecond)
134 chainHeight := fetcher.chain.BestBlockHeight()
135 if chainHeight != c.height {
136 t.Fatalf("test block fetcher error. index %d expected chain height %d but got %d", i, chainHeight, c.height)
141 func TestAddBlockMsg(t *testing.T) {
142 peers := peers.NewPeerSet(&peerMgr{})
144 testCase := []struct {
145 blocksMsg []*blockMsg
153 blocksMsg: []*blockMsg{
156 BlockHeader: types.BlockHeader{
164 BlockHeader: types.BlockHeader{
172 BlockHeader: types.BlockHeader{
186 blocksMsg: []*blockMsg{
189 BlockHeader: types.BlockHeader{
198 BlockHeader: types.BlockHeader{
207 BlockHeader: types.BlockHeader{
216 BlockHeader: types.BlockHeader{
230 // test msg height does not meet the requirements
232 blocksMsg: []*blockMsg{
235 BlockHeader: types.BlockHeader{
244 BlockHeader: types.BlockHeader{
253 BlockHeader: types.BlockHeader{
262 BlockHeader: types.BlockHeader{
277 for i, c := range testCase {
278 fetcher := newBlockFetcher(newChain(), peers)
279 for _, msg := range c.blocksMsg {
280 fetcher.add(msg, c.limit)
283 if fetcher.queue.Size() != c.queueSize {
284 t.Fatalf("index: %d queue size err got %d: want %d", i, fetcher.queue.Size(), c.queueSize)
287 if len(fetcher.msgSet) != c.msgSetSize {
288 t.Fatalf("index: %d msg set size err got %d: want %d", i, len(fetcher.msgSet), c.msgSetSize)
291 if fetcher.msgCounter[testPeer] != c.msgCounter {
292 t.Fatalf("index: %d peer msg counter err got %d: want %d", i, fetcher.msgCounter[testPeer], c.msgCounter)