Skip to content

Commit

Permalink
Add unittest of writting multiple blocks for BlockWriter
Browse files Browse the repository at this point in the history
Signed-off-by: alexzcdu <alexzcdu@tencent.com>
  • Loading branch information
alexzcdu authored and C0rWin committed Sep 30, 2021
1 parent d0b32ed commit 7124587
Showing 1 changed file with 68 additions and 0 deletions.
68 changes: 68 additions & 0 deletions orderer/common/multichannel/blockwriter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,74 @@ func TestRaceWriteConfig(t *testing.T) {
require.Equal(t, consenterMetadata1, omd.Value)
}

func TestRaceWriteBlocks(t *testing.T) {
confSys := genesisconfig.Load(genesisconfig.SampleInsecureSoloProfile, configtest.GetDevConfigDir())
genesisBlockSys := encoder.New(confSys).GenesisBlock()

tmpdir, err := ioutil.TempDir("", "file-ledger")
require.NoError(t, err)
defer os.RemoveAll(tmpdir)

_, l := newLedgerAndFactory(tmpdir, "testchannelid", genesisBlockSys)

fakeConfig := &mock.OrdererConfig{}
fakeConfig.ConsensusTypeReturns("solo")

cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
require.NoError(t, err)

mockValidator := &mocks.ConfigTXValidator{}
bw := newBlockWriter(genesisBlockSys, nil,
&mockBlockWriterSupport{
SignerSerializer: mockCrypto(),
ReadWriter: l,
ConfigTXValidator: mockValidator,
fakeConfig: fakeConfig,
bccsp: cryptoProvider,
},
)

ctx := makeConfigTxFull("testchannelid", 1)
block1 := protoutil.NewBlock(1, protoutil.BlockHeaderHash(genesisBlockSys.Header))
block1.Data.Data = [][]byte{protoutil.MarshalOrPanic(ctx)}
consenterMetadata1 := []byte("foo")
mockValidator.SequenceReturnsOnCall(1, 1)

ctx = makeConfigTxFull("testchannelid", 1)
block2 := protoutil.NewBlock(2, protoutil.BlockHeaderHash(block1.Header))
block2.Data.Data = [][]byte{protoutil.MarshalOrPanic(ctx)}
consenterMetadata2 := []byte("bar")
mockValidator.SequenceReturnsOnCall(2, 2)

ctx = makeConfigTxFull("testchannelid", 1)
block3 := protoutil.NewBlock(3, protoutil.BlockHeaderHash(block2.Header))
block3.Data.Data = [][]byte{protoutil.MarshalOrPanic(ctx)}
consenterMetadata3 := []byte("3")
mockValidator.SequenceReturnsOnCall(3, 3)

bw.WriteBlock(block1, consenterMetadata1)
bw.WriteBlock(block2, consenterMetadata2)
bw.WriteConfigBlock(block3, consenterMetadata3)

cBlock, err := blockledger.GetBlockByNumber(l, block1.Header.Number)
require.Nil(t, err)
require.Equal(t, block1.Header, cBlock.Header)
require.Equal(t, block1.Data, cBlock.Data)

cBlock, err = blockledger.GetBlockByNumber(l, block2.Header.Number)
require.Nil(t, err)
require.Equal(t, block2.Header, cBlock.Header)
require.Equal(t, block2.Data, cBlock.Data)

cBlock, err = blockledger.GetBlockByNumber(l, block3.Header.Number)
require.Nil(t, err)
require.Equal(t, block3.Header, cBlock.Header)
require.Equal(t, block3.Data, cBlock.Data)

expectedLastConfigBlockNumber := block3.Header.Number
testLastConfigBlockNumber(t, block3, expectedLastConfigBlockNumber)
}

func testLastConfigBlockNumber(t *testing.T, block *cb.Block, expectedBlockNumber uint64) {
metadata := &cb.Metadata{}
err := proto.Unmarshal(block.Metadata.Metadata[cb.BlockMetadataIndex_SIGNATURES], metadata)
Expand Down

0 comments on commit 7124587

Please sign in to comment.