github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/integration/lifecycle/lifecycle_suite_test.go (about)

     1  /*
     2  Copyright hechain All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package lifecycle
     8  
     9  import (
    10  	"context"
    11  	"encoding/json"
    12  	"fmt"
    13  	"math"
    14  	"syscall"
    15  	"testing"
    16  	"time"
    17  
    18  	"github.com/hechain20/hechain/common/flogging"
    19  	"github.com/hechain20/hechain/integration"
    20  	"github.com/hechain20/hechain/integration/nwo"
    21  	"github.com/hechain20/hechain/integration/nwo/commands"
    22  	"github.com/hechain20/hechain/integration/nwo/template"
    23  	"github.com/hechain20/hechain/protoutil"
    24  	pcommon "github.com/hyperledger/fabric-protos-go/common"
    25  	ab "github.com/hyperledger/fabric-protos-go/orderer"
    26  	pb "github.com/hyperledger/fabric-protos-go/peer"
    27  	. "github.com/onsi/ginkgo"
    28  	. "github.com/onsi/gomega"
    29  	"github.com/onsi/gomega/gbytes"
    30  	"github.com/onsi/gomega/gexec"
    31  	"github.com/tedsuo/ifrit"
    32  )
    33  
    34  func TestLifecycle(t *testing.T) {
    35  	RegisterFailHandler(Fail)
    36  	RunSpecs(t, "Lifecycle Suite")
    37  }
    38  
    39  var (
    40  	buildServer *nwo.BuildServer
    41  	components  *nwo.Components
    42  )
    43  
    44  var _ = SynchronizedBeforeSuite(func() []byte {
    45  	buildServer = nwo.NewBuildServer()
    46  	buildServer.Serve()
    47  
    48  	components = buildServer.Components()
    49  	payload, err := json.Marshal(components)
    50  	Expect(err).NotTo(HaveOccurred())
    51  
    52  	return payload
    53  }, func(payload []byte) {
    54  	err := json.Unmarshal(payload, &components)
    55  	Expect(err).NotTo(HaveOccurred())
    56  
    57  	flogging.SetWriter(GinkgoWriter)
    58  })
    59  
    60  var _ = SynchronizedAfterSuite(func() {
    61  }, func() {
    62  	buildServer.Shutdown()
    63  })
    64  
    65  func StartPort() int {
    66  	return integration.LifecyclePort.StartPortForNode()
    67  }
    68  
    69  func RunQueryInvokeQuery(n *nwo.Network, orderer *nwo.Orderer, chaincodeName string, initialQueryResult int, peers ...*nwo.Peer) {
    70  	if len(peers) == 0 {
    71  		peers = n.PeersWithChannel("testchannel")
    72  	}
    73  
    74  	addresses := make([]string, len(peers))
    75  	for i, peer := range peers {
    76  		addresses[i] = n.PeerAddress(peer, nwo.ListenPort)
    77  	}
    78  
    79  	By("querying the chaincode")
    80  	sess, err := n.PeerUserSession(peers[0], "User1", commands.ChaincodeQuery{
    81  		ChannelID: "testchannel",
    82  		Name:      chaincodeName,
    83  		Ctor:      `{"Args":["query","a"]}`,
    84  	})
    85  	ExpectWithOffset(1, err).NotTo(HaveOccurred())
    86  	EventuallyWithOffset(1, sess, n.EventuallyTimeout).Should(gexec.Exit(0))
    87  	ExpectWithOffset(1, sess).To(gbytes.Say(fmt.Sprint(initialQueryResult)))
    88  
    89  	By("invoking the chaincode")
    90  	sess, err = n.PeerUserSession(peers[0], "User1", commands.ChaincodeInvoke{
    91  		ChannelID:     "testchannel",
    92  		Orderer:       n.OrdererAddress(orderer, nwo.ListenPort),
    93  		Name:          chaincodeName,
    94  		Ctor:          `{"Args":["invoke","a","b","10"]}`,
    95  		PeerAddresses: addresses,
    96  		WaitForEvent:  true,
    97  	})
    98  	ExpectWithOffset(1, err).NotTo(HaveOccurred())
    99  	EventuallyWithOffset(1, sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   100  	ExpectWithOffset(1, sess.Err).To(gbytes.Say("Chaincode invoke successful. result: status:200"))
   101  
   102  	By("querying the chaincode")
   103  	sess, err = n.PeerUserSession(peers[0], "User1", commands.ChaincodeQuery{
   104  		ChannelID: "testchannel",
   105  		Name:      chaincodeName,
   106  		Ctor:      `{"Args":["query","a"]}`,
   107  	})
   108  	ExpectWithOffset(1, err).NotTo(HaveOccurred())
   109  	EventuallyWithOffset(1, sess, n.EventuallyTimeout).Should(gexec.Exit(0))
   110  	ExpectWithOffset(1, sess).To(gbytes.Say(fmt.Sprint(initialQueryResult - 10)))
   111  }
   112  
   113  func RestartNetwork(process ifrit.Process, network *nwo.Network) ifrit.Process {
   114  	process.Signal(syscall.SIGTERM)
   115  	Eventually(process.Wait(), network.EventuallyTimeout).Should(Receive())
   116  	networkRunner := network.NetworkGroupRunner()
   117  	process = ifrit.Invoke(networkRunner)
   118  	Eventually(process.Ready(), network.EventuallyTimeout).Should(BeClosed())
   119  	return process
   120  }
   121  
   122  func SignedProposal(channel, chaincode string, signer *nwo.SigningIdentity, args ...string) (*pb.SignedProposal, *pb.Proposal, string) {
   123  	byteArgs := make([][]byte, 0, len(args))
   124  	for _, arg := range args {
   125  		byteArgs = append(byteArgs, []byte(arg))
   126  	}
   127  	serializedSigner, err := signer.Serialize()
   128  	Expect(err).NotTo(HaveOccurred())
   129  
   130  	prop, txid, err := protoutil.CreateChaincodeProposalWithTxIDAndTransient(
   131  		pcommon.HeaderType_ENDORSER_TRANSACTION,
   132  		channel,
   133  		&pb.ChaincodeInvocationSpec{
   134  			ChaincodeSpec: &pb.ChaincodeSpec{
   135  				Type: pb.ChaincodeSpec_GOLANG,
   136  				ChaincodeId: &pb.ChaincodeID{
   137  					Name: chaincode,
   138  				},
   139  				Input: &pb.ChaincodeInput{
   140  					Args: byteArgs,
   141  				},
   142  			},
   143  		},
   144  		serializedSigner,
   145  		"",
   146  		nil,
   147  	)
   148  	Expect(err).NotTo(HaveOccurred())
   149  	Expect(prop).NotTo(BeNil())
   150  
   151  	signedProp, err := protoutil.GetSignedProposal(prop, signer)
   152  	Expect(err).NotTo(HaveOccurred())
   153  	Expect(signedProp).NotTo(BeNil())
   154  
   155  	return signedProp, prop, txid
   156  }
   157  
   158  func CommitTx(nw *nwo.Network, tx *pcommon.Envelope, peer *nwo.Peer, dc pb.DeliverClient, oc ab.AtomicBroadcast_BroadcastClient, signer *nwo.SigningIdentity, txid string) error {
   159  	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
   160  	defer cancel()
   161  
   162  	df, err := dc.DeliverFiltered(ctx)
   163  	Expect(err).NotTo(HaveOccurred())
   164  	defer df.CloseSend()
   165  
   166  	deliverEnvelope, err := protoutil.CreateSignedEnvelope(
   167  		pcommon.HeaderType_DELIVER_SEEK_INFO,
   168  		"testchannel",
   169  		signer,
   170  		&ab.SeekInfo{
   171  			Behavior: ab.SeekInfo_BLOCK_UNTIL_READY,
   172  			Start: &ab.SeekPosition{
   173  				Type: &ab.SeekPosition_Newest{Newest: &ab.SeekNewest{}},
   174  			},
   175  			Stop: &ab.SeekPosition{
   176  				Type: &ab.SeekPosition_Specified{
   177  					Specified: &ab.SeekSpecified{Number: math.MaxUint64},
   178  				},
   179  			},
   180  		},
   181  		0,
   182  		0,
   183  	)
   184  	Expect(err).NotTo(HaveOccurred())
   185  	err = df.Send(deliverEnvelope)
   186  	Expect(err).NotTo(HaveOccurred())
   187  
   188  	err = oc.Send(tx)
   189  	Expect(err).NotTo(HaveOccurred())
   190  
   191  	for {
   192  		resp, err := df.Recv()
   193  		if err != nil {
   194  			return err
   195  		}
   196  		fb, ok := resp.Type.(*pb.DeliverResponse_FilteredBlock)
   197  		if !ok {
   198  			return fmt.Errorf("unexpected filtered block, received %T", resp.Type)
   199  		}
   200  		for _, tx := range fb.FilteredBlock.FilteredTransactions {
   201  			if tx.Txid != txid {
   202  				continue
   203  			}
   204  			if tx.TxValidationCode != pb.TxValidationCode_VALID {
   205  				return fmt.Errorf("transaction invalidated with status (%s)", tx.TxValidationCode)
   206  			}
   207  			return nil
   208  		}
   209  	}
   210  }
   211  
   212  // GenerateOrgUpdateMeterials generates the necessary configtx and
   213  // crypto materials for a new org's peers to join a network
   214  func GenerateOrgUpdateMaterials(n *nwo.Network, peers ...*nwo.Peer) {
   215  	orgUpdateNetwork := *n
   216  	orgUpdateNetwork.Peers = peers
   217  	orgUpdateNetwork.Templates = &nwo.Templates{
   218  		ConfigTx: template.OrgUpdateConfigTxTemplate,
   219  		Crypto:   template.OrgUpdateCryptoTemplate,
   220  		Core:     n.Templates.CoreTemplate(),
   221  	}
   222  
   223  	orgUpdateNetwork.GenerateConfigTxConfig()
   224  	for _, peer := range peers {
   225  		orgUpdateNetwork.GenerateCoreConfig(peer)
   226  	}
   227  
   228  	orgUpdateNetwork.GenerateCryptoConfig()
   229  	sess, err := orgUpdateNetwork.Cryptogen(commands.Generate{
   230  		Config: orgUpdateNetwork.CryptoConfigPath(),
   231  		Output: orgUpdateNetwork.CryptoPath(),
   232  	})
   233  	Expect(err).NotTo(HaveOccurred())
   234  	Eventually(sess, orgUpdateNetwork.EventuallyTimeout).Should(gexec.Exit(0))
   235  
   236  	// refresh TLSCACertificates ca-certs.pem so that it includes
   237  	// the newly generated cert
   238  	n.ConcatenateTLSCACertificates()
   239  }