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) {}