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 }