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 }