Skip to content

Commit 8d8d20d

Browse files
committed
[FAB-8361]: Remove ledger dep. for committer UT
Removes dependency of ledger package from committer UT to enable test parallezation and to improve execution time. Change-Id: Ie23c9038ad8f1d5798d79b5f178e6b800a059d2f Signed-off-by: Artem Barger <bartem@il.ibm.com>
1 parent e54cb8a commit 8d8d20d

File tree

1 file changed

+156
-54
lines changed

1 file changed

+156
-54
lines changed

core/committer/committer_test.go

+156-54
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,155 @@
11
/*
2-
Copyright IBM Corp. 2016 All Rights Reserved.
2+
Copyright IBM Corp. All Rights Reserved.
33
4-
Licensed under the Apache License, Version 2.0 (the "License");
5-
you may not use this file except in compliance with the License.
6-
You may obtain a copy of the License at
7-
8-
http://www.apache.org/licenses/LICENSE-2.0
9-
10-
Unless required by applicable law or agreed to in writing, software
11-
distributed under the License is distributed on an "AS IS" BASIS,
12-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13-
See the License for the specific language governing permissions and
14-
limitations under the License.
4+
SPDX-License-Identifier: Apache-2.0
155
*/
166

177
package committer
188

199
import (
10+
"errors"
2011
"sync/atomic"
2112
"testing"
2213

2314
"github.com/hyperledger/fabric/common/configtx/test"
15+
"github.com/hyperledger/fabric/common/ledger"
2416
"github.com/hyperledger/fabric/common/ledger/testutil"
2517
"github.com/hyperledger/fabric/common/tools/configtxgen/encoder"
2618
"github.com/hyperledger/fabric/common/tools/configtxgen/localconfig"
27-
"github.com/hyperledger/fabric/common/util"
2819
ledger2 "github.com/hyperledger/fabric/core/ledger"
29-
"github.com/hyperledger/fabric/core/ledger/ledgermgmt"
3020
"github.com/hyperledger/fabric/protos/common"
31-
"github.com/spf13/viper"
21+
"github.com/hyperledger/fabric/protos/peer"
3222
"github.com/stretchr/testify/assert"
23+
"github.com/stretchr/testify/mock"
3324
)
3425

