github.com/kaituanwang/hyperledger@v2.0.1+incompatible/integration/sbe/sbe_test.go (about)

     1  /*
     2  Copyright IBM Corp All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package sbe
     8  
     9  import (
    10  	"encoding/json"
    11  	"io/ioutil"
    12  	"os"
    13  	"path/filepath"
    14  	"strings"
    15  	"syscall"
    16  
    17  	docker "github.com/fsouza/go-dockerclient"
    18  	"github.com/hyperledger/fabric-protos-go/common"
    19  	"github.com/hyperledger/fabric/integration/nwo"
    20  	"github.com/hyperledger/fabric/integration/nwo/commands"
    21  	. "github.com/onsi/ginkgo"
    22  	. "github.com/onsi/gomega"
    23  	"github.com/onsi/gomega/gbytes"
    24  	"github.com/onsi/gomega/gexec"
    25  	"github.com/tedsuo/ifrit"
    26  )
    27  
    28  var _ = Describe("SBE_E2E", func() {
    29  	var (
    30  		testDir   string
    31  		client    *docker.Client
    32  		network   *nwo.Network
    33  		chaincode nwo.Chaincode
    34  		process   ifrit.Process
    35  		tempDir   string
    36  	)
    37  
    38  	BeforeEach(func() {
    39  		var err error
    40  		testDir, err = ioutil.TempDir("", "e2e_sbe")
    41  		Expect(err).NotTo(HaveOccurred())
    42  
    43  		client, err = docker.NewClientFromEnv()
    44  		Expect(err).NotTo(HaveOccurred())
    45  
    46  		chaincode = nwo.Chaincode{
    47  			Name:              "mycc",
    48  			Version:           "0.0",
    49  			Path:              "github.com/hyperledger/fabric/integration/chaincode/keylevelep/cmd",
    50  			Ctor:              `{"Args":["init"]}`,
    51  			CollectionsConfig: "testdata/collection_config.json",
    52  		}
    53  
    54  		tempDir, err = ioutil.TempDir("", "nwo")
    55  	})
    56  
    57  	AfterEach(func() {
    58  		if process != nil {
    59  			process.Signal(syscall.SIGTERM)
    60  			Eventually(process.Wait(), network.EventuallyTimeout).Should(Receive())
    61  		}
    62  		if network != nil {
    63  			network.Cleanup()
    64  		}
    65  		os.RemoveAll(testDir)
    66  	})
    67  
    68  	Describe("basic solo network with 2 orgs", func() {
    69  		BeforeEach(func() {
    70  			network = nwo.New(nwo.BasicSolo(), testDir, client, StartPort(), components)
    71  			network.GenerateConfigTree()
    72  			network.Bootstrap()
    73  
    74  			networkRunner := network.NetworkGroupRunner()
    75  			process = ifrit.Invoke(networkRunner)
    76  			Eventually(process.Ready(), network.EventuallyTimeout).Should(BeClosed())
    77  		})
    78  
    79  		It("executes a basic solo network with 2 orgs and SBE checks", func() {
    80  			By("getting the orderer by name")
    81  			orderer := network.Orderer("orderer")
    82  
    83  			By("setting up the channel")
    84  			network.CreateAndJoinChannel(orderer, "testchannel")
    85  
    86  			By("updating the anchor peers")
    87  			network.UpdateChannelAnchors(orderer, "testchannel")
    88  
    89  			By("deploying the chaincode")
    90  			nwo.DeployChaincodeLegacy(network, "testchannel", orderer, chaincode)
    91  
    92  			By("deploying a second instance of the chaincode")
    93  			chaincode.Name = "mycc2"
    94  			nwo.DeployChaincodeLegacy(network, "testchannel", orderer, chaincode)
    95  
    96  			RunSBE(network, orderer, "pub")
    97  			RunSBE(network, orderer, "priv")
    98  		})
    99  
   100  		It("executes a basic solo network with 2 orgs and SBE checks with _lifecycle", func() {
   101  			chaincode = nwo.Chaincode{
   102  				Name:              "mycc",
   103  				Version:           "0.0",
   104  				Path:              "github.com/hyperledger/fabric/integration/chaincode/keylevelep/cmd",
   105  				Lang:              "golang",
   106  				PackageFile:       filepath.Join(tempDir, "simplecc.tar.gz"),
   107  				Ctor:              `{"Args":["init"]}`,
   108  				SignaturePolicy:   `OR('Org1MSP.member','Org2MSP.member')`,
   109  				Sequence:          "1",
   110  				InitRequired:      true,
   111  				Label:             "my_simple_chaincode",
   112  				CollectionsConfig: "testdata/collection_config.json",
   113  			}
   114  
   115  			By("getting the orderer by name")
   116  			orderer := network.Orderer("orderer")
   117  
   118  			By("setting up the channel")
   119  			network.CreateAndJoinChannel(orderer, "testchannel")
   120  
   121  			By("updating the anchor peers")
   122  			network.UpdateChannelAnchors(orderer, "testchannel")
   123  			network.VerifyMembership(network.PeersWithChannel("testchannel"), "testchannel")
   124  
   125  			By("enabling 2.0 application capabilities")
   126  			nwo.EnableCapabilities(network, "testchannel", "Application", "V2_0", orderer, network.Peer("Org1", "peer0"), network.Peer("Org2", "peer0"))
   127  
   128  			By("deploying the chaincode")
   129  			nwo.DeployChaincode(network, "testchannel", orderer, chaincode)
   130  
   131  			By("deploying a second instance of the chaincode")
   132  			chaincode.Name = "mycc2"
   133  			chaincode.PackageFile = filepath.Join(tempDir, "simplecc2.tar.gz")
   134  			chaincode.Label = "my_other_simple_chaincode"
   135  			nwo.DeployChaincode(network, "testchannel", orderer, chaincode)
   136  
   137  			RunSBE(network, orderer, "pub")
   138  			RunSBE(network, orderer, "priv")
   139  		})
   140  	})
   141  })
   142  
   143  func RunSBE(n *nwo.Network, orderer *nwo.Orderer, mode string) {
   144  	peerOrg1 := n.Peer("Org1", "peer0")
   145  	peerOrg2 := n.Peer("Org2", "peer0")
   146  
   147  	By("org1 initializes the key")
   148  	sess, err := n.PeerUserSession(peerOrg1, "User1", commands.ChaincodeInvoke{
   149  		ChannelID: "testchannel",
   150  		Orderer:   n.OrdererAddress(orderer, nwo.ListenPort),
   151  		Name:      "mycc",
   152  		Ctor:      `{"Args":["setval", "` + mode + `", "foo"]}`,
   153  		PeerAddresses: []string{
   154  			n.PeerAddress(peerOrg1, nwo.ListenPort),
   155  		},
   156  		WaitForEvent: true,
   157  	})
   158  	Expect(err).NotTo(HaveOccurred())
   159  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   160  
   161  	syncLedgerHeights(n, peerOrg1, peerOrg2)
   162  
   163  	By("org2 checks that setting the value was successful by reading it")
   164  	sess, err = n.PeerUserSession(peerOrg2, "User1", commands.ChaincodeQuery{
   165  		ChannelID: "testchannel",
   166  		Name:      "mycc",
   167  		Ctor:      `{"Args":["getval", "` + mode + `"]}`,
   168  	})
   169  	Expect(err).NotTo(HaveOccurred())
   170  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   171  	Expect(sess).To(gbytes.Say("foo"))
   172  
   173  	By("org1 adds org1 to the state-based ep of a key")
   174  	sess, err = n.PeerUserSession(peerOrg1, "User1", commands.ChaincodeInvoke{
   175  		ChannelID: "testchannel",
   176  		Orderer:   n.OrdererAddress(orderer, nwo.ListenPort),
   177  		Name:      "mycc",
   178  		Ctor:      `{"Args":["addorgs", "` + mode + `", "Org1MSP"]}`,
   179  		PeerAddresses: []string{
   180  			n.PeerAddress(peerOrg1, nwo.ListenPort),
   181  		},
   182  		WaitForEvent: true,
   183  	})
   184  	Expect(err).NotTo(HaveOccurred())
   185  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   186  
   187  	By("checking that the modification succeeded through listing the orgs in the ep")
   188  	sess, err = n.PeerUserSession(peerOrg1, "User1", commands.ChaincodeQuery{
   189  		ChannelID: "testchannel",
   190  		Name:      "mycc",
   191  		Ctor:      `{"Args":["listorgs", "` + mode + `"]}`,
   192  	})
   193  	Expect(err).NotTo(HaveOccurred())
   194  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   195  	Expect(sess).To(gbytes.Say("Org1MSP"))
   196  
   197  	By("org1 sets the value of the key")
   198  	sess, err = n.PeerUserSession(peerOrg1, "User1", commands.ChaincodeInvoke{
   199  		ChannelID: "testchannel",
   200  		Orderer:   n.OrdererAddress(orderer, nwo.ListenPort),
   201  		Name:      "mycc",
   202  		Ctor:      `{"Args":["setval", "` + mode + `", "val1"]}`,
   203  		PeerAddresses: []string{
   204  			n.PeerAddress(peerOrg1, nwo.ListenPort),
   205  		},
   206  		WaitForEvent: true,
   207  	})
   208  	Expect(err).NotTo(HaveOccurred())
   209  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   210  
   211  	syncLedgerHeights(n, peerOrg1, peerOrg2)
   212  
   213  	By("org2 checks that setting the value was successful by reading it")
   214  	sess, err = n.PeerUserSession(peerOrg2, "User1", commands.ChaincodeQuery{
   215  		ChannelID: "testchannel",
   216  		Name:      "mycc",
   217  		Ctor:      `{"Args":["getval", "` + mode + `"]}`,
   218  	})
   219  	Expect(err).NotTo(HaveOccurred())
   220  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   221  	Expect(sess).To(gbytes.Say("val1"))
   222  
   223  	By("org2 sets the value of the key")
   224  	sess, err = n.PeerUserSession(peerOrg2, "User1", commands.ChaincodeInvoke{
   225  		ChannelID: "testchannel",
   226  		Orderer:   n.OrdererAddress(orderer, nwo.ListenPort),
   227  		Name:      "mycc",
   228  		Ctor:      `{"Args":["setval", "` + mode + `", "val2"]}`,
   229  		PeerAddresses: []string{
   230  			n.PeerAddress(peerOrg2, nwo.ListenPort),
   231  		},
   232  		WaitForEvent: true,
   233  	})
   234  	Expect(err).NotTo(HaveOccurred())
   235  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(1))
   236  	Expect(sess.Err).To(gbytes.Say(`\Qcommitted with status (ENDORSEMENT_POLICY_FAILURE)\E`))
   237  
   238  	By("org2 checks that setting the value was not successful by reading it")
   239  	sess, err = n.PeerUserSession(peerOrg2, "User1", commands.ChaincodeQuery{
   240  		ChannelID: "testchannel",
   241  		Name:      "mycc",
   242  		Ctor:      `{"Args":["getval", "` + mode + `"]}`,
   243  	})
   244  	Expect(err).NotTo(HaveOccurred())
   245  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   246  	Expect(sess).To(gbytes.Say("val1"))
   247  
   248  	syncLedgerHeights(n, peerOrg2, peerOrg1)
   249  
   250  	By("org1 adds org2 to the ep of the key")
   251  	sess, err = n.PeerUserSession(peerOrg1, "User1", commands.ChaincodeInvoke{
   252  		ChannelID: "testchannel",
   253  		Orderer:   n.OrdererAddress(orderer, nwo.ListenPort),
   254  		Name:      "mycc",
   255  		Ctor:      `{"Args":["addorgs", "` + mode + `", "Org2MSP"]}`,
   256  		PeerAddresses: []string{
   257  			n.PeerAddress(peerOrg1, nwo.ListenPort),
   258  		},
   259  		WaitForEvent: true,
   260  	})
   261  	Expect(err).NotTo(HaveOccurred())
   262  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   263  
   264  	By("org1 lists the orgs of the ep to check that both org1 and org2 are there")
   265  	sess, err = n.PeerUserSession(peerOrg1, "User1", commands.ChaincodeQuery{
   266  		ChannelID: "testchannel",
   267  		Name:      "mycc",
   268  		Ctor:      `{"Args":["listorgs", "` + mode + `"]}`,
   269  	})
   270  	Expect(err).NotTo(HaveOccurred())
   271  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   272  	orgs := [2]string{"Org1MSP", "Org2MSP"}
   273  	orgsList, err := json.Marshal(orgs)
   274  	Expect(err).NotTo(HaveOccurred())
   275  	Expect(sess).To(gbytes.Say(string(orgsList)))
   276  
   277  	syncLedgerHeights(n, peerOrg1, peerOrg2)
   278  
   279  	By("org2 sets the value of the key")
   280  	sess, err = n.PeerUserSession(peerOrg2, "User1", commands.ChaincodeInvoke{
   281  		ChannelID: "testchannel",
   282  		Orderer:   n.OrdererAddress(orderer, nwo.ListenPort),
   283  		Name:      "mycc",
   284  		Ctor:      `{"Args":["setval", "` + mode + `", "val3"]}`,
   285  		PeerAddresses: []string{
   286  			n.PeerAddress(peerOrg2, nwo.ListenPort),
   287  		},
   288  		WaitForEvent: true,
   289  	})
   290  	Expect(err).NotTo(HaveOccurred())
   291  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(1))
   292  	Expect(sess.Err).To(gbytes.Say(`\Qcommitted with status (ENDORSEMENT_POLICY_FAILURE)\E`))
   293  
   294  	By("org2 checks that seting the value was not successful by reading it")
   295  	sess, err = n.PeerUserSession(peerOrg2, "User1", commands.ChaincodeQuery{
   296  		ChannelID: "testchannel",
   297  		Name:      "mycc",
   298  		Ctor:      `{"Args":["getval", "` + mode + `"]}`,
   299  	})
   300  	Expect(err).NotTo(HaveOccurred())
   301  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   302  	Expect(sess).To(gbytes.Say("val1"))
   303  
   304  	syncLedgerHeights(n, peerOrg2, peerOrg1)
   305  
   306  	By("org1 and org2 set the value of the key")
   307  	sess, err = n.PeerUserSession(peerOrg1, "User1", commands.ChaincodeInvoke{
   308  		ChannelID: "testchannel",
   309  		Orderer:   n.OrdererAddress(orderer, nwo.ListenPort),
   310  		Name:      "mycc",
   311  		Ctor:      `{"Args":["setval", "` + mode + `", "val4"]}`,
   312  		PeerAddresses: []string{
   313  			n.PeerAddress(peerOrg1, nwo.ListenPort),
   314  			n.PeerAddress(peerOrg2, nwo.ListenPort),
   315  		},
   316  		WaitForEvent: true,
   317  	})
   318  	Expect(err).NotTo(HaveOccurred())
   319  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   320  
   321  	By("org1 checks that setting the value was successful by reading it")
   322  	sess, err = n.PeerUserSession(peerOrg1, "User1", commands.ChaincodeQuery{
   323  		ChannelID: "testchannel",
   324  		Name:      "mycc",
   325  		Ctor:      `{"Args":["getval", "` + mode + `"]}`,
   326  	})
   327  	Expect(err).NotTo(HaveOccurred())
   328  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   329  	Expect(sess).To(gbytes.Say("val4"))
   330  
   331  	syncLedgerHeights(n, peerOrg1, peerOrg2)
   332  
   333  	By("org2 deletes org1 from the ep of the key")
   334  	sess, err = n.PeerUserSession(peerOrg2, "User1", commands.ChaincodeInvoke{
   335  		ChannelID: "testchannel",
   336  		Orderer:   n.OrdererAddress(orderer, nwo.ListenPort),
   337  		Name:      "mycc",
   338  		Ctor:      `{"Args":["delorgs", "` + mode + `", "Org1MSP"]}`,
   339  		PeerAddresses: []string{
   340  			n.PeerAddress(peerOrg2, nwo.ListenPort),
   341  		},
   342  		WaitForEvent: true,
   343  	})
   344  	Expect(err).NotTo(HaveOccurred())
   345  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(1))
   346  	Expect(sess.Err).To(gbytes.Say(`\Qcommitted with status (ENDORSEMENT_POLICY_FAILURE)\E`))
   347  
   348  	By("org2 lists the orgs of the key to check that deleting org1 did not succeed")
   349  	sess, err = n.PeerUserSession(peerOrg2, "User1", commands.ChaincodeQuery{
   350  		ChannelID: "testchannel",
   351  		Name:      "mycc",
   352  		Ctor:      `{"Args":["listorgs", "` + mode + `"]}`,
   353  	})
   354  	Expect(err).NotTo(HaveOccurred())
   355  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   356  	Expect(sess).To(gbytes.Say(string(orgsList)))
   357  
   358  	syncLedgerHeights(n, peerOrg2, peerOrg1)
   359  
   360  	By("org1 and org2 delete org1 from the ep of the key")
   361  	sess, err = n.PeerUserSession(peerOrg2, "User1", commands.ChaincodeInvoke{
   362  		ChannelID: "testchannel",
   363  		Orderer:   n.OrdererAddress(orderer, nwo.ListenPort),
   364  		Name:      "mycc",
   365  		Ctor:      `{"Args":["delorgs", "` + mode + `", "Org1MSP"]}`,
   366  		PeerAddresses: []string{
   367  			n.PeerAddress(peerOrg1, nwo.ListenPort),
   368  			n.PeerAddress(peerOrg2, nwo.ListenPort),
   369  		},
   370  		WaitForEvent: true,
   371  	})
   372  	Expect(err).NotTo(HaveOccurred())
   373  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   374  
   375  	By("org2 lists the orgs of the key's ep to check that removing org1 from the ep was successful")
   376  	sess, err = n.PeerUserSession(peerOrg2, "User1", commands.ChaincodeQuery{
   377  		ChannelID: "testchannel",
   378  		Name:      "mycc",
   379  		Ctor:      `{"Args":["listorgs", "` + mode + `"]}`,
   380  	})
   381  	Expect(err).NotTo(HaveOccurred())
   382  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   383  	Expect(sess).To(gbytes.Say("Org2MSP"))
   384  
   385  	By("org2 uses cc2cc invocation to set the value of the key")
   386  	sess, err = n.PeerUserSession(peerOrg2, "User1", commands.ChaincodeInvoke{
   387  		ChannelID: "testchannel",
   388  		Orderer:   n.OrdererAddress(orderer, nwo.ListenPort),
   389  		Name:      "mycc2",
   390  		Ctor:      `{"Args":["cc2cc", "testchannel", "mycc", "setval", "` + mode + `", "cc2cc_org2"]}`,
   391  		PeerAddresses: []string{
   392  			n.PeerAddress(peerOrg2, nwo.ListenPort),
   393  		},
   394  		WaitForEvent: true,
   395  	})
   396  	Expect(err).NotTo(HaveOccurred())
   397  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   398  
   399  	By("org2 reads the value of the key to check that setting it was successful")
   400  	sess, err = n.PeerUserSession(peerOrg2, "User1", commands.ChaincodeQuery{
   401  		ChannelID: "testchannel",
   402  		Name:      "mycc",
   403  		Ctor:      `{"Args":["getval", "` + mode + `"]}`,
   404  	})
   405  	Expect(err).NotTo(HaveOccurred())
   406  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   407  	Expect(sess).To(gbytes.Say("cc2cc_org2"))
   408  
   409  	syncLedgerHeights(n, peerOrg2, peerOrg1)
   410  
   411  	By("org1 uses cc2cc to set the value of the key")
   412  	sess, err = n.PeerUserSession(peerOrg1, "User1", commands.ChaincodeInvoke{
   413  		ChannelID: "testchannel",
   414  		Orderer:   n.OrdererAddress(orderer, nwo.ListenPort),
   415  		Name:      "mycc2",
   416  		Ctor:      `{"Args":["cc2cc", "testchannel", "mycc", "setval", "` + mode + `", "cc2cc_org1"]}`,
   417  		PeerAddresses: []string{
   418  			n.PeerAddress(peerOrg1, nwo.ListenPort),
   419  		},
   420  		WaitForEvent: true,
   421  	})
   422  	Expect(err).NotTo(HaveOccurred())
   423  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(1))
   424  	Expect(sess.Err).To(gbytes.Say(`\Qcommitted with status (ENDORSEMENT_POLICY_FAILURE)\E`))
   425  
   426  	By("org1 reads the value of the key to check that setting it was not successful")
   427  	sess, err = n.PeerUserSession(peerOrg1, "User1", commands.ChaincodeQuery{
   428  		ChannelID: "testchannel",
   429  		Name:      "mycc",
   430  		Ctor:      `{"Args":["getval", "` + mode + `"]}`,
   431  	})
   432  	Expect(err).NotTo(HaveOccurred())
   433  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   434  	Expect(sess).To(gbytes.Say("cc2cc_org2"))
   435  }
   436  
   437  func getLedgerHeight(n *nwo.Network, peer *nwo.Peer, channelName string) int {
   438  	sess, err := n.PeerUserSession(peer, "User1", commands.ChannelInfo{
   439  		ChannelID: channelName,
   440  	})
   441  	Expect(err).NotTo(HaveOccurred())
   442  	Eventually(sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   443  
   444  	channelInfoStr := strings.TrimPrefix(string(sess.Buffer().Contents()[:]), "Blockchain info:")
   445  	var channelInfo = common.BlockchainInfo{}
   446  	json.Unmarshal([]byte(channelInfoStr), &channelInfo)
   447  	return int(channelInfo.Height)
   448  }
   449  
   450  func syncLedgerHeights(n *nwo.Network, peer1 *nwo.Peer, peer2 *nwo.Peer) {
   451  	// get height from peer1
   452  	height := getLedgerHeight(n, peer1, "testchannel")
   453  	// wait for same height on peer2
   454  	Eventually(func() int {
   455  		return getLedgerHeight(n, peer2, "testchannel")
   456  	}, n.EventuallyTimeout).Should(Equal(height))
   457  
   458  }