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  }