165 lines
5.1 KiB
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)
|
|
}
|