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  }