github.com/ewagmig/fabric@v2.1.1+incompatible/core/committer/txvalidator/v14/plugin_validator_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package txvalidator_test 8 9 import ( 10 "testing" 11 12 "github.com/golang/protobuf/proto" 13 "github.com/hyperledger/fabric-protos-go/common" 14 "github.com/hyperledger/fabric/common/policydsl" 15 tmocks "github.com/hyperledger/fabric/core/committer/txvalidator/mocks" 16 "github.com/hyperledger/fabric/core/committer/txvalidator/plugin" 17 "github.com/hyperledger/fabric/core/committer/txvalidator/v14" 18 "github.com/hyperledger/fabric/core/committer/txvalidator/v14/mocks" 19 "github.com/hyperledger/fabric/core/committer/txvalidator/v14/testdata" 20 validation "github.com/hyperledger/fabric/core/handlers/validation/api" 21 "github.com/hyperledger/fabric/msp" 22 . "github.com/hyperledger/fabric/msp/mocks" 23 "github.com/pkg/errors" 24 "github.com/stretchr/testify/assert" 25 "github.com/stretchr/testify/mock" 26 ) 27 28 func TestValidateWithPlugin(t *testing.T) { 29 pm := make(plugin.MapBasedMapper) 30 qec := &mocks.QueryExecutorCreator{} 31 deserializer := &mocks.IdentityDeserializer{} 32 capabilites := &mocks.Capabilities{} 33 v := txvalidator.NewPluginValidator(pm, qec, deserializer, capabilites) 34 ctx := &txvalidator.Context{ 35 Namespace: "mycc", 36 VSCCName: "vscc", 37 } 38 39 // Scenario I: The plugin isn't found because the map wasn't populated with anything yet 40 err := v.ValidateWithPlugin(ctx) 41 assert.Contains(t, err.Error(), "plugin with name vscc wasn't found") 42 43 // Scenario II: The plugin initialization fails 44 factory := &mocks.PluginFactory{} 45 plugin := &mocks.Plugin{} 46 plugin.On("Init", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(errors.New("foo")).Once() 47 factory.On("New").Return(plugin) 48 pm["vscc"] = factory 49 err = v.ValidateWithPlugin(ctx) 50 assert.Contains(t, err.(*validation.ExecutionFailureError).Error(), "failed initializing plugin: foo") 51 52 // Scenario III: The plugin initialization succeeds but an execution error occurs. 53 // The plugin should pass the error as is. 54 plugin.On("Init", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil).Once() 55 validationErr := &validation.ExecutionFailureError{ 56 Reason: "bar", 57 } 58 plugin.On("Validate", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(validationErr).Once() 59 err = v.ValidateWithPlugin(ctx) 60 assert.Equal(t, validationErr, err) 61 62 // Scenario IV: The plugin initialization succeeds and the validation passes 63 plugin.On("Init", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil).Once() 64 plugin.On("Validate", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil).Once() 65 err = v.ValidateWithPlugin(ctx) 66 assert.NoError(t, err) 67 } 68 69 func TestSamplePlugin(t *testing.T) { 70 pm := make(plugin.MapBasedMapper) 71 72 qe := &tmocks.QueryExecutor{} 73 state := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 74 qe.On("GetState", "lscc", "mycc").Return(state, nil) 75 qe.On("GetStateMultipleKeys", "lscc", []string{"mycc"}).Return([][]byte{state}, nil) 76 qe.On("Done").Return(nil, nil) 77 78 qec := &mocks.QueryExecutorCreator{} 79 qec.On("NewQueryExecutor").Return(qe, nil) 80 81 deserializer := &mocks.IdentityDeserializer{} 82 identity := &MockIdentity{} 83 identity.On("GetIdentifier").Return(&msp.IdentityIdentifier{ 84 Mspid: "SampleOrg", 85 Id: "foo", 86 }) 87 deserializer.On("DeserializeIdentity", []byte{7, 8, 9}).Return(identity, nil) 88 capabilites := &mocks.Capabilities{} 89 capabilites.On("PrivateChannelData").Return(true) 90 factory := &mocks.PluginFactory{} 91 factory.On("New").Return(testdata.NewSampleValidationPlugin(t)) 92 pm["vscc"] = factory 93 94 transaction := testdata.MarshaledSignedData{ 95 Data: []byte{1, 2, 3}, 96 Signature: []byte{4, 5, 6}, 97 Identity: []byte{7, 8, 9}, 98 } 99 100 txnData, _ := proto.Marshal(&transaction) 101 102 v := txvalidator.NewPluginValidator(pm, qec, deserializer, capabilites) 103 acceptAllPolicyBytes, _ := proto.Marshal(policydsl.AcceptAllPolicy) 104 ctx := &txvalidator.Context{ 105 Namespace: "mycc", 106 VSCCName: "vscc", 107 Policy: acceptAllPolicyBytes, 108 Block: &common.Block{ 109 Header: &common.BlockHeader{}, 110 Data: &common.BlockData{ 111 Data: [][]byte{txnData}, 112 }, 113 }, 114 Channel: "mychannel", 115 } 116 assert.NoError(t, v.ValidateWithPlugin(ctx)) 117 }