2022-08-29 14:25:30 +00:00
// stm: #unit
2020-11-05 05:11:08 +00:00
package storageadapter
import (
"bytes"
"context"
"errors"
"fmt"
"math/rand"
"testing"
2021-01-08 15:28:38 +00:00
"time"
2020-11-05 05:11:08 +00:00
blocks "github.com/ipfs/go-block-format"
2022-06-14 15:00:51 +00:00
"github.com/ipfs/go-cid"
"github.com/stretchr/testify/require"
"golang.org/x/xerrors"
2020-11-05 05:11:08 +00:00
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
2022-06-14 15:00:51 +00:00
"github.com/filecoin-project/go-state-types/builtin"
markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market"
2022-09-06 15:49:29 +00:00
minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
2020-11-05 05:11:08 +00:00
"github.com/filecoin-project/go-state-types/cbor"
2022-06-14 15:00:51 +00:00
tutils "github.com/filecoin-project/specs-actors/v2/support/testing"
2020-11-05 05:11:08 +00:00
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/chain/actors/builtin/market"
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
"github.com/filecoin-project/lotus/chain/events"
test "github.com/filecoin-project/lotus/chain/events/state/mock"
"github.com/filecoin-project/lotus/chain/types"
2022-06-14 19:23:17 +00:00
pipeline "github.com/filecoin-project/lotus/storage/pipeline"
2020-11-05 05:11:08 +00:00
)
2020-11-20 16:30:17 +00:00
func TestOnDealSectorPreCommitted ( t * testing . T ) {
2022-04-20 21:34:28 +00:00
label , err := markettypes . NewLabelFromString ( "success" )
2022-03-12 18:07:35 +00:00
require . NoError ( t , err )
2020-11-05 05:11:08 +00:00
provider := address . TestAddress
ctx := context . Background ( )
publishCid := generateCids ( 1 ) [ 0 ]
sealedCid := generateCids ( 1 ) [ 0 ]
2020-11-10 00:30:47 +00:00
pieceCid := generateCids ( 1 ) [ 0 ]
2021-01-08 15:28:38 +00:00
dealID := abi . DealID ( rand . Uint64 ( ) )
2020-11-05 05:11:08 +00:00
sectorNumber := abi . SectorNumber ( rand . Uint64 ( ) )
2020-11-10 00:30:47 +00:00
proposal := market . DealProposal {
2021-01-08 15:28:38 +00:00
PieceCID : pieceCid ,
PieceSize : abi . PaddedPieceSize ( rand . Uint64 ( ) ) ,
Client : tutils . NewActorAddr ( t , "client" ) ,
Provider : tutils . NewActorAddr ( t , "provider" ) ,
StoragePricePerEpoch : abi . NewTokenAmount ( 1 ) ,
ProviderCollateral : abi . NewTokenAmount ( 1 ) ,
ClientCollateral : abi . NewTokenAmount ( 1 ) ,
2022-03-12 18:07:35 +00:00
Label : label ,
2020-11-10 00:30:47 +00:00
}
2020-11-05 05:11:08 +00:00
unfinishedDeal := & api . MarketDeal {
2020-11-10 00:30:47 +00:00
Proposal : proposal ,
2020-11-05 05:11:08 +00:00
State : market . DealState {
SectorStartEpoch : - 1 ,
LastUpdatedEpoch : 2 ,
} ,
}
2021-01-08 15:28:38 +00:00
activeDeal := & api . MarketDeal {
Proposal : proposal ,
State : market . DealState {
SectorStartEpoch : 1 ,
LastUpdatedEpoch : 2 ,
} ,
}
slashedDeal := & api . MarketDeal {
2020-11-10 00:30:47 +00:00
Proposal : proposal ,
2020-11-05 05:11:08 +00:00
State : market . DealState {
SectorStartEpoch : 1 ,
LastUpdatedEpoch : 2 ,
2021-01-08 15:28:38 +00:00
SlashEpoch : 2 ,
2020-11-05 05:11:08 +00:00
} ,
}
2020-11-30 14:16:13 +00:00
type testCase struct {
2022-06-14 19:23:17 +00:00
currentDealInfo pipeline . CurrentDealInfo
2021-01-08 15:28:38 +00:00
currentDealInfoErr error
currentDealInfoErr2 error
preCommitDiff * miner . PreCommitChanges
2020-11-20 16:30:17 +00:00
matchStates [ ] matchState
2020-11-30 14:16:13 +00:00
dealStartEpochTimeout bool
2020-11-20 16:30:17 +00:00
expectedCBCallCount uint64
expectedCBSectorNumber abi . SectorNumber
expectedCBIsActive bool
expectedCBError error
expectedError error
2020-11-30 14:16:13 +00:00
}
testCases := map [ string ] testCase {
2020-11-05 05:11:08 +00:00
"normal sequence" : {
2022-06-14 19:23:17 +00:00
currentDealInfo : pipeline . CurrentDealInfo {
2021-01-08 15:28:38 +00:00
DealID : dealID ,
MarketDeal : unfinishedDeal ,
2020-11-05 05:11:08 +00:00
} ,
matchStates : [ ] matchState {
{
2022-09-10 14:34:47 +00:00
msg : makeMessage ( t , provider , builtin . MethodsMiner . PreCommitSector , & minertypes . PreCommitSectorParams {
2020-11-05 05:11:08 +00:00
SectorNumber : sectorNumber ,
SealedCID : sealedCid ,
2021-01-08 15:28:38 +00:00
DealIDs : [ ] abi . DealID { dealID } ,
2020-11-05 05:11:08 +00:00
} ) ,
} ,
} ,
2020-11-20 16:30:17 +00:00
expectedCBCallCount : 1 ,
expectedCBIsActive : false ,
expectedCBSectorNumber : sectorNumber ,
2020-11-05 05:11:08 +00:00
} ,
2021-01-08 15:28:38 +00:00
"ignores unsuccessful pre-commit message" : {
2022-06-14 19:23:17 +00:00
currentDealInfo : pipeline . CurrentDealInfo {
2021-01-08 15:28:38 +00:00
DealID : dealID ,
MarketDeal : unfinishedDeal ,
2020-11-05 05:11:08 +00:00
} ,
matchStates : [ ] matchState {
{
2022-09-10 14:34:47 +00:00
msg : makeMessage ( t , provider , builtin . MethodsMiner . PreCommitSector , & minertypes . PreCommitSectorParams {
2020-11-05 05:11:08 +00:00
SectorNumber : sectorNumber ,
SealedCID : sealedCid ,
2021-01-08 15:28:38 +00:00
DealIDs : [ ] abi . DealID { dealID } ,
2020-11-05 05:11:08 +00:00
} ) ,
2021-01-08 15:28:38 +00:00
// non-zero exit code indicates unsuccessful pre-commit message
receipt : & types . MessageReceipt { ExitCode : 1 } ,
2020-11-05 05:11:08 +00:00
} ,
} ,
2021-01-08 15:28:38 +00:00
expectedCBCallCount : 0 ,
2020-11-05 05:11:08 +00:00
} ,
2021-01-08 15:28:38 +00:00
"deal already pre-committed" : {
2022-06-14 19:23:17 +00:00
currentDealInfo : pipeline . CurrentDealInfo {
2021-01-08 15:28:38 +00:00
DealID : dealID ,
MarketDeal : unfinishedDeal ,
2020-12-14 11:30:52 +00:00
} ,
2021-01-08 15:28:38 +00:00
preCommitDiff : & miner . PreCommitChanges {
2022-04-20 21:34:28 +00:00
Added : [ ] minertypes . SectorPreCommitOnChainInfo { {
Info : minertypes . SectorPreCommitInfo {
2020-12-14 11:30:52 +00:00
SectorNumber : sectorNumber ,
2021-01-08 15:28:38 +00:00
DealIDs : [ ] abi . DealID { dealID } ,
2020-12-14 11:30:52 +00:00
} ,
2021-01-08 15:28:38 +00:00
} } ,
2020-12-14 11:30:52 +00:00
} ,
2021-01-08 15:28:38 +00:00
expectedCBCallCount : 1 ,
expectedCBIsActive : false ,
expectedCBSectorNumber : sectorNumber ,
2020-12-14 11:30:52 +00:00
} ,
2021-01-08 15:28:38 +00:00
"error getting current deal info in check func" : {
currentDealInfoErr : errors . New ( "something went wrong" ) ,
2020-11-20 16:30:17 +00:00
expectedCBCallCount : 0 ,
2021-01-08 15:28:38 +00:00
expectedError : xerrors . Errorf ( "failed to set up called handler: failed to look up deal on chain: something went wrong" ) ,
2020-11-20 16:30:17 +00:00
} ,
2021-01-08 15:28:38 +00:00
"sector already active" : {
2022-06-14 19:23:17 +00:00
currentDealInfo : pipeline . CurrentDealInfo {
2021-01-08 15:28:38 +00:00
DealID : dealID ,
MarketDeal : activeDeal ,
2020-11-05 05:11:08 +00:00
} ,
2020-11-20 16:30:17 +00:00
expectedCBCallCount : 1 ,
expectedCBIsActive : true ,
} ,
2021-01-08 15:28:38 +00:00
"sector was slashed" : {
2022-06-14 19:23:17 +00:00
currentDealInfo : pipeline . CurrentDealInfo {
2021-01-08 15:28:38 +00:00
DealID : dealID ,
MarketDeal : slashedDeal ,
2022-06-16 09:12:33 +00:00
PublishMsgTipSet : types . EmptyTSK ,
2020-11-05 05:11:08 +00:00
} ,
2021-01-08 15:28:38 +00:00
expectedCBCallCount : 0 ,
expectedError : xerrors . Errorf ( "failed to set up called handler: deal %d was slashed at epoch %d" , dealID , slashedDeal . State . SlashEpoch ) ,
} ,
"error getting current deal info in called func" : {
2022-06-14 19:23:17 +00:00
currentDealInfo : pipeline . CurrentDealInfo {
2021-01-08 15:28:38 +00:00
DealID : dealID ,
MarketDeal : unfinishedDeal ,
} ,
currentDealInfoErr2 : errors . New ( "something went wrong" ) ,
2020-11-05 05:11:08 +00:00
matchStates : [ ] matchState {
{
2022-09-10 14:34:47 +00:00
msg : makeMessage ( t , provider , builtin . MethodsMiner . PreCommitSector , & minertypes . PreCommitSectorParams {
2020-11-05 05:11:08 +00:00
SectorNumber : sectorNumber ,
SealedCID : sealedCid ,
2021-01-08 15:28:38 +00:00
DealIDs : [ ] abi . DealID { dealID } ,
2020-11-05 05:11:08 +00:00
} ) ,
2020-11-20 16:30:17 +00:00
} ,
} ,
2021-01-08 15:28:38 +00:00
expectedCBCallCount : 1 ,
expectedCBError : errors . New ( "handling applied event: something went wrong" ) ,
2020-11-20 16:30:17 +00:00
} ,
2020-11-30 14:16:13 +00:00
"proposed deal epoch timeout" : {
2022-06-14 19:23:17 +00:00
currentDealInfo : pipeline . CurrentDealInfo {
2021-01-08 15:28:38 +00:00
DealID : dealID ,
MarketDeal : activeDeal ,
2020-11-30 14:16:13 +00:00
} ,
dealStartEpochTimeout : true ,
expectedCBCallCount : 1 ,
2021-01-08 15:28:38 +00:00
expectedCBError : xerrors . Errorf ( "handling applied event: deal with piece CID %s was not activated by proposed deal start epoch 0" , unfinishedDeal . Proposal . PieceCID ) ,
2020-11-30 14:16:13 +00:00
} ,
2020-11-20 16:30:17 +00:00
}
2020-11-30 14:16:13 +00:00
runTestCase := func ( testCase string , data testCase ) {
2020-11-20 16:30:17 +00:00
t . Run ( testCase , func ( t * testing . T ) {
checkTs , err := test . MockTipset ( provider , rand . Uint64 ( ) )
require . NoError ( t , err )
matchMessages := make ( [ ] matchMessage , len ( data . matchStates ) )
for i , ms := range data . matchStates {
matchTs , err := test . MockTipset ( provider , rand . Uint64 ( ) )
require . NoError ( t , err )
matchMessages [ i ] = matchMessage {
curH : 5 ,
msg : ms . msg ,
2020-12-14 11:30:52 +00:00
msgReceipt : ms . receipt ,
2020-11-20 16:30:17 +00:00
ts : matchTs ,
}
}
eventsAPI := & fakeEvents {
2020-11-30 14:16:13 +00:00
Ctx : ctx ,
CheckTs : checkTs ,
MatchMessages : matchMessages ,
DealStartEpochTimeout : data . dealStartEpochTimeout ,
2020-11-20 16:30:17 +00:00
}
cbCallCount := uint64 ( 0 )
var cbSectorNumber abi . SectorNumber
var cbIsActive bool
var cbError error
cb := func ( secNum abi . SectorNumber , isActive bool , err error ) {
cbCallCount ++
cbSectorNumber = secNum
cbIsActive = isActive
cbError = err
}
2021-01-08 15:28:38 +00:00
mockPCAPI := & mockPreCommitsAPI {
PCChanges : data . preCommitDiff ,
}
mockDIAPI := & mockDealInfoAPI {
CurrentDealInfo : data . currentDealInfo ,
CurrentDealInfo2 : data . currentDealInfo ,
Err : data . currentDealInfoErr ,
Err2 : data . currentDealInfoErr2 ,
}
scm := newSectorCommittedManager ( eventsAPI , mockDIAPI , mockPCAPI )
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_ADAPTER_ON_SECTOR_PRE_COMMIT_001
2021-01-08 15:28:38 +00:00
err = scm . OnDealSectorPreCommitted ( ctx , provider , proposal , publishCid , cb )
2020-11-20 16:30:17 +00:00
if data . expectedError == nil {
require . NoError ( t , err )
} else {
require . EqualError ( t , err , data . expectedError . Error ( ) )
}
require . Equal ( t , data . expectedCBSectorNumber , cbSectorNumber )
require . Equal ( t , data . expectedCBIsActive , cbIsActive )
require . Equal ( t , data . expectedCBCallCount , cbCallCount )
if data . expectedCBError == nil {
require . NoError ( t , cbError )
} else {
require . EqualError ( t , cbError , data . expectedCBError . Error ( ) )
}
} )
}
for testCase , data := range testCases {
runTestCase ( testCase , data )
}
}
func TestOnDealSectorCommitted ( t * testing . T ) {
2022-04-20 21:34:28 +00:00
label , err := markettypes . NewLabelFromString ( "success" )
2022-03-12 18:07:35 +00:00
require . NoError ( t , err )
2020-11-20 16:30:17 +00:00
provider := address . TestAddress
publishCid := generateCids ( 1 ) [ 0 ]
pieceCid := generateCids ( 1 ) [ 0 ]
2021-01-08 15:28:38 +00:00
dealID := abi . DealID ( rand . Uint64 ( ) )
2020-11-20 16:30:17 +00:00
sectorNumber := abi . SectorNumber ( rand . Uint64 ( ) )
proposal := market . DealProposal {
2021-01-08 15:28:38 +00:00
PieceCID : pieceCid ,
PieceSize : abi . PaddedPieceSize ( rand . Uint64 ( ) ) ,
Client : tutils . NewActorAddr ( t , "client" ) ,
Provider : tutils . NewActorAddr ( t , "provider" ) ,
StoragePricePerEpoch : abi . NewTokenAmount ( 1 ) ,
ProviderCollateral : abi . NewTokenAmount ( 1 ) ,
ClientCollateral : abi . NewTokenAmount ( 1 ) ,
2022-03-12 18:07:35 +00:00
Label : label ,
2020-11-20 16:30:17 +00:00
}
unfinishedDeal := & api . MarketDeal {
Proposal : proposal ,
State : market . DealState {
SectorStartEpoch : - 1 ,
LastUpdatedEpoch : 2 ,
} ,
}
2021-01-08 15:28:38 +00:00
activeDeal := & api . MarketDeal {
Proposal : proposal ,
State : market . DealState {
SectorStartEpoch : 1 ,
LastUpdatedEpoch : 2 ,
} ,
}
slashedDeal := & api . MarketDeal {
2020-11-20 16:30:17 +00:00
Proposal : proposal ,
State : market . DealState {
SectorStartEpoch : 1 ,
LastUpdatedEpoch : 2 ,
2021-01-08 15:28:38 +00:00
SlashEpoch : 2 ,
2020-11-20 16:30:17 +00:00
} ,
}
2020-11-30 14:16:13 +00:00
type testCase struct {
2022-06-14 19:23:17 +00:00
currentDealInfo pipeline . CurrentDealInfo
2021-01-08 15:28:38 +00:00
currentDealInfoErr error
2022-06-14 19:23:17 +00:00
currentDealInfo2 pipeline . CurrentDealInfo
2021-01-08 15:28:38 +00:00
currentDealInfoErr2 error
2020-11-30 14:16:13 +00:00
matchStates [ ] matchState
dealStartEpochTimeout bool
expectedCBCallCount uint64
expectedCBError error
expectedError error
}
testCases := map [ string ] testCase {
2020-11-20 16:30:17 +00:00
"normal sequence" : {
2022-06-14 19:23:17 +00:00
currentDealInfo : pipeline . CurrentDealInfo {
2021-01-08 15:28:38 +00:00
DealID : dealID ,
MarketDeal : unfinishedDeal ,
2020-11-05 05:11:08 +00:00
} ,
2022-06-14 19:23:17 +00:00
currentDealInfo2 : pipeline . CurrentDealInfo {
2021-01-08 15:28:38 +00:00
DealID : dealID ,
MarketDeal : activeDeal ,
2020-11-05 05:11:08 +00:00
} ,
matchStates : [ ] matchState {
{
2022-04-20 21:34:28 +00:00
msg : makeMessage ( t , provider , builtin . MethodsMiner . ProveCommitSector , & minertypes . ProveCommitSectorParams {
2020-11-05 05:11:08 +00:00
SectorNumber : sectorNumber ,
} ) ,
} ,
} ,
2020-11-20 16:30:17 +00:00
expectedCBCallCount : 1 ,
2020-11-05 05:11:08 +00:00
} ,
2020-12-14 11:30:52 +00:00
"ignores unsuccessful prove-commit message" : {
2022-06-14 19:23:17 +00:00
currentDealInfo : pipeline . CurrentDealInfo {
2021-01-08 15:28:38 +00:00
DealID : dealID ,
MarketDeal : unfinishedDeal ,
} ,
2022-06-14 19:23:17 +00:00
currentDealInfo2 : pipeline . CurrentDealInfo {
2021-01-08 15:28:38 +00:00
DealID : dealID ,
MarketDeal : activeDeal ,
2020-12-14 11:30:52 +00:00
} ,
matchStates : [ ] matchState {
{
2022-04-20 21:34:28 +00:00
msg : makeMessage ( t , provider , builtin . MethodsMiner . ProveCommitSector , & minertypes . ProveCommitSectorParams {
2020-12-14 11:30:52 +00:00
SectorNumber : sectorNumber ,
} ) ,
2021-01-08 15:28:38 +00:00
// Exit-code 1 means the prove-commit was unsuccessful
2020-12-14 11:30:52 +00:00
receipt : & types . MessageReceipt { ExitCode : 1 } ,
} ,
} ,
expectedCBCallCount : 0 ,
} ,
2021-01-08 15:28:38 +00:00
"error getting current deal info in check func" : {
currentDealInfoErr : errors . New ( "something went wrong" ) ,
2020-11-05 05:11:08 +00:00
expectedCBCallCount : 0 ,
2021-01-08 15:28:38 +00:00
expectedError : xerrors . Errorf ( "failed to set up called handler: failed to look up deal on chain: something went wrong" ) ,
2020-11-05 05:11:08 +00:00
} ,
2021-01-08 15:28:38 +00:00
"sector already active" : {
2022-06-14 19:23:17 +00:00
currentDealInfo : pipeline . CurrentDealInfo {
2021-01-08 15:28:38 +00:00
DealID : dealID ,
MarketDeal : activeDeal ,
2020-11-05 05:11:08 +00:00
} ,
expectedCBCallCount : 1 ,
} ,
2021-01-08 15:28:38 +00:00
"sector was slashed" : {
2022-06-14 19:23:17 +00:00
currentDealInfo : pipeline . CurrentDealInfo {
2021-01-08 15:28:38 +00:00
DealID : dealID ,
MarketDeal : slashedDeal ,
2020-11-05 05:11:08 +00:00
} ,
2021-01-08 15:28:38 +00:00
expectedCBCallCount : 0 ,
expectedError : xerrors . Errorf ( "failed to set up called handler: deal %d was slashed at epoch %d" , dealID , slashedDeal . State . SlashEpoch ) ,
} ,
"error getting current deal info in called func" : {
2022-06-14 19:23:17 +00:00
currentDealInfo : pipeline . CurrentDealInfo {
2021-01-08 15:28:38 +00:00
DealID : dealID ,
MarketDeal : unfinishedDeal ,
} ,
currentDealInfoErr2 : errors . New ( "something went wrong" ) ,
2020-11-05 05:11:08 +00:00
matchStates : [ ] matchState {
{
2022-04-20 21:34:28 +00:00
msg : makeMessage ( t , provider , builtin . MethodsMiner . ProveCommitSector , & minertypes . ProveCommitSectorParams {
2020-11-05 05:11:08 +00:00
SectorNumber : sectorNumber ,
} ) ,
} ,
} ,
expectedCBCallCount : 1 ,
2021-01-08 15:28:38 +00:00
expectedCBError : xerrors . Errorf ( "handling applied event: failed to look up deal on chain: something went wrong" ) ,
2020-11-05 05:11:08 +00:00
} ,
2020-11-30 14:16:13 +00:00
"proposed deal epoch timeout" : {
2022-06-14 19:23:17 +00:00
currentDealInfo : pipeline . CurrentDealInfo {
2021-01-08 15:28:38 +00:00
DealID : dealID ,
MarketDeal : unfinishedDeal ,
2020-11-30 14:16:13 +00:00
} ,
dealStartEpochTimeout : true ,
expectedCBCallCount : 1 ,
2021-01-08 15:28:38 +00:00
expectedCBError : xerrors . Errorf ( "handling applied event: deal with piece CID %s was not activated by proposed deal start epoch 0" , unfinishedDeal . Proposal . PieceCID ) ,
} ,
"got prove-commit but deal not active" : {
2022-06-14 19:23:17 +00:00
currentDealInfo : pipeline . CurrentDealInfo {
2021-01-08 15:28:38 +00:00
DealID : dealID ,
MarketDeal : unfinishedDeal ,
} ,
2022-06-14 19:23:17 +00:00
currentDealInfo2 : pipeline . CurrentDealInfo {
2021-01-08 15:28:38 +00:00
DealID : dealID ,
MarketDeal : unfinishedDeal ,
} ,
matchStates : [ ] matchState {
{
2022-04-20 21:34:28 +00:00
msg : makeMessage ( t , provider , builtin . MethodsMiner . ProveCommitSector , & minertypes . ProveCommitSectorParams {
2021-01-08 15:28:38 +00:00
SectorNumber : sectorNumber ,
} ) ,
} ,
} ,
expectedCBCallCount : 1 ,
expectedCBError : xerrors . Errorf ( "handling applied event: deal wasn't active: deal=%d, parentState=bafkqaaa, h=5" , dealID ) ,
2020-11-30 14:16:13 +00:00
} ,
2020-11-05 05:11:08 +00:00
}
2020-11-30 14:16:13 +00:00
runTestCase := func ( testCase string , data testCase ) {
2020-11-05 05:11:08 +00:00
t . Run ( testCase , func ( t * testing . T ) {
2021-01-08 15:28:38 +00:00
ctx , cancel := context . WithTimeout ( context . Background ( ) , 5 * time . Second )
defer cancel ( )
2020-11-05 05:11:08 +00:00
checkTs , err := test . MockTipset ( provider , rand . Uint64 ( ) )
require . NoError ( t , err )
matchMessages := make ( [ ] matchMessage , len ( data . matchStates ) )
for i , ms := range data . matchStates {
matchTs , err := test . MockTipset ( provider , rand . Uint64 ( ) )
require . NoError ( t , err )
matchMessages [ i ] = matchMessage {
curH : 5 ,
msg : ms . msg ,
2020-12-14 11:30:52 +00:00
msgReceipt : ms . receipt ,
2020-11-05 05:11:08 +00:00
ts : matchTs ,
}
}
eventsAPI := & fakeEvents {
2020-11-30 14:16:13 +00:00
Ctx : ctx ,
CheckTs : checkTs ,
MatchMessages : matchMessages ,
DealStartEpochTimeout : data . dealStartEpochTimeout ,
2020-11-05 05:11:08 +00:00
}
cbCallCount := uint64 ( 0 )
var cbError error
cb := func ( err error ) {
cbCallCount ++
cbError = err
}
2021-01-08 15:28:38 +00:00
mockPCAPI := & mockPreCommitsAPI { }
mockDIAPI := & mockDealInfoAPI {
CurrentDealInfo : data . currentDealInfo ,
CurrentDealInfo2 : data . currentDealInfo2 ,
Err : data . currentDealInfoErr ,
Err2 : data . currentDealInfoErr2 ,
}
scm := newSectorCommittedManager ( eventsAPI , mockDIAPI , mockPCAPI )
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_ADAPTER_ON_SECTOR_COMMIT_001
2021-01-08 15:28:38 +00:00
err = scm . OnDealSectorCommitted ( ctx , provider , sectorNumber , proposal , publishCid , cb )
2020-11-05 05:11:08 +00:00
if data . expectedError == nil {
require . NoError ( t , err )
} else {
require . EqualError ( t , err , data . expectedError . Error ( ) )
}
require . Equal ( t , data . expectedCBCallCount , cbCallCount )
if data . expectedCBError == nil {
require . NoError ( t , cbError )
} else {
require . EqualError ( t , cbError , data . expectedCBError . Error ( ) )
}
} )
}
2020-11-10 04:02:02 +00:00
for testCase , data := range testCases {
runTestCase ( testCase , data )
}
2020-11-05 05:11:08 +00:00
}
type matchState struct {
2020-12-14 11:30:52 +00:00
msg * types . Message
receipt * types . MessageReceipt
2020-11-05 05:11:08 +00:00
}
type matchMessage struct {
curH abi . ChainEpoch
msg * types . Message
msgReceipt * types . MessageReceipt
ts * types . TipSet
doesRevert bool
}
type fakeEvents struct {
2020-11-30 14:16:13 +00:00
Ctx context . Context
CheckTs * types . TipSet
MatchMessages [ ] matchMessage
DealStartEpochTimeout bool
2020-11-05 05:11:08 +00:00
}
2021-08-04 00:10:30 +00:00
func ( fe * fakeEvents ) Called ( ctx context . Context , check events . CheckFunc , msgHnd events . MsgHandler , rev events . RevertHandler , confidence int , timeout abi . ChainEpoch , mf events . MsgMatchFunc ) error {
2020-12-01 11:35:11 +00:00
if fe . DealStartEpochTimeout {
msgHnd ( nil , nil , nil , 100 ) // nolint:errcheck
return nil
}
2021-08-04 00:10:30 +00:00
_ , more , err := check ( ctx , fe . CheckTs )
2020-11-05 05:11:08 +00:00
if err != nil {
return err
}
if ! more {
return nil
}
for _ , matchMessage := range fe . MatchMessages {
matched , err := mf ( matchMessage . msg )
if err != nil {
return err
}
if matched {
2020-12-14 11:30:52 +00:00
receipt := matchMessage . msgReceipt
if receipt == nil {
receipt = & types . MessageReceipt { ExitCode : 0 }
}
more , err := msgHnd ( matchMessage . msg , receipt , matchMessage . ts , matchMessage . curH )
2020-11-05 05:11:08 +00:00
if err != nil {
2021-01-08 15:28:38 +00:00
// error is handled through a callback rather than being returned
return nil
2020-11-05 05:11:08 +00:00
}
if matchMessage . doesRevert {
2021-08-04 00:10:30 +00:00
err := rev ( ctx , matchMessage . ts )
2020-11-05 05:11:08 +00:00
if err != nil {
return err
}
}
if ! more {
return nil
}
}
}
return nil
}
func makeMessage ( t * testing . T , to address . Address , method abi . MethodNum , params cbor . Marshaler ) * types . Message {
buf := new ( bytes . Buffer )
err := params . MarshalCBOR ( buf )
require . NoError ( t , err )
return & types . Message {
To : to ,
Method : method ,
Params : buf . Bytes ( ) ,
}
}
var seq int
func generateCids ( n int ) [ ] cid . Cid {
cids := make ( [ ] cid . Cid , 0 , n )
for i := 0 ; i < n ; i ++ {
2020-11-05 05:31:09 +00:00
c := blocks . NewBlock ( [ ] byte ( fmt . Sprint ( seq ) ) ) . Cid ( )
2020-11-05 05:11:08 +00:00
seq ++
cids = append ( cids , c )
}
return cids
}
2021-01-08 15:28:38 +00:00
type mockPreCommitsAPI struct {
PCChanges * miner . PreCommitChanges
Err error
}
func ( m * mockPreCommitsAPI ) diffPreCommits ( ctx context . Context , actor address . Address , pre , cur types . TipSetKey ) ( * miner . PreCommitChanges , error ) {
pcc := & miner . PreCommitChanges { }
if m . PCChanges != nil {
pcc = m . PCChanges
}
return pcc , m . Err
}
type mockDealInfoAPI struct {
count int
2022-06-14 19:23:17 +00:00
CurrentDealInfo pipeline . CurrentDealInfo
2021-01-08 15:28:38 +00:00
Err error
2022-06-14 19:23:17 +00:00
CurrentDealInfo2 pipeline . CurrentDealInfo
2021-01-08 15:28:38 +00:00
Err2 error
}
2022-06-17 16:25:59 +00:00
func ( m * mockDealInfoAPI ) GetCurrentDealInfo ( ctx context . Context , tsk types . TipSetKey , proposal * market . DealProposal , publishCid cid . Cid ) ( pipeline . CurrentDealInfo , error ) {
2021-01-08 15:28:38 +00:00
m . count ++
if m . count == 2 {
return m . CurrentDealInfo2 , m . Err2
}
return m . CurrentDealInfo , m . Err
}