26+
type mockLedger struct {
27+
height uint64
28+
currentHash []byte
29+
previousHash []byte
30+
mock.Mock
31+
}
32+
33+
func (m *mockLedger) GetBlockchainInfo() (*common.BlockchainInfo, error) {
34+
info := &common.BlockchainInfo{
35+
Height: m.height,
36+
CurrentBlockHash: m.currentHash,
37+
PreviousBlockHash: m.previousHash,
38+
}
39+
return info, nil
40+
}
41+
42+
func (m *mockLedger) GetBlockByNumber(blockNumber uint64) (*common.Block, error) {
43+
args := m.Called(blockNumber)
44+
return args.Get(0).(*common.Block), args.Error(1)
45+
}
46+
47+
func (m *mockLedger) GetBlocksIterator(startBlockNumber uint64) (ledger.ResultsIterator, error) {
48+
args := m.Called(startBlockNumber)
49+
return args.Get(0).(ledger.ResultsIterator), args.Error(1)
50+
}
51+
52+
func (m *mockLedger) Close() {
53+
54+
}
55+
56+
func (m *mockLedger) GetTransactionByID(txID string) (*peer.ProcessedTransaction, error) {
57+
args := m.Called(txID)
58+
return args.Get(0).(*peer.ProcessedTransaction), args.Error(1)
59+
}
60+
61+
func (m *mockLedger) GetBlockByHash(blockHash []byte) (*common.Block, error) {
62+
args := m.Called(blockHash)
63+
return args.Get(0).(*common.Block), args.Error(1)
64+
}
65+
66+
func (m *mockLedger) GetBlockByTxID(txID string) (*common.Block, error) {
67+
args := m.Called(txID)
68+
return args.Get(0).(*common.Block), args.Error(1)
69+
}
70+
71+
func (m *mockLedger) GetTxValidationCodeByTxID(txID string) (peer.TxValidationCode, error) {
72+
args := m.Called(txID)
73+
return args.Get(0).(peer.TxValidationCode), args.Error(1)
74+
}
75+
76+
func (m *mockLedger) NewTxSimulator(txid string) (ledger2.TxSimulator, error) {
77+
args := m.Called(txid)
78+
return args.Get(0).(ledger2.TxSimulator), args.Error(1)
79+
}
80+
81+
func (m *mockLedger) NewQueryExecutor() (ledger2.QueryExecutor, error) {
82+
args := m.Called()
83+
return args.Get(0).(ledger2.QueryExecutor), args.Error(1)
84+
}
85+
86+
func (m *mockLedger) NewHistoryQueryExecutor() (ledger2.HistoryQueryExecutor, error) {
87+
args := m.Called()
88+
return args.Get(0).(ledger2.HistoryQueryExecutor), args.Error(1)
89+
}
90+
91+
func (m *mockLedger) GetPvtDataAndBlockByNum(blockNum uint64, filter ledger2.PvtNsCollFilter) (*ledger2.BlockAndPvtData, error) {
92+
args := m.Called(blockNum, filter)
93+
return args.Get(0).(*ledger2.BlockAndPvtData), args.Error(1)
94+
}
95+
96+
func (m *mockLedger) GetPvtDataByNum(blockNum uint64, filter ledger2.PvtNsCollFilter) ([]*ledger2.TxPvtData, error) {
97+
args := m.Called(blockNum, filter)
98+
return args.Get(0).([]*ledger2.TxPvtData), args.Error(1)
99+
}
100+
101+
func (m *mockLedger) CommitWithPvtData(blockAndPvtdata *ledger2.BlockAndPvtData) error {
102+
m.height += 1
103+
m.previousHash = m.currentHash
104+
m.currentHash = blockAndPvtdata.Block.Header.DataHash
105+
args := m.Called(blockAndPvtdata)
106+
return args.Error(0)
107+
}
108+
109+
func (m *mockLedger) PurgePrivateData(maxBlockNumToRetain uint64) error {
110+
args := m.Called(maxBlockNumToRetain)
111+
return args.Error(0)
112+
}
113+
114+
func (m *mockLedger) PrivateDataMinBlockNum() (uint64, error) {
115+
args := m.Called()
116+
return args.Get(0).(uint64), args.Error(1)
117+
}
118+
119+
func (m *mockLedger) Prune(policy ledger.PrunePolicy) error {
120+
args := m.Called(policy)
121+
return args.Error(0)
122+
}
123+
124+
func createLedger(channelID string) (*common.Block, *mockLedger) {
125+
gb, _ := test.MakeGenesisBlock(channelID)
126+
ledger := &mockLedger{
127+
height: 1,
128+
previousHash: []byte{},
129+
currentHash: gb.Header.DataHash,
130+
}
131+
return gb, ledger
132+
}
133+
35134
func TestKVLedgerBlockStorage(t *testing.T) {
36-
viper.Set("peer.fileSystemPath", "/tmp/fabric/committertest")
37-
ledgermgmt.InitializeTestEnv()
38-
defer ledgermgmt.CleanupTestEnv()
39-
gb, _ := test.MakeGenesisBlock("TestLedger")
40-
gbHash := gb.Header.Hash()
41-
ledger, err := ledgermgmt.CreateLedger(gb)
42-
assert.NoError(t, err, "Error while creating ledger: %s", err)
43-
defer ledger.Close()
135+
t.Parallel()
136+
gb, ledger := createLedger("TestLedger")
137+
block1 := testutil.ConstructBlock(t, 1, gb.Header.DataHash, [][]byte{{1, 2, 3, 4}, {5, 6, 7, 8}}, true)
138+
139+
ledger.On("CommitWithPvtData", mock.Anything).Run(func(args mock.Arguments) {
140+
b := args.Get(0).(*ledger2.BlockAndPvtData)
141+
assert.Equal(t, uint64(1), b.Block.Header.GetNumber())
142+
assert.Equal(t, gb.Header.DataHash, b.Block.Header.PreviousHash)
143+
assert.Equal(t, block1.Header.DataHash, b.Block.Header.DataHash)
144+
}).Return(nil)
145+
146+
ledger.On("GetBlockByNumber", uint64(0)).Return(gb, nil)
44147

45148
committer := NewLedgerCommitter(ledger)
46149
height, err := committer.LedgerHeight()
47150
assert.Equal(t, uint64(1), height)
48151
assert.NoError(t, err)
49152

50-
bcInfo, _ := ledger.GetBlockchainInfo()
51-
testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{
52-
Height: 1, CurrentBlockHash: gbHash, PreviousBlockHash: nil})
53-
54-
txid := util.GenerateUUID()
55-
simulator, _ := ledger.NewTxSimulator(txid)
56-
simulator.SetState("ns1", "key1", []byte("value1"))
57-
simulator.SetState("ns1", "key2", []byte("value2"))
58-
simulator.SetState("ns1", "key3", []byte("value3"))
59-
simulator.Done()
60-
61-
simRes, _ := simulator.GetTxSimulationResults()
62-
simResBytes, _ := simRes.GetPubSimulationBytes()
63-
block1 := testutil.ConstructBlock(t, 1, gbHash, [][]byte{simResBytes}, true)
64-
65153
err = committer.CommitWithPvtData(&ledger2.BlockAndPvtData{
66154
Block: block1,
67155
})
@@ -74,25 +162,13 @@ func TestKVLedgerBlockStorage(t *testing.T) {
74162
blocks := committer.GetBlocks([]uint64{0})
75163
assert.Equal(t, 1, len(blocks))
76164
assert.NoError(t, err)
77-
78-
bcInfo, _ = ledger.GetBlockchainInfo()
79-
block1Hash := block1.Header.Hash()
80-
testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{
81-
Height: 2, CurrentBlockHash: block1Hash, PreviousBlockHash: gbHash})
82165
}
83166

