github.com/kaituanwang/hyperledger@v2.0.1+incompatible/core/policy/application_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package policy 8 9 import ( 10 "testing" 11 12 "github.com/hyperledger/fabric-protos-go/common" 13 "github.com/hyperledger/fabric-protos-go/peer" 14 "github.com/hyperledger/fabric/common/cauthdsl" 15 "github.com/hyperledger/fabric/core/policy/mocks" 16 "github.com/hyperledger/fabric/msp" 17 "github.com/hyperledger/fabric/protoutil" 18 "github.com/pkg/errors" 19 "github.com/stretchr/testify/assert" 20 "github.com/stretchr/testify/mock" 21 ) 22 23 func TestComponentIntegrationSignaturePolicyEnv(t *testing.T) { 24 idds := &mocks.IdentityDeserializer{} 25 id := &mocks.Identity{} 26 27 spp := &cauthdsl.EnvelopeBasedPolicyProvider{ 28 Deserializer: idds, 29 } 30 ev := &ApplicationPolicyEvaluator{ 31 signaturePolicyProvider: spp, 32 } 33 34 spenv := cauthdsl.SignedByMspMember("msp") 35 mspenv := protoutil.MarshalOrPanic(&peer.ApplicationPolicy{ 36 Type: &peer.ApplicationPolicy_SignaturePolicy{ 37 SignaturePolicy: spenv, 38 }, 39 }) 40 41 idds.On("DeserializeIdentity", []byte("guess who")).Return(id, nil) 42 id.On("GetIdentifier").Return(&msp.IdentityIdentifier{Id: "id", Mspid: "msp"}) 43 id.On("SatisfiesPrincipal", mock.Anything).Return(nil) 44 id.On("Verify", []byte("batti"), []byte("lei")).Return(nil) 45 err := ev.Evaluate(mspenv, []*protoutil.SignedData{{ 46 Identity: []byte("guess who"), 47 Data: []byte("batti"), 48 Signature: []byte("lei"), 49 }}) 50 assert.NoError(t, err) 51 } 52 53 func TestEvaluator(t *testing.T) { 54 okEval := &mocks.Policy{} 55 nokEval := &mocks.Policy{} 56 57 okEval.On("EvaluateSignedData", mock.Anything).Return(nil) 58 nokEval.On("EvaluateSignedData", mock.Anything).Return(errors.New("bad bad")) 59 60 spp := &mocks.SignaturePolicyProvider{} 61 cpp := &mocks.ChannelPolicyReferenceProvider{} 62 ev := &ApplicationPolicyEvaluator{ 63 signaturePolicyProvider: spp, 64 channelPolicyReferenceProvider: cpp, 65 } 66 67 // SCENARIO: bad policy argument 68 69 err := ev.Evaluate([]byte("bad bad"), nil) 70 assert.Error(t, err) 71 assert.Contains(t, err.Error(), "failed to unmarshal ApplicationPolicy bytes") 72 73 // SCENARIO: bad policy type 74 75 err = ev.Evaluate([]byte{}, nil) 76 assert.Error(t, err) 77 assert.Contains(t, err.Error(), "unsupported policy type") 78 79 // SCENARIO: signature policy supplied - good and bad path 80 81 spenv := &common.SignaturePolicyEnvelope{} 82 mspenv := protoutil.MarshalOrPanic(&peer.ApplicationPolicy{ 83 Type: &peer.ApplicationPolicy_SignaturePolicy{ 84 SignaturePolicy: spenv, 85 }, 86 }) 87 spp.On("NewPolicy", spenv).Return(okEval, nil).Once() 88 err = ev.Evaluate(mspenv, nil) 89 assert.NoError(t, err) 90 spp.On("NewPolicy", spenv).Return(nokEval, nil).Once() 91 err = ev.Evaluate(mspenv, nil) 92 assert.Error(t, err) 93 assert.Contains(t, err.Error(), "bad bad") 94 spp.On("NewPolicy", spenv).Return(nil, errors.New("bad policy")).Once() 95 err = ev.Evaluate(mspenv, nil) 96 assert.Error(t, err) 97 assert.Contains(t, err.Error(), "bad policy") 98 99 // SCENARIO: channel ref policy supplied - good and bad path 100 101 chrefstr := "Quo usque tandem abutere, Catilina, patientia nostra?" 102 chrefstrEnv := protoutil.MarshalOrPanic(&peer.ApplicationPolicy{ 103 Type: &peer.ApplicationPolicy_ChannelConfigPolicyReference{ 104 ChannelConfigPolicyReference: chrefstr, 105 }, 106 }) 107 cpp.On("NewPolicy", chrefstr).Return(okEval, nil).Once() 108 err = ev.Evaluate(chrefstrEnv, nil) 109 assert.NoError(t, err) 110 cpp.On("NewPolicy", chrefstr).Return(nokEval, nil).Once() 111 err = ev.Evaluate(chrefstrEnv, nil) 112 assert.Error(t, err) 113 assert.Contains(t, err.Error(), "bad bad") 114 cpp.On("NewPolicy", chrefstr).Return(nil, errors.New("bad policy")).Once() 115 err = ev.Evaluate(chrefstrEnv, nil) 116 assert.Error(t, err) 117 assert.Contains(t, err.Error(), "bad policy") 118 } 119 120 func TestChannelPolicyReference(t *testing.T) { 121 mcpmg := &mocks.ChannelPolicyManagerGetter{} 122 mcpmg.On("Manager", "channel").Return(nil, false).Once() 123 ape, err := New(nil, "channel", mcpmg) 124 assert.Error(t, err) 125 assert.Nil(t, ape) 126 assert.Contains(t, err.Error(), "failed to retrieve policy manager for channel") 127 128 mm := &mocks.PolicyManager{} 129 mcpmg.On("Manager", "channel").Return(mm, true).Once() 130 ape, err = New(nil, "channel", mcpmg) 131 assert.NoError(t, err) 132 assert.NotNil(t, ape) 133 134 mcpmg.On("Manager", "channel").Return(mm, true) 135 136 mp := &mocks.Policy{} 137 mp.On("EvaluateSignedData", mock.Anything).Return(nil) 138 mm.On("GetPolicy", "As the sun breaks above the ground").Return(mp, true) 139 err = ape.evaluateChannelConfigPolicyReference("As the sun breaks above the ground", nil) 140 assert.NoError(t, err) 141 142 mm.On("GetPolicy", "An old man stands on the hill").Return(nil, false) 143 err = ape.evaluateChannelConfigPolicyReference("An old man stands on the hill", nil) 144 assert.Error(t, err) 145 assert.Contains(t, err.Error(), "failed to retrieve policy for reference") 146 }