1
1
/*
2
- Copyright IBM Corp. 2016 All Rights Reserved.
2
+ Copyright IBM Corp. All Rights Reserved.
3
3
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
15
5
*/
16
6
17
7
package committer
18
8
19
9
import (
10
+ "errors"
20
11
"sync/atomic"
21
12
"testing"
22
13
23
14
"github.com/hyperledger/fabric/common/configtx/test"
15
+ "github.com/hyperledger/fabric/common/ledger"
24
16
"github.com/hyperledger/fabric/common/ledger/testutil"
25
17
"github.com/hyperledger/fabric/common/tools/configtxgen/encoder"
26
18
"github.com/hyperledger/fabric/common/tools/configtxgen/localconfig"
27
- "github.com/hyperledger/fabric/common/util"
28
19
ledger2 "github.com/hyperledger/fabric/core/ledger"
29
- "github.com/hyperledger/fabric/core/ledger/ledgermgmt"
30
20
"github.com/hyperledger/fabric/protos/common"
31
- "github.com/spf13/viper "
21
+ "github.com/hyperledger/fabric/protos/peer "
32
22
"github.com/stretchr/testify/assert"
23
+ "github.com/stretchr/testify/mock"
33
24
)
34
25
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
+
35
134
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 )
44
147
45
148
committer := NewLedgerCommitter (ledger )
46
149
height , err := committer .LedgerHeight ()
47
150
assert .Equal (t , uint64 (1 ), height )
48
151
assert .NoError (t , err )
49
152
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
-
65
153
err = committer .CommitWithPvtData (& ledger2.BlockAndPvtData {
66
154
Block : block1 ,
67
155
})
@@ -74,25 +162,13 @@ func TestKVLedgerBlockStorage(t *testing.T) {
74
162
blocks := committer .GetBlocks ([]uint64 {0 })
75
163
assert .Equal (t , 1 , len (blocks ))
76
164
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 })
82
165
}
83
166
84
167
func TestNewLedgerCommitterReactive (t * testing.T ) {
85
- viper . Set ( "peer.fileSystemPath" , "/tmp/fabric/committertest" )
168
+ t . Parallel ( )
86
169
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 )
96
172
var configArrived int32
97
173
committer := NewLedgerCommitterReactive (ledger , func (_ * common.Block ) error {
98
174
atomic .AddInt32 (& configArrived , 1 )
@@ -106,8 +182,34 @@ func TestNewLedgerCommitterReactive(t *testing.T) {
106
182
profile := localconfig .Load (localconfig .SampleSingleMSPSoloProfile )
107
183
block := encoder .New (profile ).GenesisBlockForChannel (chainID )
108
184
109
- committer .CommitWithPvtData (& ledger2.BlockAndPvtData {
185
+ err = committer .CommitWithPvtData (& ledger2.BlockAndPvtData {
110
186
Block : block ,
111
187
})
188
+ assert .NoError (t , err )
112
189
assert .Equal (t , int32 (1 ), atomic .LoadInt32 (& configArrived ))
113
190
}
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