feat: Add additional test annotations (#8272)
* Annotate api,proxy_util,blockstore_badger, policy tests
* Annotate splitstore: bsbadger / markset
* Annotate splitstore feature
* Annotate union/timed blockstore tests
* Annotate openrpc, diff_adt tests
* Annotate error,drand,events tests
* Annotate predicates_test
* Fix annotations
* Annotate tscache, gen tests
* Annotate fundmanager test
* Annotate repub and selection tests
* Annotate statetree_test
* Annotate forks_test
* Annotate searchwait_test.go
* Fix duplicated @@ symbols
* Annotate chain stmgr/store tests
* Annotate more (types) tests
* More tests annotated
* Annotate conformance chaos actor tests
* Annotate more integration tests
* Annotate journal system tests
* Annotate more tests.
* Annotate gas,head buffer behaviors
* Fix markset annotations
* doc: test annotations for the markets dagstore wrapper
* Annotate miner_api test in dagstore
* Annotate more test files
* Remove bad annotations from fsrepo
* Annotate wdpost system
* Remove bad annotations
* Renamce "conformance" to "chaos_actor" tests
* doc: stm annotations for blockheader & election proof tests
* Annotate remaining "A" tests
* annotate: stm for error_test
* memrepo_test.go
* Annotate "b" file tests
* message_test.go
* doc: stm annotate for fsrepo_test
* Annotate "c" file tests
* Annotate "D" test files
* message_test.go
* doc: stm annotate for chain, node/config & client
* docs: stm annotate node_test
* Annotate u,v,wl tests
* doc: stm annotations for various test files
* Annotate "T" test files
* doc: stm annotate for proxy_util_test & policy_test
* doc: stm annotate for various tests
* doc: final few stm annotations
* Add mempool unit tests
* Add two more memPool Add tests
* Update submodules
* Add check function tests
* Add stm annotations, refactor test helper
* Annotate api,proxy_util,blockstore_badger, policy tests
* Annotate splitstore: bsbadger / markset
solving merge conflicts
* Annotate splitstore feature
* Annotate union/timed blockstore tests
* Annotate openrpc, diff_adt tests
* Annotate error,drand,events tests
* Annotate predicates_test
* Fix annotations
* Annotate tscache, gen tests
* Annotate fundmanager test
* Annotate statetree_test
* Annotate forks_test
* Annotate searchwait_test.go
* Fix duplicated @@ symbols
* Annotate chain stmgr/store tests
* Annotate more (types) tests
* More tests annotated
* Annotate conformance chaos actor tests
* Annotate more integration tests
* Annotate journal system tests
* Annotate more tests.
* Annotate gas,head buffer behaviors
solve merge conflict
* Fix markset annotations
* Annotate miner_api test in dagstore
* Annotate more test files
* doc: test annotations for the markets dagstore wrapper
* Annotate wdpost system
* Renamce "conformance" to "chaos_actor" tests
* Annotate remaining "A" tests
* doc: stm annotations for blockheader & election proof tests
* annotate: stm for error_test
* Annotate "b" file tests
* memrepo_test.go
* Annotate "c" file tests
* message_test.go
* Annotate "D" test files
* doc: stm annotate for fsrepo_test
* Annotate u,v,wl tests
* message_test.go
* doc: stm annotate for chain, node/config & client
* docs: stm annotate node_test
* Annotate "T" test files
* doc: stm annotations for various test files
* Add mempool unit tests
solve merge conflict
* doc: stm annotate for proxy_util_test & policy_test
* doc: stm annotate for various tests
* doc: final few stm annotations
* Add two more memPool Add tests
* Update submodules
* Add check function tests
solve conflict
* Add stm annotations, refactor test helper
solve merge conflict
* Change CLI test kinds to "unit"
* Fix double merged test
* Fix ccupgrade_test merge
* Fix lint issues
* Add stm annotation to types_Test
* Test vectors submodule
* Add file annotation to burn_test
Co-authored-by: Nikola Divic <divicnikola@gmail.com>
Co-authored-by: TheMenko <themenkoprojects@gmail.com>
2022-03-16 17:37:34 +00:00
|
|
|
//stm: #unit
|
2021-01-08 15:28:38 +00:00
|
|
|
package storageadapter
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"context"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/ipfs/go-cid"
|
2021-08-06 02:23:29 +00:00
|
|
|
"github.com/raulk/clock"
|
2021-08-31 17:14:54 +00:00
|
|
|
"golang.org/x/xerrors"
|
2021-01-08 15:28:38 +00:00
|
|
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
2021-08-31 17:14:54 +00:00
|
|
|
"github.com/filecoin-project/go-address"
|
|
|
|
"github.com/filecoin-project/go-state-types/abi"
|
|
|
|
"github.com/filecoin-project/go-state-types/crypto"
|
|
|
|
"github.com/filecoin-project/go-state-types/exitcode"
|
|
|
|
market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market"
|
2021-01-08 15:28:38 +00:00
|
|
|
tutils "github.com/filecoin-project/specs-actors/v2/support/testing"
|
|
|
|
|
2021-08-31 17:14:54 +00:00
|
|
|
"github.com/filecoin-project/lotus/api"
|
2021-08-06 02:23:29 +00:00
|
|
|
"github.com/filecoin-project/lotus/build"
|
2021-01-08 15:28:38 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/actors/builtin/market"
|
|
|
|
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
|
|
|
"github.com/filecoin-project/lotus/chain/types"
|
|
|
|
market0 "github.com/filecoin-project/specs-actors/actors/builtin/market"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestDealPublisher(t *testing.T) {
|
feat: Add additional test annotations (#8272)
* Annotate api,proxy_util,blockstore_badger, policy tests
* Annotate splitstore: bsbadger / markset
* Annotate splitstore feature
* Annotate union/timed blockstore tests
* Annotate openrpc, diff_adt tests
* Annotate error,drand,events tests
* Annotate predicates_test
* Fix annotations
* Annotate tscache, gen tests
* Annotate fundmanager test
* Annotate repub and selection tests
* Annotate statetree_test
* Annotate forks_test
* Annotate searchwait_test.go
* Fix duplicated @@ symbols
* Annotate chain stmgr/store tests
* Annotate more (types) tests
* More tests annotated
* Annotate conformance chaos actor tests
* Annotate more integration tests
* Annotate journal system tests
* Annotate more tests.
* Annotate gas,head buffer behaviors
* Fix markset annotations
* doc: test annotations for the markets dagstore wrapper
* Annotate miner_api test in dagstore
* Annotate more test files
* Remove bad annotations from fsrepo
* Annotate wdpost system
* Remove bad annotations
* Renamce "conformance" to "chaos_actor" tests
* doc: stm annotations for blockheader & election proof tests
* Annotate remaining "A" tests
* annotate: stm for error_test
* memrepo_test.go
* Annotate "b" file tests
* message_test.go
* doc: stm annotate for fsrepo_test
* Annotate "c" file tests
* Annotate "D" test files
* message_test.go
* doc: stm annotate for chain, node/config & client
* docs: stm annotate node_test
* Annotate u,v,wl tests
* doc: stm annotations for various test files
* Annotate "T" test files
* doc: stm annotate for proxy_util_test & policy_test
* doc: stm annotate for various tests
* doc: final few stm annotations
* Add mempool unit tests
* Add two more memPool Add tests
* Update submodules
* Add check function tests
* Add stm annotations, refactor test helper
* Annotate api,proxy_util,blockstore_badger, policy tests
* Annotate splitstore: bsbadger / markset
solving merge conflicts
* Annotate splitstore feature
* Annotate union/timed blockstore tests
* Annotate openrpc, diff_adt tests
* Annotate error,drand,events tests
* Annotate predicates_test
* Fix annotations
* Annotate tscache, gen tests
* Annotate fundmanager test
* Annotate statetree_test
* Annotate forks_test
* Annotate searchwait_test.go
* Fix duplicated @@ symbols
* Annotate chain stmgr/store tests
* Annotate more (types) tests
* More tests annotated
* Annotate conformance chaos actor tests
* Annotate more integration tests
* Annotate journal system tests
* Annotate more tests.
* Annotate gas,head buffer behaviors
solve merge conflict
* Fix markset annotations
* Annotate miner_api test in dagstore
* Annotate more test files
* doc: test annotations for the markets dagstore wrapper
* Annotate wdpost system
* Renamce "conformance" to "chaos_actor" tests
* Annotate remaining "A" tests
* doc: stm annotations for blockheader & election proof tests
* annotate: stm for error_test
* Annotate "b" file tests
* memrepo_test.go
* Annotate "c" file tests
* message_test.go
* Annotate "D" test files
* doc: stm annotate for fsrepo_test
* Annotate u,v,wl tests
* message_test.go
* doc: stm annotate for chain, node/config & client
* docs: stm annotate node_test
* Annotate "T" test files
* doc: stm annotations for various test files
* Add mempool unit tests
solve merge conflict
* doc: stm annotate for proxy_util_test & policy_test
* doc: stm annotate for various tests
* doc: final few stm annotations
* Add two more memPool Add tests
* Update submodules
* Add check function tests
solve conflict
* Add stm annotations, refactor test helper
solve merge conflict
* Change CLI test kinds to "unit"
* Fix double merged test
* Fix ccupgrade_test merge
* Fix lint issues
* Add stm annotation to types_Test
* Test vectors submodule
* Add file annotation to burn_test
Co-authored-by: Nikola Divic <divicnikola@gmail.com>
Co-authored-by: TheMenko <themenkoprojects@gmail.com>
2022-03-16 17:37:34 +00:00
|
|
|
//stm: @MARKET_DEAL_PUBLISHER_PUBLISH_001, @MARKET_DEAL_PUBLISHER_GET_PENDING_DEALS_001
|
2021-08-06 02:23:29 +00:00
|
|
|
oldClock := build.Clock
|
|
|
|
t.Cleanup(func() { build.Clock = oldClock })
|
|
|
|
mc := clock.NewMock()
|
|
|
|
build.Clock = mc
|
|
|
|
|
2021-01-08 15:28:38 +00:00
|
|
|
testCases := []struct {
|
2021-02-02 09:22:12 +00:00
|
|
|
name string
|
|
|
|
publishPeriod time.Duration
|
|
|
|
maxDealsPerMsg uint64
|
|
|
|
dealCountWithinPublishPeriod int
|
|
|
|
ctxCancelledWithinPublishPeriod int
|
|
|
|
expiredDeals int
|
|
|
|
dealCountAfterPublishPeriod int
|
|
|
|
expectedDealsPerMsg []int
|
2021-08-31 17:14:54 +00:00
|
|
|
failOne bool
|
2021-01-08 15:28:38 +00:00
|
|
|
}{{
|
|
|
|
name: "publish one deal within publish period",
|
|
|
|
publishPeriod: 10 * time.Millisecond,
|
|
|
|
maxDealsPerMsg: 5,
|
|
|
|
dealCountWithinPublishPeriod: 1,
|
|
|
|
dealCountAfterPublishPeriod: 0,
|
|
|
|
expectedDealsPerMsg: []int{1},
|
|
|
|
}, {
|
|
|
|
name: "publish two deals within publish period",
|
|
|
|
publishPeriod: 10 * time.Millisecond,
|
|
|
|
maxDealsPerMsg: 5,
|
|
|
|
dealCountWithinPublishPeriod: 2,
|
|
|
|
dealCountAfterPublishPeriod: 0,
|
|
|
|
expectedDealsPerMsg: []int{2},
|
|
|
|
}, {
|
|
|
|
name: "publish one deal within publish period, and one after",
|
|
|
|
publishPeriod: 10 * time.Millisecond,
|
|
|
|
maxDealsPerMsg: 5,
|
|
|
|
dealCountWithinPublishPeriod: 1,
|
|
|
|
dealCountAfterPublishPeriod: 1,
|
|
|
|
expectedDealsPerMsg: []int{1, 1},
|
|
|
|
}, {
|
|
|
|
name: "publish deals that exceed max deals per message within publish period, and one after",
|
|
|
|
publishPeriod: 10 * time.Millisecond,
|
|
|
|
maxDealsPerMsg: 2,
|
|
|
|
dealCountWithinPublishPeriod: 3,
|
|
|
|
dealCountAfterPublishPeriod: 1,
|
|
|
|
expectedDealsPerMsg: []int{2, 1, 1},
|
2021-02-02 09:22:12 +00:00
|
|
|
}, {
|
|
|
|
name: "ignore deals with cancelled context",
|
|
|
|
publishPeriod: 10 * time.Millisecond,
|
|
|
|
maxDealsPerMsg: 5,
|
|
|
|
dealCountWithinPublishPeriod: 2,
|
|
|
|
ctxCancelledWithinPublishPeriod: 2,
|
|
|
|
dealCountAfterPublishPeriod: 1,
|
|
|
|
expectedDealsPerMsg: []int{2, 1},
|
2021-01-08 15:28:38 +00:00
|
|
|
}, {
|
|
|
|
name: "ignore expired deals",
|
|
|
|
publishPeriod: 10 * time.Millisecond,
|
|
|
|
maxDealsPerMsg: 5,
|
|
|
|
dealCountWithinPublishPeriod: 2,
|
2021-02-02 09:22:12 +00:00
|
|
|
expiredDeals: 2,
|
2021-01-08 15:28:38 +00:00
|
|
|
dealCountAfterPublishPeriod: 1,
|
|
|
|
expectedDealsPerMsg: []int{2, 1},
|
2021-02-01 09:23:05 +00:00
|
|
|
}, {
|
2021-02-02 09:22:12 +00:00
|
|
|
name: "zero config",
|
|
|
|
publishPeriod: 0,
|
|
|
|
maxDealsPerMsg: 0,
|
|
|
|
dealCountWithinPublishPeriod: 2,
|
|
|
|
ctxCancelledWithinPublishPeriod: 0,
|
|
|
|
dealCountAfterPublishPeriod: 2,
|
|
|
|
expectedDealsPerMsg: []int{1, 1, 1, 1},
|
2021-08-31 17:14:54 +00:00
|
|
|
}, {
|
|
|
|
name: "one deal failing doesn't fail the entire batch",
|
|
|
|
publishPeriod: 10 * time.Millisecond,
|
|
|
|
maxDealsPerMsg: 5,
|
|
|
|
dealCountWithinPublishPeriod: 2,
|
|
|
|
dealCountAfterPublishPeriod: 0,
|
|
|
|
failOne: true,
|
|
|
|
expectedDealsPerMsg: []int{1},
|
2021-01-08 15:28:38 +00:00
|
|
|
}}
|
|
|
|
|
|
|
|
for _, tc := range testCases {
|
|
|
|
tc := tc
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
2021-08-06 02:23:29 +00:00
|
|
|
mc.Set(time.Now())
|
2021-02-05 16:09:57 +00:00
|
|
|
dpapi := newDPAPI(t)
|
2021-01-08 15:28:38 +00:00
|
|
|
|
|
|
|
// Create a deal publisher
|
2021-07-07 17:12:03 +00:00
|
|
|
dp := newDealPublisher(dpapi, nil, PublishMsgConfig{
|
2021-02-01 09:23:05 +00:00
|
|
|
Period: tc.publishPeriod,
|
2021-01-08 15:28:38 +00:00
|
|
|
MaxDealsPerMsg: tc.maxDealsPerMsg,
|
|
|
|
}, &api.MessageSendSpec{MaxFee: abi.NewTokenAmount(1)})
|
|
|
|
|
|
|
|
// Keep a record of the deals that were submitted to be published
|
|
|
|
var dealsToPublish []market.ClientDealProposal
|
|
|
|
|
|
|
|
// Publish deals within publish period
|
|
|
|
for i := 0; i < tc.dealCountWithinPublishPeriod; i++ {
|
2021-08-31 17:14:54 +00:00
|
|
|
if tc.failOne && i == 1 {
|
|
|
|
publishDeal(t, dp, i, false, false)
|
|
|
|
} else {
|
|
|
|
deal := publishDeal(t, dp, 0, false, false)
|
|
|
|
dealsToPublish = append(dealsToPublish, deal)
|
|
|
|
}
|
2021-02-02 09:22:12 +00:00
|
|
|
}
|
|
|
|
for i := 0; i < tc.ctxCancelledWithinPublishPeriod; i++ {
|
2021-08-31 17:14:54 +00:00
|
|
|
publishDeal(t, dp, 0, true, false)
|
2021-01-08 15:28:38 +00:00
|
|
|
}
|
2021-02-02 09:22:12 +00:00
|
|
|
for i := 0; i < tc.expiredDeals; i++ {
|
2021-08-31 17:14:54 +00:00
|
|
|
publishDeal(t, dp, 0, false, true)
|
2021-01-08 15:28:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Wait until publish period has elapsed
|
2021-08-06 02:23:29 +00:00
|
|
|
if tc.publishPeriod > 0 {
|
|
|
|
// If we expect deals to get stuck in the queue, wait until that happens
|
|
|
|
if tc.maxDealsPerMsg != 0 && tc.dealCountWithinPublishPeriod%int(tc.maxDealsPerMsg) != 0 {
|
|
|
|
require.Eventually(t, func() bool {
|
|
|
|
dp.lk.Lock()
|
|
|
|
defer dp.lk.Unlock()
|
|
|
|
return !dp.publishPeriodStart.IsZero()
|
|
|
|
}, time.Second, time.Millisecond, "failed to queue deals")
|
|
|
|
}
|
|
|
|
|
|
|
|
// Then wait to send
|
|
|
|
require.Eventually(t, func() bool {
|
|
|
|
dp.lk.Lock()
|
|
|
|
defer dp.lk.Unlock()
|
|
|
|
|
|
|
|
// Advance if necessary.
|
|
|
|
if mc.Since(dp.publishPeriodStart) <= tc.publishPeriod {
|
|
|
|
dp.lk.Unlock()
|
|
|
|
mc.Set(dp.publishPeriodStart.Add(tc.publishPeriod + 1))
|
|
|
|
dp.lk.Lock()
|
|
|
|
}
|
|
|
|
|
|
|
|
return len(dp.pending) == 0
|
|
|
|
}, time.Second, time.Millisecond, "failed to send pending messages")
|
|
|
|
}
|
2021-01-08 15:28:38 +00:00
|
|
|
|
|
|
|
// Publish deals after publish period
|
|
|
|
for i := 0; i < tc.dealCountAfterPublishPeriod; i++ {
|
2021-08-31 17:14:54 +00:00
|
|
|
deal := publishDeal(t, dp, 0, false, false)
|
2021-02-05 16:09:57 +00:00
|
|
|
dealsToPublish = append(dealsToPublish, deal)
|
2021-01-08 15:28:38 +00:00
|
|
|
}
|
|
|
|
|
2021-08-06 02:23:29 +00:00
|
|
|
if tc.publishPeriod > 0 && tc.dealCountAfterPublishPeriod > 0 {
|
|
|
|
require.Eventually(t, func() bool {
|
|
|
|
dp.lk.Lock()
|
|
|
|
defer dp.lk.Unlock()
|
|
|
|
if mc.Since(dp.publishPeriodStart) <= tc.publishPeriod {
|
|
|
|
dp.lk.Unlock()
|
|
|
|
mc.Set(dp.publishPeriodStart.Add(tc.publishPeriod + 1))
|
|
|
|
dp.lk.Lock()
|
|
|
|
}
|
|
|
|
return len(dp.pending) == 0
|
|
|
|
}, time.Second, time.Millisecond, "failed to send pending messages")
|
|
|
|
}
|
|
|
|
|
2021-02-05 16:09:57 +00:00
|
|
|
checkPublishedDeals(t, dpapi, dealsToPublish, tc.expectedDealsPerMsg)
|
2021-01-08 15:28:38 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-05 16:09:57 +00:00
|
|
|
func TestForcePublish(t *testing.T) {
|
feat: Add additional test annotations (#8272)
* Annotate api,proxy_util,blockstore_badger, policy tests
* Annotate splitstore: bsbadger / markset
* Annotate splitstore feature
* Annotate union/timed blockstore tests
* Annotate openrpc, diff_adt tests
* Annotate error,drand,events tests
* Annotate predicates_test
* Fix annotations
* Annotate tscache, gen tests
* Annotate fundmanager test
* Annotate repub and selection tests
* Annotate statetree_test
* Annotate forks_test
* Annotate searchwait_test.go
* Fix duplicated @@ symbols
* Annotate chain stmgr/store tests
* Annotate more (types) tests
* More tests annotated
* Annotate conformance chaos actor tests
* Annotate more integration tests
* Annotate journal system tests
* Annotate more tests.
* Annotate gas,head buffer behaviors
* Fix markset annotations
* doc: test annotations for the markets dagstore wrapper
* Annotate miner_api test in dagstore
* Annotate more test files
* Remove bad annotations from fsrepo
* Annotate wdpost system
* Remove bad annotations
* Renamce "conformance" to "chaos_actor" tests
* doc: stm annotations for blockheader & election proof tests
* Annotate remaining "A" tests
* annotate: stm for error_test
* memrepo_test.go
* Annotate "b" file tests
* message_test.go
* doc: stm annotate for fsrepo_test
* Annotate "c" file tests
* Annotate "D" test files
* message_test.go
* doc: stm annotate for chain, node/config & client
* docs: stm annotate node_test
* Annotate u,v,wl tests
* doc: stm annotations for various test files
* Annotate "T" test files
* doc: stm annotate for proxy_util_test & policy_test
* doc: stm annotate for various tests
* doc: final few stm annotations
* Add mempool unit tests
* Add two more memPool Add tests
* Update submodules
* Add check function tests
* Add stm annotations, refactor test helper
* Annotate api,proxy_util,blockstore_badger, policy tests
* Annotate splitstore: bsbadger / markset
solving merge conflicts
* Annotate splitstore feature
* Annotate union/timed blockstore tests
* Annotate openrpc, diff_adt tests
* Annotate error,drand,events tests
* Annotate predicates_test
* Fix annotations
* Annotate tscache, gen tests
* Annotate fundmanager test
* Annotate statetree_test
* Annotate forks_test
* Annotate searchwait_test.go
* Fix duplicated @@ symbols
* Annotate chain stmgr/store tests
* Annotate more (types) tests
* More tests annotated
* Annotate conformance chaos actor tests
* Annotate more integration tests
* Annotate journal system tests
* Annotate more tests.
* Annotate gas,head buffer behaviors
solve merge conflict
* Fix markset annotations
* Annotate miner_api test in dagstore
* Annotate more test files
* doc: test annotations for the markets dagstore wrapper
* Annotate wdpost system
* Renamce "conformance" to "chaos_actor" tests
* Annotate remaining "A" tests
* doc: stm annotations for blockheader & election proof tests
* annotate: stm for error_test
* Annotate "b" file tests
* memrepo_test.go
* Annotate "c" file tests
* message_test.go
* Annotate "D" test files
* doc: stm annotate for fsrepo_test
* Annotate u,v,wl tests
* message_test.go
* doc: stm annotate for chain, node/config & client
* docs: stm annotate node_test
* Annotate "T" test files
* doc: stm annotations for various test files
* Add mempool unit tests
solve merge conflict
* doc: stm annotate for proxy_util_test & policy_test
* doc: stm annotate for various tests
* doc: final few stm annotations
* Add two more memPool Add tests
* Update submodules
* Add check function tests
solve conflict
* Add stm annotations, refactor test helper
solve merge conflict
* Change CLI test kinds to "unit"
* Fix double merged test
* Fix ccupgrade_test merge
* Fix lint issues
* Add stm annotation to types_Test
* Test vectors submodule
* Add file annotation to burn_test
Co-authored-by: Nikola Divic <divicnikola@gmail.com>
Co-authored-by: TheMenko <themenkoprojects@gmail.com>
2022-03-16 17:37:34 +00:00
|
|
|
//stm: @MARKET_DEAL_PUBLISHER_PUBLISH_001, @MARKET_DEAL_PUBLISHER_GET_PENDING_DEALS_001
|
|
|
|
//stm: @MARKET_DEAL_PUBLISHER_FORCE_PUBLISH_ALL_001
|
2021-02-05 16:09:57 +00:00
|
|
|
dpapi := newDPAPI(t)
|
|
|
|
|
|
|
|
// Create a deal publisher
|
2021-08-06 02:23:29 +00:00
|
|
|
start := build.Clock.Now()
|
2021-02-05 16:09:57 +00:00
|
|
|
publishPeriod := time.Hour
|
2021-07-07 17:12:03 +00:00
|
|
|
dp := newDealPublisher(dpapi, nil, PublishMsgConfig{
|
2021-02-05 16:09:57 +00:00
|
|
|
Period: publishPeriod,
|
|
|
|
MaxDealsPerMsg: 10,
|
|
|
|
}, &api.MessageSendSpec{MaxFee: abi.NewTokenAmount(1)})
|
|
|
|
|
|
|
|
// Queue three deals for publishing, one with a cancelled context
|
|
|
|
var dealsToPublish []market.ClientDealProposal
|
|
|
|
// 1. Regular deal
|
2021-08-31 17:14:54 +00:00
|
|
|
deal := publishDeal(t, dp, 0, false, false)
|
2021-02-05 16:09:57 +00:00
|
|
|
dealsToPublish = append(dealsToPublish, deal)
|
|
|
|
// 2. Deal with cancelled context
|
2021-08-31 17:14:54 +00:00
|
|
|
publishDeal(t, dp, 0, true, false)
|
2021-02-05 16:09:57 +00:00
|
|
|
// 3. Regular deal
|
2021-08-31 17:14:54 +00:00
|
|
|
deal = publishDeal(t, dp, 0, false, false)
|
2021-02-05 16:09:57 +00:00
|
|
|
dealsToPublish = append(dealsToPublish, deal)
|
|
|
|
|
|
|
|
// Allow a moment for them to be queued
|
2021-08-06 02:23:29 +00:00
|
|
|
build.Clock.Sleep(10 * time.Millisecond)
|
2021-02-05 16:09:57 +00:00
|
|
|
|
|
|
|
// Should be two deals in the pending deals list
|
|
|
|
// (deal with cancelled context is ignored)
|
|
|
|
pendingInfo := dp.PendingDeals()
|
2021-02-05 17:58:55 +00:00
|
|
|
require.Len(t, pendingInfo.Deals, 2)
|
|
|
|
require.Equal(t, publishPeriod, pendingInfo.PublishPeriod)
|
|
|
|
require.True(t, pendingInfo.PublishPeriodStart.After(start))
|
2021-08-06 02:23:29 +00:00
|
|
|
require.True(t, pendingInfo.PublishPeriodStart.Before(build.Clock.Now()))
|
2021-02-05 16:09:57 +00:00
|
|
|
|
|
|
|
// Force publish all pending deals
|
|
|
|
dp.ForcePublishPendingDeals()
|
|
|
|
|
|
|
|
// Should be no pending deals
|
|
|
|
pendingInfo = dp.PendingDeals()
|
2021-02-05 17:58:55 +00:00
|
|
|
require.Len(t, pendingInfo.Deals, 0)
|
2021-02-05 16:09:57 +00:00
|
|
|
|
|
|
|
// Make sure the expected deals were published
|
|
|
|
checkPublishedDeals(t, dpapi, dealsToPublish, []int{2})
|
|
|
|
}
|
|
|
|
|
2021-08-31 17:14:54 +00:00
|
|
|
func publishDeal(t *testing.T, dp *DealPublisher, invalid int, ctxCancelled bool, expired bool) market.ClientDealProposal {
|
2021-02-05 16:09:57 +00:00
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
|
t.Cleanup(cancel)
|
|
|
|
|
|
|
|
pctx := ctx
|
|
|
|
if ctxCancelled {
|
|
|
|
pctx, cancel = context.WithCancel(ctx)
|
|
|
|
cancel()
|
|
|
|
}
|
|
|
|
|
|
|
|
startEpoch := abi.ChainEpoch(20)
|
|
|
|
if expired {
|
|
|
|
startEpoch = abi.ChainEpoch(5)
|
|
|
|
}
|
|
|
|
deal := market.ClientDealProposal{
|
|
|
|
Proposal: market0.DealProposal{
|
|
|
|
PieceCID: generateCids(1)[0],
|
|
|
|
Client: getClientActor(t),
|
|
|
|
Provider: getProviderActor(t),
|
|
|
|
StartEpoch: startEpoch,
|
|
|
|
EndEpoch: abi.ChainEpoch(120),
|
2021-08-31 17:14:54 +00:00
|
|
|
PieceSize: abi.PaddedPieceSize(invalid), // pass invalid into StateCall below
|
2021-02-05 16:09:57 +00:00
|
|
|
},
|
|
|
|
ClientSignature: crypto.Signature{
|
|
|
|
Type: crypto.SigTypeSecp256k1,
|
|
|
|
Data: []byte("signature data"),
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
_, err := dp.Publish(pctx, deal)
|
2021-02-08 11:05:44 +00:00
|
|
|
|
|
|
|
// If the test has completed just bail out without checking for errors
|
|
|
|
if ctx.Err() != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-08-31 17:14:54 +00:00
|
|
|
if ctxCancelled || expired || invalid == 1 {
|
2021-02-05 16:09:57 +00:00
|
|
|
require.Error(t, err)
|
|
|
|
} else {
|
|
|
|
require.NoError(t, err)
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
return deal
|
|
|
|
}
|
|
|
|
|
|
|
|
func checkPublishedDeals(t *testing.T, dpapi *dpAPI, dealsToPublish []market.ClientDealProposal, expectedDealsPerMsg []int) {
|
|
|
|
// For each message that was expected to be sent
|
|
|
|
var publishedDeals []market.ClientDealProposal
|
|
|
|
for _, expectedDealsInMsg := range expectedDealsPerMsg {
|
|
|
|
// Should have called StateMinerInfo with the provider address
|
|
|
|
stateMinerInfoAddr := <-dpapi.stateMinerInfoCalls
|
|
|
|
require.Equal(t, getProviderActor(t), stateMinerInfoAddr)
|
|
|
|
|
|
|
|
// Check the fields of the message that was sent
|
|
|
|
msg := <-dpapi.pushedMsgs
|
|
|
|
require.Equal(t, getWorkerActor(t), msg.From)
|
|
|
|
require.Equal(t, market.Address, msg.To)
|
|
|
|
require.Equal(t, market.Methods.PublishStorageDeals, msg.Method)
|
|
|
|
|
|
|
|
// Check that the expected number of deals was included in the message
|
|
|
|
var params market2.PublishStorageDealsParams
|
|
|
|
err := params.UnmarshalCBOR(bytes.NewReader(msg.Params))
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Len(t, params.Deals, expectedDealsInMsg)
|
|
|
|
|
|
|
|
// Keep track of the deals that were sent
|
|
|
|
for _, d := range params.Deals {
|
|
|
|
publishedDeals = append(publishedDeals, d)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Verify that all deals that were submitted to be published were
|
|
|
|
// sent out (we do this by ensuring all the piece CIDs are present)
|
|
|
|
require.True(t, matchPieceCids(publishedDeals, dealsToPublish))
|
|
|
|
}
|
|
|
|
|
2021-01-08 15:28:38 +00:00
|
|
|
func matchPieceCids(sent []market.ClientDealProposal, exp []market.ClientDealProposal) bool {
|
|
|
|
cidsA := dealPieceCids(sent)
|
|
|
|
cidsB := dealPieceCids(exp)
|
|
|
|
|
|
|
|
if len(cidsA) != len(cidsB) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
s1 := cid.NewSet()
|
|
|
|
for _, c := range cidsA {
|
|
|
|
s1.Add(c)
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, c := range cidsB {
|
|
|
|
if !s1.Has(c) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func dealPieceCids(deals []market2.ClientDealProposal) []cid.Cid {
|
|
|
|
cids := make([]cid.Cid, 0, len(deals))
|
|
|
|
for _, dl := range deals {
|
|
|
|
cids = append(cids, dl.Proposal.PieceCID)
|
|
|
|
}
|
|
|
|
return cids
|
|
|
|
}
|
|
|
|
|
|
|
|
type dpAPI struct {
|
|
|
|
t *testing.T
|
|
|
|
worker address.Address
|
|
|
|
|
|
|
|
stateMinerInfoCalls chan address.Address
|
|
|
|
pushedMsgs chan *types.Message
|
|
|
|
}
|
|
|
|
|
2021-02-05 16:09:57 +00:00
|
|
|
func newDPAPI(t *testing.T) *dpAPI {
|
2021-01-08 15:28:38 +00:00
|
|
|
return &dpAPI{
|
|
|
|
t: t,
|
2021-02-05 16:09:57 +00:00
|
|
|
worker: getWorkerActor(t),
|
2021-01-08 15:28:38 +00:00
|
|
|
stateMinerInfoCalls: make(chan address.Address, 128),
|
|
|
|
pushedMsgs: make(chan *types.Message, 128),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-02 09:22:12 +00:00
|
|
|
func (d *dpAPI) ChainHead(ctx context.Context) (*types.TipSet, error) {
|
|
|
|
dummyCid, err := cid.Parse("bafkqaaa")
|
|
|
|
require.NoError(d.t, err)
|
|
|
|
return types.NewTipSet([]*types.BlockHeader{{
|
|
|
|
Miner: tutils.NewActorAddr(d.t, "miner"),
|
|
|
|
Height: abi.ChainEpoch(10),
|
|
|
|
ParentStateRoot: dummyCid,
|
|
|
|
Messages: dummyCid,
|
|
|
|
ParentMessageReceipts: dummyCid,
|
|
|
|
BlockSig: &crypto.Signature{Type: crypto.SigTypeBLS},
|
|
|
|
BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS},
|
|
|
|
}})
|
|
|
|
}
|
|
|
|
|
2021-01-08 15:28:38 +00:00
|
|
|
func (d *dpAPI) StateMinerInfo(ctx context.Context, address address.Address, key types.TipSetKey) (miner.MinerInfo, error) {
|
|
|
|
d.stateMinerInfoCalls <- address
|
|
|
|
return miner.MinerInfo{Worker: d.worker}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *dpAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec) (*types.SignedMessage, error) {
|
|
|
|
d.pushedMsgs <- msg
|
|
|
|
return &types.SignedMessage{Message: *msg}, nil
|
|
|
|
}
|
2021-02-05 16:09:57 +00:00
|
|
|
|
2021-07-07 17:12:03 +00:00
|
|
|
func (d *dpAPI) WalletBalance(ctx context.Context, a address.Address) (types.BigInt, error) {
|
|
|
|
panic("don't call me")
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *dpAPI) WalletHas(ctx context.Context, a address.Address) (bool, error) {
|
|
|
|
panic("don't call me")
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *dpAPI) StateAccountKey(ctx context.Context, a address.Address, key types.TipSetKey) (address.Address, error) {
|
|
|
|
panic("don't call me")
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *dpAPI) StateLookupID(ctx context.Context, a address.Address, key types.TipSetKey) (address.Address, error) {
|
|
|
|
panic("don't call me")
|
|
|
|
}
|
|
|
|
|
2021-08-31 11:56:25 +00:00
|
|
|
func (d *dpAPI) StateCall(ctx context.Context, message *types.Message, key types.TipSetKey) (*api.InvocResult, error) {
|
2021-08-31 17:14:54 +00:00
|
|
|
var p market2.PublishStorageDealsParams
|
|
|
|
if err := p.UnmarshalCBOR(bytes.NewReader(message.Params)); err != nil {
|
|
|
|
return nil, xerrors.Errorf("unmarshal market params: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
exit := exitcode.Ok
|
|
|
|
if p.Deals[0].Proposal.PieceSize == 1 {
|
|
|
|
exit = exitcode.ErrIllegalState
|
|
|
|
}
|
|
|
|
return &api.InvocResult{MsgRct: &types.MessageReceipt{ExitCode: exit}}, nil
|
2021-08-31 11:56:25 +00:00
|
|
|
}
|
|
|
|
|
2021-02-05 16:09:57 +00:00
|
|
|
func getClientActor(t *testing.T) address.Address {
|
|
|
|
return tutils.NewActorAddr(t, "client")
|
|
|
|
}
|
|
|
|
|
|
|
|
func getWorkerActor(t *testing.T) address.Address {
|
|
|
|
return tutils.NewActorAddr(t, "worker")
|
|
|
|
}
|
|
|
|
|
|
|
|
func getProviderActor(t *testing.T) address.Address {
|
|
|
|
return tutils.NewActorAddr(t, "provider")
|
|
|
|
}
|