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

215 lines
5.6 KiB
Go

/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package chaincode
import (
"fmt"
"io/ioutil"
"os"
"testing"
"github.com/golang/protobuf/proto"
pcommon "github.com/hyperledger/fabric-protos-go/common"
pb "github.com/hyperledger/fabric-protos-go/peer"
"github.com/hyperledger/fabric/bccsp/sw"
"github.com/hyperledger/fabric/internal/peer/common"
"github.com/hyperledger/fabric/msp"
msptesttools "github.com/hyperledger/fabric/msp/mgmt/testtools"
"github.com/stretchr/testify/require"
)
func TestMain(m *testing.M) {
err := msptesttools.LoadMSPSetupForTesting()
if err != nil {
panic(fmt.Sprintf("Fatal error when reading MSP config: %s", err))
}
os.Exit(m.Run())
}
func mockCDSFactory(spec *pb.ChaincodeSpec) (*pb.ChaincodeDeploymentSpec, error) {
return &pb.ChaincodeDeploymentSpec{ChaincodeSpec: spec, CodePackage: []byte("somecode")}, nil
}
func extractSignedCCDepSpec(env *pcommon.Envelope) (*pcommon.ChannelHeader, *pb.SignedChaincodeDeploymentSpec, error) {
p := &pcommon.Payload{}
err := proto.Unmarshal(env.Payload, p)
if err != nil {
return nil, nil, err
}
ch := &pcommon.ChannelHeader{}
err = proto.Unmarshal(p.Header.ChannelHeader, ch)
if err != nil {
return nil, nil, err
}
sp := &pb.SignedChaincodeDeploymentSpec{}
err = proto.Unmarshal(p.Data, sp)
if err != nil {
return nil, nil, err
}
return ch, sp, nil
}
// TestCDSPackage tests generation of the old ChaincodeDeploymentSpec install
// which we will presumably continue to support at least for a bit
func TestCDSPackage(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("Run chaincode package cmd error:%v", err)
}
b, err := ioutil.ReadFile(ccpackfile)
if err != nil {
t.Fatalf("package file %s not created", ccpackfile)
}
cds := &pb.ChaincodeDeploymentSpec{}
err = proto.Unmarshal(b, cds)
if err != nil {
t.Fatalf("could not unmarshall package into CDS")
}
}
// helper to create a SignedChaincodeDeploymentSpec
func createSignedCDSPackage(t *testing.T, args []string, sign bool) error {
p := newPackagerForTest(t, sign)
cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
require.NoError(t, err)
cmd := packageCmd(nil, mockCDSFactory, p, cryptoProvider)
addFlags(cmd)
cmd.SetArgs(args)
if err := cmd.Execute(); err != nil {
return err
}
return nil
}
func mockChaincodeCmdFactoryForTest(sign bool) (*ChaincodeCmdFactory, error) {
var signer msp.SigningIdentity
var err error
if sign {
signer, err = common.GetDefaultSigner()
if err != nil {
return nil, fmt.Errorf("Get default signer error: %v", err)
}
}
cf := &ChaincodeCmdFactory{Signer: signer}
return cf, nil
}
// TestSignedCDSPackage generates the new envelope encapsulating
// CDS, policy
func TestSignedCDSPackage(t *testing.T) {
pdir := t.TempDir()
ccpackfile := pdir + "/ccpack.file"
err := createSignedCDSPackage(t, []string{"-n", "somecc", "-p", "some/go/package", "-v", "0", "-s", ccpackfile}, false)
if err != nil {
t.Fatalf("could not create signed cds package %s", err)
}
b, err := ioutil.ReadFile(ccpackfile)
if err != nil {
t.Fatalf("package file %s not created", ccpackfile)
}
e := &pcommon.Envelope{}
err = proto.Unmarshal(b, e)
if err != nil {
t.Fatalf("could not unmarshall envelope")
}
_, p, err := extractSignedCCDepSpec(e)
if err != nil {
t.Fatalf("could not extract signed dep spec")
}
if p.OwnerEndorsements != nil {
t.Fatalf("expected no signatures but found endorsements")
}
}
// TestSignedCDSPackageWithSignature generates the new envelope encapsulating
// CDS, policy and signs the package with local MSP
func TestSignedCDSPackageWithSignature(t *testing.T) {
pdir := t.TempDir()
ccpackfile := pdir + "/ccpack.file"
err := createSignedCDSPackage(t, []string{"-n", "somecc", "-p", "some/go/package", "-v", "0", "-s", "-S", ccpackfile}, true)
if err != nil {
t.Fatalf("could not create signed cds package %s", err)
}
b, err := ioutil.ReadFile(ccpackfile)
if err != nil {
t.Fatalf("package file %s not created", ccpackfile)
}
e := &pcommon.Envelope{}
err = proto.Unmarshal(b, e)
if err != nil {
t.Fatalf("could not unmarshall envelope")
}
_, p, err := extractSignedCCDepSpec(e)
if err != nil {
t.Fatalf("could not extract signed dep spec")
}
if p.OwnerEndorsements == nil {
t.Fatalf("expected signatures and found nil")
}
}
func TestNoOwnerToSign(t *testing.T) {
pdir := t.TempDir()
ccpackfile := pdir + "/ccpack.file"
// note "-S" requires signer but we are passing fase
err := createSignedCDSPackage(t, []string{"-n", "somecc", "-p", "some/go/package", "-v", "0", "-s", "-S", ccpackfile}, false)
if err == nil {
t.Fatalf("Expected error with nil signer but succeeded")
}
}
func TestInvalidPolicy(t *testing.T) {
pdir := t.TempDir()
ccpackfile := pdir + "/ccpack.file"
err := createSignedCDSPackage(t, []string{"-n", "somecc", "-p", "some/go/package", "-v", "0", "-s", "-i", "AND('a bad policy')", ccpackfile}, false)
if err == nil {
t.Fatalf("Expected error with nil signer but succeeded")
}
}
func newPackagerForTest(t *testing.T /*pr PlatformRegistry, w Writer,*/, sign bool) *Packager {
mockCF, err := mockChaincodeCmdFactoryForTest(sign)
if err != nil {
t.Fatal("error creating mock ChaincodeCmdFactory", err)
}
cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
require.NoError(t, err)
p := &Packager{
ChaincodeCmdFactory: mockCF,
CDSFactory: mockCDSFactory,
CryptoProvider: cryptoProvider,
}
return p
}