go_study/fabric-main/common/ledger/blkstorage/blockfile_scan_test.go

77 lines
2.5 KiB
Go

/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package blkstorage
import (
"os"
"testing"
"github.com/hyperledger/fabric-protos-go/common"
"github.com/hyperledger/fabric/common/ledger/testutil"
"github.com/hyperledger/fabric/internal/fileutil"
"github.com/stretchr/testify/require"
)
func TestBlockFileScanSmallTxOnly(t *testing.T) {
env := newTestEnv(t, NewConf(t.TempDir(), 0))
defer env.Cleanup()
ledgerid := "testLedger"
blkfileMgrWrapper := newTestBlockfileWrapper(env, ledgerid)
bg, gb := testutil.NewBlockGenerator(t, ledgerid, false)
blocks := []*common.Block{gb}
blocks = append(blocks, bg.NextTestBlock(0, 0))
blocks = append(blocks, bg.NextTestBlock(0, 0))
blocks = append(blocks, bg.NextTestBlock(0, 0))
blkfileMgrWrapper.addBlocks(blocks)
blkfileMgrWrapper.close()
filePath := deriveBlockfilePath(env.provider.conf.getLedgerBlockDir(ledgerid), 0)
_, fileSize, err := fileutil.FileExists(filePath)
require.NoError(t, err)
lastBlockBytes, endOffsetLastBlock, numBlocks, err := scanForLastCompleteBlock(env.provider.conf.getLedgerBlockDir(ledgerid), 0, 0)
require.NoError(t, err)
require.Equal(t, len(blocks), numBlocks)
require.Equal(t, fileSize, endOffsetLastBlock)
expectedLastBlockBytes, _, err := serializeBlock(blocks[len(blocks)-1])
require.NoError(t, err)
require.Equal(t, expectedLastBlockBytes, lastBlockBytes)
}
func TestBlockFileScanSmallTxLastTxIncomplete(t *testing.T) {
env := newTestEnv(t, NewConf(t.TempDir(), 0))
defer env.Cleanup()
ledgerid := "testLedger"
blkfileMgrWrapper := newTestBlockfileWrapper(env, ledgerid)
bg, gb := testutil.NewBlockGenerator(t, ledgerid, false)
blocks := []*common.Block{gb}
blocks = append(blocks, bg.NextTestBlock(0, 0))
blocks = append(blocks, bg.NextTestBlock(0, 0))
blocks = append(blocks, bg.NextTestBlock(0, 0))
blkfileMgrWrapper.addBlocks(blocks)
blkfileMgrWrapper.close()
filePath := deriveBlockfilePath(env.provider.conf.getLedgerBlockDir(ledgerid), 0)
_, fileSize, err := fileutil.FileExists(filePath)
require.NoError(t, err)
file, err := os.OpenFile(filePath, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0o660)
require.NoError(t, err)
defer file.Close()
err = file.Truncate(fileSize - 1)
require.NoError(t, err)
lastBlockBytes, _, numBlocks, err := scanForLastCompleteBlock(env.provider.conf.getLedgerBlockDir(ledgerid), 0, 0)
require.NoError(t, err)
require.Equal(t, len(blocks)-1, numBlocks)
expectedLastBlockBytes, _, err := serializeBlock(blocks[len(blocks)-2])
require.NoError(t, err)
require.Equal(t, expectedLastBlockBytes, lastBlockBytes)
}