go_study/fabric-main/integration/gateway/endorsing_orgs_test.go

165 lines
5.1 KiB
Go

/*
Copyright IBM Corp All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package gateway
import (
"context"
"io/ioutil"
"os"
"path/filepath"
"syscall"
docker "github.com/fsouza/go-dockerclient"
"github.com/golang/protobuf/proto"
"github.com/hyperledger/fabric-protos-go/gateway"
"github.com/hyperledger/fabric-protos-go/peer"
"github.com/hyperledger/fabric/integration/channelparticipation"
"github.com/hyperledger/fabric/integration/nwo"
"github.com/hyperledger/fabric/protoutil"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"github.com/tedsuo/ifrit"
ginkgomon "github.com/tedsuo/ifrit/ginkgomon_v2"
)
var _ = Describe("GatewayService with endorsing orgs", func() {
var (
testDir string
network *nwo.Network
orderer *nwo.Orderer
org1Peer0 *nwo.Peer
org2Peer0 *nwo.Peer
org3Peer0 *nwo.Peer
ordererRunner *ginkgomon.Runner
ordererProcess, peerProcess ifrit.Process
)
BeforeEach(func() {
var err error
testDir, err = ioutil.TempDir("", "gateway")
Expect(err).NotTo(HaveOccurred())
client, err := docker.NewClientFromEnv()
Expect(err).NotTo(HaveOccurred())
config := nwo.ThreeOrgEtcdRaft()
network = nwo.New(config, testDir, client, StartPort(), components)
network.GenerateConfigTree()
network.Bootstrap()
// Start all the fabric processes
ordererRunner, ordererProcess, peerProcess = network.StartSingleOrdererNetwork("orderer")
orderer = network.Orderer("orderer")
channelparticipation.JoinOrdererJoinPeersAppChannel(network, "testchannel", orderer, ordererRunner)
network.VerifyMembership(
network.PeersWithChannel("testchannel"),
"testchannel",
)
nwo.EnableCapabilities(
network,
"testchannel",
"Application", "V2_0",
orderer,
network.PeersWithChannel("testchannel")...,
)
org1Peer0 = network.Peer("Org1", "peer0")
org2Peer0 = network.Peer("Org2", "peer0")
org3Peer0 = network.Peer("Org3", "peer0")
chaincode := nwo.Chaincode{
Name: "pvtmarblescc",
Version: "0.0",
Path: components.Build("github.com/hyperledger/fabric/integration/chaincode/marbles_private/cmd"),
Lang: "binary",
PackageFile: filepath.Join(testDir, "pvtmarblescc.tar.gz"),
Policy: `OR ('Org1MSP.member', 'Org2MSP.member', 'Org3MSP.member')`,
SignaturePolicy: `OR ('Org1MSP.member', 'Org2MSP.member', 'Org3MSP.member')`,
Sequence: "1",
InitRequired: false,
Label: "pvtmarblescc_label",
CollectionsConfig: filepath.Join("testdata", "collections_config_anyorg.json"),
}
nwo.DeployChaincode(network, "testchannel", orderer, chaincode)
})
AfterEach(func() {
if ordererProcess != nil {
ordererProcess.Signal(syscall.SIGTERM)
Eventually(ordererProcess.Wait(), network.EventuallyTimeout).Should(Receive())
}
if peerProcess != nil {
peerProcess.Signal(syscall.SIGTERM)
Eventually(peerProcess.Wait(), network.EventuallyTimeout).Should(Receive())
}
if network != nil {
network.Cleanup()
}
os.RemoveAll(testDir)
})
It("should execute chaincode on a peer in the specified org", func() {
peers := [3]*nwo.Peer{org1Peer0, org2Peer0, org3Peer0}
// Submit transactions using every peer's gateway, with every peer as the endorsing
// org, to reduce the likelihood of tests passing by chance
for _, p := range peers {
conn := network.PeerClientConn(p)
defer conn.Close()
gatewayClient := gateway.NewGatewayClient(conn)
ctx, cancel := context.WithTimeout(context.Background(), network.EventuallyTimeout)
defer cancel()
signingIdentity := network.PeerUserSigner(p, "User1")
for _, o := range peers {
mspid := network.Organization(o.Organization).MSPID
submitCheckEndorsingOrgsTransaction(ctx, gatewayClient, signingIdentity, mspid)
}
}
})
})
func submitCheckEndorsingOrgsTransaction(ctx context.Context, client gateway.GatewayClient, signingIdentity *nwo.SigningIdentity, mspids ...string) {
transientData := make(map[string][]byte)
for _, m := range mspids {
transientData[m] = []byte(`true`)
}
proposedTransaction, transactionID := NewProposedTransaction(signingIdentity, "testchannel", "pvtmarblescc", "checkEndorsingOrg", transientData)
endorseRequest := &gateway.EndorseRequest{
TransactionId: transactionID,
ChannelId: "testchannel",
ProposedTransaction: proposedTransaction,
EndorsingOrganizations: mspids,
}
endorseResponse, err := client.Endorse(ctx, endorseRequest)
Expect(err).NotTo(HaveOccurred())
chaincodeAction, err := protoutil.GetActionFromEnvelopeMsg(endorseResponse.GetPreparedTransaction())
Expect(err).NotTo(HaveOccurred())
result := chaincodeAction.GetResponse()
expectedPayload := "Peer mspid OK"
Expect(string(result.Payload)).To(Equal(expectedPayload))
expectedResult := &peer.Response{
Status: 200,
Message: "",
Payload: []uint8(expectedPayload),
}
Expect(proto.Equal(result, expectedResult)).To(BeTrue(), "Expected\n\t%#v\nto proto.Equal\n\t%#v", result, expectedResult)
}