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 }