Merge pull request #2985 from filecoin-project/refactor/paych-mgr-api
Refactor paych mgr apis for easier mocking
This commit is contained in:
commit
75f5afc0da
@ -27,62 +27,71 @@ import (
|
|||||||
|
|
||||||
var log = logging.Logger("paych")
|
var log = logging.Logger("paych")
|
||||||
|
|
||||||
type ManagerApi struct {
|
// PaychAPI is used by dependency injection to pass the consituent APIs to NewManager()
|
||||||
|
type PaychAPI struct {
|
||||||
fx.In
|
fx.In
|
||||||
|
|
||||||
full.MpoolAPI
|
full.MpoolAPI
|
||||||
full.WalletAPI
|
|
||||||
full.StateAPI
|
full.StateAPI
|
||||||
}
|
}
|
||||||
|
|
||||||
type StateManagerApi interface {
|
// stateManagerAPI defines the methods needed from StateManager
|
||||||
|
type stateManagerAPI interface {
|
||||||
LoadActorState(ctx context.Context, a address.Address, out interface{}, ts *types.TipSet) (*types.Actor, error)
|
LoadActorState(ctx context.Context, a address.Address, out interface{}, ts *types.TipSet) (*types.Actor, error)
|
||||||
Call(ctx context.Context, msg *types.Message, ts *types.TipSet) (*api.InvocResult, error)
|
Call(ctx context.Context, msg *types.Message, ts *types.TipSet) (*api.InvocResult, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// paychAPI defines the API methods needed by the payment channel manager
|
||||||
|
type paychAPI interface {
|
||||||
|
StateWaitMsg(ctx context.Context, msg cid.Cid, confidence uint64) (*api.MsgLookup, error)
|
||||||
|
MpoolPushMessage(ctx context.Context, msg *types.Message) (*types.SignedMessage, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// managerAPI defines all methods needed by the manager
|
||||||
|
type managerAPI interface {
|
||||||
|
stateManagerAPI
|
||||||
|
paychAPI
|
||||||
|
}
|
||||||
|
|
||||||
|
// managerAPIImpl is used to create a composite that implements managerAPI
|
||||||
|
type managerAPIImpl struct {
|
||||||
|
stateManagerAPI
|
||||||
|
paychAPI
|
||||||
|
}
|
||||||
|
|
||||||
type Manager struct {
|
type Manager struct {
|
||||||
// The Manager context is used to terminate wait operations on shutdown
|
// The Manager context is used to terminate wait operations on shutdown
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
shutdown context.CancelFunc
|
shutdown context.CancelFunc
|
||||||
|
|
||||||
store *Store
|
store *Store
|
||||||
sm StateManagerApi
|
|
||||||
sa *stateAccessor
|
sa *stateAccessor
|
||||||
pchapi paychApi
|
pchapi managerAPI
|
||||||
|
|
||||||
lk sync.RWMutex
|
lk sync.RWMutex
|
||||||
channels map[string]*channelAccessor
|
channels map[string]*channelAccessor
|
||||||
|
|
||||||
mpool full.MpoolAPI
|
|
||||||
wallet full.WalletAPI
|
|
||||||
state full.StateAPI
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewManager(mctx helpers.MetricsCtx, lc fx.Lifecycle, sm *stmgr.StateManager, pchstore *Store, api ManagerApi) *Manager {
|
func NewManager(mctx helpers.MetricsCtx, lc fx.Lifecycle, sm *stmgr.StateManager, pchstore *Store, api PaychAPI) *Manager {
|
||||||
ctx := helpers.LifecycleCtx(mctx, lc)
|
ctx := helpers.LifecycleCtx(mctx, lc)
|
||||||
ctx, shutdown := context.WithCancel(ctx)
|
ctx, shutdown := context.WithCancel(ctx)
|
||||||
|
|
||||||
|
impl := &managerAPIImpl{stateManagerAPI: sm, paychAPI: &api}
|
||||||
return &Manager{
|
return &Manager{
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
shutdown: shutdown,
|
shutdown: shutdown,
|
||||||
store: pchstore,
|
store: pchstore,
|
||||||
sm: sm,
|
sa: &stateAccessor{sm: impl},
|
||||||
sa: &stateAccessor{sm: sm},
|
|
||||||
channels: make(map[string]*channelAccessor),
|
channels: make(map[string]*channelAccessor),
|
||||||
pchapi: &api,
|
pchapi: impl,
|
||||||
|
|
||||||
mpool: api.MpoolAPI,
|
|
||||||
wallet: api.WalletAPI,
|
|
||||||
state: api.StateAPI,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// newManager is used by the tests to supply mocks
|
// newManager is used by the tests to supply mocks
|
||||||
func newManager(sm StateManagerApi, pchstore *Store, pchapi paychApi) (*Manager, error) {
|
func newManager(pchstore *Store, pchapi managerAPI) (*Manager, error) {
|
||||||
pm := &Manager{
|
pm := &Manager{
|
||||||
store: pchstore,
|
store: pchstore,
|
||||||
sm: sm,
|
sa: &stateAccessor{sm: pchapi},
|
||||||
sa: &stateAccessor{sm: sm},
|
|
||||||
channels: make(map[string]*channelAccessor),
|
channels: make(map[string]*channelAccessor),
|
||||||
pchapi: pchapi,
|
pchapi: pchapi,
|
||||||
}
|
}
|
||||||
|
180
paychmgr/mock_test.go
Normal file
180
paychmgr/mock_test.go
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
package paychmgr
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/go-address"
|
||||||
|
"github.com/filecoin-project/lotus/api"
|
||||||
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
"github.com/filecoin-project/specs-actors/actors/builtin/account"
|
||||||
|
"github.com/filecoin-project/specs-actors/actors/builtin/paych"
|
||||||
|
"github.com/ipfs/go-cid"
|
||||||
|
)
|
||||||
|
|
||||||
|
type mockManagerAPI struct {
|
||||||
|
*mockStateManager
|
||||||
|
*mockPaychAPI
|
||||||
|
}
|
||||||
|
|
||||||
|
func newMockManagerAPI() *mockManagerAPI {
|
||||||
|
return &mockManagerAPI{
|
||||||
|
mockStateManager: newMockStateManager(),
|
||||||
|
mockPaychAPI: newMockPaychAPI(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type mockPchState struct {
|
||||||
|
actor *types.Actor
|
||||||
|
state paych.State
|
||||||
|
}
|
||||||
|
|
||||||
|
type mockStateManager struct {
|
||||||
|
lk sync.Mutex
|
||||||
|
accountState map[address.Address]account.State
|
||||||
|
paychState map[address.Address]mockPchState
|
||||||
|
response *api.InvocResult
|
||||||
|
}
|
||||||
|
|
||||||
|
func newMockStateManager() *mockStateManager {
|
||||||
|
return &mockStateManager{
|
||||||
|
accountState: make(map[address.Address]account.State),
|
||||||
|
paychState: make(map[address.Address]mockPchState),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sm *mockStateManager) setAccountState(a address.Address, state account.State) {
|
||||||
|
sm.lk.Lock()
|
||||||
|
defer sm.lk.Unlock()
|
||||||
|
sm.accountState[a] = state
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sm *mockStateManager) setPaychState(a address.Address, actor *types.Actor, state paych.State) {
|
||||||
|
sm.lk.Lock()
|
||||||
|
defer sm.lk.Unlock()
|
||||||
|
sm.paychState[a] = mockPchState{actor, state}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sm *mockStateManager) LoadActorState(ctx context.Context, a address.Address, out interface{}, ts *types.TipSet) (*types.Actor, error) {
|
||||||
|
sm.lk.Lock()
|
||||||
|
defer sm.lk.Unlock()
|
||||||
|
|
||||||
|
if outState, ok := out.(*account.State); ok {
|
||||||
|
*outState = sm.accountState[a]
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
if outState, ok := out.(*paych.State); ok {
|
||||||
|
info := sm.paychState[a]
|
||||||
|
*outState = info.state
|
||||||
|
return info.actor, nil
|
||||||
|
}
|
||||||
|
panic(fmt.Sprintf("unexpected state type %v", out))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sm *mockStateManager) Call(ctx context.Context, msg *types.Message, ts *types.TipSet) (*api.InvocResult, error) {
|
||||||
|
return sm.response, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type waitingCall struct {
|
||||||
|
response chan types.MessageReceipt
|
||||||
|
}
|
||||||
|
|
||||||
|
type waitingResponse struct {
|
||||||
|
receipt types.MessageReceipt
|
||||||
|
done chan struct{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type mockPaychAPI struct {
|
||||||
|
lk sync.Mutex
|
||||||
|
messages map[cid.Cid]*types.SignedMessage
|
||||||
|
waitingCalls map[cid.Cid]*waitingCall
|
||||||
|
waitingResponses map[cid.Cid]*waitingResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
func newMockPaychAPI() *mockPaychAPI {
|
||||||
|
return &mockPaychAPI{
|
||||||
|
messages: make(map[cid.Cid]*types.SignedMessage),
|
||||||
|
waitingCalls: make(map[cid.Cid]*waitingCall),
|
||||||
|
waitingResponses: make(map[cid.Cid]*waitingResponse),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pchapi *mockPaychAPI) StateWaitMsg(ctx context.Context, mcid cid.Cid, confidence uint64) (*api.MsgLookup, error) {
|
||||||
|
pchapi.lk.Lock()
|
||||||
|
|
||||||
|
response := make(chan types.MessageReceipt)
|
||||||
|
|
||||||
|
if response, ok := pchapi.waitingResponses[mcid]; ok {
|
||||||
|
defer pchapi.lk.Unlock()
|
||||||
|
defer func() {
|
||||||
|
go close(response.done)
|
||||||
|
}()
|
||||||
|
|
||||||
|
delete(pchapi.waitingResponses, mcid)
|
||||||
|
return &api.MsgLookup{Receipt: response.receipt}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
pchapi.waitingCalls[mcid] = &waitingCall{response: response}
|
||||||
|
pchapi.lk.Unlock()
|
||||||
|
|
||||||
|
receipt := <-response
|
||||||
|
return &api.MsgLookup{Receipt: receipt}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pchapi *mockPaychAPI) receiveMsgResponse(mcid cid.Cid, receipt types.MessageReceipt) {
|
||||||
|
pchapi.lk.Lock()
|
||||||
|
|
||||||
|
if call, ok := pchapi.waitingCalls[mcid]; ok {
|
||||||
|
defer pchapi.lk.Unlock()
|
||||||
|
|
||||||
|
delete(pchapi.waitingCalls, mcid)
|
||||||
|
call.response <- receipt
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
done := make(chan struct{})
|
||||||
|
pchapi.waitingResponses[mcid] = &waitingResponse{receipt: receipt, done: done}
|
||||||
|
|
||||||
|
pchapi.lk.Unlock()
|
||||||
|
|
||||||
|
<-done
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send success response for any waiting calls
|
||||||
|
func (pchapi *mockPaychAPI) close() {
|
||||||
|
pchapi.lk.Lock()
|
||||||
|
defer pchapi.lk.Unlock()
|
||||||
|
|
||||||
|
success := types.MessageReceipt{
|
||||||
|
ExitCode: 0,
|
||||||
|
Return: []byte{},
|
||||||
|
}
|
||||||
|
for mcid, call := range pchapi.waitingCalls {
|
||||||
|
delete(pchapi.waitingCalls, mcid)
|
||||||
|
call.response <- success
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pchapi *mockPaychAPI) MpoolPushMessage(ctx context.Context, msg *types.Message) (*types.SignedMessage, error) {
|
||||||
|
pchapi.lk.Lock()
|
||||||
|
defer pchapi.lk.Unlock()
|
||||||
|
|
||||||
|
smsg := &types.SignedMessage{Message: *msg}
|
||||||
|
pchapi.messages[smsg.Cid()] = smsg
|
||||||
|
return smsg, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pchapi *mockPaychAPI) pushedMessages(c cid.Cid) *types.SignedMessage {
|
||||||
|
pchapi.lk.Lock()
|
||||||
|
defer pchapi.lk.Unlock()
|
||||||
|
|
||||||
|
return pchapi.messages[c]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pchapi *mockPaychAPI) pushedMessageCount() int {
|
||||||
|
pchapi.lk.Lock()
|
||||||
|
defer pchapi.lk.Unlock()
|
||||||
|
|
||||||
|
return len(pchapi.messages)
|
||||||
|
}
|
@ -24,9 +24,8 @@ type channelAccessor struct {
|
|||||||
// waitCtx is used by processes that wait for things to be confirmed
|
// waitCtx is used by processes that wait for things to be confirmed
|
||||||
// on chain
|
// on chain
|
||||||
waitCtx context.Context
|
waitCtx context.Context
|
||||||
sm StateManagerApi
|
|
||||||
sa *stateAccessor
|
sa *stateAccessor
|
||||||
api paychApi
|
api managerAPI
|
||||||
store *Store
|
store *Store
|
||||||
lk *channelLock
|
lk *channelLock
|
||||||
fundsReqQueue []*fundsReq
|
fundsReqQueue []*fundsReq
|
||||||
@ -36,8 +35,7 @@ type channelAccessor struct {
|
|||||||
func newChannelAccessor(pm *Manager) *channelAccessor {
|
func newChannelAccessor(pm *Manager) *channelAccessor {
|
||||||
return &channelAccessor{
|
return &channelAccessor{
|
||||||
lk: &channelLock{globalLock: &pm.lk},
|
lk: &channelLock{globalLock: &pm.lk},
|
||||||
sm: pm.sm,
|
sa: pm.sa,
|
||||||
sa: &stateAccessor{sm: pm.sm},
|
|
||||||
api: pm.pchapi,
|
api: pm.pchapi,
|
||||||
store: pm.store,
|
store: pm.store,
|
||||||
msgListeners: newMsgListeners(),
|
msgListeners: newMsgListeners(),
|
||||||
@ -70,7 +68,7 @@ func (ca *channelAccessor) checkVoucherValidUnlocked(ctx context.Context, ch add
|
|||||||
}
|
}
|
||||||
|
|
||||||
var actState account.State
|
var actState account.State
|
||||||
_, err = ca.sm.LoadActorState(ctx, pchState.From, &actState, nil)
|
_, err = ca.api.LoadActorState(ctx, pchState.From, &actState, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -181,7 +179,7 @@ func (ca *channelAccessor) checkVoucherSpendable(ctx context.Context, ch address
|
|||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
ret, err := ca.sm.Call(ctx, &types.Message{
|
ret, err := ca.api.Call(ctx, &types.Message{
|
||||||
From: recipient,
|
From: recipient,
|
||||||
To: ch,
|
To: ch,
|
||||||
Method: builtin.MethodsPaych.UpdateChannelState,
|
Method: builtin.MethodsPaych.UpdateChannelState,
|
||||||
@ -200,7 +198,7 @@ func (ca *channelAccessor) checkVoucherSpendable(ctx context.Context, ch address
|
|||||||
|
|
||||||
func (ca *channelAccessor) getPaychRecipient(ctx context.Context, ch address.Address) (address.Address, error) {
|
func (ca *channelAccessor) getPaychRecipient(ctx context.Context, ch address.Address) (address.Address, error) {
|
||||||
var state paych.State
|
var state paych.State
|
||||||
if _, err := ca.sm.LoadActorState(ctx, ch, &state, nil); err != nil {
|
if _, err := ca.api.LoadActorState(ctx, ch, &state, nil); err != nil {
|
||||||
return address.Address{}, err
|
return address.Address{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,8 +2,6 @@ package paychmgr
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
|
||||||
"sync"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/filecoin-project/specs-actors/actors/builtin"
|
"github.com/filecoin-project/specs-actors/actors/builtin"
|
||||||
@ -24,64 +22,12 @@ import (
|
|||||||
"github.com/filecoin-project/specs-actors/actors/builtin/account"
|
"github.com/filecoin-project/specs-actors/actors/builtin/account"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
"github.com/filecoin-project/lotus/api"
|
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
|
||||||
ds "github.com/ipfs/go-datastore"
|
ds "github.com/ipfs/go-datastore"
|
||||||
ds_sync "github.com/ipfs/go-datastore/sync"
|
ds_sync "github.com/ipfs/go-datastore/sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
type testPchState struct {
|
|
||||||
actor *types.Actor
|
|
||||||
state paych.State
|
|
||||||
}
|
|
||||||
|
|
||||||
type mockStateManager struct {
|
|
||||||
lk sync.Mutex
|
|
||||||
accountState map[address.Address]account.State
|
|
||||||
paychState map[address.Address]testPchState
|
|
||||||
response *api.InvocResult
|
|
||||||
}
|
|
||||||
|
|
||||||
func newMockStateManager() *mockStateManager {
|
|
||||||
return &mockStateManager{
|
|
||||||
accountState: make(map[address.Address]account.State),
|
|
||||||
paychState: make(map[address.Address]testPchState),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sm *mockStateManager) setAccountState(a address.Address, state account.State) {
|
|
||||||
sm.lk.Lock()
|
|
||||||
defer sm.lk.Unlock()
|
|
||||||
sm.accountState[a] = state
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sm *mockStateManager) setPaychState(a address.Address, actor *types.Actor, state paych.State) {
|
|
||||||
sm.lk.Lock()
|
|
||||||
defer sm.lk.Unlock()
|
|
||||||
sm.paychState[a] = testPchState{actor, state}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sm *mockStateManager) LoadActorState(ctx context.Context, a address.Address, out interface{}, ts *types.TipSet) (*types.Actor, error) {
|
|
||||||
sm.lk.Lock()
|
|
||||||
defer sm.lk.Unlock()
|
|
||||||
|
|
||||||
if outState, ok := out.(*account.State); ok {
|
|
||||||
*outState = sm.accountState[a]
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
if outState, ok := out.(*paych.State); ok {
|
|
||||||
info := sm.paychState[a]
|
|
||||||
*outState = info.state
|
|
||||||
return info.actor, nil
|
|
||||||
}
|
|
||||||
panic(fmt.Sprintf("unexpected state type %v", out))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sm *mockStateManager) Call(ctx context.Context, msg *types.Message, ts *types.TipSet) (*api.InvocResult, error) {
|
|
||||||
return sm.response, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestPaychOutbound(t *testing.T) {
|
func TestPaychOutbound(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore()))
|
store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore()))
|
||||||
@ -92,10 +38,10 @@ func TestPaychOutbound(t *testing.T) {
|
|||||||
fromAcct := tutils.NewIDAddr(t, 201)
|
fromAcct := tutils.NewIDAddr(t, 201)
|
||||||
toAcct := tutils.NewIDAddr(t, 202)
|
toAcct := tutils.NewIDAddr(t, 202)
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
sm.setAccountState(fromAcct, account.State{Address: from})
|
mock.setAccountState(fromAcct, account.State{Address: from})
|
||||||
sm.setAccountState(toAcct, account.State{Address: to})
|
mock.setAccountState(toAcct, account.State{Address: to})
|
||||||
sm.setPaychState(ch, nil, paych.State{
|
mock.setPaychState(ch, nil, paych.State{
|
||||||
From: fromAcct,
|
From: fromAcct,
|
||||||
To: toAcct,
|
To: toAcct,
|
||||||
ToSend: big.NewInt(0),
|
ToSend: big.NewInt(0),
|
||||||
@ -104,7 +50,7 @@ func TestPaychOutbound(t *testing.T) {
|
|||||||
LaneStates: []*paych.LaneState{},
|
LaneStates: []*paych.LaneState{},
|
||||||
})
|
})
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, nil)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = mgr.TrackOutboundChannel(ctx, ch)
|
err = mgr.TrackOutboundChannel(ctx, ch)
|
||||||
@ -130,10 +76,10 @@ func TestPaychInbound(t *testing.T) {
|
|||||||
fromAcct := tutils.NewIDAddr(t, 201)
|
fromAcct := tutils.NewIDAddr(t, 201)
|
||||||
toAcct := tutils.NewIDAddr(t, 202)
|
toAcct := tutils.NewIDAddr(t, 202)
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
sm.setAccountState(fromAcct, account.State{Address: from})
|
mock.setAccountState(fromAcct, account.State{Address: from})
|
||||||
sm.setAccountState(toAcct, account.State{Address: to})
|
mock.setAccountState(toAcct, account.State{Address: to})
|
||||||
sm.setPaychState(ch, nil, paych.State{
|
mock.setPaychState(ch, nil, paych.State{
|
||||||
From: fromAcct,
|
From: fromAcct,
|
||||||
To: toAcct,
|
To: toAcct,
|
||||||
ToSend: big.NewInt(0),
|
ToSend: big.NewInt(0),
|
||||||
@ -142,7 +88,7 @@ func TestPaychInbound(t *testing.T) {
|
|||||||
LaneStates: []*paych.LaneState{},
|
LaneStates: []*paych.LaneState{},
|
||||||
})
|
})
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, nil)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = mgr.TrackInboundChannel(ctx, ch)
|
err = mgr.TrackInboundChannel(ctx, ch)
|
||||||
@ -170,9 +116,9 @@ func TestCheckVoucherValid(t *testing.T) {
|
|||||||
fromAcct := tutils.NewActorAddr(t, "fromAct")
|
fromAcct := tutils.NewActorAddr(t, "fromAct")
|
||||||
toAcct := tutils.NewActorAddr(t, "toAct")
|
toAcct := tutils.NewActorAddr(t, "toAct")
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
sm.setAccountState(fromAcct, account.State{Address: from})
|
mock.setAccountState(fromAcct, account.State{Address: from})
|
||||||
sm.setAccountState(toAcct, account.State{Address: to})
|
mock.setAccountState(toAcct, account.State{Address: to})
|
||||||
|
|
||||||
tcases := []struct {
|
tcases := []struct {
|
||||||
name string
|
name string
|
||||||
@ -316,7 +262,7 @@ func TestCheckVoucherValid(t *testing.T) {
|
|||||||
Nonce: 0,
|
Nonce: 0,
|
||||||
Balance: tcase.actorBalance,
|
Balance: tcase.actorBalance,
|
||||||
}
|
}
|
||||||
sm.setPaychState(ch, act, paych.State{
|
mock.setPaychState(ch, act, paych.State{
|
||||||
From: fromAcct,
|
From: fromAcct,
|
||||||
To: toAcct,
|
To: toAcct,
|
||||||
ToSend: tcase.toSend,
|
ToSend: tcase.toSend,
|
||||||
@ -325,7 +271,7 @@ func TestCheckVoucherValid(t *testing.T) {
|
|||||||
LaneStates: tcase.laneStates,
|
LaneStates: tcase.laneStates,
|
||||||
})
|
})
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, nil)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = mgr.TrackInboundChannel(ctx, ch)
|
err = mgr.TrackInboundChannel(ctx, ch)
|
||||||
@ -355,9 +301,9 @@ func TestCheckVoucherValidCountingAllLanes(t *testing.T) {
|
|||||||
toAcct := tutils.NewActorAddr(t, "toAct")
|
toAcct := tutils.NewActorAddr(t, "toAct")
|
||||||
minDelta := big.NewInt(0)
|
minDelta := big.NewInt(0)
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
sm.setAccountState(fromAcct, account.State{Address: from})
|
mock.setAccountState(fromAcct, account.State{Address: from})
|
||||||
sm.setAccountState(toAcct, account.State{Address: to})
|
mock.setAccountState(toAcct, account.State{Address: to})
|
||||||
|
|
||||||
store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore()))
|
store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore()))
|
||||||
|
|
||||||
@ -379,7 +325,7 @@ func TestCheckVoucherValidCountingAllLanes(t *testing.T) {
|
|||||||
Nonce: 0,
|
Nonce: 0,
|
||||||
Balance: actorBalance,
|
Balance: actorBalance,
|
||||||
}
|
}
|
||||||
sm.setPaychState(ch, act, paych.State{
|
mock.setPaychState(ch, act, paych.State{
|
||||||
From: fromAcct,
|
From: fromAcct,
|
||||||
To: toAcct,
|
To: toAcct,
|
||||||
ToSend: toSend,
|
ToSend: toSend,
|
||||||
@ -388,7 +334,7 @@ func TestCheckVoucherValidCountingAllLanes(t *testing.T) {
|
|||||||
LaneStates: laneStates,
|
LaneStates: laneStates,
|
||||||
})
|
})
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, nil)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = mgr.TrackInboundChannel(ctx, ch)
|
err = mgr.TrackInboundChannel(ctx, ch)
|
||||||
@ -678,9 +624,9 @@ func testSetupMgrWithChannel(ctx context.Context, t *testing.T) (*Manager, addre
|
|||||||
fromAcct := tutils.NewActorAddr(t, "fromAct")
|
fromAcct := tutils.NewActorAddr(t, "fromAct")
|
||||||
toAcct := tutils.NewActorAddr(t, "toAct")
|
toAcct := tutils.NewActorAddr(t, "toAct")
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
sm.setAccountState(fromAcct, account.State{Address: from})
|
mock.setAccountState(fromAcct, account.State{Address: from})
|
||||||
sm.setAccountState(toAcct, account.State{Address: to})
|
mock.setAccountState(toAcct, account.State{Address: to})
|
||||||
|
|
||||||
act := &types.Actor{
|
act := &types.Actor{
|
||||||
Code: builtin.AccountActorCodeID,
|
Code: builtin.AccountActorCodeID,
|
||||||
@ -688,7 +634,7 @@ func testSetupMgrWithChannel(ctx context.Context, t *testing.T) (*Manager, addre
|
|||||||
Nonce: 0,
|
Nonce: 0,
|
||||||
Balance: big.NewInt(20),
|
Balance: big.NewInt(20),
|
||||||
}
|
}
|
||||||
sm.setPaychState(ch, act, paych.State{
|
mock.setPaychState(ch, act, paych.State{
|
||||||
From: fromAcct,
|
From: fromAcct,
|
||||||
To: toAcct,
|
To: toAcct,
|
||||||
ToSend: big.NewInt(0),
|
ToSend: big.NewInt(0),
|
||||||
@ -698,7 +644,7 @@ func testSetupMgrWithChannel(ctx context.Context, t *testing.T) (*Manager, addre
|
|||||||
})
|
})
|
||||||
|
|
||||||
store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore()))
|
store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore()))
|
||||||
mgr, err := newManager(sm, store, nil)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = mgr.TrackInboundChannel(ctx, ch)
|
err = mgr.TrackInboundChannel(ctx, ch)
|
||||||
|
@ -12,7 +12,6 @@ import (
|
|||||||
|
|
||||||
"github.com/filecoin-project/specs-actors/actors/builtin"
|
"github.com/filecoin-project/specs-actors/actors/builtin"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/api"
|
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
@ -26,109 +25,6 @@ import (
|
|||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
type waitingCall struct {
|
|
||||||
response chan types.MessageReceipt
|
|
||||||
}
|
|
||||||
|
|
||||||
type waitingResponse struct {
|
|
||||||
receipt types.MessageReceipt
|
|
||||||
done chan struct{}
|
|
||||||
}
|
|
||||||
|
|
||||||
type mockPaychAPI struct {
|
|
||||||
lk sync.Mutex
|
|
||||||
messages map[cid.Cid]*types.SignedMessage
|
|
||||||
waitingCalls map[cid.Cid]*waitingCall
|
|
||||||
waitingResponses map[cid.Cid]*waitingResponse
|
|
||||||
}
|
|
||||||
|
|
||||||
func newMockPaychAPI() *mockPaychAPI {
|
|
||||||
return &mockPaychAPI{
|
|
||||||
messages: make(map[cid.Cid]*types.SignedMessage),
|
|
||||||
waitingCalls: make(map[cid.Cid]*waitingCall),
|
|
||||||
waitingResponses: make(map[cid.Cid]*waitingResponse),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (pchapi *mockPaychAPI) StateWaitMsg(ctx context.Context, mcid cid.Cid, confidence uint64) (*api.MsgLookup, error) {
|
|
||||||
pchapi.lk.Lock()
|
|
||||||
|
|
||||||
response := make(chan types.MessageReceipt)
|
|
||||||
|
|
||||||
if response, ok := pchapi.waitingResponses[mcid]; ok {
|
|
||||||
defer pchapi.lk.Unlock()
|
|
||||||
defer func() {
|
|
||||||
go close(response.done)
|
|
||||||
}()
|
|
||||||
|
|
||||||
delete(pchapi.waitingResponses, mcid)
|
|
||||||
return &api.MsgLookup{Receipt: response.receipt}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
pchapi.waitingCalls[mcid] = &waitingCall{response: response}
|
|
||||||
pchapi.lk.Unlock()
|
|
||||||
|
|
||||||
receipt := <-response
|
|
||||||
return &api.MsgLookup{Receipt: receipt}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (pchapi *mockPaychAPI) receiveMsgResponse(mcid cid.Cid, receipt types.MessageReceipt) {
|
|
||||||
pchapi.lk.Lock()
|
|
||||||
|
|
||||||
if call, ok := pchapi.waitingCalls[mcid]; ok {
|
|
||||||
defer pchapi.lk.Unlock()
|
|
||||||
|
|
||||||
delete(pchapi.waitingCalls, mcid)
|
|
||||||
call.response <- receipt
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
done := make(chan struct{})
|
|
||||||
pchapi.waitingResponses[mcid] = &waitingResponse{receipt: receipt, done: done}
|
|
||||||
|
|
||||||
pchapi.lk.Unlock()
|
|
||||||
|
|
||||||
<-done
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send success response for any waiting calls
|
|
||||||
func (pchapi *mockPaychAPI) close() {
|
|
||||||
pchapi.lk.Lock()
|
|
||||||
defer pchapi.lk.Unlock()
|
|
||||||
|
|
||||||
success := types.MessageReceipt{
|
|
||||||
ExitCode: 0,
|
|
||||||
Return: []byte{},
|
|
||||||
}
|
|
||||||
for mcid, call := range pchapi.waitingCalls {
|
|
||||||
delete(pchapi.waitingCalls, mcid)
|
|
||||||
call.response <- success
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (pchapi *mockPaychAPI) MpoolPushMessage(ctx context.Context, msg *types.Message) (*types.SignedMessage, error) {
|
|
||||||
pchapi.lk.Lock()
|
|
||||||
defer pchapi.lk.Unlock()
|
|
||||||
|
|
||||||
smsg := &types.SignedMessage{Message: *msg}
|
|
||||||
pchapi.messages[smsg.Cid()] = smsg
|
|
||||||
return smsg, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (pchapi *mockPaychAPI) pushedMessages(c cid.Cid) *types.SignedMessage {
|
|
||||||
pchapi.lk.Lock()
|
|
||||||
defer pchapi.lk.Unlock()
|
|
||||||
|
|
||||||
return pchapi.messages[c]
|
|
||||||
}
|
|
||||||
|
|
||||||
func (pchapi *mockPaychAPI) pushedMessageCount() int {
|
|
||||||
pchapi.lk.Lock()
|
|
||||||
defer pchapi.lk.Unlock()
|
|
||||||
|
|
||||||
return len(pchapi.messages)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testChannelResponse(t *testing.T, ch address.Address) types.MessageReceipt {
|
func testChannelResponse(t *testing.T, ch address.Address) types.MessageReceipt {
|
||||||
createChannelRet := init_.ExecReturn{
|
createChannelRet := init_.ExecReturn{
|
||||||
IDAddress: ch,
|
IDAddress: ch,
|
||||||
@ -152,11 +48,10 @@ func TestPaychGetCreateChannelMsg(t *testing.T) {
|
|||||||
from := tutils.NewIDAddr(t, 101)
|
from := tutils.NewIDAddr(t, 101)
|
||||||
to := tutils.NewIDAddr(t, 102)
|
to := tutils.NewIDAddr(t, 102)
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
pchapi := newMockPaychAPI()
|
defer mock.close()
|
||||||
defer pchapi.close()
|
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, pchapi)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
amt := big.NewInt(10)
|
amt := big.NewInt(10)
|
||||||
@ -164,7 +59,7 @@ func TestPaychGetCreateChannelMsg(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, address.Undef, ch)
|
require.Equal(t, address.Undef, ch)
|
||||||
|
|
||||||
pushedMsg := pchapi.pushedMessages(mcid)
|
pushedMsg := mock.pushedMessages(mcid)
|
||||||
require.Equal(t, from, pushedMsg.Message.From)
|
require.Equal(t, from, pushedMsg.Message.From)
|
||||||
require.Equal(t, builtin.InitActorAddr, pushedMsg.Message.To)
|
require.Equal(t, builtin.InitActorAddr, pushedMsg.Message.To)
|
||||||
require.Equal(t, amt, pushedMsg.Message.Value)
|
require.Equal(t, amt, pushedMsg.Message.Value)
|
||||||
@ -180,11 +75,10 @@ func TestPaychGetCreateChannelThenAddFunds(t *testing.T) {
|
|||||||
from := tutils.NewIDAddr(t, 101)
|
from := tutils.NewIDAddr(t, 101)
|
||||||
to := tutils.NewIDAddr(t, 102)
|
to := tutils.NewIDAddr(t, 102)
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
pchapi := newMockPaychAPI()
|
defer mock.close()
|
||||||
defer pchapi.close()
|
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, pchapi)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Send create message for a channel with value 10
|
// Send create message for a channel with value 10
|
||||||
@ -234,7 +128,7 @@ func TestPaychGetCreateChannelThenAddFunds(t *testing.T) {
|
|||||||
require.Nil(t, ci.CreateMsg)
|
require.Nil(t, ci.CreateMsg)
|
||||||
|
|
||||||
// Trigger add funds confirmation
|
// Trigger add funds confirmation
|
||||||
pchapi.receiveMsgResponse(addFundsMsgCid, types.MessageReceipt{ExitCode: 0})
|
mock.receiveMsgResponse(addFundsMsgCid, types.MessageReceipt{ExitCode: 0})
|
||||||
|
|
||||||
// Wait for add funds confirmation to be processed by manager
|
// Wait for add funds confirmation to be processed by manager
|
||||||
_, err = mgr.GetPaychWaitReady(ctx, addFundsMsgCid)
|
_, err = mgr.GetPaychWaitReady(ctx, addFundsMsgCid)
|
||||||
@ -255,7 +149,7 @@ func TestPaychGetCreateChannelThenAddFunds(t *testing.T) {
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
// 3. Send create channel response
|
// 3. Send create channel response
|
||||||
pchapi.receiveMsgResponse(createMsgCid, response)
|
mock.receiveMsgResponse(createMsgCid, response)
|
||||||
|
|
||||||
<-done
|
<-done
|
||||||
}
|
}
|
||||||
@ -270,11 +164,10 @@ func TestPaychGetCreateChannelWithErrorThenCreateAgain(t *testing.T) {
|
|||||||
from := tutils.NewIDAddr(t, 101)
|
from := tutils.NewIDAddr(t, 101)
|
||||||
to := tutils.NewIDAddr(t, 102)
|
to := tutils.NewIDAddr(t, 102)
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
pchapi := newMockPaychAPI()
|
defer mock.close()
|
||||||
defer pchapi.close()
|
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, pchapi)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Send create message for a channel
|
// Send create message for a channel
|
||||||
@ -304,7 +197,7 @@ func TestPaychGetCreateChannelWithErrorThenCreateAgain(t *testing.T) {
|
|||||||
// 4. Send a success response
|
// 4. Send a success response
|
||||||
ch := tutils.NewIDAddr(t, 100)
|
ch := tutils.NewIDAddr(t, 100)
|
||||||
successResponse := testChannelResponse(t, ch)
|
successResponse := testChannelResponse(t, ch)
|
||||||
pchapi.receiveMsgResponse(mcid2, successResponse)
|
mock.receiveMsgResponse(mcid2, successResponse)
|
||||||
|
|
||||||
_, err = mgr.GetPaychWaitReady(ctx, mcid2)
|
_, err = mgr.GetPaychWaitReady(ctx, mcid2)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@ -321,7 +214,7 @@ func TestPaychGetCreateChannelWithErrorThenCreateAgain(t *testing.T) {
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
// 3. Send error response to first channel create
|
// 3. Send error response to first channel create
|
||||||
pchapi.receiveMsgResponse(mcid1, errResponse)
|
mock.receiveMsgResponse(mcid1, errResponse)
|
||||||
|
|
||||||
<-done
|
<-done
|
||||||
}
|
}
|
||||||
@ -336,11 +229,10 @@ func TestPaychGetRecoverAfterError(t *testing.T) {
|
|||||||
from := tutils.NewIDAddr(t, 101)
|
from := tutils.NewIDAddr(t, 101)
|
||||||
to := tutils.NewIDAddr(t, 102)
|
to := tutils.NewIDAddr(t, 102)
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
pchapi := newMockPaychAPI()
|
defer mock.close()
|
||||||
defer pchapi.close()
|
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, pchapi)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Send create message for a channel
|
// Send create message for a channel
|
||||||
@ -349,7 +241,7 @@ func TestPaychGetRecoverAfterError(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Send error create channel response
|
// Send error create channel response
|
||||||
pchapi.receiveMsgResponse(mcid, types.MessageReceipt{
|
mock.receiveMsgResponse(mcid, types.MessageReceipt{
|
||||||
ExitCode: 1, // error
|
ExitCode: 1, // error
|
||||||
Return: []byte{},
|
Return: []byte{},
|
||||||
})
|
})
|
||||||
@ -361,7 +253,7 @@ func TestPaychGetRecoverAfterError(t *testing.T) {
|
|||||||
|
|
||||||
// Send success create channel response
|
// Send success create channel response
|
||||||
response := testChannelResponse(t, ch)
|
response := testChannelResponse(t, ch)
|
||||||
pchapi.receiveMsgResponse(mcid2, response)
|
mock.receiveMsgResponse(mcid2, response)
|
||||||
|
|
||||||
_, err = mgr.GetPaychWaitReady(ctx, mcid2)
|
_, err = mgr.GetPaychWaitReady(ctx, mcid2)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@ -389,11 +281,10 @@ func TestPaychGetRecoverAfterAddFundsError(t *testing.T) {
|
|||||||
from := tutils.NewIDAddr(t, 101)
|
from := tutils.NewIDAddr(t, 101)
|
||||||
to := tutils.NewIDAddr(t, 102)
|
to := tutils.NewIDAddr(t, 102)
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
pchapi := newMockPaychAPI()
|
defer mock.close()
|
||||||
defer pchapi.close()
|
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, pchapi)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Send create message for a channel
|
// Send create message for a channel
|
||||||
@ -403,7 +294,7 @@ func TestPaychGetRecoverAfterAddFundsError(t *testing.T) {
|
|||||||
|
|
||||||
// Send success create channel response
|
// Send success create channel response
|
||||||
response := testChannelResponse(t, ch)
|
response := testChannelResponse(t, ch)
|
||||||
pchapi.receiveMsgResponse(mcid1, response)
|
mock.receiveMsgResponse(mcid1, response)
|
||||||
|
|
||||||
// Send add funds message for channel
|
// Send add funds message for channel
|
||||||
amt2 := big.NewInt(5)
|
amt2 := big.NewInt(5)
|
||||||
@ -411,7 +302,7 @@ func TestPaychGetRecoverAfterAddFundsError(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Send error add funds response
|
// Send error add funds response
|
||||||
pchapi.receiveMsgResponse(mcid2, types.MessageReceipt{
|
mock.receiveMsgResponse(mcid2, types.MessageReceipt{
|
||||||
ExitCode: 1, // error
|
ExitCode: 1, // error
|
||||||
Return: []byte{},
|
Return: []byte{},
|
||||||
})
|
})
|
||||||
@ -438,7 +329,7 @@ func TestPaychGetRecoverAfterAddFundsError(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Send success add funds response
|
// Send success add funds response
|
||||||
pchapi.receiveMsgResponse(mcid3, types.MessageReceipt{
|
mock.receiveMsgResponse(mcid3, types.MessageReceipt{
|
||||||
ExitCode: 0,
|
ExitCode: 0,
|
||||||
Return: []byte{},
|
Return: []byte{},
|
||||||
})
|
})
|
||||||
@ -472,10 +363,9 @@ func TestPaychGetRestartAfterCreateChannelMsg(t *testing.T) {
|
|||||||
from := tutils.NewIDAddr(t, 101)
|
from := tutils.NewIDAddr(t, 101)
|
||||||
to := tutils.NewIDAddr(t, 102)
|
to := tutils.NewIDAddr(t, 102)
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
pchapi := newMockPaychAPI()
|
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, pchapi)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Send create message for a channel with value 10
|
// Send create message for a channel with value 10
|
||||||
@ -484,14 +374,13 @@ func TestPaychGetRestartAfterCreateChannelMsg(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Simulate shutting down system
|
// Simulate shutting down system
|
||||||
pchapi.close()
|
mock.close()
|
||||||
|
|
||||||
// Create a new manager with the same datastore
|
// Create a new manager with the same datastore
|
||||||
sm2 := newMockStateManager()
|
mock2 := newMockManagerAPI()
|
||||||
pchapi2 := newMockPaychAPI()
|
defer mock2.close()
|
||||||
defer pchapi2.close()
|
|
||||||
|
|
||||||
mgr2, err := newManager(sm2, store, pchapi2)
|
mgr2, err := newManager(store, mock2)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Should have no channels yet (message sent but channel not created)
|
// Should have no channels yet (message sent but channel not created)
|
||||||
@ -537,7 +426,7 @@ func TestPaychGetRestartAfterCreateChannelMsg(t *testing.T) {
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
// 3. Send create channel response
|
// 3. Send create channel response
|
||||||
pchapi2.receiveMsgResponse(createMsgCid, response)
|
mock2.receiveMsgResponse(createMsgCid, response)
|
||||||
|
|
||||||
<-done
|
<-done
|
||||||
}
|
}
|
||||||
@ -553,10 +442,9 @@ func TestPaychGetRestartAfterAddFundsMsg(t *testing.T) {
|
|||||||
from := tutils.NewIDAddr(t, 101)
|
from := tutils.NewIDAddr(t, 101)
|
||||||
to := tutils.NewIDAddr(t, 102)
|
to := tutils.NewIDAddr(t, 102)
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
pchapi := newMockPaychAPI()
|
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, pchapi)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Send create message for a channel
|
// Send create message for a channel
|
||||||
@ -566,7 +454,7 @@ func TestPaychGetRestartAfterAddFundsMsg(t *testing.T) {
|
|||||||
|
|
||||||
// Send success create channel response
|
// Send success create channel response
|
||||||
response := testChannelResponse(t, ch)
|
response := testChannelResponse(t, ch)
|
||||||
pchapi.receiveMsgResponse(mcid1, response)
|
mock.receiveMsgResponse(mcid1, response)
|
||||||
|
|
||||||
// Send add funds message for channel
|
// Send add funds message for channel
|
||||||
amt2 := big.NewInt(5)
|
amt2 := big.NewInt(5)
|
||||||
@ -574,18 +462,17 @@ func TestPaychGetRestartAfterAddFundsMsg(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Simulate shutting down system
|
// Simulate shutting down system
|
||||||
pchapi.close()
|
mock.close()
|
||||||
|
|
||||||
// Create a new manager with the same datastore
|
// Create a new manager with the same datastore
|
||||||
sm2 := newMockStateManager()
|
mock2 := newMockManagerAPI()
|
||||||
pchapi2 := newMockPaychAPI()
|
defer mock2.close()
|
||||||
defer pchapi2.close()
|
|
||||||
|
|
||||||
mgr2, err := newManager(sm2, store, pchapi2)
|
mgr2, err := newManager(store, mock2)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Send success add funds response
|
// Send success add funds response
|
||||||
pchapi2.receiveMsgResponse(mcid2, types.MessageReceipt{
|
mock2.receiveMsgResponse(mcid2, types.MessageReceipt{
|
||||||
ExitCode: 0,
|
ExitCode: 0,
|
||||||
Return: []byte{},
|
Return: []byte{},
|
||||||
})
|
})
|
||||||
@ -617,11 +504,10 @@ func TestPaychGetWait(t *testing.T) {
|
|||||||
from := tutils.NewIDAddr(t, 101)
|
from := tutils.NewIDAddr(t, 101)
|
||||||
to := tutils.NewIDAddr(t, 102)
|
to := tutils.NewIDAddr(t, 102)
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
pchapi := newMockPaychAPI()
|
defer mock.close()
|
||||||
defer pchapi.close()
|
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, pchapi)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// 1. Get
|
// 1. Get
|
||||||
@ -633,7 +519,7 @@ func TestPaychGetWait(t *testing.T) {
|
|||||||
go func() {
|
go func() {
|
||||||
// 3. Send response
|
// 3. Send response
|
||||||
response := testChannelResponse(t, expch)
|
response := testChannelResponse(t, expch)
|
||||||
pchapi.receiveMsgResponse(createMsgCid, response)
|
mock.receiveMsgResponse(createMsgCid, response)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// 2. Wait till ready
|
// 2. Wait till ready
|
||||||
@ -658,7 +544,7 @@ func TestPaychGetWait(t *testing.T) {
|
|||||||
ExitCode: 0,
|
ExitCode: 0,
|
||||||
Return: []byte{},
|
Return: []byte{},
|
||||||
}
|
}
|
||||||
pchapi.receiveMsgResponse(addFundsMsgCid, addFundsResponse)
|
mock.receiveMsgResponse(addFundsMsgCid, addFundsResponse)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// 5. Wait for add funds
|
// 5. Wait for add funds
|
||||||
@ -675,11 +561,10 @@ func TestPaychGetWaitErr(t *testing.T) {
|
|||||||
from := tutils.NewIDAddr(t, 101)
|
from := tutils.NewIDAddr(t, 101)
|
||||||
to := tutils.NewIDAddr(t, 102)
|
to := tutils.NewIDAddr(t, 102)
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
pchapi := newMockPaychAPI()
|
defer mock.close()
|
||||||
defer pchapi.close()
|
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, pchapi)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// 1. Create channel
|
// 1. Create channel
|
||||||
@ -709,7 +594,7 @@ func TestPaychGetWaitErr(t *testing.T) {
|
|||||||
ExitCode: 1, // error
|
ExitCode: 1, // error
|
||||||
Return: []byte{},
|
Return: []byte{},
|
||||||
}
|
}
|
||||||
pchapi.receiveMsgResponse(mcid, response)
|
mock.receiveMsgResponse(mcid, response)
|
||||||
|
|
||||||
<-done
|
<-done
|
||||||
}
|
}
|
||||||
@ -723,11 +608,10 @@ func TestPaychGetWaitCtx(t *testing.T) {
|
|||||||
from := tutils.NewIDAddr(t, 101)
|
from := tutils.NewIDAddr(t, 101)
|
||||||
to := tutils.NewIDAddr(t, 102)
|
to := tutils.NewIDAddr(t, 102)
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
pchapi := newMockPaychAPI()
|
defer mock.close()
|
||||||
defer pchapi.close()
|
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, pchapi)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
amt := big.NewInt(10)
|
amt := big.NewInt(10)
|
||||||
@ -754,11 +638,10 @@ func TestPaychGetMergeAddFunds(t *testing.T) {
|
|||||||
from := tutils.NewIDAddr(t, 101)
|
from := tutils.NewIDAddr(t, 101)
|
||||||
to := tutils.NewIDAddr(t, 102)
|
to := tutils.NewIDAddr(t, 102)
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
pchapi := newMockPaychAPI()
|
defer mock.close()
|
||||||
defer pchapi.close()
|
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, pchapi)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Send create message for a channel with value 10
|
// Send create message for a channel with value 10
|
||||||
@ -800,7 +683,7 @@ func TestPaychGetMergeAddFunds(t *testing.T) {
|
|||||||
|
|
||||||
// Send create channel response
|
// Send create channel response
|
||||||
response := testChannelResponse(t, ch)
|
response := testChannelResponse(t, ch)
|
||||||
pchapi.receiveMsgResponse(createMsgCid, response)
|
mock.receiveMsgResponse(createMsgCid, response)
|
||||||
|
|
||||||
// Wait for create channel response
|
// Wait for create channel response
|
||||||
chres, err := mgr.GetPaychWaitReady(ctx, createMsgCid)
|
chres, err := mgr.GetPaychWaitReady(ctx, createMsgCid)
|
||||||
@ -817,7 +700,7 @@ func TestPaychGetMergeAddFunds(t *testing.T) {
|
|||||||
require.Equal(t, addFundsMcid1, addFundsMcid2)
|
require.Equal(t, addFundsMcid1, addFundsMcid2)
|
||||||
|
|
||||||
// Send success add funds response
|
// Send success add funds response
|
||||||
pchapi.receiveMsgResponse(addFundsMcid1, types.MessageReceipt{
|
mock.receiveMsgResponse(addFundsMcid1, types.MessageReceipt{
|
||||||
ExitCode: 0,
|
ExitCode: 0,
|
||||||
Return: []byte{},
|
Return: []byte{},
|
||||||
})
|
})
|
||||||
@ -829,17 +712,17 @@ func TestPaychGetMergeAddFunds(t *testing.T) {
|
|||||||
|
|
||||||
// Make sure that one create channel message and one add funds message was
|
// Make sure that one create channel message and one add funds message was
|
||||||
// sent
|
// sent
|
||||||
require.Equal(t, 2, pchapi.pushedMessageCount())
|
require.Equal(t, 2, mock.pushedMessageCount())
|
||||||
|
|
||||||
// Check create message amount is correct
|
// Check create message amount is correct
|
||||||
createMsg := pchapi.pushedMessages(createMsgCid)
|
createMsg := mock.pushedMessages(createMsgCid)
|
||||||
require.Equal(t, from, createMsg.Message.From)
|
require.Equal(t, from, createMsg.Message.From)
|
||||||
require.Equal(t, builtin.InitActorAddr, createMsg.Message.To)
|
require.Equal(t, builtin.InitActorAddr, createMsg.Message.To)
|
||||||
require.Equal(t, createAmt, createMsg.Message.Value)
|
require.Equal(t, createAmt, createMsg.Message.Value)
|
||||||
|
|
||||||
// Check merged add funds amount is the sum of the individual
|
// Check merged add funds amount is the sum of the individual
|
||||||
// amounts
|
// amounts
|
||||||
addFundsMsg := pchapi.pushedMessages(addFundsMcid1)
|
addFundsMsg := mock.pushedMessages(addFundsMcid1)
|
||||||
require.Equal(t, from, addFundsMsg.Message.From)
|
require.Equal(t, from, addFundsMsg.Message.From)
|
||||||
require.Equal(t, ch, addFundsMsg.Message.To)
|
require.Equal(t, ch, addFundsMsg.Message.To)
|
||||||
require.Equal(t, types.BigAdd(addFundsAmt1, addFundsAmt2), addFundsMsg.Message.Value)
|
require.Equal(t, types.BigAdd(addFundsAmt1, addFundsAmt2), addFundsMsg.Message.Value)
|
||||||
@ -855,11 +738,10 @@ func TestPaychGetMergeAddFundsCtxCancelOne(t *testing.T) {
|
|||||||
from := tutils.NewIDAddr(t, 101)
|
from := tutils.NewIDAddr(t, 101)
|
||||||
to := tutils.NewIDAddr(t, 102)
|
to := tutils.NewIDAddr(t, 102)
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
pchapi := newMockPaychAPI()
|
defer mock.close()
|
||||||
defer pchapi.close()
|
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, pchapi)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Send create message for a channel with value 10
|
// Send create message for a channel with value 10
|
||||||
@ -899,7 +781,7 @@ func TestPaychGetMergeAddFundsCtxCancelOne(t *testing.T) {
|
|||||||
|
|
||||||
// Send create channel response
|
// Send create channel response
|
||||||
response := testChannelResponse(t, ch)
|
response := testChannelResponse(t, ch)
|
||||||
pchapi.receiveMsgResponse(createMsgCid, response)
|
mock.receiveMsgResponse(createMsgCid, response)
|
||||||
|
|
||||||
// Wait for create channel response
|
// Wait for create channel response
|
||||||
chres, err := mgr.GetPaychWaitReady(ctx, createMsgCid)
|
chres, err := mgr.GetPaychWaitReady(ctx, createMsgCid)
|
||||||
@ -914,7 +796,7 @@ func TestPaychGetMergeAddFundsCtxCancelOne(t *testing.T) {
|
|||||||
require.Equal(t, ch, addFundsCh2)
|
require.Equal(t, ch, addFundsCh2)
|
||||||
|
|
||||||
// Send success add funds response
|
// Send success add funds response
|
||||||
pchapi.receiveMsgResponse(addFundsMcid2, types.MessageReceipt{
|
mock.receiveMsgResponse(addFundsMcid2, types.MessageReceipt{
|
||||||
ExitCode: 0,
|
ExitCode: 0,
|
||||||
Return: []byte{},
|
Return: []byte{},
|
||||||
})
|
})
|
||||||
@ -926,17 +808,17 @@ func TestPaychGetMergeAddFundsCtxCancelOne(t *testing.T) {
|
|||||||
|
|
||||||
// Make sure that one create channel message and one add funds message was
|
// Make sure that one create channel message and one add funds message was
|
||||||
// sent
|
// sent
|
||||||
require.Equal(t, 2, pchapi.pushedMessageCount())
|
require.Equal(t, 2, mock.pushedMessageCount())
|
||||||
|
|
||||||
// Check create message amount is correct
|
// Check create message amount is correct
|
||||||
createMsg := pchapi.pushedMessages(createMsgCid)
|
createMsg := mock.pushedMessages(createMsgCid)
|
||||||
require.Equal(t, from, createMsg.Message.From)
|
require.Equal(t, from, createMsg.Message.From)
|
||||||
require.Equal(t, builtin.InitActorAddr, createMsg.Message.To)
|
require.Equal(t, builtin.InitActorAddr, createMsg.Message.To)
|
||||||
require.Equal(t, createAmt, createMsg.Message.Value)
|
require.Equal(t, createAmt, createMsg.Message.Value)
|
||||||
|
|
||||||
// Check merged add funds amount only includes the second add funds amount
|
// Check merged add funds amount only includes the second add funds amount
|
||||||
// (because first was cancelled)
|
// (because first was cancelled)
|
||||||
addFundsMsg := pchapi.pushedMessages(addFundsMcid2)
|
addFundsMsg := mock.pushedMessages(addFundsMcid2)
|
||||||
require.Equal(t, from, addFundsMsg.Message.From)
|
require.Equal(t, from, addFundsMsg.Message.From)
|
||||||
require.Equal(t, ch, addFundsMsg.Message.To)
|
require.Equal(t, ch, addFundsMsg.Message.To)
|
||||||
require.Equal(t, addFundsAmt2, addFundsMsg.Message.Value)
|
require.Equal(t, addFundsAmt2, addFundsMsg.Message.Value)
|
||||||
@ -952,11 +834,10 @@ func TestPaychGetMergeAddFundsCtxCancelAll(t *testing.T) {
|
|||||||
from := tutils.NewIDAddr(t, 101)
|
from := tutils.NewIDAddr(t, 101)
|
||||||
to := tutils.NewIDAddr(t, 102)
|
to := tutils.NewIDAddr(t, 102)
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
pchapi := newMockPaychAPI()
|
defer mock.close()
|
||||||
defer pchapi.close()
|
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, pchapi)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Send create message for a channel with value 10
|
// Send create message for a channel with value 10
|
||||||
@ -995,7 +876,7 @@ func TestPaychGetMergeAddFundsCtxCancelAll(t *testing.T) {
|
|||||||
|
|
||||||
// Send create channel response
|
// Send create channel response
|
||||||
response := testChannelResponse(t, ch)
|
response := testChannelResponse(t, ch)
|
||||||
pchapi.receiveMsgResponse(createMsgCid, response)
|
mock.receiveMsgResponse(createMsgCid, response)
|
||||||
|
|
||||||
// Wait for create channel response
|
// Wait for create channel response
|
||||||
chres, err := mgr.GetPaychWaitReady(ctx, createMsgCid)
|
chres, err := mgr.GetPaychWaitReady(ctx, createMsgCid)
|
||||||
@ -1009,10 +890,10 @@ func TestPaychGetMergeAddFundsCtxCancelAll(t *testing.T) {
|
|||||||
require.NotNil(t, addFundsErr2)
|
require.NotNil(t, addFundsErr2)
|
||||||
|
|
||||||
// Make sure that just the create channel message was sent
|
// Make sure that just the create channel message was sent
|
||||||
require.Equal(t, 1, pchapi.pushedMessageCount())
|
require.Equal(t, 1, mock.pushedMessageCount())
|
||||||
|
|
||||||
// Check create message amount is correct
|
// Check create message amount is correct
|
||||||
createMsg := pchapi.pushedMessages(createMsgCid)
|
createMsg := mock.pushedMessages(createMsgCid)
|
||||||
require.Equal(t, from, createMsg.Message.From)
|
require.Equal(t, from, createMsg.Message.From)
|
||||||
require.Equal(t, builtin.InitActorAddr, createMsg.Message.To)
|
require.Equal(t, builtin.InitActorAddr, createMsg.Message.To)
|
||||||
require.Equal(t, createAmt, createMsg.Message.Value)
|
require.Equal(t, createAmt, createMsg.Message.Value)
|
||||||
|
@ -22,11 +22,10 @@ func TestPaychSettle(t *testing.T) {
|
|||||||
from := tutils.NewIDAddr(t, 101)
|
from := tutils.NewIDAddr(t, 101)
|
||||||
to := tutils.NewIDAddr(t, 102)
|
to := tutils.NewIDAddr(t, 102)
|
||||||
|
|
||||||
sm := newMockStateManager()
|
mock := newMockManagerAPI()
|
||||||
pchapi := newMockPaychAPI()
|
defer mock.close()
|
||||||
defer pchapi.close()
|
|
||||||
|
|
||||||
mgr, err := newManager(sm, store, pchapi)
|
mgr, err := newManager(store, mock)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
amt := big.NewInt(10)
|
amt := big.NewInt(10)
|
||||||
@ -35,7 +34,7 @@ func TestPaychSettle(t *testing.T) {
|
|||||||
|
|
||||||
// Send channel create response
|
// Send channel create response
|
||||||
response := testChannelResponse(t, expch)
|
response := testChannelResponse(t, expch)
|
||||||
pchapi.receiveMsgResponse(mcid, response)
|
mock.receiveMsgResponse(mcid, response)
|
||||||
|
|
||||||
// Get the channel address
|
// Get the channel address
|
||||||
ch, err := mgr.GetPaychWaitReady(ctx, mcid)
|
ch, err := mgr.GetPaychWaitReady(ctx, mcid)
|
||||||
@ -56,7 +55,7 @@ func TestPaychSettle(t *testing.T) {
|
|||||||
|
|
||||||
// Send new channel create response
|
// Send new channel create response
|
||||||
response2 := testChannelResponse(t, expch2)
|
response2 := testChannelResponse(t, expch2)
|
||||||
pchapi.receiveMsgResponse(mcid2, response2)
|
mock.receiveMsgResponse(mcid2, response2)
|
||||||
|
|
||||||
// Make sure the new channel is different from the old channel
|
// Make sure the new channel is different from the old channel
|
||||||
ch2, err := mgr.GetPaychWaitReady(ctx, mcid2)
|
ch2, err := mgr.GetPaychWaitReady(ctx, mcid2)
|
||||||
|
@ -8,8 +8,6 @@ import (
|
|||||||
|
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/api"
|
|
||||||
|
|
||||||
"github.com/filecoin-project/specs-actors/actors/abi/big"
|
"github.com/filecoin-project/specs-actors/actors/abi/big"
|
||||||
|
|
||||||
"github.com/filecoin-project/specs-actors/actors/builtin"
|
"github.com/filecoin-project/specs-actors/actors/builtin"
|
||||||
@ -25,11 +23,6 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type paychApi interface {
|
|
||||||
StateWaitMsg(ctx context.Context, msg cid.Cid, confidence uint64) (*api.MsgLookup, error)
|
|
||||||
MpoolPushMessage(ctx context.Context, msg *types.Message) (*types.SignedMessage, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
// paychFundsRes is the response to a create channel or add funds request
|
// paychFundsRes is the response to a create channel or add funds request
|
||||||
type paychFundsRes struct {
|
type paychFundsRes struct {
|
||||||
channel address.Address
|
channel address.Address
|
||||||
|
@ -12,7 +12,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type stateAccessor struct {
|
type stateAccessor struct {
|
||||||
sm StateManagerApi
|
sm stateManagerAPI
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ca *stateAccessor) loadPaychState(ctx context.Context, ch address.Address) (*types.Actor, *paych.State, error) {
|
func (ca *stateAccessor) loadPaychState(ctx context.Context, ch address.Address) (*types.Actor, *paych.State, error) {
|
||||||
|
Loading…
Reference in New Issue
Block a user