115 lines
3.5 KiB
Go
115 lines
3.5 KiB
Go
/*
|
|
Copyright IBM Corp. All Rights Reserved.
|
|
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package smartbft_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
protos "github.com/SmartBFT-Go/consensus/smartbftprotos"
|
|
"github.com/golang/protobuf/proto"
|
|
cb "github.com/hyperledger/fabric-protos-go/common"
|
|
ab "github.com/hyperledger/fabric-protos-go/orderer"
|
|
"github.com/hyperledger/fabric/common/flogging"
|
|
"github.com/hyperledger/fabric/orderer/consensus/smartbft"
|
|
"github.com/hyperledger/fabric/orderer/consensus/smartbft/mocks"
|
|
"github.com/hyperledger/fabric/protoutil"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/mock"
|
|
)
|
|
|
|
func TestDispatchConsensus(t *testing.T) {
|
|
expectedRequest := &protos.Message{
|
|
Content: &protos.Message_Prepare{
|
|
Prepare: &protos.Prepare{
|
|
Seq: 1,
|
|
View: 1,
|
|
},
|
|
},
|
|
}
|
|
|
|
t.Run("Channel exists", func(t *testing.T) {
|
|
receivedMessage := make(chan *protos.Message, 1)
|
|
mr := &mocks.MessageReceiver{}
|
|
mr.On("HandleMessage", uint64(1), mock.Anything).Return(nil).Run(func(arguments mock.Arguments) {
|
|
receivedMessage <- arguments.Get(1).(*protos.Message)
|
|
}).Once()
|
|
|
|
rg := &mocks.ReceiverGetter{}
|
|
rg.On("ReceiverByChain", "mychannel").Return(mr).Twice()
|
|
|
|
ingress := &smartbft.Ingress{ChainSelector: rg, Logger: flogging.MustGetLogger("test")}
|
|
|
|
// Good message
|
|
err := ingress.OnConsensus("mychannel", 1, &ab.ConsensusRequest{
|
|
Channel: "mychannel",
|
|
Payload: protoutil.MarshalOrPanic(expectedRequest),
|
|
})
|
|
assert.NoError(t, err)
|
|
|
|
receivedMsg := <-receivedMessage
|
|
assert.True(t, proto.Equal(receivedMsg, expectedRequest))
|
|
mr.AssertNumberOfCalls(t, "HandleMessage", 1)
|
|
|
|
// Bad message
|
|
err = ingress.OnConsensus("mychannel", 1, &ab.ConsensusRequest{
|
|
Channel: "mychannel",
|
|
Payload: []byte{1, 2, 3},
|
|
})
|
|
|
|
assert.Contains(t, err.Error(), "malformed message")
|
|
})
|
|
|
|
t.Run("Channel does not exist", func(t *testing.T) {
|
|
rg := &mocks.ReceiverGetter{}
|
|
rg.On("ReceiverByChain", "notmychannel").Return(nil).Once()
|
|
|
|
ingress := &smartbft.Ingress{ChainSelector: rg, Logger: flogging.MustGetLogger("test")}
|
|
|
|
err := ingress.OnConsensus("notmychannel", 1, nil)
|
|
assert.EqualError(t, err, "channel notmychannel doesn't exist")
|
|
})
|
|
}
|
|
|
|
func TestDispatchSubmit(t *testing.T) {
|
|
expectedRequest := &ab.SubmitRequest{
|
|
Channel: "ignored value - success",
|
|
Payload: &cb.Envelope{Payload: []byte{1, 2, 3}},
|
|
}
|
|
|
|
mr := &mocks.MessageReceiver{}
|
|
mr.On("Submit", expectedRequest, uint64(1)).Return(nil).Once()
|
|
|
|
rg := &mocks.ReceiverGetter{}
|
|
rg.On("ReceiverByChain", "mychannel").Return(mr).Once()
|
|
rg.On("ReceiverByChain", "notmychannel").Return(nil).Once()
|
|
|
|
t.Run("Channel exists", func(t *testing.T) {
|
|
mr := &mocks.MessageReceiver{}
|
|
mr.On("HandleRequest", uint64(1), protoutil.MarshalOrPanic(expectedRequest.Payload)).Return(nil).Once()
|
|
|
|
rg := &mocks.ReceiverGetter{}
|
|
rg.On("ReceiverByChain", "mychannel").Return(mr).Once()
|
|
|
|
ingress := &smartbft.Ingress{ChainSelector: rg, Logger: flogging.MustGetLogger("test")}
|
|
|
|
err := ingress.OnSubmit("mychannel", 1, expectedRequest)
|
|
assert.NoError(t, err)
|
|
|
|
mr.AssertCalled(t, "HandleRequest", uint64(1), protoutil.MarshalOrPanic(expectedRequest.Payload))
|
|
})
|
|
|
|
t.Run("Channel does not exist", func(t *testing.T) {
|
|
rg := &mocks.ReceiverGetter{}
|
|
rg.On("ReceiverByChain", "notmychannel").Return(nil).Once()
|
|
|
|
ingress := &smartbft.Ingress{ChainSelector: rg, Logger: flogging.MustGetLogger("test")}
|
|
|
|
err := ingress.OnSubmit("notmychannel", 1, expectedRequest)
|
|
assert.EqualError(t, err, "channel notmychannel doesn't exist")
|
|
})
|
|
}
|