github.com/516108736/tendermint@v0.36.0/light/provider/mock/mock.go (about)

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