github.com/adnan-c/fabric_e2e_couchdb@v0.6.1-preview.0.20170228180935-21ce6b23cf91/core/ledger/kvledger/kv_ledger_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  	"strconv"
    22  	"testing"
    23  
    24  	"github.com/hyperledger/fabric/common/ledger/testutil"
    25  	ledgerpackage "github.com/hyperledger/fabric/core/ledger"
    26  	"github.com/hyperledger/fabric/core/ledger/ledgerconfig"
    27  	ledgertestutil "github.com/hyperledger/fabric/core/ledger/testutil"
    28  	"github.com/hyperledger/fabric/protos/common"
    29  	putils "github.com/hyperledger/fabric/protos/utils"
    30  	"github.com/stretchr/testify/assert"
    31  )
    32  
    33  func TestKVLedgerBlockStorage(t *testing.T) {
    34  	env := newTestEnv(t)
    35  	defer env.cleanup()
    36  	provider, _ := NewProvider()
    37  	defer provider.Close()
    38  	ledger, _ := provider.Create("testLedger")
    39  	defer ledger.Close()
    40  
    41  	bcInfo, _ := ledger.GetBlockchainInfo()
    42  	testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{
    43  		Height: 0, CurrentBlockHash: nil, PreviousBlockHash: nil})
    44  
    45  	simulator, _ := ledger.NewTxSimulator()
    46  	simulator.SetState("ns1", "key1", []byte("value1"))
    47  	simulator.SetState("ns1", "key2", []byte("value2"))
    48  	simulator.SetState("ns1", "key3", []byte("value3"))
    49  	simulator.Done()
    50  	simRes, _ := simulator.GetTxSimulationResults()
    51  	bg := testutil.NewBlockGenerator(t)
    52  	block0 := bg.NextBlock([][]byte{simRes}, false)
    53  	ledger.Commit(block0)
    54  
    55  	bcInfo, _ = ledger.GetBlockchainInfo()
    56  	block1Hash := block0.Header.Hash()
    57  	testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{
    58  		Height: 1, CurrentBlockHash: block1Hash, PreviousBlockHash: []byte{}})
    59  
    60  	simulator, _ = ledger.NewTxSimulator()
    61  	simulator.SetState("ns1", "key1", []byte("value4"))
    62  	simulator.SetState("ns1", "key2", []byte("value5"))
    63  	simulator.SetState("ns1", "key3", []byte("value6"))
    64  	simulator.Done()
    65  	simRes, _ = simulator.GetTxSimulationResults()
    66  	block1 := bg.NextBlock([][]byte{simRes}, false)
    67  	ledger.Commit(block1)
    68  
    69  	bcInfo, _ = ledger.GetBlockchainInfo()
    70  	block2Hash := block1.Header.Hash()
    71  	testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{
    72  		Height: 2, CurrentBlockHash: block2Hash, PreviousBlockHash: block0.Header.Hash()})
    73  
    74  	b0, _ := ledger.GetBlockByHash(block1Hash)
    75  	testutil.AssertEquals(t, b0, block0)
    76  
    77  	b1, _ := ledger.GetBlockByHash(block2Hash)
    78  	testutil.AssertEquals(t, b1, block1)
    79  
    80  	b0, _ = ledger.GetBlockByNumber(0)
    81  	testutil.AssertEquals(t, b0, block0)
    82  
    83  	b1, _ = ledger.GetBlockByNumber(1)
    84  	testutil.AssertEquals(t, b1, block1)
    85  
    86  	// get the tran id from the 2nd block, then use it to test GetTransactionByID()
    87  	txEnvBytes2 := block1.Data.Data[0]
    88  	txEnv2, err := putils.GetEnvelopeFromBlock(txEnvBytes2)
    89  	testutil.AssertNoError(t, err, "Error upon GetEnvelopeFromBlock")
    90  	payload2, err := putils.GetPayload(txEnv2)
    91  	testutil.AssertNoError(t, err, "Error upon GetPayload")
    92  	chdr, err := putils.UnmarshalChannelHeader(payload2.Header.ChannelHeader)
    93  	testutil.AssertNoError(t, err, "Error upon GetChannelHeaderFromBytes")
    94  	txID2 := chdr.TxId
    95  	processedTran2, err := ledger.GetTransactionByID(txID2)
    96  	testutil.AssertNoError(t, err, "Error upon GetTransactionByID")
    97  	// get the tran envelope from the retrieved ProcessedTransaction
    98  	retrievedTxEnv2 := processedTran2.TransactionEnvelope
    99  	testutil.AssertEquals(t, retrievedTxEnv2, txEnv2)
   100  
   101  }
   102  
   103  func TestKVLedgerDBRecovery(t *testing.T) {
   104  	ledgertestutil.SetupCoreYAMLConfig("./../../../peer")
   105  	env := newTestEnv(t)
   106  	defer env.cleanup()
   107  	provider, _ := NewProvider()
   108  	defer provider.Close()
   109  	ledger, _ := provider.Create("testLedger")
   110  	defer ledger.Close()
   111  
   112  	bcInfo, err := ledger.GetBlockchainInfo()
   113  	testutil.AssertNoError(t, err, "")
   114  	testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{
   115  		Height: 0, CurrentBlockHash: nil, PreviousBlockHash: nil})
   116  	//creating and committing the first block
   117  	simulator, _ := ledger.NewTxSimulator()
   118  	//simulating a transaction
   119  	simulator.SetState("ns1", "key1", []byte("value1.1"))
   120  	simulator.SetState("ns1", "key2", []byte("value2.1"))
   121  	simulator.SetState("ns1", "key3", []byte("value3.1"))
   122  	simulator.Done()
   123  	simRes, _ := simulator.GetTxSimulationResults()
   124  	//generating a block based on the simulation result
   125  	bg := testutil.NewBlockGenerator(t)
   126  	block1 := bg.NextBlock([][]byte{simRes}, false)
   127  	//performing validation of read and write set to find valid transactions
   128  	ledger.Commit(block1)
   129  	bcInfo, _ = ledger.GetBlockchainInfo()
   130  	block1Hash := block1.Header.Hash()
   131  	testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{
   132  		Height: 1, CurrentBlockHash: block1Hash, PreviousBlockHash: []byte{}})
   133  
   134  	//======================================================================================
   135  	//SCENARIO 1: peer fails before committing the second block to state DB
   136  	//and history DB (if exist)
   137  	//======================================================================================
   138  	simulator, _ = ledger.NewTxSimulator()
   139  	//simulating transaction
   140  	simulator.SetState("ns1", "key1", []byte("value1.2"))
   141  	simulator.SetState("ns1", "key2", []byte("value2.2"))
   142  	simulator.SetState("ns1", "key3", []byte("value3.2"))
   143  	simulator.Done()
   144  	simRes, _ = simulator.GetTxSimulationResults()
   145  	//generating a block based on the simulation result
   146  	block2 := bg.NextBlock([][]byte{simRes}, false)
   147  
   148  	//performing validation of read and write set to find valid transactions
   149  	ledger.(*kvLedger).txtmgmt.ValidateAndPrepare(block2, true)
   150  	//writing the validated block to block storage but not committing the transaction
   151  	//to state DB and history DB (if exist)
   152  	err = ledger.(*kvLedger).blockStore.AddBlock(block2)
   153  
   154  	//assume that peer fails here before committing the transaction
   155  	assert.NoError(t, err)
   156  
   157  	bcInfo, _ = ledger.GetBlockchainInfo()
   158  	block2Hash := block2.Header.Hash()
   159  	testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{
   160  		Height: 2, CurrentBlockHash: block2Hash, PreviousBlockHash: block1.Header.Hash()})
   161  
   162  	simulator, _ = ledger.NewTxSimulator()
   163  	value, _ := simulator.GetState("ns1", "key1")
   164  	//value for 'key1' should be 'value1' as the last commit failed
   165  	testutil.AssertEquals(t, value, []byte("value1.1"))
   166  	value, _ = simulator.GetState("ns1", "key2")
   167  	//value for 'key2' should be 'value2' as the last commit failed
   168  	testutil.AssertEquals(t, value, []byte("value2.1"))
   169  	value, _ = simulator.GetState("ns1", "key3")
   170  	//value for 'key3' should be 'value3' as the last commit failed
   171  	testutil.AssertEquals(t, value, []byte("value3.1"))
   172  	//savepoint in state DB should 0 as the last commit failed
   173  	stateDBSavepoint, _ := ledger.(*kvLedger).txtmgmt.GetLastSavepoint()
   174  	testutil.AssertEquals(t, stateDBSavepoint.BlockNum, uint64(0))
   175  
   176  	if ledgerconfig.IsHistoryDBEnabled() == true {
   177  		qhistory, _ := ledger.NewHistoryQueryExecutor()
   178  		itr, _ := qhistory.GetHistoryForKey("ns1", "key1")
   179  		count := 0
   180  		for {
   181  			kmod, err := itr.Next()
   182  			testutil.AssertNoError(t, err, "Error upon Next()")
   183  			if kmod == nil {
   184  				break
   185  			}
   186  			retrievedValue := kmod.(*ledgerpackage.KeyModification).Value
   187  			count++
   188  			expectedValue := []byte("value1." + strconv.Itoa(count))
   189  			testutil.AssertEquals(t, retrievedValue, expectedValue)
   190  		}
   191  		testutil.AssertEquals(t, count, 1)
   192  
   193  		//savepoint in history DB should 0 as the last commit failed
   194  		historyDBSavepoint, _ := ledger.(*kvLedger).historyDB.GetLastSavepoint()
   195  		testutil.AssertEquals(t, historyDBSavepoint.BlockNum, uint64(0))
   196  	}
   197  
   198  	simulator.Done()
   199  	ledger.Close()
   200  	provider.Close()
   201  
   202  	//we assume here that the peer comes online and calls NewKVLedger to get a handler for the ledger
   203  	//State DB should be recovered before returning from NewKVLedger call
   204  	provider, _ = NewProvider()
   205  	ledger, _ = provider.Open("testLedger")
   206  
   207  	simulator, _ = ledger.NewTxSimulator()
   208  	value, _ = simulator.GetState("ns1", "key1")
   209  	//value for 'key1' should be 'value4' after recovery
   210  	testutil.AssertEquals(t, value, []byte("value1.2"))
   211  	value, _ = simulator.GetState("ns1", "key2")
   212  	//value for 'key2' should be 'value5' after recovery
   213  	testutil.AssertEquals(t, value, []byte("value2.2"))
   214  	value, _ = simulator.GetState("ns1", "key3")
   215  	//value for 'key3' should be 'value6' after recovery
   216  	testutil.AssertEquals(t, value, []byte("value3.2"))
   217  	//savepoint in state DB should 2 after recovery
   218  	stateDBSavepoint, _ = ledger.(*kvLedger).txtmgmt.GetLastSavepoint()
   219  	testutil.AssertEquals(t, stateDBSavepoint.BlockNum, uint64(1))
   220  
   221  	if ledgerconfig.IsHistoryDBEnabled() == true {
   222  		qhistory, _ := ledger.NewHistoryQueryExecutor()
   223  		itr, _ := qhistory.GetHistoryForKey("ns1", "key1")
   224  		count := 0
   225  		for {
   226  			kmod, err := itr.Next()
   227  			testutil.AssertNoError(t, err, "Error upon Next()")
   228  			if kmod == nil {
   229  				break
   230  			}
   231  			retrievedValue := kmod.(*ledgerpackage.KeyModification).Value
   232  			count++
   233  			expectedValue := []byte("value1." + strconv.Itoa(count))
   234  			testutil.AssertEquals(t, retrievedValue, expectedValue)
   235  		}
   236  		testutil.AssertEquals(t, count, 2)
   237  
   238  		//savepoint in history DB should 2 after recovery
   239  		historyDBSavepoint, _ := ledger.(*kvLedger).historyDB.GetLastSavepoint()
   240  		testutil.AssertEquals(t, historyDBSavepoint.BlockNum, uint64(1))
   241  	}
   242  
   243  	simulator.Done()
   244  
   245  	//======================================================================================
   246  	//SCENARIO 2: peer fails after committing the third block to state DB
   247  	//but before committing to history DB (if exist)
   248  	//======================================================================================
   249  
   250  	simulator, _ = ledger.NewTxSimulator()
   251  	//simulating transaction
   252  	simulator.SetState("ns1", "key1", []byte("value1.3"))
   253  	simulator.SetState("ns1", "key2", []byte("value2.3"))
   254  	simulator.SetState("ns1", "key3", []byte("value3.3"))
   255  	simulator.Done()
   256  	simRes, _ = simulator.GetTxSimulationResults()
   257  	//generating a block based on the simulation result
   258  	block3 := bg.NextBlock([][]byte{simRes}, false)
   259  	//performing validation of read and write set to find valid transactions
   260  	ledger.(*kvLedger).txtmgmt.ValidateAndPrepare(block3, true)
   261  	//writing the validated block to block storage
   262  	err = ledger.(*kvLedger).blockStore.AddBlock(block3)
   263  	//committing the transaction to state DB
   264  	err = ledger.(*kvLedger).txtmgmt.Commit()
   265  	//assume that peer fails here after committing the transaction to state DB but before
   266  	//history DB
   267  	assert.NoError(t, err)
   268  
   269  	bcInfo, _ = ledger.GetBlockchainInfo()
   270  	block3Hash := block3.Header.Hash()
   271  	testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{
   272  		Height: 3, CurrentBlockHash: block3Hash, PreviousBlockHash: block2.Header.Hash()})
   273  
   274  	simulator, _ = ledger.NewTxSimulator()
   275  	value, _ = simulator.GetState("ns1", "key1")
   276  	//value for 'key1' should be 'value7'
   277  	testutil.AssertEquals(t, value, []byte("value1.3"))
   278  	value, _ = simulator.GetState("ns1", "key2")
   279  	//value for 'key2' should be 'value8'
   280  	testutil.AssertEquals(t, value, []byte("value2.3"))
   281  	value, _ = simulator.GetState("ns1", "key3")
   282  	//value for 'key3' should be 'value9'
   283  	testutil.AssertEquals(t, value, []byte("value3.3"))
   284  	//savepoint in state DB should 3
   285  	stateDBSavepoint, _ = ledger.(*kvLedger).txtmgmt.GetLastSavepoint()
   286  	testutil.AssertEquals(t, stateDBSavepoint.BlockNum, uint64(2))
   287  
   288  	if ledgerconfig.IsHistoryDBEnabled() == true {
   289  		qhistory, _ := ledger.NewHistoryQueryExecutor()
   290  		itr, _ := qhistory.GetHistoryForKey("ns1", "key1")
   291  		count := 0
   292  		for {
   293  			kmod, err := itr.Next()
   294  			testutil.AssertNoError(t, err, "Error upon Next()")
   295  			if kmod == nil {
   296  				break
   297  			}
   298  			retrievedValue := kmod.(*ledgerpackage.KeyModification).Value
   299  			count++
   300  			expectedValue := []byte("value1." + strconv.Itoa(count))
   301  			testutil.AssertEquals(t, retrievedValue, expectedValue)
   302  		}
   303  		testutil.AssertEquals(t, count, 2)
   304  
   305  		//savepoint in history DB should 2 as the last commit failed
   306  		historyDBSavepoint, _ := ledger.(*kvLedger).historyDB.GetLastSavepoint()
   307  		testutil.AssertEquals(t, historyDBSavepoint.BlockNum, uint64(1))
   308  	}
   309  	simulator.Done()
   310  	ledger.Close()
   311  	provider.Close()
   312  
   313  	//we assume here that the peer comes online and calls NewKVLedger to get a handler for the ledger
   314  	//history DB should be recovered before returning from NewKVLedger call
   315  	provider, _ = NewProvider()
   316  	ledger, _ = provider.Open("testLedger")
   317  	simulator, _ = ledger.NewTxSimulator()
   318  	stateDBSavepoint, _ = ledger.(*kvLedger).txtmgmt.GetLastSavepoint()
   319  	testutil.AssertEquals(t, stateDBSavepoint.BlockNum, uint64(2))
   320  
   321  	if ledgerconfig.IsHistoryDBEnabled() == true {
   322  		qhistory, _ := ledger.NewHistoryQueryExecutor()
   323  		itr, _ := qhistory.GetHistoryForKey("ns1", "key1")
   324  		count := 0
   325  		for {
   326  			kmod, err := itr.Next()
   327  			testutil.AssertNoError(t, err, "Error upon Next()")
   328  			if kmod == nil {
   329  				break
   330  			}
   331  			retrievedValue := kmod.(*ledgerpackage.KeyModification).Value
   332  			count++
   333  			expectedValue := []byte("value1." + strconv.Itoa(count))
   334  			testutil.AssertEquals(t, retrievedValue, expectedValue)
   335  		}
   336  		testutil.AssertEquals(t, count, 3)
   337  
   338  		//savepoint in history DB should 3 after recovery
   339  		historyDBSavepoint, _ := ledger.(*kvLedger).historyDB.GetLastSavepoint()
   340  		testutil.AssertEquals(t, historyDBSavepoint.BlockNum, uint64(2))
   341  	}
   342  	simulator.Done()
   343  
   344  	//Rare scenario
   345  
   346  	//======================================================================================
   347  	//SCENARIO 3: peer fails after committing the fourth block to history DB (if exist)
   348  	//but before committing to state DB
   349  	//======================================================================================
   350  	simulator, _ = ledger.NewTxSimulator()
   351  	//simulating transaction
   352  	simulator.SetState("ns1", "key1", []byte("value1.4"))
   353  	simulator.SetState("ns1", "key2", []byte("value2.4"))
   354  	simulator.SetState("ns1", "key3", []byte("value3.4"))
   355  	simulator.Done()
   356  	simRes, _ = simulator.GetTxSimulationResults()
   357  	//generating a block based on the simulation result
   358  	block4 := bg.NextBlock([][]byte{simRes}, false)
   359  	//performing validation of read and write set to find valid transactions
   360  	ledger.(*kvLedger).txtmgmt.ValidateAndPrepare(block4, true)
   361  	//writing the validated block to block storage but fails to commit to state DB but
   362  	//successfully commits to history DB (if exists)
   363  	err = ledger.(*kvLedger).blockStore.AddBlock(block4)
   364  	if ledgerconfig.IsHistoryDBEnabled() == true {
   365  		err = ledger.(*kvLedger).historyDB.Commit(block4)
   366  	}
   367  	assert.NoError(t, err)
   368  
   369  	bcInfo, _ = ledger.GetBlockchainInfo()
   370  	block4Hash := block4.Header.Hash()
   371  	testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{
   372  		Height: 4, CurrentBlockHash: block4Hash, PreviousBlockHash: block3.Header.Hash()})
   373  
   374  	simulator, _ = ledger.NewTxSimulator()
   375  	value, _ = simulator.GetState("ns1", "key1")
   376  	//value for 'key1' should be 'value7' as the last commit to State DB failed
   377  	testutil.AssertEquals(t, value, []byte("value1.3"))
   378  	value, _ = simulator.GetState("ns1", "key2")
   379  	//value for 'key2' should be 'value8' as the last commit to State DB failed
   380  	testutil.AssertEquals(t, value, []byte("value2.3"))
   381  	value, _ = simulator.GetState("ns1", "key3")
   382  	//value for 'key3' should be 'value9' as the last commit to State DB failed
   383  	testutil.AssertEquals(t, value, []byte("value3.3"))
   384  	//savepoint in state DB should 3 as the last commit failed
   385  	stateDBSavepoint, _ = ledger.(*kvLedger).txtmgmt.GetLastSavepoint()
   386  	testutil.AssertEquals(t, stateDBSavepoint.BlockNum, uint64(2))
   387  
   388  	if ledgerconfig.IsHistoryDBEnabled() == true {
   389  		qhistory, _ := ledger.NewHistoryQueryExecutor()
   390  		itr, _ := qhistory.GetHistoryForKey("ns1", "key1")
   391  		count := 0
   392  		for {
   393  			kmod, err := itr.Next()
   394  			testutil.AssertNoError(t, err, "Error upon Next()")
   395  			if kmod == nil {
   396  				break
   397  			}
   398  			retrievedValue := kmod.(*ledgerpackage.KeyModification).Value
   399  			count++
   400  			expectedValue := []byte("value1." + strconv.Itoa(count))
   401  			testutil.AssertEquals(t, retrievedValue, expectedValue)
   402  		}
   403  		testutil.AssertEquals(t, count, 4)
   404  		//savepoint in history DB should 4
   405  		historyDBSavepoint, _ := ledger.(*kvLedger).historyDB.GetLastSavepoint()
   406  		testutil.AssertEquals(t, historyDBSavepoint.BlockNum, uint64(3))
   407  	}
   408  	simulator.Done()
   409  	ledger.Close()
   410  	provider.Close()
   411  
   412  	//we assume here that the peer comes online and calls NewKVLedger to get a handler for the ledger
   413  	//state DB should be recovered before returning from NewKVLedger call
   414  	provider, _ = NewProvider()
   415  	ledger, _ = provider.Open("testLedger")
   416  	simulator, _ = ledger.NewTxSimulator()
   417  	value, _ = simulator.GetState("ns1", "key1")
   418  	//value for 'key1' should be 'value10' after state DB recovery
   419  	testutil.AssertEquals(t, value, []byte("value1.4"))
   420  	value, _ = simulator.GetState("ns1", "key2")
   421  	//value for 'key2' should be 'value11' after state DB recovery
   422  	testutil.AssertEquals(t, value, []byte("value2.4"))
   423  	value, _ = simulator.GetState("ns1", "key3")
   424  	//value for 'key3' should be 'value12' after state DB recovery
   425  	testutil.AssertEquals(t, value, []byte("value3.4"))
   426  	//savepoint in state DB should 4 after the recovery
   427  	stateDBSavepoint, _ = ledger.(*kvLedger).txtmgmt.GetLastSavepoint()
   428  	testutil.AssertEquals(t, stateDBSavepoint.BlockNum, uint64(3))
   429  	simulator.Done()
   430  }
   431  
   432  func TestLedgerWithCouchDbEnabledWithBinaryAndJSONData(t *testing.T) {
   433  
   434  	//call a helper method to load the core.yaml
   435  	ledgertestutil.SetupCoreYAMLConfig("./../../../peer")
   436  
   437  	logger.Debugf("TestLedgerWithCouchDbEnabledWithBinaryAndJSONData  IsCouchDBEnabled()value: %v , IsHistoryDBEnabled()value: %v\n",
   438  		ledgerconfig.IsCouchDBEnabled(), ledgerconfig.IsHistoryDBEnabled())
   439  
   440  	env := newTestEnv(t)
   441  	defer env.cleanup()
   442  	provider, _ := NewProvider()
   443  	defer provider.Close()
   444  	ledger, _ := provider.Create("testLedger")
   445  	defer ledger.Close()
   446  
   447  	bcInfo, _ := ledger.GetBlockchainInfo()
   448  	testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{
   449  		Height: 0, CurrentBlockHash: nil, PreviousBlockHash: nil})
   450  
   451  	simulator, _ := ledger.NewTxSimulator()
   452  	simulator.SetState("ns1", "key4", []byte("value1"))
   453  	simulator.SetState("ns1", "key5", []byte("value2"))
   454  	simulator.SetState("ns1", "key6", []byte("{\"shipmentID\":\"161003PKC7300\",\"customsInvoice\":{\"methodOfTransport\":\"GROUND\",\"invoiceNumber\":\"00091622\"},\"weightUnitOfMeasure\":\"KGM\",\"volumeUnitOfMeasure\": \"CO\",\"dimensionUnitOfMeasure\":\"CM\",\"currency\":\"USD\"}"))
   455  	simulator.SetState("ns1", "key7", []byte("{\"shipmentID\":\"161003PKC7600\",\"customsInvoice\":{\"methodOfTransport\":\"AIR MAYBE\",\"invoiceNumber\":\"00091624\"},\"weightUnitOfMeasure\":\"KGM\",\"volumeUnitOfMeasure\": \"CO\",\"dimensionUnitOfMeasure\":\"CM\",\"currency\":\"USD\"}"))
   456  	simulator.Done()
   457  	simRes, _ := simulator.GetTxSimulationResults()
   458  	bg := testutil.NewBlockGenerator(t)
   459  	block1 := bg.NextBlock([][]byte{simRes}, false)
   460  
   461  	ledger.Commit(block1)
   462  
   463  	bcInfo, _ = ledger.GetBlockchainInfo()
   464  	block1Hash := block1.Header.Hash()
   465  	testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{
   466  		Height: 1, CurrentBlockHash: block1Hash, PreviousBlockHash: []byte{}})
   467  
   468  	simulationResults := [][]byte{}
   469  	simulator, _ = ledger.NewTxSimulator()
   470  	simulator.SetState("ns1", "key4", []byte("value3"))
   471  	simulator.SetState("ns1", "key5", []byte("{\"shipmentID\":\"161003PKC7500\",\"customsInvoice\":{\"methodOfTransport\":\"AIR FREIGHT\",\"invoiceNumber\":\"00091623\"},\"weightUnitOfMeasure\":\"KGM\",\"volumeUnitOfMeasure\": \"CO\",\"dimensionUnitOfMeasure\":\"CM\",\"currency\":\"USD\"}"))
   472  	simulator.SetState("ns1", "key6", []byte("value4"))
   473  	simulator.SetState("ns1", "key7", []byte("{\"shipmentID\":\"161003PKC7600\",\"customsInvoice\":{\"methodOfTransport\":\"GROUND\",\"invoiceNumber\":\"00091624\"},\"weightUnitOfMeasure\":\"KGM\",\"volumeUnitOfMeasure\": \"CO\",\"dimensionUnitOfMeasure\":\"CM\",\"currency\":\"USD\"}"))
   474  	simulator.SetState("ns1", "key8", []byte("{\"shipmentID\":\"161003PKC7700\",\"customsInvoice\":{\"methodOfTransport\":\"SHIP\",\"invoiceNumber\":\"00091625\"},\"weightUnitOfMeasure\":\"KGM\",\"volumeUnitOfMeasure\": \"CO\",\"dimensionUnitOfMeasure\":\"CM\",\"currency\":\"USD\"}"))
   475  	simulator.Done()
   476  	simRes, _ = simulator.GetTxSimulationResults()
   477  	simulationResults = append(simulationResults, simRes)
   478  	//add a 2nd transaction
   479  	simulator2, _ := ledger.NewTxSimulator()
   480  	simulator2.SetState("ns1", "key7", []byte("{\"shipmentID\":\"161003PKC7600\",\"customsInvoice\":{\"methodOfTransport\":\"TRAIN\",\"invoiceNumber\":\"00091624\"},\"weightUnitOfMeasure\":\"KGM\",\"volumeUnitOfMeasure\": \"CO\",\"dimensionUnitOfMeasure\":\"CM\",\"currency\":\"USD\"}"))
   481  	simulator2.SetState("ns1", "key9", []byte("value5"))
   482  	simulator2.SetState("ns1", "key10", []byte("{\"shipmentID\":\"261003PKC8000\",\"customsInvoice\":{\"methodOfTransport\":\"DONKEY\",\"invoiceNumber\":\"00091626\"},\"weightUnitOfMeasure\":\"KGM\",\"volumeUnitOfMeasure\": \"CO\",\"dimensionUnitOfMeasure\":\"CM\",\"currency\":\"USD\"}"))
   483  	simulator2.Done()
   484  	simRes2, _ := simulator2.GetTxSimulationResults()
   485  	simulationResults = append(simulationResults, simRes2)
   486  
   487  	block2 := bg.NextBlock(simulationResults, false)
   488  	ledger.Commit(block2)
   489  
   490  	bcInfo, _ = ledger.GetBlockchainInfo()
   491  	block2Hash := block2.Header.Hash()
   492  	testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{
   493  		Height: 2, CurrentBlockHash: block2Hash, PreviousBlockHash: block1.Header.Hash()})
   494  
   495  	b1, _ := ledger.GetBlockByHash(block1Hash)
   496  	testutil.AssertEquals(t, b1, block1)
   497  
   498  	b2, _ := ledger.GetBlockByHash(block2Hash)
   499  	testutil.AssertEquals(t, b2, block2)
   500  
   501  	b1, _ = ledger.GetBlockByNumber(0)
   502  	testutil.AssertEquals(t, b1, block1)
   503  
   504  	b2, _ = ledger.GetBlockByNumber(1)
   505  	testutil.AssertEquals(t, b2, block2)
   506  
   507  	//Similar test has been pushed down to historyleveldb_test.go as well
   508  	if ledgerconfig.IsHistoryDBEnabled() == true {
   509  		logger.Debugf("History is enabled\n")
   510  		qhistory, err := ledger.NewHistoryQueryExecutor()
   511  		testutil.AssertNoError(t, err, fmt.Sprintf("Error when trying to retrieve history database executor"))
   512  
   513  		itr, err2 := qhistory.GetHistoryForKey("ns1", "key7")
   514  		testutil.AssertNoError(t, err2, fmt.Sprintf("Error upon GetHistoryForKey"))
   515  
   516  		var retrievedValue []byte
   517  		count := 0
   518  		for {
   519  			kmod, _ := itr.Next()
   520  			if kmod == nil {
   521  				break
   522  			}
   523  			retrievedValue = kmod.(*ledgerpackage.KeyModification).Value
   524  			count++
   525  		}
   526  		testutil.AssertEquals(t, count, 3)
   527  		// test the last value in the history matches the last value set for key7
   528  		expectedValue := []byte("{\"shipmentID\":\"161003PKC7600\",\"customsInvoice\":{\"methodOfTransport\":\"TRAIN\",\"invoiceNumber\":\"00091624\"},\"weightUnitOfMeasure\":\"KGM\",\"volumeUnitOfMeasure\": \"CO\",\"dimensionUnitOfMeasure\":\"CM\",\"currency\":\"USD\"}")
   529  		testutil.AssertEquals(t, retrievedValue, expectedValue)
   530  
   531  	}
   532  }