github.com/MetalBlockchain/subnet-evm@v0.4.9/sync/client/mock_network.go (about) 1 // (c) 2021-2022, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package statesyncclient 5 6 import ( 7 "errors" 8 9 "github.com/MetalBlockchain/metalgo/ids" 10 "github.com/MetalBlockchain/subnet-evm/peer" 11 12 "github.com/MetalBlockchain/metalgo/version" 13 ) 14 15 var _ peer.NetworkClient = &mockNetwork{} 16 17 // TODO replace with gomock library 18 type mockNetwork struct { 19 // captured request data 20 numCalls uint 21 requestedVersion *version.Application 22 request []byte 23 24 // response mocking for RequestAny and Request calls 25 response [][]byte 26 callback func() // callback is called prior to processing each mock call 27 requestErr []error 28 nodesRequested []ids.NodeID 29 } 30 31 func (t *mockNetwork) SendAppRequestAny(minVersion *version.Application, request []byte) ([]byte, ids.NodeID, error) { 32 if len(t.response) == 0 { 33 return nil, ids.EmptyNodeID, errors.New("no mocked response to return in mockNetwork") 34 } 35 36 t.requestedVersion = minVersion 37 38 response, err := t.processMock(request) 39 return response, ids.EmptyNodeID, err 40 } 41 42 func (t *mockNetwork) SendAppRequest(nodeID ids.NodeID, request []byte) ([]byte, error) { 43 if len(t.response) == 0 { 44 return nil, errors.New("no mocked response to return in mockNetwork") 45 } 46 47 t.nodesRequested = append(t.nodesRequested, nodeID) 48 49 return t.processMock(request) 50 } 51 52 func (t *mockNetwork) processMock(request []byte) ([]byte, error) { 53 t.request = request 54 t.numCalls++ 55 56 if t.callback != nil { 57 t.callback() 58 } 59 60 response := t.response[0] 61 if len(t.response) > 1 { 62 t.response = t.response[1:] 63 } else { 64 t.response = nil 65 } 66 67 var err error 68 if len(t.requestErr) > 0 { 69 err = t.requestErr[0] 70 t.requestErr = t.requestErr[1:] 71 } 72 73 return response, err 74 } 75 76 func (t *mockNetwork) Gossip([]byte) error { 77 panic("not implemented") // we don't care about this function for this test 78 } 79 80 func (t *mockNetwork) SendCrossChainRequest(chainID ids.ID, request []byte) ([]byte, error) { 81 panic("not implemented") // we don't care about this function for this test 82 } 83 84 func (t *mockNetwork) mockResponse(times uint8, callback func(), response []byte) { 85 t.response = make([][]byte, times) 86 for i := uint8(0); i < times; i++ { 87 t.response[i] = response 88 } 89 t.callback = callback 90 t.numCalls = 0 91 } 92 93 func (t *mockNetwork) mockResponses(callback func(), responses ...[]byte) { 94 t.response = responses 95 t.callback = callback 96 t.numCalls = 0 97 } 98 99 func (t *mockNetwork) TrackBandwidth(ids.NodeID, float64) {}