package test import ( "context" "sync" "github.com/ipfs/go-cid" blocks "github.com/ipfs/go-libipfs/blocks" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/chain/types" ) type MockAPI struct { bs blockstore.Blockstore lk sync.Mutex ts map[types.TipSetKey]*types.Actor stateGetActorCalled int } func NewMockAPI(bs blockstore.Blockstore) *MockAPI { return &MockAPI{ bs: bs, ts: make(map[types.TipSetKey]*types.Actor), } } func (m *MockAPI) ChainHasObj(ctx context.Context, c cid.Cid) (bool, error) { return m.bs.Has(ctx, c) } func (m *MockAPI) ChainReadObj(ctx context.Context, c cid.Cid) ([]byte, error) { blk, err := m.bs.Get(ctx, c) if err != nil { return nil, xerrors.Errorf("blockstore get: %w", err) } return blk.RawData(), nil } func (m *MockAPI) ChainPutObj(ctx context.Context, block blocks.Block) error { return m.bs.Put(ctx, block) } func (m *MockAPI) StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) { m.lk.Lock() defer m.lk.Unlock() m.stateGetActorCalled++ return m.ts[tsk], nil } func (m *MockAPI) StateGetActorCallCount() int { m.lk.Lock() defer m.lk.Unlock() return m.stateGetActorCalled } func (m *MockAPI) ResetCallCounts() { m.lk.Lock() defer m.lk.Unlock() m.stateGetActorCalled = 0 } func (m *MockAPI) SetActor(tsk types.TipSetKey, act *types.Actor) { m.lk.Lock() defer m.lk.Unlock() m.ts[tsk] = act }