163 lines
4.9 KiB
Go
163 lines
4.9 KiB
Go
/*
|
|
Copyright IBM Corp. All Rights Reserved.
|
|
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package nwo_test
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"syscall"
|
|
|
|
docker "github.com/fsouza/go-dockerclient"
|
|
"github.com/hyperledger/fabric/integration/channelparticipation"
|
|
"github.com/hyperledger/fabric/integration/nwo"
|
|
"github.com/hyperledger/fabric/integration/nwo/commands"
|
|
. "github.com/onsi/ginkgo/v2"
|
|
. "github.com/onsi/gomega"
|
|
"github.com/onsi/gomega/gbytes"
|
|
"github.com/onsi/gomega/gexec"
|
|
"github.com/tedsuo/ifrit"
|
|
ginkgomon "github.com/tedsuo/ifrit/ginkgomon_v2"
|
|
)
|
|
|
|
var _ = Describe("Network", func() {
|
|
var (
|
|
client *docker.Client
|
|
tempDir string
|
|
)
|
|
|
|
BeforeEach(func() {
|
|
var err error
|
|
tempDir, err = ioutil.TempDir("", "nwo")
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
client, err = docker.NewClientFromEnv()
|
|
Expect(err).NotTo(HaveOccurred())
|
|
})
|
|
|
|
AfterEach(func() {
|
|
os.RemoveAll(tempDir)
|
|
})
|
|
|
|
Describe("etcdraft network", func() {
|
|
var network *nwo.Network
|
|
var ordererRunner *ginkgomon.Runner
|
|
var ordererProcess, peerProcess ifrit.Process
|
|
|
|
BeforeEach(func() {
|
|
network = nwo.New(nwo.BasicEtcdRaft(), tempDir, client, StartPort(), components)
|
|
|
|
// Generate config and bootstrap the network
|
|
network.GenerateConfigTree()
|
|
network.Bootstrap()
|
|
|
|
// Start all of the fabric processes
|
|
ordererRunner, ordererProcess, peerProcess = network.StartSingleOrdererNetwork("orderer")
|
|
})
|
|
|
|
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())
|
|
}
|
|
|
|
network.Cleanup()
|
|
})
|
|
|
|
It("deploys and executes chaincode (simple) using the legacy lifecycle", func() {
|
|
orderer := network.Orderer("orderer")
|
|
channelparticipation.JoinOrdererJoinPeersAppChannel(network, "testchannel", orderer, ordererRunner)
|
|
peer := network.Peer("Org1", "peer0")
|
|
|
|
legacyChaincode := nwo.Chaincode{
|
|
Name: "mycc",
|
|
Version: "0.0",
|
|
Path: "github.com/hyperledger/fabric/integration/chaincode/simple/cmd",
|
|
Ctor: `{"Args":["init","a","100","b","200"]}`,
|
|
Policy: `AND ('Org1MSP.member','Org2MSP.member')`,
|
|
}
|
|
|
|
nwo.DeployChaincodeLegacy(network, "testchannel", orderer, legacyChaincode)
|
|
RunQueryInvokeQuery(network, orderer, peer, 100)
|
|
})
|
|
|
|
It("deploys and executes chaincode (simple) using _lifecycle", func() {
|
|
orderer := network.Orderer("orderer")
|
|
channelparticipation.JoinOrdererJoinPeersAppChannel(network, "testchannel", orderer, ordererRunner)
|
|
peer := network.Peer("Org1", "peer0")
|
|
|
|
chaincode := nwo.Chaincode{
|
|
Name: "mycc",
|
|
Version: "0.0",
|
|
Path: "github.com/hyperledger/fabric/integration/chaincode/simple/cmd",
|
|
Lang: "golang",
|
|
PackageFile: filepath.Join(tempDir, "simplecc.tar.gz"),
|
|
Ctor: `{"Args":["init","a","100","b","200"]}`,
|
|
SignaturePolicy: `AND ('Org1MSP.member','Org2MSP.member')`,
|
|
Sequence: "1",
|
|
InitRequired: true,
|
|
Label: "my_simple_chaincode",
|
|
}
|
|
|
|
network.VerifyMembership(network.PeersWithChannel("testchannel"), "testchannel")
|
|
|
|
nwo.EnableCapabilities(
|
|
network,
|
|
"testchannel",
|
|
"Application", "V2_0",
|
|
orderer,
|
|
network.PeersWithChannel("testchannel")...,
|
|
)
|
|
nwo.DeployChaincode(network, "testchannel", orderer, chaincode)
|
|
|
|
RunQueryInvokeQuery(network, orderer, peer, 100)
|
|
})
|
|
})
|
|
})
|
|
|
|
func RunQueryInvokeQuery(n *nwo.Network, orderer *nwo.Orderer, peer *nwo.Peer, initialQueryResult int) {
|
|
By("querying the chaincode")
|
|
sess, err := n.PeerUserSession(peer, "User1", commands.ChaincodeQuery{
|
|
ChannelID: "testchannel",
|
|
Name: "mycc",
|
|
Ctor: `{"Args":["query","a"]}`,
|
|
})
|
|
Expect(err).NotTo(HaveOccurred())
|
|
Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
|
|
Expect(sess).To(gbytes.Say(fmt.Sprint(initialQueryResult)))
|
|
|
|
sess, err = n.PeerUserSession(peer, "User1", commands.ChaincodeInvoke{
|
|
ChannelID: "testchannel",
|
|
Orderer: n.OrdererAddress(orderer, nwo.ListenPort),
|
|
Name: "mycc",
|
|
Ctor: `{"Args":["invoke","a","b","10"]}`,
|
|
PeerAddresses: []string{
|
|
n.PeerAddress(n.Peer("Org1", "peer0"), nwo.ListenPort),
|
|
n.PeerAddress(n.Peer("Org2", "peer0"), nwo.ListenPort),
|
|
},
|
|
WaitForEvent: true,
|
|
})
|
|
Expect(err).NotTo(HaveOccurred())
|
|
Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
|
|
Expect(sess.Err).To(gbytes.Say("Chaincode invoke successful. result: status:200"))
|
|
|
|
sess, err = n.PeerUserSession(peer, "User1", commands.ChaincodeQuery{
|
|
ChannelID: "testchannel",
|
|
Name: "mycc",
|
|
Ctor: `{"Args":["query","a"]}`,
|
|
})
|
|
Expect(err).NotTo(HaveOccurred())
|
|
Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
|
|
Expect(sess).To(gbytes.Say(fmt.Sprint(initialQueryResult - 10)))
|
|
}
|