github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/integration/ledger/ledger_generate_test.go (about)

     1  //go:build generate
     2  // +build generate
     3  
     4  /*
     5  Copyright hechain All Rights Reserved.
     6  
     7  SPDX-License-Identifier: Apache-2.0
     8  */
     9  
    10  package ledger
    11  
    12  import (
    13  	"fmt"
    14  	"path/filepath"
    15  
    16  	. "github.com/onsi/ginkgo"
    17  
    18  	"github.com/hechain20/hechain/integration/nwo"
    19  )
    20  
    21  // This test generate sample ledger data that can be used to verify rebuild ledger function and upgrade function (in a future release).
    22  // It is skipped in general. To generate sample ledger data, use build tag 'generate' and run this test in isolation.
    23  // It does not delete the network directory so that you can copy the generated data to a different directory for unit tests.
    24  // At the end of test, it prints `setup.testDir is <directory>`. Copy the network data under <directory> to
    25  // the unit test directory for rebuild tests as needed.
    26  // It generates the following blocks:
    27  // block 0: genesis
    28  // block 1 to 4: network setup
    29  // block 5 to 8: marblesp chaincode instantiation
    30  // block 9 to 12: marbles chancode instantiation
    31  // block 13: marblesp chaincode invocation
    32  // block 14 to 17: upgrade marblesp chaincode with a new collection config
    33  // block 18: marbles chaincode invocation
    34  var _ = Describe("sample ledger generation", func() {
    35  	var (
    36  		setup       *setup
    37  		helper      *testHelper
    38  		chaincodemp nwo.Chaincode
    39  		chaincodem  nwo.Chaincode
    40  	)
    41  
    42  	BeforeEach(func() {
    43  		setup = initThreeOrgsSetup()
    44  		nwo.EnableCapabilities(setup.network, setup.channelID, "Application", "V2_0", setup.orderer, setup.peers...)
    45  		helper = &testHelper{
    46  			networkHelper: &networkHelper{
    47  				Network:   setup.network,
    48  				orderer:   setup.orderer,
    49  				peers:     setup.peers,
    50  				testDir:   setup.testDir,
    51  				channelID: setup.channelID,
    52  			},
    53  		}
    54  
    55  		chaincodemp = nwo.Chaincode{
    56  			Name:              "marblesp",
    57  			Version:           "1.0",
    58  			Path:              components.Build("github.com/hechain20/hechain/integration/chaincode/marbles_private/cmd"),
    59  			Lang:              "binary",
    60  			PackageFile:       filepath.Join(setup.testDir, "marbles-pvtdata.tar.gz"),
    61  			Label:             "marbles-private-20",
    62  			SignaturePolicy:   `OR ('Org1MSP.member','Org2MSP.member', 'Org3MSP.member')`,
    63  			CollectionsConfig: filepath.Join("testdata", "collection_configs", "collections_config1.json"),
    64  			Sequence:          "1",
    65  		}
    66  
    67  		chaincodem = nwo.Chaincode{
    68  			Name:            "marbles",
    69  			Version:         "0.0",
    70  			Path:            "github.com/hechain20/hechain/integration/chaincode/marbles/cmd",
    71  			Lang:            "golang",
    72  			PackageFile:     filepath.Join(setup.testDir, "marbles.tar.gz"),
    73  			Label:           "marbles",
    74  			SignaturePolicy: `OR ('Org1MSP.member','Org2MSP.member', 'Org3MSP.member')`,
    75  			Sequence:        "1",
    76  		}
    77  	})
    78  
    79  	AfterEach(func() {
    80  		setup.terminateAllProcess()
    81  		setup.network.Cleanup()
    82  		// do not delete testDir and log it so that we can copy the test data to unit tests for verification purpose
    83  		fmt.Fprintf(GinkgoWriter, "The test dir is %s. Use peers/org2.peer0/filesystem/ledgersData as the sample ledger for kvledger rebuild tests\n", setup.testDir)
    84  	})
    85  
    86  	It("creates marbles", func() {
    87  		org2peer0 := setup.network.Peer("org2", "peer0")
    88  		height := helper.getLedgerHeight(org2peer0)
    89  
    90  		By(fmt.Sprintf("deploying marblesp chaincode at block height %d", height))
    91  		helper.deployChaincode(chaincodemp)
    92  
    93  		height = helper.getLedgerHeight(org2peer0)
    94  		By(fmt.Sprintf("deploying marbles chaincode at block height %d", height))
    95  		helper.deployChaincode(chaincodem)
    96  
    97  		height = helper.getLedgerHeight(org2peer0)
    98  		By(fmt.Sprintf("creating marbles1 with marblesp chaincode at block height %d", height))
    99  		helper.addMarble("marblesp", `{"name":"marble1", "color":"blue", "size":35, "owner":"tom", "price":99}`, org2peer0)
   100  		helper.waitUntilEqualLedgerHeight(height + 1)
   101  
   102  		By("verifying marble1 exist in collectionMarbles & collectionMarblePrivateDetails in peer0.org2")
   103  		helper.assertPresentInCollectionM("marblesp", "marble1", org2peer0)
   104  		helper.assertPresentInCollectionMPD("marblesp", "marble1", org2peer0)
   105  
   106  		By(fmt.Sprintf("upgrading marblesp chaincode at block height %d", helper.getLedgerHeight(org2peer0)))
   107  		chaincodemp.Version = "1.1"
   108  		chaincodemp.CollectionsConfig = filepath.Join("testdata", "collection_configs", "collections_config2.json")
   109  		chaincodemp.Sequence = "2"
   110  		nwo.DeployChaincode(setup.network, setup.channelID, setup.orderer, chaincodemp)
   111  
   112  		mhelper := &marblesTestHelper{
   113  			networkHelper: &networkHelper{
   114  				Network:   setup.network,
   115  				orderer:   setup.orderer,
   116  				peers:     setup.peers,
   117  				testDir:   setup.testDir,
   118  				channelID: setup.channelID,
   119  			},
   120  		}
   121  		By(fmt.Sprintf("creating marble100 with marbles chaincode at block height %d", helper.getLedgerHeight(org2peer0)))
   122  		mhelper.invokeMarblesChaincode("marbles", org2peer0, "initMarble", "marble100", "blue", "35", "tom")
   123  		By("transferring marble100 owner")
   124  		mhelper.invokeMarblesChaincode("marbles", org2peer0, "transferMarble", "marble100", "jerry")
   125  
   126  		By("verifying marble100 new owner after transfer by color")
   127  		expectedResult := newMarble("marble100", "blue", 35, "jerry")
   128  		mhelper.assertMarbleExists("marbles", org2peer0, expectedResult, "marble100")
   129  
   130  		By("getting history for marble100")
   131  		expectedHistoryResult := []*marbleHistoryResult{
   132  			{IsDelete: "false", Value: newMarble("marble100", "blue", 35, "jerry")},
   133  			{IsDelete: "false", Value: newMarble("marble100", "blue", 35, "tom")},
   134  		}
   135  		mhelper.assertGetHistoryForMarble("marbles", org2peer0, expectedHistoryResult, "marble100")
   136  	})
   137  })