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 }