github.com/kaituanwang/hyperledger@v2.0.1+incompatible/core/chaincode/lifecycle/metadata_provider_test.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package lifecycle_test
     8  
     9  import (
    10  	pb "github.com/hyperledger/fabric-protos-go/peer"
    11  	lb "github.com/hyperledger/fabric-protos-go/peer/lifecycle"
    12  	"github.com/hyperledger/fabric/common/chaincode"
    13  	"github.com/hyperledger/fabric/core/chaincode/lifecycle"
    14  	"github.com/hyperledger/fabric/core/chaincode/lifecycle/mock"
    15  	"github.com/pkg/errors"
    16  
    17  	"github.com/hyperledger/fabric/common/cauthdsl"
    18  	"github.com/hyperledger/fabric/protoutil"
    19  	. "github.com/onsi/ginkgo"
    20  	. "github.com/onsi/gomega"
    21  )
    22  
    23  var _ = Describe("MetadataProvider", func() {
    24  	var (
    25  		fakeChaincodeInfoProvider          *mock.ChaincodeInfoProvider
    26  		fakeLegacyMetadataProvider         *mock.LegacyMetadataProvider
    27  		fakeChannelPolicyReferenceProvider *mock.ChannelPolicyReferenceProvider
    28  		fakeConvertedPolicy                *mock.ConvertiblePolicy
    29  		metadataProvider                   *lifecycle.MetadataProvider
    30  		ccInfo                             *lifecycle.LocalChaincodeInfo
    31  	)
    32  
    33  	BeforeEach(func() {
    34  		fakeChaincodeInfoProvider = &mock.ChaincodeInfoProvider{}
    35  		ccInfo = &lifecycle.LocalChaincodeInfo{
    36  			Definition: &lifecycle.ChaincodeDefinition{
    37  				Sequence: 1,
    38  				EndorsementInfo: &lb.ChaincodeEndorsementInfo{
    39  					Version: "cc-version",
    40  				},
    41  				ValidationInfo: &lb.ChaincodeValidationInfo{
    42  					ValidationParameter: protoutil.MarshalOrPanic(&pb.ApplicationPolicy{
    43  						Type: &pb.ApplicationPolicy_SignaturePolicy{
    44  							SignaturePolicy: cauthdsl.AcceptAllPolicy,
    45  						},
    46  					}),
    47  				},
    48  				Collections: &pb.CollectionConfigPackage{},
    49  			},
    50  		}
    51  		fakeChaincodeInfoProvider.ChaincodeInfoReturns(ccInfo, nil)
    52  
    53  		legacyCCMetadata := &chaincode.Metadata{
    54  			Name:              "legacy-cc",
    55  			Version:           "legacy-version",
    56  			Policy:            []byte("legacy-policy"),
    57  			CollectionsConfig: &pb.CollectionConfigPackage{},
    58  		}
    59  		fakeLegacyMetadataProvider = &mock.LegacyMetadataProvider{}
    60  		fakeLegacyMetadataProvider.MetadataReturns(legacyCCMetadata)
    61  
    62  		metadataProvider = lifecycle.NewMetadataProvider(fakeChaincodeInfoProvider, fakeLegacyMetadataProvider, nil)
    63  	})
    64  
    65  	It("returns metadata using the ChaincodeInfoProvider (SignaturePolicyEnvelope case)", func() {
    66  		metadata := metadataProvider.Metadata("testchannel", "cc-name", true)
    67  		Expect(metadata).To(Equal(
    68  			&chaincode.Metadata{
    69  				Name:              "cc-name",
    70  				Version:           "1",
    71  				Policy:            cauthdsl.MarshaledAcceptAllPolicy,
    72  				CollectionsConfig: &pb.CollectionConfigPackage{},
    73  			},
    74  		))
    75  	})
    76  
    77  	Context("when the chaincode is not found by the ChaincodeInfoProvider", func() {
    78  		BeforeEach(func() {
    79  			fakeChaincodeInfoProvider.ChaincodeInfoReturns(nil, errors.New("scrumtrulescent"))
    80  		})
    81  
    82  		It("returns metadata using the LegacyMetadataProvider", func() {
    83  			metadata := metadataProvider.Metadata("testchannel", "legacy-cc", true)
    84  			Expect(metadata).To(Equal(
    85  				&chaincode.Metadata{
    86  					Name:              "legacy-cc",
    87  					Version:           "legacy-version",
    88  					Policy:            []byte("legacy-policy"),
    89  					CollectionsConfig: &pb.CollectionConfigPackage{},
    90  				},
    91  			))
    92  		})
    93  	})
    94  
    95  	Context("when the policy is bad", func() {
    96  		BeforeEach(func() {
    97  			ccInfo.Definition.ValidationInfo.ValidationParameter = []byte{0, 1, 2}
    98  			fakeChaincodeInfoProvider.ChaincodeInfoReturns(ccInfo, nil)
    99  		})
   100  
   101  		It("returns metadata after providing a reject-all policy", func() {
   102  			metadata := metadataProvider.Metadata("testchannel", "cc-name", true)
   103  			Expect(metadata).To(Equal(
   104  				&chaincode.Metadata{
   105  					Name:              "cc-name",
   106  					Version:           "1",
   107  					Policy:            cauthdsl.MarshaledRejectAllPolicy,
   108  					CollectionsConfig: &pb.CollectionConfigPackage{},
   109  				},
   110  			))
   111  		})
   112  	})
   113  
   114  	Context("when the policy is of the channel reference type", func() {
   115  		BeforeEach(func() {
   116  			ccInfo.Definition.ValidationInfo.ValidationParameter = protoutil.MarshalOrPanic(
   117  				&pb.ApplicationPolicy{
   118  					Type: &pb.ApplicationPolicy_ChannelConfigPolicyReference{
   119  						ChannelConfigPolicyReference: "barf",
   120  					},
   121  				})
   122  			fakeChaincodeInfoProvider.ChaincodeInfoReturns(ccInfo, nil)
   123  
   124  			fakeConvertedPolicy = &mock.ConvertiblePolicy{}
   125  			fakeConvertedPolicy.ConvertReturns(cauthdsl.AcceptAllPolicy, nil)
   126  
   127  			fakeChannelPolicyReferenceProvider = &mock.ChannelPolicyReferenceProvider{}
   128  			fakeChannelPolicyReferenceProvider.NewPolicyReturns(fakeConvertedPolicy, nil)
   129  			metadataProvider.ChannelPolicyReferenceProvider = fakeChannelPolicyReferenceProvider
   130  		})
   131  
   132  		It("returns metadata after translating the policy", func() {
   133  			metadata := metadataProvider.Metadata("testchannel", "cc-name", true)
   134  			Expect(metadata).To(Equal(
   135  				&chaincode.Metadata{
   136  					Name:              "cc-name",
   137  					Version:           "1",
   138  					Policy:            cauthdsl.MarshaledAcceptAllPolicy,
   139  					CollectionsConfig: &pb.CollectionConfigPackage{},
   140  				},
   141  			))
   142  		})
   143  
   144  		Context("when NewPolicy returns an error", func() {
   145  			BeforeEach(func() {
   146  				fakeChannelPolicyReferenceProvider = &mock.ChannelPolicyReferenceProvider{}
   147  				fakeChannelPolicyReferenceProvider.NewPolicyReturns(nil, errors.New("go away"))
   148  				metadataProvider.ChannelPolicyReferenceProvider = fakeChannelPolicyReferenceProvider
   149  			})
   150  
   151  			It("returns metadata after providing a reject-all policy", func() {
   152  				metadata := metadataProvider.Metadata("testchannel", "cc-name", true)
   153  				Expect(metadata).To(Equal(
   154  					&chaincode.Metadata{
   155  						Name:              "cc-name",
   156  						Version:           "1",
   157  						Policy:            cauthdsl.MarshaledRejectAllPolicy,
   158  						CollectionsConfig: &pb.CollectionConfigPackage{},
   159  					},
   160  				))
   161  			})
   162  		})
   163  
   164  		Context("when the policy is not convertible", func() {
   165  			BeforeEach(func() {
   166  				fakeChannelPolicyReferenceProvider = &mock.ChannelPolicyReferenceProvider{}
   167  				fakeChannelPolicyReferenceProvider.NewPolicyReturns(&mock.InconvertiblePolicy{}, nil)
   168  				metadataProvider.ChannelPolicyReferenceProvider = fakeChannelPolicyReferenceProvider
   169  			})
   170  
   171  			It("returns metadata after providing a reject-all policy", func() {
   172  				metadata := metadataProvider.Metadata("testchannel", "cc-name", true)
   173  				Expect(metadata).To(Equal(
   174  					&chaincode.Metadata{
   175  						Name:              "cc-name",
   176  						Version:           "1",
   177  						Policy:            cauthdsl.MarshaledRejectAllPolicy,
   178  						CollectionsConfig: &pb.CollectionConfigPackage{},
   179  					},
   180  				))
   181  			})
   182  		})
   183  
   184  		Context("when conversion fails", func() {
   185  			BeforeEach(func() {
   186  				fakeConvertedPolicy = &mock.ConvertiblePolicy{}
   187  				fakeConvertedPolicy.ConvertReturns(nil, errors.New("go away"))
   188  
   189  				fakeChannelPolicyReferenceProvider = &mock.ChannelPolicyReferenceProvider{}
   190  				fakeChannelPolicyReferenceProvider.NewPolicyReturns(fakeConvertedPolicy, nil)
   191  				metadataProvider.ChannelPolicyReferenceProvider = fakeChannelPolicyReferenceProvider
   192  			})
   193  
   194  			It("returns metadata after providing a reject-all policy", func() {
   195  				metadata := metadataProvider.Metadata("testchannel", "cc-name", true)
   196  				Expect(metadata).To(Equal(
   197  					&chaincode.Metadata{
   198  						Name:              "cc-name",
   199  						Version:           "1",
   200  						Policy:            cauthdsl.MarshaledRejectAllPolicy,
   201  						CollectionsConfig: &pb.CollectionConfigPackage{},
   202  					},
   203  				))
   204  			})
   205  		})
   206  	})
   207  })