github.com/kaituanwang/hyperledger@v2.0.1+incompatible/integration/pvtdata/implicit_coll_test.go (about)

     1  /*
     2  Copyright IBM Corp All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package pvtdata
     8  
     9  import (
    10  	"encoding/base64"
    11  	"encoding/json"
    12  	"fmt"
    13  	"path/filepath"
    14  
    15  	"github.com/hyperledger/fabric/integration/chaincode/kvexecutor"
    16  	"github.com/hyperledger/fabric/integration/nwo"
    17  	"github.com/hyperledger/fabric/integration/nwo/commands"
    18  	. "github.com/onsi/ginkgo"
    19  	. "github.com/onsi/gomega"
    20  
    21  	"github.com/tedsuo/ifrit"
    22  )
    23  
    24  var _ bool = Describe("PrivateData implicit collection", func() {
    25  	var (
    26  		network       *nwo.Network
    27  		process       ifrit.Process
    28  		orderer       *nwo.Orderer
    29  		testChaincode chaincode
    30  	)
    31  
    32  	BeforeEach(func() {
    33  		By("setting up the network")
    34  		network = initThreeOrgsSetup(false)
    35  
    36  		By("setting the pull retry threshold to 0 on all peers")
    37  		// set pull retry threshold to 0 to disable pulling
    38  		for _, p := range network.Peers {
    39  			core := network.ReadPeerConfig(p)
    40  			core.Peer.Gossip.PvtData.PullRetryThreshold = 0
    41  			network.WritePeerConfig(p, core)
    42  		}
    43  
    44  		By("starting the network")
    45  		process, orderer = startNetwork(network)
    46  
    47  		By("deploying new lifecycle chaincode")
    48  		testChaincode = chaincode{
    49  			Chaincode: nwo.Chaincode{
    50  				Name:        "kvexecutor",
    51  				Version:     "1.0",
    52  				Path:        components.Build("github.com/hyperledger/fabric/integration/chaincode/kvexecutor/cmd"),
    53  				Lang:        "binary",
    54  				PackageFile: filepath.Join(network.RootDir, "kvexcutor.tar.gz"),
    55  				Label:       "kvexcutor",
    56  				Sequence:    "1",
    57  			},
    58  			isLegacy: false,
    59  		}
    60  		nwo.EnableCapabilities(network, channelID, "Application", "V2_0", orderer, network.Peers...)
    61  		deployChaincode(network, orderer, testChaincode)
    62  	})
    63  
    64  	AfterEach(func() {
    65  		testCleanup(network, process)
    66  	})
    67  
    68  	It("disseminates implicit collection data owned by the peer's org ", func() {
    69  		peer1 := network.Peer("Org1", "peer0")
    70  		peer2 := network.Peer("Org2", "peer0")
    71  
    72  		By("writing private data to org1's and org2's implicit collections")
    73  		writeInput := []kvexecutor.KVData{
    74  			{Collection: "_implicit_org_Org1MSP", Key: "org1_key1", Value: "org1_value1"},
    75  			{Collection: "_implicit_org_Org2MSP", Key: "org2_key1", Value: "org2_value1"},
    76  		}
    77  		writeImplicitCollection(network, orderer, testChaincode.Name, writeInput, peer1, peer2)
    78  
    79  		By("querying org1.peer0 for _implicit_org_Org1MSP collection data, expecting pvtdata")
    80  		readInput1 := []kvexecutor.KVData{{Collection: "_implicit_org_Org1MSP", Key: "org1_key1"}}
    81  		expectedMsg1, err := json.Marshal(writeInput[:1])
    82  		Expect(err).NotTo(HaveOccurred())
    83  		readImplicitCollection(network, network.Peer("Org1", "peer0"), testChaincode.Name, readInput1, string(expectedMsg1), true)
    84  
    85  		By("querying org1.peer1 for _implicit_org_Org1MSP collection data, expecting pvtdata")
    86  		readImplicitCollection(network, network.Peer("Org1", "peer1"), testChaincode.Name, readInput1, string(expectedMsg1), true)
    87  
    88  		By("querying org2.peer0 for _implicit_org_Org1MSP collection data, expecting error")
    89  		readImplicitCollection(network, network.Peer("Org2", "peer0"), testChaincode.Name, readInput1,
    90  			"private data matching public hash version is not available", false)
    91  
    92  		By("querying org2.peer1 for _implicit_org_Org1MSP collection data, expecting error")
    93  		readImplicitCollection(network, network.Peer("Org2", "peer1"), testChaincode.Name, readInput1,
    94  			"private data matching public hash version is not available", false)
    95  
    96  		By("querying org2.peer0 for _implicit_org_Org2MSP collection data, expecting pvtdata")
    97  		readInput2 := []kvexecutor.KVData{{Collection: "_implicit_org_Org2MSP", Key: "org2_key1"}}
    98  		expectedMsg2, err := json.Marshal(writeInput[1:])
    99  		Expect(err).NotTo(HaveOccurred())
   100  		readImplicitCollection(network, network.Peer("Org2", "peer0"), testChaincode.Name, readInput2, string(expectedMsg2), true)
   101  
   102  		By("querying org2.peer1 for _implicit_org_Org2MSP collection data, expecting pvtdata")
   103  		readImplicitCollection(network, network.Peer("Org2", "peer1"), testChaincode.Name, readInput2, string(expectedMsg2), true)
   104  
   105  		By("querying org1.peer0 for _implicit_org_Org2MSP collection data, expecting error")
   106  		readImplicitCollection(network, network.Peer("Org1", "peer0"), testChaincode.Name, readInput2,
   107  			"private data matching public hash version is not available", false)
   108  
   109  		By("querying org1.peer1 for _implicit_org_Org2MSP collection data, expecting error")
   110  		readImplicitCollection(network, network.Peer("Org1", "peer1"), testChaincode.Name, readInput2,
   111  			"private data matching public hash version is not available", false)
   112  	})
   113  })
   114  
   115  func writeImplicitCollection(n *nwo.Network, orderer *nwo.Orderer, chaincodeName string, writeInput []kvexecutor.KVData, peers ...*nwo.Peer) {
   116  	writeInputBytes, err := json.Marshal(writeInput)
   117  	Expect(err).NotTo(HaveOccurred())
   118  	writeInputBase64 := base64.StdEncoding.EncodeToString(writeInputBytes)
   119  
   120  	peerAddresses := make([]string, 0)
   121  	for _, peer := range peers {
   122  		peerAddresses = append(peerAddresses, n.PeerAddress(peer, nwo.ListenPort))
   123  	}
   124  	command := commands.ChaincodeInvoke{
   125  		ChannelID:     channelID,
   126  		Orderer:       n.OrdererAddress(orderer, nwo.ListenPort),
   127  		Name:          chaincodeName,
   128  		Ctor:          fmt.Sprintf(`{"Args":["readWriteKVs","%s","%s"]}`, "", writeInputBase64),
   129  		PeerAddresses: peerAddresses,
   130  		WaitForEvent:  true,
   131  	}
   132  	invokeChaincode(n, peers[0], command)
   133  	nwo.WaitUntilEqualLedgerHeight(n, channelID, nwo.GetLedgerHeight(n, peers[0], channelID), n.Peers...)
   134  }
   135  
   136  func readImplicitCollection(n *nwo.Network, peer *nwo.Peer, chaincodeName string, readInput []kvexecutor.KVData, expectedMsg string, expectSuccess bool) {
   137  	readInputBytes, err := json.Marshal(readInput)
   138  	Expect(err).NotTo(HaveOccurred())
   139  	readInputBase64 := base64.StdEncoding.EncodeToString(readInputBytes)
   140  
   141  	command := commands.ChaincodeQuery{
   142  		ChannelID: channelID,
   143  		Name:      chaincodeName,
   144  		Ctor:      fmt.Sprintf(`{"Args":["readWriteKVs","%s","%s"]}`, readInputBase64, ""),
   145  	}
   146  	queryChaincode(n, peer, command, expectedMsg, expectSuccess)
   147  }