github.com/lazyledger/lazyledger-core@v0.35.0-dev.0.20210613111200-4c651f053571/light/provider/mock/mock.go (about)

     1  package mock
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"strings"
     8  
     9  	"github.com/lazyledger/lazyledger-core/light/provider"
    10  	"github.com/lazyledger/lazyledger-core/types"
    11  )
    12  
    13  type Mock struct {
    14  	id               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(id string, headers map[int64]*types.SignedHeader, vals map[int64]*types.ValidatorSet) *Mock {
    25  	return &Mock{
    26  		id:               id,
    27  		headers:          headers,
    28  		vals:             vals,
    29  		evidenceToReport: make(map[string]types.Evidence),
    30  	}
    31  }
    32  
    33  func (p *Mock) String() string {
    34  	var headers strings.Builder
    35  	for _, h := range p.headers {
    36  		fmt.Fprintf(&headers, " %d:%X", h.Height, h.Hash())
    37  	}
    38  
    39  	var vals strings.Builder
    40  	for _, v := range p.vals {
    41  		fmt.Fprintf(&vals, " %X", v.Hash())
    42  	}
    43  
    44  	return fmt.Sprintf("Mock{id: %s, headers: %s, vals: %v}", p.id, headers.String(), vals.String())
    45  }
    46  
    47  func (p *Mock) LightBlock(_ context.Context, height int64) (*types.LightBlock, error) {
    48  	var lb *types.LightBlock
    49  	if height == 0 && len(p.headers) > 0 {
    50  		sh := p.headers[int64(len(p.headers))]
    51  		vals := p.vals[int64(len(p.vals))]
    52  		lb = &types.LightBlock{
    53  			SignedHeader: sh,
    54  			ValidatorSet: vals,
    55  		}
    56  
    57  	}
    58  	if _, ok := p.headers[height]; ok {
    59  		sh := p.headers[height]
    60  		vals := p.vals[height]
    61  		lb = &types.LightBlock{
    62  			SignedHeader: sh,
    63  			ValidatorSet: vals,
    64  		}
    65  	}
    66  	if lb == nil {
    67  		return nil, provider.ErrLightBlockNotFound
    68  	}
    69  	if lb.SignedHeader == nil || lb.ValidatorSet == nil {
    70  		return nil, provider.ErrBadLightBlock{Reason: errors.New("nil header or vals")}
    71  	}
    72  	if err := lb.ValidateBasic(lb.ChainID); err != nil {
    73  		return nil, provider.ErrBadLightBlock{Reason: err}
    74  	}
    75  	return lb, nil
    76  }
    77  
    78  func (p *Mock) DASLightBlock(ctx context.Context, height int64) (*types.LightBlock, error) {
    79  	panic("not implemented")
    80  }
    81  
    82  func (p *Mock) ReportEvidence(_ context.Context, ev types.Evidence) error {
    83  	p.evidenceToReport[string(ev.Hash())] = ev
    84  	return nil
    85  }
    86  
    87  func (p *Mock) HasEvidence(ev types.Evidence) bool {
    88  	_, ok := p.evidenceToReport[string(ev.Hash())]
    89  	return ok
    90  }