@@ -18,11 +18,19 @@ package kvledger
18
18
19
19
import (
20
20
"fmt"
21
+ "os"
22
+ "path/filepath"
21
23
"testing"
22
24
23
25
configtxtest "github.com/hyperledger/fabric/common/configtx/test"
26
+ "github.com/hyperledger/fabric/common/ledger/blkstorage/fsblkstorage"
24
27
"github.com/hyperledger/fabric/common/ledger/testutil"
25
28
"github.com/hyperledger/fabric/core/ledger"
29
+ "github.com/hyperledger/fabric/core/ledger/ledgerconfig"
30
+ "github.com/hyperledger/fabric/protos/common"
31
+ "github.com/hyperledger/fabric/protos/ledger/queryresult"
32
+ putils "github.com/hyperledger/fabric/protos/utils"
33
+ "github.com/spf13/viper"
26
34
)
27
35
28
36
func TestLedgerProvider (t * testing.T ) {
@@ -111,6 +119,118 @@ func TestMultipleLedgerBasicRW(t *testing.T) {
111
119
}
112
120
}
113
121
122
+ func TestLedgerBackup (t * testing.T ) {
123
+ ledgerid := "TestLedger"
124
+ originalPath := "/tmp/fabric/ledgertests/kvledger1"
125
+ restorePath := "/tmp/fabric/ledgertests/kvledger2"
126
+ viper .Set ("ledger.history.enableHistoryDatabase" , true )
127
+
128
+ // create and populate a ledger in the original environment
129
+ env := createTestEnv (t , originalPath )
130
+ provider , _ := NewProvider ()
131
+ bg , gb := testutil .NewBlockGenerator (t , ledgerid , false )
132
+ gbHash := gb .Header .Hash ()
133
+ ledger , _ := provider .Create (gb )
134
+
135
+ simulator , _ := ledger .NewTxSimulator ()
136
+ simulator .SetState ("ns1" , "key1" , []byte ("value1" ))
137
+ simulator .SetState ("ns1" , "key2" , []byte ("value2" ))
138
+ simulator .SetState ("ns1" , "key3" , []byte ("value3" ))
139
+ simulator .Done ()
140
+ simRes , _ := simulator .GetTxSimulationResults ()
141
+ block1 := bg .NextBlock ([][]byte {simRes })
142
+ ledger .Commit (block1 )
143
+
144
+ simulator , _ = ledger .NewTxSimulator ()
145
+ simulator .SetState ("ns1" , "key1" , []byte ("value4" ))
146
+ simulator .SetState ("ns1" , "key2" , []byte ("value5" ))
147
+ simulator .SetState ("ns1" , "key3" , []byte ("value6" ))
148
+ simulator .Done ()
149
+ simRes , _ = simulator .GetTxSimulationResults ()
150
+ block2 := bg .NextBlock ([][]byte {simRes })
151
+ ledger .Commit (block2 )
152
+
153
+ ledger .Close ()
154
+ provider .Close ()
155
+
156
+ // Create restore environment
157
+ env = createTestEnv (t , restorePath )
158
+
159
+ // remove the statedb, historydb, and block indexes (they are suppoed to be auto created during opening of an existing ledger)
160
+ // and rename the originalPath to restorePath
161
+ testutil .AssertNoError (t , os .RemoveAll (ledgerconfig .GetStateLevelDBPath ()), "" )
162
+ testutil .AssertNoError (t , os .RemoveAll (ledgerconfig .GetHistoryLevelDBPath ()), "" )
163
+ testutil .AssertNoError (t , os .RemoveAll (filepath .Join (ledgerconfig .GetBlockStorePath (), fsblkstorage .IndexDir )), "" )
164
+ testutil .AssertNoError (t , os .Rename (originalPath , restorePath ), "" )
165
+ defer env .cleanup ()
166
+
167
+ // Instantiate the ledger from restore environment and this should behave exactly as it would have in the original environment
168
+ provider , _ = NewProvider ()
169
+ defer provider .Close ()
170
+
171
+ _ , err := provider .Create (gb )
172
+ testutil .AssertEquals (t , err , ErrLedgerIDExists )
173
+
174
+ ledger , _ = provider .Open (ledgerid )
175
+ defer ledger .Close ()
176
+
177
+ block1Hash := block1 .Header .Hash ()
178
+ block2Hash := block2 .Header .Hash ()
179
+ bcInfo , _ := ledger .GetBlockchainInfo ()
180
+ testutil .AssertEquals (t , bcInfo , & common.BlockchainInfo {
181
+ Height : 3 , CurrentBlockHash : block2Hash , PreviousBlockHash : block1Hash })
182
+
183
+ b0 , _ := ledger .GetBlockByHash (gbHash )
184
+ testutil .AssertEquals (t , b0 , gb )
185
+
186
+ b1 , _ := ledger .GetBlockByHash (block1Hash )
187
+ testutil .AssertEquals (t , b1 , block1 )
188
+
189
+ b2 , _ := ledger .GetBlockByHash (block2Hash )
190
+ testutil .AssertEquals (t , b2 , block2 )
191
+
192
+ b0 , _ = ledger .GetBlockByNumber (0 )
193
+ testutil .AssertEquals (t , b0 , gb )
194
+
195
+ b1 , _ = ledger .GetBlockByNumber (1 )
196
+ testutil .AssertEquals (t , b1 , block1 )
197
+
198
+ b2 , _ = ledger .GetBlockByNumber (2 )
199
+ testutil .AssertEquals (t , b2 , block2 )
200
+
201
+ // get the tran id from the 2nd block, then use it to test GetTransactionByID()
202
+ txEnvBytes2 := block1 .Data .Data [0 ]
203
+ txEnv2 , err := putils .GetEnvelopeFromBlock (txEnvBytes2 )
204
+ testutil .AssertNoError (t , err , "Error upon GetEnvelopeFromBlock" )
205
+ payload2 , err := putils .GetPayload (txEnv2 )
206
+ testutil .AssertNoError (t , err , "Error upon GetPayload" )
207
+ chdr , err := putils .UnmarshalChannelHeader (payload2 .Header .ChannelHeader )
208
+ testutil .AssertNoError (t , err , "Error upon GetChannelHeaderFromBytes" )
209
+ txID2 := chdr .TxId
210
+ processedTran2 , err := ledger .GetTransactionByID (txID2 )
211
+ testutil .AssertNoError (t , err , "Error upon GetTransactionByID" )
212
+ // get the tran envelope from the retrieved ProcessedTransaction
213
+ retrievedTxEnv2 := processedTran2 .TransactionEnvelope
214
+ testutil .AssertEquals (t , retrievedTxEnv2 , txEnv2 )
215
+
216
+ qe , _ := ledger .NewQueryExecutor ()
217
+ value1 , _ := qe .GetState ("ns1" , "key1" )
218
+ testutil .AssertEquals (t , value1 , []byte ("value4" ))
219
+
220
+ hqe , err := ledger .NewHistoryQueryExecutor ()
221
+ testutil .AssertNoError (t , err , "" )
222
+ itr , err := hqe .GetHistoryForKey ("ns1" , "key1" )
223
+ testutil .AssertNoError (t , err , "" )
224
+ defer itr .Close ()
225
+
226
+ result1 , err := itr .Next ()
227
+ testutil .AssertNoError (t , err , "" )
228
+ testutil .AssertEquals (t , result1 .(* queryresult.KeyModification ).Value , []byte ("value1" ))
229
+ result2 , err := itr .Next ()
230
+ testutil .AssertNoError (t , err , "" )
231
+ testutil .AssertEquals (t , result2 .(* queryresult.KeyModification ).Value , []byte ("value4" ))
232
+ }
233
+
114
234
func constructTestLedgerID (i int ) string {
115
235
return fmt .Sprintf ("ledger_%06d" , i )
116
236
}
0 commit comments