github.com/anjalikarhana/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  })