github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/integration/gateway/endorsing_orgs_test.go (about) 1 /* 2 Copyright hechain All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package gateway 8 9 import ( 10 "context" 11 "io/ioutil" 12 "os" 13 "path/filepath" 14 "syscall" 15 16 docker "github.com/fsouza/go-dockerclient" 17 "github.com/golang/protobuf/proto" 18 "github.com/hechain20/hechain/integration/nwo" 19 "github.com/hechain20/hechain/protoutil" 20 "github.com/hyperledger/fabric-protos-go/gateway" 21 "github.com/hyperledger/fabric-protos-go/peer" 22 . "github.com/onsi/ginkgo" 23 . "github.com/onsi/gomega" 24 "github.com/tedsuo/ifrit" 25 ) 26 27 var _ = Describe("GatewayService with endorsing orgs", func() { 28 var ( 29 testDir string 30 network *nwo.Network 31 orderer *nwo.Orderer 32 org1Peer0 *nwo.Peer 33 org2Peer0 *nwo.Peer 34 org3Peer0 *nwo.Peer 35 process ifrit.Process 36 ) 37 38 BeforeEach(func() { 39 var err error 40 testDir, err = ioutil.TempDir("", "gateway") 41 Expect(err).NotTo(HaveOccurred()) 42 43 client, err := docker.NewClientFromEnv() 44 Expect(err).NotTo(HaveOccurred()) 45 46 config := nwo.ThreeOrgRaft() 47 network = nwo.New(config, testDir, client, StartPort(), components) 48 49 network.GenerateConfigTree() 50 network.Bootstrap() 51 52 networkRunner := network.NetworkGroupRunner() 53 process = ifrit.Invoke(networkRunner) 54 Eventually(process.Ready(), network.EventuallyTimeout).Should(BeClosed()) 55 56 orderer = network.Orderer("orderer") 57 network.CreateAndJoinChannel(orderer, "testchannel") 58 network.UpdateChannelAnchors(orderer, "testchannel") 59 network.VerifyMembership( 60 network.PeersWithChannel("testchannel"), 61 "testchannel", 62 ) 63 nwo.EnableCapabilities( 64 network, 65 "testchannel", 66 "Application", "V2_0", 67 orderer, 68 network.PeersWithChannel("testchannel")..., 69 ) 70 71 org1Peer0 = network.Peer("Org1", "peer0") 72 org2Peer0 = network.Peer("Org2", "peer0") 73 org3Peer0 = network.Peer("Org3", "peer0") 74 75 chaincode := nwo.Chaincode{ 76 Name: "pvtmarblescc", 77 Version: "0.0", 78 Path: components.Build("github.com/hechain20/hechain/integration/chaincode/marbles_private/cmd"), 79 Lang: "binary", 80 PackageFile: filepath.Join(testDir, "pvtmarblescc.tar.gz"), 81 Policy: `OR ('Org1MSP.member', 'Org2MSP.member', 'Org3MSP.member')`, 82 SignaturePolicy: `OR ('Org1MSP.member', 'Org2MSP.member', 'Org3MSP.member')`, 83 Sequence: "1", 84 InitRequired: false, 85 Label: "pvtmarblescc_label", 86 CollectionsConfig: filepath.Join("testdata", "collections_config_anyorg.json"), 87 } 88 89 nwo.DeployChaincode(network, "testchannel", orderer, chaincode) 90 }) 91 92 AfterEach(func() { 93 if process != nil { 94 process.Signal(syscall.SIGTERM) 95 Eventually(process.Wait(), network.EventuallyTimeout).Should(Receive()) 96 } 97 if network != nil { 98 network.Cleanup() 99 } 100 os.RemoveAll(testDir) 101 }) 102 103 It("should execute chaincode on a peer in the specified org", func() { 104 peers := [3]*nwo.Peer{org1Peer0, org2Peer0, org3Peer0} 105 106 // Submit transactions using every peer's gateway, with every peer as the endorsing 107 // org, to reduce the likelihood of tests passing by chance 108 for _, p := range peers { 109 conn := network.PeerClientConn(p) 110 defer conn.Close() 111 gatewayClient := gateway.NewGatewayClient(conn) 112 ctx, cancel := context.WithTimeout(context.Background(), network.EventuallyTimeout) 113 defer cancel() 114 115 signingIdentity := network.PeerUserSigner(p, "User1") 116 for _, o := range peers { 117 mspid := network.Organization(o.Organization).MSPID 118 119 submitCheckEndorsingOrgsTransaction(ctx, gatewayClient, signingIdentity, mspid) 120 } 121 } 122 }) 123 }) 124 125 func submitCheckEndorsingOrgsTransaction(ctx context.Context, client gateway.GatewayClient, signingIdentity *nwo.SigningIdentity, mspids ...string) { 126 transientData := make(map[string][]byte) 127 for _, m := range mspids { 128 transientData[m] = []byte(`true`) 129 } 130 131 proposedTransaction, transactionID := NewProposedTransaction(signingIdentity, "testchannel", "pvtmarblescc", "checkEndorsingOrg", transientData) 132 133 endorseRequest := &gateway.EndorseRequest{ 134 TransactionId: transactionID, 135 ChannelId: "testchannel", 136 ProposedTransaction: proposedTransaction, 137 EndorsingOrganizations: mspids, 138 } 139 140 endorseResponse, err := client.Endorse(ctx, endorseRequest) 141 Expect(err).NotTo(HaveOccurred()) 142 143 chaincodeAction, err := protoutil.GetActionFromEnvelopeMsg(endorseResponse.GetPreparedTransaction()) 144 Expect(err).NotTo(HaveOccurred()) 145 146 result := chaincodeAction.GetResponse() 147 148 expectedPayload := "Peer mspid OK" 149 Expect(string(result.Payload)).To(Equal(expectedPayload)) 150 expectedResult := &peer.Response{ 151 Status: 200, 152 Message: "", 153 Payload: []uint8(expectedPayload), 154 } 155 Expect(proto.Equal(result, expectedResult)).To(BeTrue(), "Expected\n\t%#v\nto proto.Equal\n\t%#v", result, expectedResult) 156 }