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 })