From ace78f3a2804f2f4953f3ad9b945a4dbea221ac7 Mon Sep 17 00:00:00 2001 From: Jimmy Hu Date: Fri, 2 Nov 2018 10:40:58 +0800 Subject: dex: implement PullBlocks/PullVotes (#1) --- dex/cache_test.go | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 dex/cache_test.go (limited to 'dex/cache_test.go') diff --git a/dex/cache_test.go b/dex/cache_test.go new file mode 100644 index 000000000..96e07aa17 --- /dev/null +++ b/dex/cache_test.go @@ -0,0 +1,144 @@ +// Copyright 2018 The dexon-consensus-core Authors +// This file is part of the dexon-consensus-core library. +// +// The dexon-consensus-core library is free software: you can redistribute it +// and/or modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// The dexon-consensus-core library is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser +// General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the dexon-consensus-core library. If not, see +// . + +package dex + +import ( + "testing" + + coreCommon "github.com/dexon-foundation/dexon-consensus-core/common" + coreTypes "github.com/dexon-foundation/dexon-consensus-core/core/types" +) + +func TestCacheVote(t *testing.T) { + cache := newCache(3) + pos0 := coreTypes.Position{ + Height: uint64(0), + } + pos1 := coreTypes.Position{ + Height: uint64(1), + } + vote1 := &coreTypes.Vote{ + BlockHash: coreCommon.NewRandomHash(), + Position: pos0, + } + vote2 := &coreTypes.Vote{ + BlockHash: coreCommon.NewRandomHash(), + Position: pos0, + } + vote3 := &coreTypes.Vote{ + BlockHash: coreCommon.NewRandomHash(), + Position: pos1, + } + vote4 := &coreTypes.Vote{ + BlockHash: coreCommon.NewRandomHash(), + Position: pos1, + } + cache.addVote(vote1) + cache.addVote(vote2) + cache.addVote(vote3) + + votes := cache.votes(pos0) + if len(votes) != 2 { + t.Errorf("fail to get votes: have %d, want 2", len(votes)) + } + if !votes[0].BlockHash.Equal(vote1.BlockHash) { + t.Errorf("get wrong vote: have %s, want %s", votes[0], vote1) + } + if !votes[1].BlockHash.Equal(vote2.BlockHash) { + t.Errorf("get wrong vote: have %s, want %s", votes[1], vote2) + } + votes = cache.votes(pos1) + if len(votes) != 1 { + t.Errorf("fail to get votes: have %d, want 1", len(votes)) + } + if !votes[0].BlockHash.Equal(vote3.BlockHash) { + t.Errorf("get wrong vote: have %s, want %s", votes[0], vote3) + } + + cache.addVote(vote4) + + votes = cache.votes(pos0) + if len(votes) != 0 { + t.Errorf("fail to get votes: have %d, want 0", len(votes)) + } + votes = cache.votes(pos1) + if len(votes) != 2 { + t.Errorf("fail to get votes: have %d, want 1", len(votes)) + } + if !votes[0].BlockHash.Equal(vote3.BlockHash) { + t.Errorf("get wrong vote: have %s, want %s", votes[0], vote3) + } + if !votes[1].BlockHash.Equal(vote4.BlockHash) { + t.Errorf("get wrong vote: have %s, want %s", votes[1], vote4) + } +} + +func TestCacheBlock(t *testing.T) { + cache := newCache(3) + block1 := &coreTypes.Block{ + Hash: coreCommon.NewRandomHash(), + } + block2 := &coreTypes.Block{ + Hash: coreCommon.NewRandomHash(), + } + block3 := &coreTypes.Block{ + Hash: coreCommon.NewRandomHash(), + } + block4 := &coreTypes.Block{ + Hash: coreCommon.NewRandomHash(), + } + cache.addBlock(block1) + cache.addBlock(block2) + cache.addBlock(block3) + + hashes := coreCommon.Hashes{block1.Hash, block2.Hash, block3.Hash, block4.Hash} + hashMap := map[coreCommon.Hash]struct{}{ + block1.Hash: struct{}{}, + block2.Hash: struct{}{}, + block3.Hash: struct{}{}, + } + blocks := cache.blocks(hashes) + if len(blocks) != 3 { + t.Errorf("fail to get blocks: have %d, want 3", len(blocks)) + } + for _, block := range blocks { + if _, exist := hashMap[block.Hash]; !exist { + t.Errorf("get wrong block: have %s, want %v", block, hashMap) + } + } + + cache.addBlock(block4) + + blocks = cache.blocks(hashes) + hashMap[block4.Hash] = struct{}{} + if len(blocks) != 3 { + t.Errorf("fail to get blocks: have %d, want 3", len(blocks)) + } + hasNewBlock := false + for _, block := range blocks { + if _, exist := hashMap[block.Hash]; !exist { + t.Errorf("get wrong block: have %s, want %v", block, hashMap) + } + if block.Hash.Equal(block4.Hash) { + hasNewBlock = true + } + } + if !hasNewBlock { + t.Errorf("expect block %s in cache, have %v", block4, blocks) + } +} -- cgit v1.2.3