84167
func TestNewLedgerCommitterReactive(t *testing.T) {
85-
viper.Set("peer.fileSystemPath", "/tmp/fabric/committertest")
168+
t.Parallel()
86169
chainID := "TestLedger"
87-
88-
ledgermgmt.InitializeTestEnv()
89-
defer ledgermgmt.CleanupTestEnv()
90-
gb, _ := test.MakeGenesisBlock(chainID)
91-
92-
ledger, err := ledgermgmt.CreateLedger(gb)
93-
assert.NoError(t, err, "Error while creating ledger: %s", err)
94-
defer ledger.Close()
95-
170+
_, ledger := createLedger(chainID)
171+
ledger.On("CommitWithPvtData", mock.Anything).Return(nil)
96172
var configArrived int32
97173
committer := NewLedgerCommitterReactive(ledger, func(_ *common.Block) error {
98174
atomic.AddInt32(&configArrived, 1)
@@ -106,8 +182,34 @@ func TestNewLedgerCommitterReactive(t *testing.T) {
106182
profile := localconfig.Load(localconfig.SampleSingleMSPSoloProfile)
107183
block := encoder.New(profile).GenesisBlockForChannel(chainID)
108184

109-
committer.CommitWithPvtData(&ledger2.BlockAndPvtData{
185+
err = committer.CommitWithPvtData(&ledger2.BlockAndPvtData{
110186
Block: block,
111187
})
188+
assert.NoError(t, err)
112189
assert.Equal(t, int32(1), atomic.LoadInt32(&configArrived))
113190
}
191+
192+
func TestNewLedgerCommitterReactiveFailedConfigUpdate(t *testing.T) {
193+
t.Parallel()
194+
chainID := "TestLedger"
195+
_, ledger := createLedger(chainID)
196+
ledger.On("CommitWithPvtData", mock.Anything).Return(nil)
197+
var configArrived int32
198+
committer := NewLedgerCommitterReactive(ledger, func(_ *common.Block) error {
199+
return errors.New("failed update config")
200+
})
201+
202+
height, err := committer.LedgerHeight()
203+
assert.Equal(t, uint64(1), height)
204+
assert.NoError(t, err)
205+
206+
profile := localconfig.Load(localconfig.SampleSingleMSPSoloProfile)
207+
block := encoder.New(profile).GenesisBlockForChannel(chainID)
208+
209+
err = committer.CommitWithPvtData(&ledger2.BlockAndPvtData{
210+
Block: block,
211+
})
212+
213+
assert.Error(t, err)
214+
assert.Equal(t, int32(0), atomic.LoadInt32(&configArrived))
215+
}

0 commit comments

Comments
 (0)