github.com/franono/tendermint@v0.32.2-0.20200527150959-749313264ce9/lite2/provider/mock/mock.go (about)

     1  package mock
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/franono/tendermint/lite2/provider"
     8  	"github.com/franono/tendermint/types"
     9  )
    10  
    11  type Mock struct {
    12  	chainID          string
    13  	headers          map[int64]*types.SignedHeader
    14  	vals             map[int64]*types.ValidatorSet
    15  	evidenceToReport map[string]types.Evidence // hash => evidence
    16  }
    17  
    18  var _ provider.Provider = (*Mock)(nil)
    19  
    20  // New creates a mock provider with the given set of headers and validator
    21  // sets.
    22  func New(chainID string, headers map[int64]*types.SignedHeader, vals map[int64]*types.ValidatorSet) *Mock {
    23  	return &Mock{
    24  		chainID:          chainID,
    25  		headers:          headers,
    26  		vals:             vals,
    27  		evidenceToReport: make(map[string]types.Evidence),
    28  	}
    29  }
    30  
    31  // ChainID returns the blockchain ID.
    32  func (p *Mock) ChainID() string {
    33  	return p.chainID
    34  }
    35  
    36  func (p *Mock) String() string {
    37  	var headers strings.Builder
    38  	for _, h := range p.headers {
    39  		fmt.Fprintf(&headers, " %d:%X", h.Height, h.Hash())
    40  	}
    41  
    42  	var vals strings.Builder
    43  	for _, v := range p.vals {
    44  		fmt.Fprintf(&vals, " %X", v.Hash())
    45  	}
    46  
    47  	return fmt.Sprintf("Mock{headers: %s, vals: %v}", headers.String(), vals.String())
    48  }
    49  
    50  func (p *Mock) SignedHeader(height int64) (*types.SignedHeader, error) {
    51  	if height == 0 && len(p.headers) > 0 {
    52  		return p.headers[int64(len(p.headers))], nil
    53  	}
    54  	if _, ok := p.headers[height]; ok {
    55  		return p.headers[height], nil
    56  	}
    57  	return nil, provider.ErrSignedHeaderNotFound
    58  }
    59  
    60  func (p *Mock) ValidatorSet(height int64) (*types.ValidatorSet, error) {
    61  	if height == 0 && len(p.vals) > 0 {
    62  		return p.vals[int64(len(p.vals))], nil
    63  	}
    64  	if _, ok := p.vals[height]; ok {
    65  		return p.vals[height], nil
    66  	}
    67  	return nil, provider.ErrValidatorSetNotFound
    68  }
    69  
    70  func (p *Mock) ReportEvidence(ev types.Evidence) error {
    71  	p.evidenceToReport[string(ev.Hash())] = ev
    72  	return nil
    73  }
    74  
    75  func (p *Mock) HasEvidence(ev types.Evidence) bool {
    76  	_, ok := p.evidenceToReport[string(ev.Hash())]
    77  	return ok
    78  }