forked from ava-labs/coreth
/
mock_network.go
99 lines (76 loc) · 2.42 KB
/
mock_network.go
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
// (c) 2021-2022, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package statesyncclient
import (
"errors"
"github.com/MetalBlockchain/metalgo/ids"
"github.com/MetalBlockchain/coreth/peer"
"github.com/MetalBlockchain/metalgo/version"
)
var _ peer.NetworkClient = &mockNetwork{}
// TODO replace with gomock library
type mockNetwork struct {
// captured request data
numCalls uint
requestedVersion *version.Application
request []byte
// response mocking for RequestAny and Request calls
response [][]byte
callback func() // callback is called prior to processing each mock call
requestErr []error
nodesRequested []ids.NodeID
}
func (t *mockNetwork) SendAppRequestAny(minVersion *version.Application, request []byte) ([]byte, ids.NodeID, error) {
if len(t.response) == 0 {
return nil, ids.EmptyNodeID, errors.New("no mocked response to return in mockNetwork")
}
t.requestedVersion = minVersion
response, err := t.processMock(request)
return response, ids.EmptyNodeID, err
}
func (t *mockNetwork) SendAppRequest(nodeID ids.NodeID, request []byte) ([]byte, error) {
if len(t.response) == 0 {
return nil, errors.New("no mocked response to return in mockNetwork")
}
t.nodesRequested = append(t.nodesRequested, nodeID)
return t.processMock(request)
}
func (t *mockNetwork) processMock(request []byte) ([]byte, error) {
t.request = request
t.numCalls++
if t.callback != nil {
t.callback()
}
response := t.response[0]
if len(t.response) > 1 {
t.response = t.response[1:]
} else {
t.response = nil
}
var err error
if len(t.requestErr) > 0 {
err = t.requestErr[0]
t.requestErr = t.requestErr[1:]
}
return response, err
}
func (t *mockNetwork) Gossip([]byte) error {
panic("not implemented") // we don't care about this function for this test
}
func (t *mockNetwork) SendCrossChainRequest(chainID ids.ID, request []byte) ([]byte, error) {
panic("not implemented") // we don't care about this function for this test
}
func (t *mockNetwork) mockResponse(times uint8, callback func(), response []byte) {
t.response = make([][]byte, times)
for i := uint8(0); i < times; i++ {
t.response[i] = response
}
t.callback = callback
t.numCalls = 0
}
func (t *mockNetwork) mockResponses(callback func(), responses ...[]byte) {
t.response = responses
t.callback = callback
t.numCalls = 0
}
func (t *mockNetwork) TrackBandwidth(ids.NodeID, float64) {}