github.com/true-sqn/fabric@v2.1.1+incompatible/internal/peer/common/deliverclient_test.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package common
     8  
     9  import (
    10  	"errors"
    11  	"fmt"
    12  	"sync"
    13  	"testing"
    14  
    15  	cb "github.com/hyperledger/fabric-protos-go/common"
    16  	ab "github.com/hyperledger/fabric-protos-go/orderer"
    17  	"github.com/hyperledger/fabric/core/config/configtest"
    18  	"github.com/hyperledger/fabric/internal/peer/common/mock"
    19  	"github.com/hyperledger/fabric/internal/pkg/identity"
    20  	msptesttools "github.com/hyperledger/fabric/msp/mgmt/testtools"
    21  	"github.com/hyperledger/fabric/protoutil"
    22  	"github.com/spf13/viper"
    23  	"github.com/stretchr/testify/assert"
    24  )
    25  
    26  //go:generate counterfeiter -o mock/signer_serializer.go --fake-name SignerSerializer . signerSerializer
    27  
    28  type signerSerializer interface {
    29  	identity.SignerSerializer
    30  }
    31  
    32  //go:generate counterfeiter -o mock/deliverservice.go --fake-name DeliverService . deliverService
    33  
    34  type deliverService interface {
    35  	ab.AtomicBroadcast_DeliverClient
    36  }
    37  
    38  var once sync.Once
    39  
    40  // InitMSP init MSP
    41  func InitMSP() {
    42  	once.Do(initMSP)
    43  }
    44  
    45  func initMSP() {
    46  	err := msptesttools.LoadMSPSetupForTesting()
    47  	if err != nil {
    48  		panic(fmt.Errorf("Fatal error when reading MSP config: err %s", err))
    49  	}
    50  }
    51  
    52  func TestDeliverClientErrors(t *testing.T) {
    53  	InitMSP()
    54  
    55  	mockClient := &mock.DeliverService{}
    56  	o := &DeliverClient{
    57  		Service: mockClient,
    58  	}
    59  
    60  	// failure - recv returns error
    61  	mockClient.RecvReturns(nil, errors.New("monkey"))
    62  	block, err := o.readBlock()
    63  	assert.Nil(t, block)
    64  	assert.Error(t, err)
    65  	assert.Contains(t, err.Error(), "error receiving: monkey")
    66  
    67  	// failure - recv returns status
    68  	statusResponse := &ab.DeliverResponse{
    69  		Type: &ab.DeliverResponse_Status{Status: cb.Status_SUCCESS},
    70  	}
    71  	mockClient.RecvReturns(statusResponse, nil)
    72  	block, err = o.readBlock()
    73  	assert.Nil(t, block)
    74  	assert.Error(t, err)
    75  	assert.Contains(t, err.Error(), "can't read the block")
    76  
    77  	// failure - recv returns empty proto
    78  	mockClient.RecvReturns(&ab.DeliverResponse{}, nil)
    79  	block, err = o.readBlock()
    80  	assert.Nil(t, block)
    81  	assert.Error(t, err)
    82  	assert.Contains(t, err.Error(), "response error: unknown type")
    83  
    84  	// failures - send returns error
    85  	// getting specified block
    86  	mockClient.SendReturns(errors.New("gorilla"))
    87  	block, err = o.GetSpecifiedBlock(0)
    88  	assert.Nil(t, block)
    89  	assert.Error(t, err)
    90  	assert.Contains(t, err.Error(), "error getting specified block: gorilla")
    91  
    92  	// getting oldest block
    93  	block, err = o.GetOldestBlock()
    94  	assert.Nil(t, block)
    95  	assert.Error(t, err)
    96  	assert.Contains(t, err.Error(), "error getting oldest block: gorilla")
    97  
    98  	// getting newest block
    99  	block, err = o.GetNewestBlock()
   100  	assert.Nil(t, block)
   101  	assert.Error(t, err)
   102  	assert.Contains(t, err.Error(), "error getting newest block: gorilla")
   103  }
   104  
   105  func TestSeekHelper(t *testing.T) {
   106  	t.Run("Standard", func(t *testing.T) {
   107  		env := seekHelper("channel-id", &ab.SeekPosition{}, nil, nil, false)
   108  		assert.NotNil(t, env)
   109  		seekInfo := &ab.SeekInfo{}
   110  		_, err := protoutil.UnmarshalEnvelopeOfType(env, cb.HeaderType_DELIVER_SEEK_INFO, seekInfo)
   111  		assert.NoError(t, err)
   112  		assert.Equal(t, seekInfo.Behavior, ab.SeekInfo_BLOCK_UNTIL_READY)
   113  		assert.Equal(t, seekInfo.ErrorResponse, ab.SeekInfo_STRICT)
   114  	})
   115  
   116  	t.Run("BestEffort", func(t *testing.T) {
   117  		env := seekHelper("channel-id", &ab.SeekPosition{}, nil, nil, true)
   118  		assert.NotNil(t, env)
   119  		seekInfo := &ab.SeekInfo{}
   120  		_, err := protoutil.UnmarshalEnvelopeOfType(env, cb.HeaderType_DELIVER_SEEK_INFO, seekInfo)
   121  		assert.NoError(t, err)
   122  		assert.Equal(t, seekInfo.ErrorResponse, ab.SeekInfo_BEST_EFFORT)
   123  	})
   124  }
   125  
   126  func TestNewOrdererDeliverClient(t *testing.T) {
   127  	defer viper.Reset()
   128  	cleanup := configtest.SetDevFabricConfigPath(t)
   129  	defer cleanup()
   130  	InitMSP()
   131  
   132  	// failure - rootcert file doesn't exist
   133  	viper.Set("orderer.tls.enabled", true)
   134  	viper.Set("orderer.tls.rootcert.file", "ukelele.crt")
   135  	oc, err := NewDeliverClientForOrderer("ukelele", &mock.SignerSerializer{}, false)
   136  	assert.Nil(t, oc)
   137  	assert.Error(t, err)
   138  	assert.Contains(t, err.Error(), "failed to create deliver client for orderer: failed to load config for OrdererClient")
   139  }
   140  
   141  func TestNewDeliverClientForPeer(t *testing.T) {
   142  	defer viper.Reset()
   143  	cleanup := configtest.SetDevFabricConfigPath(t)
   144  	defer cleanup()
   145  	InitMSP()
   146  
   147  	// failure - rootcert file doesn't exist
   148  	viper.Set("peer.tls.enabled", true)
   149  	viper.Set("peer.tls.rootcert.file", "ukelele.crt")
   150  	pc, err := NewDeliverClientForPeer("ukelele", &mock.SignerSerializer{}, false)
   151  	assert.Nil(t, pc)
   152  	assert.Error(t, err)
   153  	assert.Contains(t, err.Error(), "failed to create deliver client for peer: failed to load config for PeerClient")
   154  }