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  }