From 945997c6d2a25b9d5aa9994d5344ead77e429020 Mon Sep 17 00:00:00 2001 From: jiangpeng <11565373+bysomeone@users.noreply.github.com> Date: Wed, 8 May 2024 13:32:52 +0800 Subject: [PATCH] add block finalizer unit test --- blockchain/blockfinalize.go | 10 +++--- blockchain/blockfinalize_test.go | 58 ++++++++++++++++++++++++++++++++ blockchain/chain.go | 4 +-- 3 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 blockchain/blockfinalize_test.go diff --git a/blockchain/blockfinalize.go b/blockchain/blockfinalize.go index 345c0a0fb..ee327968b 100644 --- a/blockchain/blockfinalize.go +++ b/blockchain/blockfinalize.go @@ -18,10 +18,9 @@ type finalizer struct { lock sync.RWMutex } -func newFinalizer(chain *BlockChain) *finalizer { - - f := &finalizer{chain: chain} +func (f *finalizer) Init(chain *BlockChain) { + f.chain = chain raw, err := chain.blockStore.db.Get(snowChoiceKey) if err == nil { @@ -36,8 +35,6 @@ func newFinalizer(chain *BlockChain) *finalizer { chainlog.Debug("newFinalizer", "enableHeight", f.choice.Height, "gapHeight", chain.cfg.BlockFinalizeGapHeight) go f.waitFinalizeStartBlock(f.choice.Height) } - - return f } func (f *finalizer) healthCheck(finalizedHeight int64) { @@ -68,7 +65,8 @@ const defaultFinalizeGapHeight = 128 func (f *finalizer) waitFinalizeStartBlock(beginHeight int64) { - for f.chain.blockStore.Height() < beginHeight+f.chain.cfg.BlockFinalizeGapHeight { + waitHeight := f.chain.cfg.BlockFinalizeGapHeight + for f.chain.blockStore.Height() < beginHeight+waitHeight { time.Sleep(time.Second * 5) } diff --git a/blockchain/blockfinalize_test.go b/blockchain/blockfinalize_test.go new file mode 100644 index 000000000..a5af27d0d --- /dev/null +++ b/blockchain/blockfinalize_test.go @@ -0,0 +1,58 @@ +package blockchain + +import ( + dbm "github.com/33cn/chain33/common/db" + "github.com/33cn/chain33/queue" + "github.com/33cn/chain33/types" + "github.com/stretchr/testify/require" + "os" + "testing" +) + +func newTestChain(t *testing.T) (*BlockChain, string) { + + chain := InitEnv() + dir, err := os.MkdirTemp("", "finalize") + require.Nil(t, err) + blockStoreDB := dbm.NewDB("blockchain", "leveldb", dir, 64) + chain.blockStore = NewBlockStore(chain, blockStoreDB, nil) + node := newPreGenBlockNode() + node.parent = nil + chain.bestChain = newChainView(node) + return chain, dir +} + +func TestFinalizer(t *testing.T) { + + chain, dir := newTestChain(t) + defer os.RemoveAll(dir) + + f := &finalizer{} + f.Init(chain) + + hash := []byte("testhash") + choice := &types.SnowChoice{Height: 1, Hash: hash} + msg := queue.NewMessage(0, "test", 0, choice) + + f.snowmanPreferBlock(msg) + f.snowmanAcceptBlock(msg) + height, hash1 := f.getLastFinalized() + require.Equal(t, 0, int(height)) + require.Equal(t, 0, len(hash1)) + node := &blockNode{ + parent: chain.bestChain.Tip(), + height: 1, + hash: hash, + } + chain.bestChain.SetTip(node) + f.snowmanAcceptBlock(msg) + height, hash1 = f.getLastFinalized() + require.Equal(t, 1, int(height)) + require.Equal(t, hash, hash1) + + f.snowmanLastChoice(msg) + msg1, err := chain.client.Wait(msg) + require.Nil(t, err) + require.Equal(t, msg1.Data, choice) + f.Init(chain) +} diff --git a/blockchain/chain.go b/blockchain/chain.go index 4a9667f4c..ff2c71690 100644 --- a/blockchain/chain.go +++ b/blockchain/chain.go @@ -292,8 +292,8 @@ func (chain *BlockChain) SetQueueClient(client queue.Client) { // 获取当前最大chunk连续高度 chain.maxSerialChunkNum = chain.blockStore.GetMaxSerialChunkNum() - chain.finalizer = newFinalizer(chain) - + chain.finalizer = &finalizer{} + chain.finalizer.Init(chain) //recv 消息的处理,共识模块需要获取lastblock从数据库中 chain.recvwg.Add(1) //初始化blockchian模块