1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
Copyright (C) THL A29 Limited, a Tencent company. All rights reserved.
SPDX-License-Identifier: Apache-2.0
*/
package compensator_service
import (
"testing"
"time"
"chainmaker.org/chainmaker/common/v2/msgbus"
"chainmaker.org/chainmaker/consensus-maxbft/v2/forest"
forest_mock "chainmaker.org/chainmaker/consensus-maxbft/v2/forest/mock"
"chainmaker.org/chainmaker/pb-go/v2/consensus/maxbft"
"chainmaker.org/chainmaker/pb-go/v2/net"
"chainmaker.org/chainmaker/protocol/v2/test"
"github.com/golang/protobuf/proto"
"github.com/stretchr/testify/require"
)
type MockNetSender struct {
Queue []*net.NetMsg
}
func (m *MockNetSender) OnMessage(message *msgbus.Message) {
if message.Topic == msgbus.SendConsensusMsg {
if msg, ok := message.Payload.(*net.NetMsg); ok {
m.Queue = append(m.Queue, msg)
}
return
}
}
func (m *MockNetSender) OnQuit() {
}
func TestRespService_HandleRequest(t *testing.T) {
blockCache := forest_mock.NewBlockCacheMock()
// 创建forest
fork := forest.NewForest(forest.NewCachedForestNode(forest.GenesisProposalContainer()),
blockCache, test.NewTestLogger(t))
// 检查其信息是否准确
require.Equal(t, "0", fork.Root().Data().Key())
var (
parentBlockView = []uint64{0, 1, 1, 2, 3, 3, 4, 5, 5, 6}
curBlkView = []uint64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
blkHeight = []uint64{1, 2, 2, 3, 3, 3, 4, 4, 4, 4}
blkHash = []string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}
preBlkHash = []string{"0", "1", "1", "2", "3", "3", "4", "5", "5", "6"}
)
// add blocks
for i := 0; i < 10; i++ {
proposalBlk1 := forest.NewProposalData(parentBlockView[i], curBlkView[i],
blkHeight[i], blkHash[i], preBlkHash[i])
_, _ = fork.UpdateStatesByProposal(proposalBlk1, true)
_ = fork.AddProposal(proposalBlk1, false)
}
msgBus := msgbus.NewMessageBus()
sender := &MockNetSender{
Queue: make([]*net.NetMsg, 0),
}
msgBus.Register(msgbus.SendConsensusMsg, sender)
respSvr := NewRespService(fork, "node1", msgBus, nil, test.NewTestLogger(t), nil, nil)
req := &maxbft.ProposalFetchMsg{
Height: 3,
View: 0,
BlockId: []byte{},
Requester: []byte("node2"),
}
respSvr.HandleRequest(req)
consensusMsg := new(maxbft.ConsensusMsg)
resp := new(maxbft.ProposalRespMsg)
time.Sleep(100 * time.Millisecond)
for _, toSendMessage := range sender.Queue {
err := proto.Unmarshal(toSendMessage.Payload, consensusMsg)
require.Nil(t, err)
err = proto.Unmarshal(consensusMsg.Payload, resp)
require.Nil(t, err)
require.Equal(t, resp.Proposal.Block.Header.BlockHeight, uint64(3))
require.Equal(t, string(resp.Responser), "node1")
}
sender.Queue = make([]*net.NetMsg, 0)
req = &maxbft.ProposalFetchMsg{
Height: 0,
View: 0,
BlockId: []byte("7"),
Requester: []byte("node2"),
}
respSvr.HandleRequest(req)
time.Sleep(100 * time.Millisecond)
require.Equal(t, len(sender.Queue), 1)
toSendMessage := sender.Queue[0]
err := proto.Unmarshal(toSendMessage.Payload, consensusMsg)
require.Nil(t, err)
err = proto.Unmarshal(consensusMsg.Payload, resp)
require.Nil(t, err)
require.Equal(t, string(resp.Proposal.Block.Header.BlockHash), "7")
require.Equal(t, string(resp.Responser), "node1")
}