153 lines
4.4 KiB
Go
153 lines
4.4 KiB
Go
/*
|
|
Copyright IBM Corp. All Rights Reserved.
|
|
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package common
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"sync"
|
|
"testing"
|
|
|
|
cb "github.com/hyperledger/fabric-protos-go/common"
|
|
ab "github.com/hyperledger/fabric-protos-go/orderer"
|
|
"github.com/hyperledger/fabric/core/config/configtest"
|
|
"github.com/hyperledger/fabric/internal/peer/common/mock"
|
|
"github.com/hyperledger/fabric/internal/pkg/identity"
|
|
msptesttools "github.com/hyperledger/fabric/msp/mgmt/testtools"
|
|
"github.com/hyperledger/fabric/protoutil"
|
|
"github.com/spf13/viper"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
//go:generate counterfeiter -o mock/signer_serializer.go --fake-name SignerSerializer . signerSerializer
|
|
|
|
type signerSerializer interface {
|
|
identity.SignerSerializer
|
|
}
|
|
|
|
//go:generate counterfeiter -o mock/deliverservice.go --fake-name DeliverService . deliverService
|
|
|
|
type deliverService interface {
|
|
ab.AtomicBroadcast_DeliverClient
|
|
}
|
|
|
|
var once sync.Once
|
|
|
|
// InitMSP init MSP
|
|
func InitMSP() {
|
|
once.Do(initMSP)
|
|
}
|
|
|
|
func initMSP() {
|
|
err := msptesttools.LoadMSPSetupForTesting()
|
|
if err != nil {
|
|
panic(fmt.Errorf("Fatal error when reading MSP config: err %s", err))
|
|
}
|
|
}
|
|
|
|
func TestDeliverClientErrors(t *testing.T) {
|
|
InitMSP()
|
|
|
|
mockClient := &mock.DeliverService{}
|
|
o := &DeliverClient{
|
|
Service: mockClient,
|
|
}
|
|
|
|
// failure - recv returns error
|
|
mockClient.RecvReturns(nil, errors.New("monkey"))
|
|
block, err := o.readBlock()
|
|
require.Nil(t, block)
|
|
require.Error(t, err)
|
|
require.Contains(t, err.Error(), "error receiving: monkey")
|
|
|
|
// failure - recv returns status
|
|
statusResponse := &ab.DeliverResponse{
|
|
Type: &ab.DeliverResponse_Status{Status: cb.Status_SUCCESS},
|
|
}
|
|
mockClient.RecvReturns(statusResponse, nil)
|
|
block, err = o.readBlock()
|
|
require.Nil(t, block)
|
|
require.Error(t, err)
|
|
require.Contains(t, err.Error(), "can't read the block")
|
|
|
|
// failure - recv returns empty proto
|
|
mockClient.RecvReturns(&ab.DeliverResponse{}, nil)
|
|
block, err = o.readBlock()
|
|
require.Nil(t, block)
|
|
require.Error(t, err)
|
|
require.Contains(t, err.Error(), "response error: unknown type")
|
|
|
|
// failures - send returns error
|
|
// getting specified block
|
|
mockClient.SendReturns(errors.New("gorilla"))
|
|
block, err = o.GetSpecifiedBlock(0)
|
|
require.Nil(t, block)
|
|
require.Error(t, err)
|
|
require.Contains(t, err.Error(), "error getting specified block: gorilla")
|
|
|
|
// getting oldest block
|
|
block, err = o.GetOldestBlock()
|
|
require.Nil(t, block)
|
|
require.Error(t, err)
|
|
require.Contains(t, err.Error(), "error getting oldest block: gorilla")
|
|
|
|
// getting newest block
|
|
block, err = o.GetNewestBlock()
|
|
require.Nil(t, block)
|
|
require.Error(t, err)
|
|
require.Contains(t, err.Error(), "error getting newest block: gorilla")
|
|
}
|
|
|
|
func TestSeekHelper(t *testing.T) {
|
|
t.Run("Standard", func(t *testing.T) {
|
|
env := seekHelper("channel-id", &ab.SeekPosition{}, nil, nil, false)
|
|
require.NotNil(t, env)
|
|
seekInfo := &ab.SeekInfo{}
|
|
_, err := protoutil.UnmarshalEnvelopeOfType(env, cb.HeaderType_DELIVER_SEEK_INFO, seekInfo)
|
|
require.NoError(t, err)
|
|
require.Equal(t, seekInfo.Behavior, ab.SeekInfo_BLOCK_UNTIL_READY)
|
|
require.Equal(t, seekInfo.ErrorResponse, ab.SeekInfo_STRICT)
|
|
})
|
|
|
|
t.Run("BestEffort", func(t *testing.T) {
|
|
env := seekHelper("channel-id", &ab.SeekPosition{}, nil, nil, true)
|
|
require.NotNil(t, env)
|
|
seekInfo := &ab.SeekInfo{}
|
|
_, err := protoutil.UnmarshalEnvelopeOfType(env, cb.HeaderType_DELIVER_SEEK_INFO, seekInfo)
|
|
require.NoError(t, err)
|
|
require.Equal(t, seekInfo.ErrorResponse, ab.SeekInfo_BEST_EFFORT)
|
|
})
|
|
}
|
|
|
|
func TestNewOrdererDeliverClient(t *testing.T) {
|
|
defer viper.Reset()
|
|
configtest.SetDevFabricConfigPath(t)
|
|
InitMSP()
|
|
|
|
// failure - rootcert file doesn't exist
|
|
viper.Set("orderer.tls.enabled", true)
|
|
viper.Set("orderer.tls.rootcert.file", "ukelele.crt")
|
|
oc, err := NewDeliverClientForOrderer("ukelele", &mock.SignerSerializer{}, false)
|
|
require.Nil(t, oc)
|
|
require.Error(t, err)
|
|
require.Contains(t, err.Error(), "failed to create deliver client for orderer: failed to load config for OrdererClient")
|
|
}
|
|
|
|
func TestNewDeliverClientForPeer(t *testing.T) {
|
|
defer viper.Reset()
|
|
configtest.SetDevFabricConfigPath(t)
|
|
InitMSP()
|
|
|
|
// failure - rootcert file doesn't exist
|
|
viper.Set("peer.tls.enabled", true)
|
|
viper.Set("peer.tls.rootcert.file", "ukelele.crt")
|
|
pc, err := NewDeliverClientForPeer("ukelele", &mock.SignerSerializer{}, false)
|
|
require.Nil(t, pc)
|
|
require.Error(t, err)
|
|
require.Contains(t, err.Error(), "failed to create deliver client for peer: failed to load config for PeerClient")
|
|
}
|