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 }