github.com/defanghe/fabric@v2.1.1+incompatible/internal/peer/lifecycle/chaincode/getinstalledpackage_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package chaincode_test 8 9 import ( 10 "fmt" 11 "io/ioutil" 12 "os" 13 "path/filepath" 14 15 pb "github.com/hyperledger/fabric-protos-go/peer" 16 "github.com/hyperledger/fabric/bccsp/sw" 17 "github.com/hyperledger/fabric/internal/peer/lifecycle/chaincode" 18 "github.com/hyperledger/fabric/internal/peer/lifecycle/chaincode/mock" 19 "github.com/pkg/errors" 20 "github.com/spf13/cobra" 21 22 . "github.com/onsi/ginkgo" 23 . "github.com/onsi/gomega" 24 ) 25 26 var _ = Describe("GetInstalledPackage", func() { 27 Describe("InstalledPackageGetter", func() { 28 var ( 29 mockProposalResponse *pb.ProposalResponse 30 mockEndorserClient *mock.EndorserClient 31 mockWriter *mock.Writer 32 mockSigner *mock.Signer 33 testDir string 34 input *chaincode.GetInstalledPackageInput 35 installedPackageGetter *chaincode.InstalledPackageGetter 36 ) 37 38 BeforeEach(func() { 39 mockEndorserClient = &mock.EndorserClient{} 40 mockProposalResponse = &pb.ProposalResponse{ 41 Response: &pb.Response{ 42 Status: 200, 43 }, 44 } 45 mockEndorserClient.ProcessProposalReturns(mockProposalResponse, nil) 46 47 var err error 48 testDir, err = ioutil.TempDir("", "getinstalledpackage-test") 49 Expect(err).NotTo(HaveOccurred()) 50 input = &chaincode.GetInstalledPackageInput{ 51 PackageID: "pkgFile", 52 OutputDirectory: testDir, 53 } 54 55 mockWriter = &mock.Writer{} 56 mockSigner = &mock.Signer{} 57 58 installedPackageGetter = &chaincode.InstalledPackageGetter{ 59 Input: input, 60 EndorserClient: mockEndorserClient, 61 Writer: mockWriter, 62 Signer: mockSigner, 63 } 64 }) 65 66 AfterEach(func() { 67 os.RemoveAll(testDir) 68 }) 69 70 It("gets the installed chaincode package and writes it to the specified directory", func() { 71 err := installedPackageGetter.Get() 72 Expect(err).NotTo(HaveOccurred()) 73 Expect(mockWriter.WriteFileCallCount()).To(Equal(1)) 74 dir, name, _ := mockWriter.WriteFileArgsForCall(0) 75 Expect(err).NotTo(HaveOccurred()) 76 Expect(dir).To(Equal(testDir)) 77 Expect(name).To(Equal("pkgFile.tar.gz")) 78 }) 79 80 Context("when the output directory is not specified", func() { 81 BeforeEach(func() { 82 input.OutputDirectory = "" 83 }) 84 85 It("get the installed chaincode package and writes it to the working directory", func() { 86 err := installedPackageGetter.Get() 87 Expect(err).NotTo(HaveOccurred()) 88 Expect(mockWriter.WriteFileCallCount()).To(Equal(1)) 89 dir, name, _ := mockWriter.WriteFileArgsForCall(0) 90 wd, err := os.Getwd() 91 Expect(err).NotTo(HaveOccurred()) 92 Expect(dir).To(Equal(wd)) 93 Expect(name).To(Equal("pkgFile.tar.gz")) 94 }) 95 }) 96 97 Context("when the signer cannot be serialized", func() { 98 BeforeEach(func() { 99 mockSigner.SerializeReturns(nil, errors.New("cafe")) 100 }) 101 102 It("returns an error", func() { 103 err := installedPackageGetter.Get() 104 Expect(err).To(MatchError("failed to create proposal: failed to serialize identity: cafe")) 105 }) 106 }) 107 108 Context("when the package id is not specified", func() { 109 BeforeEach(func() { 110 input.PackageID = "" 111 }) 112 113 It("returns an error", func() { 114 err := installedPackageGetter.Get() 115 Expect(err).To(MatchError("The required parameter 'package-id' is empty. Rerun the command with --package-id flag")) 116 }) 117 }) 118 119 Context("when the signer cannot be serialized", func() { 120 BeforeEach(func() { 121 mockSigner.SerializeReturns(nil, errors.New("cafe")) 122 }) 123 124 It("returns an error", func() { 125 err := installedPackageGetter.Get() 126 Expect(err).To(MatchError("failed to create proposal: failed to serialize identity: cafe")) 127 }) 128 }) 129 130 Context("when the signer fails to sign the proposal", func() { 131 BeforeEach(func() { 132 mockSigner.SignReturns(nil, errors.New("tea")) 133 }) 134 135 It("returns an error", func() { 136 err := installedPackageGetter.Get() 137 Expect(err).To(MatchError("failed to create signed proposal: tea")) 138 }) 139 }) 140 141 Context("when the endorser fails to endorse the proposal", func() { 142 BeforeEach(func() { 143 mockEndorserClient.ProcessProposalReturns(nil, errors.New("latte")) 144 }) 145 146 It("returns an error", func() { 147 err := installedPackageGetter.Get() 148 Expect(err).To(MatchError("failed to endorse proposal: latte")) 149 }) 150 }) 151 152 Context("when the endorser returns a nil proposal response", func() { 153 BeforeEach(func() { 154 mockProposalResponse = nil 155 mockEndorserClient.ProcessProposalReturns(mockProposalResponse, nil) 156 }) 157 158 It("returns an error", func() { 159 err := installedPackageGetter.Get() 160 Expect(err).To(MatchError("received nil proposal response")) 161 }) 162 }) 163 164 Context("when the endorser returns a proposal response with a nil response", func() { 165 BeforeEach(func() { 166 mockProposalResponse.Response = nil 167 mockEndorserClient.ProcessProposalReturns(mockProposalResponse, nil) 168 }) 169 170 It("returns an error", func() { 171 err := installedPackageGetter.Get() 172 Expect(err).To(MatchError("received proposal response with nil response")) 173 }) 174 }) 175 176 Context("when the endorser returns a non-success status", func() { 177 BeforeEach(func() { 178 mockProposalResponse.Response = &pb.Response{ 179 Status: 500, 180 Message: "capuccino", 181 } 182 mockEndorserClient.ProcessProposalReturns(mockProposalResponse, nil) 183 }) 184 185 It("returns an error", func() { 186 err := installedPackageGetter.Get() 187 Expect(err).To(MatchError("proposal failed with status: 500 - capuccino")) 188 }) 189 }) 190 191 Context("when the payload contains bytes that aren't an GetInstalledChaincodePackageResult", func() { 192 BeforeEach(func() { 193 mockProposalResponse.Response = &pb.Response{ 194 Payload: []byte("badpayloadbadpayload"), 195 Status: 200, 196 } 197 mockEndorserClient.ProcessProposalReturns(mockProposalResponse, nil) 198 }) 199 200 It("returns an error", func() { 201 err := installedPackageGetter.Get() 202 Expect(err).To(MatchError(ContainSubstring("failed to unmarshal proposal response's response payload"))) 203 }) 204 }) 205 206 Context("when the writer fails to write the chaincode package", func() { 207 BeforeEach(func() { 208 mockWriter.WriteFileReturns(errors.New("frappuccino")) 209 }) 210 211 It("returns an error", func() { 212 err := installedPackageGetter.Get() 213 Expect(err).To(MatchError(fmt.Sprintf("failed to write chaincode package to %s: frappuccino", filepath.Join(testDir, "pkgFile.tar.gz")))) 214 }) 215 }) 216 }) 217 218 Describe("GetInstalledPackageCmd", func() { 219 var ( 220 getInstalledPackageCmd *cobra.Command 221 ) 222 223 BeforeEach(func() { 224 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 225 Expect(err).To(BeNil()) 226 getInstalledPackageCmd = chaincode.GetInstalledPackageCmd(nil, cryptoProvider) 227 getInstalledPackageCmd.SetArgs([]string{ 228 "--package-id=test-package", 229 "--peerAddresses=test1", 230 "--tlsRootCertFiles=tls1", 231 }) 232 }) 233 234 AfterEach(func() { 235 chaincode.ResetFlags() 236 }) 237 238 It("sets up the installedPackageGetter and attempts to get the installed chaincode package", func() { 239 err := getInstalledPackageCmd.Execute() 240 Expect(err).To(MatchError(ContainSubstring("failed to retrieve endorser client for getinstalledpackage"))) 241 }) 242 243 Context("when more than one peer address is provided", func() { 244 BeforeEach(func() { 245 getInstalledPackageCmd.SetArgs([]string{ 246 "--peerAddresses=test3", 247 "--peerAddresses=test4", 248 }) 249 }) 250 251 It("returns an error", func() { 252 err := getInstalledPackageCmd.Execute() 253 Expect(err).To(MatchError(ContainSubstring("failed to validate peer connection parameters"))) 254 }) 255 }) 256 }) 257 })