github.com/sykesm/fabric@v1.1.0-preview.0.20200129034918-2aa12b1a0181/integration/lifecycle/lifecycle_suite_test.go (about)

     1  /*
     2  Copyright IBM Corp All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package lifecycle
     8  
     9  import (
    10  	"context"
    11  	"crypto/tls"
    12  	"encoding/json"
    13  	"fmt"
    14  	"io/ioutil"
    15  	"path/filepath"
    16  	"syscall"
    17  	"testing"
    18  	"time"
    19  
    20  	pcommon "github.com/hyperledger/fabric-protos-go/common"
    21  	pb "github.com/hyperledger/fabric-protos-go/peer"
    22  	"github.com/hyperledger/fabric/bccsp/sw"
    23  	"github.com/hyperledger/fabric/core/comm"
    24  	"github.com/hyperledger/fabric/integration"
    25  	"github.com/hyperledger/fabric/integration/nwo"
    26  	"github.com/hyperledger/fabric/integration/nwo/commands"
    27  	ic "github.com/hyperledger/fabric/internal/peer/chaincode"
    28  	"github.com/hyperledger/fabric/internal/peer/common"
    29  	"github.com/hyperledger/fabric/msp"
    30  	"github.com/hyperledger/fabric/protoutil"
    31  	. "github.com/onsi/ginkgo"
    32  	. "github.com/onsi/gomega"
    33  	"github.com/onsi/gomega/gbytes"
    34  	"github.com/onsi/gomega/gexec"
    35  	"github.com/pkg/errors"
    36  	"github.com/tedsuo/ifrit"
    37  )
    38  
    39  func TestLifecycle(t *testing.T) {
    40  	RegisterFailHandler(Fail)
    41  	RunSpecs(t, "Lifecycle Suite")
    42  }
    43  
    44  var (
    45  	buildServer *nwo.BuildServer
    46  	components  *nwo.Components
    47  )
    48  
    49  var _ = SynchronizedBeforeSuite(func() []byte {
    50  	buildServer = nwo.NewBuildServer()
    51  	buildServer.Serve()
    52  
    53  	components = buildServer.Components()
    54  	payload, err := json.Marshal(components)
    55  	Expect(err).NotTo(HaveOccurred())
    56  
    57  	return payload
    58  }, func(payload []byte) {
    59  	err := json.Unmarshal(payload, &components)
    60  	Expect(err).NotTo(HaveOccurred())
    61  })
    62  
    63  var _ = SynchronizedAfterSuite(func() {
    64  }, func() {
    65  	buildServer.Shutdown()
    66  })
    67  
    68  func StartPort() int {
    69  	return integration.LifecyclePort.StartPortForNode()
    70  }
    71  
    72  func RunQueryInvokeQuery(n *nwo.Network, orderer *nwo.Orderer, chaincodeName string, initialQueryResult int, peers ...*nwo.Peer) {
    73  	if len(peers) == 0 {
    74  		peers = n.PeersWithChannel("testchannel")
    75  	}
    76  
    77  	addresses := make([]string, len(peers))
    78  	for i, peer := range peers {
    79  		addresses[i] = n.PeerAddress(peer, nwo.ListenPort)
    80  	}
    81  
    82  	By("querying the chaincode")
    83  	sess, err := n.PeerUserSession(peers[0], "User1", commands.ChaincodeQuery{
    84  		ChannelID: "testchannel",
    85  		Name:      chaincodeName,
    86  		Ctor:      `{"Args":["query","a"]}`,
    87  	})
    88  	ExpectWithOffset(1, err).NotTo(HaveOccurred())
    89  	EventuallyWithOffset(1, sess, n.EventuallyTimeout).Should(gexec.Exit(0))
    90  	ExpectWithOffset(1, sess).To(gbytes.Say(fmt.Sprint(initialQueryResult)))
    91  
    92  	By("invoking the chaincode")
    93  	sess, err = n.PeerUserSession(peers[0], "User1", commands.ChaincodeInvoke{
    94  		ChannelID:     "testchannel",
    95  		Orderer:       n.OrdererAddress(orderer, nwo.ListenPort),
    96  		Name:          chaincodeName,
    97  		Ctor:          `{"Args":["invoke","a","b","10"]}`,
    98  		PeerAddresses: addresses,
    99  		WaitForEvent:  true,
   100  	})
   101  	ExpectWithOffset(1, err).NotTo(HaveOccurred())
   102  	EventuallyWithOffset(1, sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   103  	ExpectWithOffset(1, sess.Err).To(gbytes.Say("Chaincode invoke successful. result: status:200"))
   104  
   105  	By("querying the chaincode")
   106  	sess, err = n.PeerUserSession(peers[0], "User1", commands.ChaincodeQuery{
   107  		ChannelID: "testchannel",
   108  		Name:      chaincodeName,
   109  		Ctor:      `{"Args":["query","a"]}`,
   110  	})
   111  	ExpectWithOffset(1, err).NotTo(HaveOccurred())
   112  	EventuallyWithOffset(1, sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   113  	ExpectWithOffset(1, sess).To(gbytes.Say(fmt.Sprint(initialQueryResult - 10)))
   114  }
   115  
   116  func RestartNetwork(process *ifrit.Process, network *nwo.Network) {
   117  	(*process).Signal(syscall.SIGTERM)
   118  	Eventually((*process).Wait(), network.EventuallyTimeout).Should(Receive())
   119  	networkRunner := network.NetworkGroupRunner()
   120  	*process = ifrit.Invoke(networkRunner)
   121  	Eventually((*process).Ready(), network.EventuallyTimeout).Should(BeClosed())
   122  }
   123  
   124  func LoadLocalMSPAt(dir, id, mspType string) (msp.MSP, error) {
   125  	if mspType != "bccsp" {
   126  		return nil, errors.Errorf("invalid msp type, expected 'bccsp', got %s", mspType)
   127  	}
   128  	conf, err := msp.GetLocalMspConfig(dir, nil, id)
   129  	if err != nil {
   130  		return nil, err
   131  	}
   132  	ks, err := sw.NewFileBasedKeyStore(nil, filepath.Join(dir, "keystore"), true)
   133  	if err != nil {
   134  		return nil, err
   135  	}
   136  	cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
   137  	if err != nil {
   138  		return nil, err
   139  	}
   140  	thisMSP, err := msp.NewBccspMspWithKeyStore(msp.MSPv1_0, ks, cryptoProvider)
   141  	if err != nil {
   142  		return nil, err
   143  	}
   144  	err = thisMSP.Setup(conf)
   145  	if err != nil {
   146  		return nil, err
   147  	}
   148  	return thisMSP, nil
   149  }
   150  
   151  func Signer(dir string) (msp.SigningIdentity, []byte) {
   152  	MSP, err := LoadLocalMSPAt(dir, "Org1MSP", "bccsp")
   153  	Expect(err).To(BeNil())
   154  	Expect(MSP).NotTo(BeNil())
   155  	Expect(err).To(BeNil(), "failed getting signer for %s", dir)
   156  	signer, err := MSP.GetDefaultSigningIdentity()
   157  	Expect(err).To(BeNil())
   158  	Expect(signer).NotTo(BeNil())
   159  	serialisedSigner, err := signer.Serialize()
   160  	Expect(err).To(BeNil())
   161  	Expect(serialisedSigner).NotTo(BeNil())
   162  
   163  	return signer, serialisedSigner
   164  }
   165  
   166  func SignedProposal(channel, chaincode string, signer msp.SigningIdentity, serialisedSigner []byte, args ...string) (*pb.SignedProposal, *pb.Proposal, string) {
   167  	byteArgs := make([][]byte, 0, len(args))
   168  	for _, arg := range args {
   169  		byteArgs = append(byteArgs, []byte(arg))
   170  	}
   171  
   172  	prop, txid, err := protoutil.CreateChaincodeProposalWithTxIDAndTransient(
   173  		pcommon.HeaderType_ENDORSER_TRANSACTION,
   174  		channel,
   175  		&pb.ChaincodeInvocationSpec{
   176  			ChaincodeSpec: &pb.ChaincodeSpec{
   177  				Type: pb.ChaincodeSpec_GOLANG,
   178  				ChaincodeId: &pb.ChaincodeID{
   179  					Name: chaincode,
   180  				},
   181  				Input: &pb.ChaincodeInput{
   182  					Args: byteArgs,
   183  				},
   184  			},
   185  		},
   186  		serialisedSigner,
   187  		"",
   188  		nil,
   189  	)
   190  	Expect(err).NotTo(HaveOccurred())
   191  	Expect(prop).NotTo(BeNil())
   192  
   193  	signedProp, err := protoutil.GetSignedProposal(prop, signer)
   194  	Expect(err).NotTo(HaveOccurred())
   195  	Expect(signedProp).NotTo(BeNil())
   196  
   197  	return signedProp, prop, txid
   198  }
   199  
   200  func grpcClient(tlsRootCertFile string) *comm.GRPCClient {
   201  	caPEM, res := ioutil.ReadFile(tlsRootCertFile)
   202  	Expect(res).To(BeNil())
   203  
   204  	gClient, err := comm.NewGRPCClient(comm.ClientConfig{
   205  		Timeout: 3 * time.Second,
   206  		KaOpts:  comm.DefaultKeepaliveOptions,
   207  		SecOpts: comm.SecureOptions{
   208  			UseTLS:        true,
   209  			ServerRootCAs: [][]byte{caPEM},
   210  		},
   211  	})
   212  	Expect(err).NotTo(HaveOccurred())
   213  	Expect(gClient).NotTo(BeNil())
   214  
   215  	return gClient
   216  }
   217  
   218  func EndorserClient(address, tlsRootCertFile string) pb.EndorserClient {
   219  	peerClient := &common.PeerClient{
   220  		CommonClient: common.CommonClient{
   221  			GRPCClient: grpcClient(tlsRootCertFile),
   222  			Address:    address,
   223  		},
   224  	}
   225  
   226  	ec, err := peerClient.Endorser()
   227  	Expect(err).NotTo(HaveOccurred())
   228  	Expect(ec).NotTo(BeNil())
   229  
   230  	return ec
   231  }
   232  
   233  func OrdererClient(address, tlsRootCertFile string) common.BroadcastClient {
   234  	ordererClient := &common.OrdererClient{
   235  		CommonClient: common.CommonClient{
   236  			GRPCClient: grpcClient(tlsRootCertFile),
   237  			Address:    address,
   238  		},
   239  	}
   240  
   241  	bc, err := ordererClient.Broadcast()
   242  	Expect(err).NotTo(HaveOccurred())
   243  	Expect(bc).NotTo(BeNil())
   244  
   245  	return &common.BroadcastGRPCClient{Client: bc}
   246  }
   247  
   248  func DeliverClient(address, tlsRootCertFile string) pb.DeliverClient {
   249  	peerClient := &common.PeerClient{
   250  		CommonClient: common.CommonClient{
   251  			GRPCClient: grpcClient(tlsRootCertFile),
   252  			Address:    address,
   253  		},
   254  	}
   255  
   256  	pd, err := peerClient.PeerDeliver()
   257  	Expect(err).NotTo(HaveOccurred())
   258  	Expect(pd).NotTo(BeNil())
   259  
   260  	return pd
   261  }
   262  
   263  func CommitTx(network *nwo.Network, env *pcommon.Envelope, peer *nwo.Peer, dc pb.DeliverClient, oc common.BroadcastClient, signer msp.SigningIdentity, txid string) error {
   264  	var cancelFunc context.CancelFunc
   265  	ctx, cancelFunc := context.WithTimeout(context.Background(), 10*time.Second)
   266  	defer cancelFunc()
   267  
   268  	dg := ic.NewDeliverGroup([]pb.DeliverClient{dc}, []string{network.PeerAddress(peer, nwo.ListenPort)}, signer, tls.Certificate{}, "testchannel", txid)
   269  
   270  	err := dg.Connect(ctx)
   271  	Expect(err).NotTo(HaveOccurred())
   272  
   273  	err = oc.Send(env)
   274  	Expect(err).NotTo(HaveOccurred())
   275  
   276  	return dg.Wait(ctx)
   277  }
   278  
   279  // GenerateOrgUpdateMeterials generates the necessary configtx and
   280  // crypto materials for a new org's peers to join a network
   281  func GenerateOrgUpdateMaterials(n *nwo.Network, peers ...*nwo.Peer) {
   282  	orgUpdateNetwork := *n
   283  	orgUpdateNetwork.Peers = peers
   284  	orgUpdateNetwork.Templates = &nwo.Templates{
   285  		ConfigTx: nwo.OrgUpdateConfigTxTemplate,
   286  		Crypto:   nwo.OrgUpdateCryptoTemplate,
   287  		Core:     n.Templates.CoreTemplate(),
   288  	}
   289  
   290  	orgUpdateNetwork.GenerateConfigTxConfig()
   291  	for _, peer := range peers {
   292  		orgUpdateNetwork.GenerateCoreConfig(peer)
   293  	}
   294  
   295  	orgUpdateNetwork.GenerateCryptoConfig()
   296  	sess, err := orgUpdateNetwork.Cryptogen(commands.Generate{
   297  		Config: orgUpdateNetwork.CryptoConfigPath(),
   298  		Output: orgUpdateNetwork.CryptoPath(),
   299  	})
   300  	Expect(err).NotTo(HaveOccurred())
   301  	Eventually(sess, orgUpdateNetwork.EventuallyTimeout).Should(gexec.Exit(0))
   302  
   303  	// refresh TLSCACertificates ca-certs.pem so that it includes
   304  	// the newly generated cert
   305  	n.ConcatenateTLSCACertificates()
   306  }