github.com/leonlxy/hyperledger@v1.0.0-alpha.0.20170427033203-34922035d248/core/ledger/kvledger/kv_ledger_provider_test.go (about) 1 /* 2 Copyright IBM Corp. 2016 All Rights Reserved. 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. 15 */ 16 17 package kvledger 18 19 import ( 20 "fmt" 21 "os" 22 "path/filepath" 23 "testing" 24 25 configtxtest "github.com/hyperledger/fabric/common/configtx/test" 26 "github.com/hyperledger/fabric/common/ledger/blkstorage/fsblkstorage" 27 "github.com/hyperledger/fabric/common/ledger/testutil" 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" 34 ) 35 36 func TestLedgerProvider(t *testing.T) { 37 env := newTestEnv(t) 38 defer env.cleanup() 39 numLedgers := 10 40 provider, _ := NewProvider() 41 existingLedgerIDs, err := provider.List() 42 testutil.AssertNoError(t, err, "") 43 testutil.AssertEquals(t, len(existingLedgerIDs), 0) 44 for i := 0; i < numLedgers; i++ { 45 genesisBlock, _ := configtxtest.MakeGenesisBlock(constructTestLedgerID(i)) 46 provider.Create(genesisBlock) 47 } 48 existingLedgerIDs, err = provider.List() 49 testutil.AssertNoError(t, err, "") 50 testutil.AssertEquals(t, len(existingLedgerIDs), numLedgers) 51 52 provider.Close() 53 54 provider, _ = NewProvider() 55 defer provider.Close() 56 ledgerIds, _ := provider.List() 57 testutil.AssertEquals(t, len(ledgerIds), numLedgers) 58 t.Logf("ledgerIDs=%#v", ledgerIds) 59 for i := 0; i < numLedgers; i++ { 60 testutil.AssertEquals(t, ledgerIds[i], constructTestLedgerID(i)) 61 } 62 for i := 0; i < numLedgers; i++ { 63 ledger, err := provider.Open(constructTestLedgerID(i)) 64 testutil.AssertNoError(t, err, "") 65 bcInfo, err := ledger.GetBlockchainInfo() 66 ledger.Close() 67 testutil.AssertNoError(t, err, "") 68 testutil.AssertEquals(t, bcInfo.Height, uint64(1)) 69 } 70 gb, _ := configtxtest.MakeGenesisBlock(constructTestLedgerID(2)) 71 _, err = provider.Create(gb) 72 testutil.AssertEquals(t, err, ErrLedgerIDExists) 73 74 _, err = provider.Open(constructTestLedgerID(numLedgers)) 75 testutil.AssertEquals(t, err, ErrNonExistingLedgerID) 76 } 77 78 func TestMultipleLedgerBasicRW(t *testing.T) { 79 env := newTestEnv(t) 80 defer env.cleanup() 81 numLedgers := 10 82 provider, _ := NewProvider() 83 ledgers := make([]ledger.PeerLedger, numLedgers) 84 for i := 0; i < numLedgers; i++ { 85 bg, gb := testutil.NewBlockGenerator(t, constructTestLedgerID(i), false) 86 l, err := provider.Create(gb) 87 testutil.AssertNoError(t, err, "") 88 ledgers[i] = l 89 s, _ := l.NewTxSimulator() 90 err = s.SetState("ns", "testKey", []byte(fmt.Sprintf("testValue_%d", i))) 91 s.Done() 92 testutil.AssertNoError(t, err, "") 93 res, err := s.GetTxSimulationResults() 94 testutil.AssertNoError(t, err, "") 95 b := bg.NextBlock([][]byte{res}) 96 err = l.Commit(b) 97 l.Close() 98 testutil.AssertNoError(t, err, "") 99 } 100 101 provider.Close() 102 103 provider, _ = NewProvider() 104 defer provider.Close() 105 ledgers = make([]ledger.PeerLedger, numLedgers) 106 for i := 0; i < numLedgers; i++ { 107 l, err := provider.Open(constructTestLedgerID(i)) 108 testutil.AssertNoError(t, err, "") 109 ledgers[i] = l 110 } 111 112 for i, l := range ledgers { 113 q, _ := l.NewQueryExecutor() 114 val, err := q.GetState("ns", "testKey") 115 q.Done() 116 testutil.AssertNoError(t, err, "") 117 testutil.AssertEquals(t, val, []byte(fmt.Sprintf("testValue_%d", i))) 118 l.Close() 119 } 120 } 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 234 func constructTestLedgerID(i int) string { 235 return fmt.Sprintf("ledger_%06d", i) 236 }