go_study/fabric-main/internal/peer/chaincode/install_test.go

154 lines
3.9 KiB
Go

/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package chaincode
import (
"fmt"
"io/ioutil"
"os"
"testing"
pb "github.com/hyperledger/fabric-protos-go/peer"
"github.com/hyperledger/fabric/bccsp/sw"
"github.com/hyperledger/fabric/internal/peer/common"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"github.com/stretchr/testify/require"
)
func initInstallTest(t *testing.T, fsPath string, ec pb.EndorserClient, mockResponse *pb.ProposalResponse) (*cobra.Command, *ChaincodeCmdFactory) {
viper.Set("peer.fileSystemPath", fsPath)
signer, err := common.GetDefaultSigner()
if err != nil {
t.Fatalf("Get default signer error: %v", err)
}
if mockResponse == nil {
mockResponse = &pb.ProposalResponse{
Response: &pb.Response{Status: 200},
Endorsement: &pb.Endorsement{},
}
}
if ec == nil {
ec = common.GetMockEndorserClient(mockResponse, nil)
}
mockCF := &ChaincodeCmdFactory{
Signer: signer,
EndorserClients: []pb.EndorserClient{ec},
}
cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
require.NoError(t, err)
cmd := installCmd(mockCF, nil, cryptoProvider)
addFlags(cmd)
return cmd, mockCF
}
func TestInstallBadVersion(t *testing.T) {
fsPath := t.TempDir()
cmd, _ := initInstallTest(t, fsPath, nil, nil)
args := []string{"-n", "mychaincode", "-p", "github.com/hyperledger/fabric/internal/peer/chaincode/testdata/src/chaincodes/noop"}
cmd.SetArgs(args)
if err := cmd.Execute(); err == nil {
t.Fatal("Expected error executing install command for version not specified")
}
}
func TestInstallNonExistentCC(t *testing.T) {
fsPath := t.TempDir()
cmd, _ := initInstallTest(t, fsPath, nil, nil)
args := []string{"-n", "badmychaincode", "-p", "github.com/hyperledger/fabric/internal/peer/chaincode/testdata/src/chaincodes/bad_mychaincode", "-v", "testversion"}
cmd.SetArgs(args)
if err := cmd.Execute(); err == nil {
t.Fatal("Expected error executing install command for bad chaincode")
}
if _, err := os.Stat(fsPath + "/chaincodes/badmychaincode.testversion"); err == nil {
t.Fatal("chaincode mychaincode.testversion should not exist")
}
}
func TestInstallFromPackage(t *testing.T) {
pdir := t.TempDir()
ccpackfile := pdir + "/ccpack.file"
err := createSignedCDSPackage(t, []string{"-n", "somecc", "-p", "some/go/package", "-v", "0", ccpackfile}, false)
if err != nil {
t.Fatalf("could not create package :%v", err)
}
fsPath := t.TempDir()
cmd, mockCF := initInstallTest(t, fsPath, nil, nil)
mockResponse := &pb.ProposalResponse{
Response: &pb.Response{Status: 200},
Endorsement: &pb.Endorsement{},
}
mockEndorserClient := common.GetMockEndorserClient(mockResponse, nil)
mockCF.EndorserClients = []pb.EndorserClient{mockEndorserClient}
args := []string{ccpackfile}
cmd.SetArgs(args)
if err := cmd.Execute(); err != nil {
t.Fatal("error executing install command from package")
}
}
func TestInstallFromBadPackage(t *testing.T) {
pdir := t.TempDir()
ccpackfile := pdir + "/ccpack.file"
err := ioutil.WriteFile(ccpackfile, []byte("really bad CC package"), 0o700)
if err != nil {
t.Fatalf("could not create package :%v", err)
}
fsPath := t.TempDir()
cmd, _ := initInstallTest(t, fsPath, nil, nil)
args := []string{ccpackfile}
cmd.SetArgs(args)
if err := cmd.Execute(); err == nil {
t.Fatal("expected error installing bad package")
}
}
func installCC(t *testing.T) error {
defer viper.Reset()
fsPath := t.TempDir()
cmd, _ := initInstallTest(t, fsPath, nil, nil)
args := []string{"-n", "mychaincode", "-p", "github.com/hyperledger/fabric/internal/peer/chaincode/testdata/src/chaincodes/noop", "-v", "anotherversion"}
cmd.SetArgs(args)
if err := cmd.Execute(); err != nil {
return fmt.Errorf("Run chaincode upgrade cmd error:%v", err)
}
return nil
}
func TestInstall(t *testing.T) {
if err := installCC(t); err != nil {
t.Fatalf("Install failed with error: %v", err)
}
}