diff --git a/internal/store/store_test.go b/internal/store/store_test.go index ca3f0a020..f30a70e91 100644 --- a/internal/store/store_test.go +++ b/internal/store/store_test.go @@ -2,7 +2,6 @@ package store import ( "fmt" - stdlog "log" "os" "runtime/debug" "strings" @@ -61,47 +60,11 @@ func makeStateAndBlockStore(dir string) (sm.State, *BlockStore, cleanupFunc, err return state, NewBlockStore(blockDB), func() { os.RemoveAll(cfg.RootDir) }, nil } -func freshBlockStore() (*BlockStore, dbm.DB) { +func newInMemoryBlockStore() (*BlockStore, dbm.DB) { db := dbm.NewMemDB() return NewBlockStore(db), db } -var ( - state sm.State - block *types.Block - partSet *types.PartSet - part1 *types.Part - part2 *types.Part - seenCommit1 *types.ExtendedCommit -) - -func TestMain(m *testing.M) { - dir, err := os.MkdirTemp("", "store_test") - if err != nil { - stdlog.Fatal(err) - } - var cleanup cleanupFunc - - state, _, cleanup, err = makeStateAndBlockStore(dir) - if err != nil { - stdlog.Fatal(err) - } - - block = factory.MakeBlock(state, 1, new(types.Commit)) - - partSet, err = block.MakePartSet(2) - if err != nil { - stdlog.Fatal(err) - } - part1 = partSet.GetPart(0) - part2 = partSet.GetPart(1) - seenCommit1 = makeTestExtCommit(10, tmtime.Now()) - code := m.Run() - cleanup() - os.RemoveAll(dir) // best-effort - os.Exit(code) -} - // TODO: This test should be simplified ... func TestBlockStoreSaveLoadBlock(t *testing.T) { state, bs, cleanup, err := makeStateAndBlockStore(t.TempDir()) @@ -122,8 +85,10 @@ func TestBlockStoreSaveLoadBlock(t *testing.T) { block := factory.MakeBlock(state, bs.Height()+1, new(types.Commit)) validPartSet, err := block.MakePartSet(2) require.NoError(t, err) - seenCommit := makeTestExtCommit(bs.Height()+1, tmtime.Now()) - bs.SaveBlock(block, partSet, seenCommit) + part2 := validPartSet.GetPart(1) + + seenCommit := makeTestExtCommit(block.Header.Height, tmtime.Now()) + bs.SaveBlock(block, validPartSet, seenCommit) require.EqualValues(t, 1, bs.Base(), "expecting the new height to be changed") require.EqualValues(t, block.Header.Height, bs.Height(), "expecting the new height to be changed") @@ -158,7 +123,7 @@ func TestBlockStoreSaveLoadBlock(t *testing.T) { { block: newBlock(header1, commitAtH10), parts: validPartSet, - seenCommit: seenCommit1, + seenCommit: seenCommit, }, { @@ -189,7 +154,7 @@ func TestBlockStoreSaveLoadBlock(t *testing.T) { { block: newBlock(header1, commitAtH10), parts: validPartSet, - seenCommit: seenCommit1, + seenCommit: seenCommit, corruptCommitInDB: true, // Corrupt the DB's commit entry wantPanic: "error reading block commit", }, @@ -197,7 +162,7 @@ func TestBlockStoreSaveLoadBlock(t *testing.T) { { block: newBlock(header1, commitAtH10), parts: validPartSet, - seenCommit: seenCommit1, + seenCommit: seenCommit, wantPanic: "unmarshal to tmproto.BlockMeta", corruptBlockInDB: true, // Corrupt the DB's block entry }, @@ -205,7 +170,7 @@ func TestBlockStoreSaveLoadBlock(t *testing.T) { { block: newBlock(header1, commitAtH10), parts: validPartSet, - seenCommit: seenCommit1, + seenCommit: seenCommit, // Expecting no error and we want a nil back eraseSeenCommitInDB: true, @@ -214,7 +179,7 @@ func TestBlockStoreSaveLoadBlock(t *testing.T) { { block: newBlock(header1, commitAtH10), parts: validPartSet, - seenCommit: seenCommit1, + seenCommit: seenCommit, corruptSeenCommitInDB: true, wantPanic: "error reading block seen commit", @@ -223,7 +188,7 @@ func TestBlockStoreSaveLoadBlock(t *testing.T) { { block: newBlock(header1, commitAtH10), parts: validPartSet, - seenCommit: seenCommit1, + seenCommit: seenCommit, // Expecting no error and we want a nil back eraseCommitInDB: true, @@ -240,7 +205,7 @@ func TestBlockStoreSaveLoadBlock(t *testing.T) { for i, tuple := range tuples { tuple := tuple - bs, db := freshBlockStore() + bs, db := newInMemoryBlockStore() // SaveBlock res, err, panicErr := doFn(func() (interface{}, error) { bs.SaveBlock(tuple.block, tuple.parts, tuple.seenCommit) @@ -340,13 +305,19 @@ func TestLoadBaseMeta(t *testing.T) { } func TestLoadBlockPart(t *testing.T) { - bs, db := freshBlockStore() + cfg, err := config.ResetTestRoot(t.TempDir(), "blockchain_reactor_test") + require.NoError(t, err) + + bs, db := newInMemoryBlockStore() height, index := int64(10), 1 loadPart := func() (interface{}, error) { part := bs.LoadBlockPart(height, index) return part, nil } + state, err := sm.MakeGenesisStateFromFile(cfg.GenesisFile()) + require.NoError(t, err) + // Initially no contents. // 1. Requesting for a non-existent block shouldn't fail res, _, panicErr := doFn(loadPart) @@ -354,13 +325,18 @@ func TestLoadBlockPart(t *testing.T) { require.Nil(t, res, "a non-existent block part should return nil") // 2. Next save a corrupted block then try to load it - err := db.Set(blockPartKey(height, index), []byte("Tendermint")) + err = db.Set(blockPartKey(height, index), []byte("Tendermint")) require.NoError(t, err) res, _, panicErr = doFn(loadPart) require.NotNil(t, panicErr, "expecting a non-nil panic") require.Contains(t, panicErr.Error(), "unmarshal to tmproto.Part failed") // 3. A good block serialized and saved to the DB should be retrievable + block := factory.MakeBlock(state, height, new(types.Commit)) + partSet, err := block.MakePartSet(2) + require.NoError(t, err) + part1 := partSet.GetPart(0) + pb1, err := part1.ToProto() require.NoError(t, err) err = db.Set(blockPartKey(height, index), mustEncode(pb1)) @@ -454,7 +430,7 @@ func TestPruneBlocks(t *testing.T) { } func TestLoadBlockMeta(t *testing.T) { - bs, db := freshBlockStore() + bs, db := newInMemoryBlockStore() height := int64(10) loadMeta := func() (interface{}, error) { meta := bs.LoadBlockMeta(height) @@ -523,9 +499,12 @@ func TestBlockFetchAtHeight(t *testing.T) { } func TestSeenAndCanonicalCommit(t *testing.T) { - bs, _ := freshBlockStore() + state, store, cleanup, err := makeStateAndBlockStore(t.TempDir()) + defer cleanup() + require.NoError(t, err) + loadCommit := func() (interface{}, error) { - meta := bs.LoadSeenCommit() + meta := store.LoadSeenCommit() return meta, nil } @@ -543,14 +522,14 @@ func TestSeenAndCanonicalCommit(t *testing.T) { partSet, err := block.MakePartSet(2) require.NoError(t, err) seenCommit := makeTestExtCommit(h, tmtime.Now()) - bs.SaveBlock(block, partSet, seenCommit) - c3 := bs.LoadSeenCommit() + store.SaveBlock(block, partSet, seenCommit) + c3 := store.LoadSeenCommit() require.NotNil(t, c3) require.Equal(t, h, c3.Height) require.Equal(t, seenCommit.StripExtensions().Hash(), c3.Hash()) - c5 := bs.LoadBlockCommit(h) + c5 := store.LoadBlockCommit(h) require.Nil(t, c5) - c6 := bs.LoadBlockCommit(h - 1) + c6 := store.LoadBlockCommit(h - 1) require.Equal(t, blockCommit.Hash(), c6.Hash()) }