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"
sealing "github.com/filecoin-project/lotus/extern/storage-sealing"
2020-11-05 05:11:08 +00:00
2020-11-30 14:16:13 +00:00
"golang.org/x/xerrors"
2020-11-05 05:11:08 +00:00
blocks "github.com/ipfs/go-block-format"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/cbor"
"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"
2021-01-08 15:28:38 +00:00
tutils "github.com/filecoin-project/specs-actors/v2/support/testing"
2020-11-05 05:11:08 +00:00
"github.com/ipfs/go-cid"
"github.com/stretchr/testify/require"
)
2020-11-20 16:30:17 +00:00
func TestOnDealSectorPreCommitted ( t * testing . T ) {
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 ) ,
Label : "success" ,
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 {
2021-01-08 15:28:38 +00:00
currentDealInfo sealing . CurrentDealInfo
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" : {
2021-01-08 15:28:38 +00:00
currentDealInfo : sealing . CurrentDealInfo {
DealID : dealID ,
MarketDeal : unfinishedDeal ,
2020-11-05 05:11:08 +00:00
} ,
matchStates : [ ] matchState {
{
msg : makeMessage ( t , provider , miner . Methods . PreCommitSector , & miner . SectorPreCommitInfo {
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" : {
currentDealInfo : sealing . CurrentDealInfo {
DealID : dealID ,
MarketDeal : unfinishedDeal ,
2020-11-05 05:11:08 +00:00
} ,
matchStates : [ ] matchState {
{
msg : makeMessage ( t , provider , miner . Methods . PreCommitSector , & miner . SectorPreCommitInfo {
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" : {
currentDealInfo : sealing . CurrentDealInfo {
DealID : dealID ,
MarketDeal : unfinishedDeal ,
2020-12-14 11:30:52 +00:00
} ,
2021-01-08 15:28:38 +00:00
preCommitDiff : & miner . PreCommitChanges {
Added : [ ] miner . SectorPreCommitOnChainInfo { {
Info : miner . 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" : {
currentDealInfo : sealing . CurrentDealInfo {
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" : {
currentDealInfo : sealing . CurrentDealInfo {
DealID : dealID ,
MarketDeal : slashedDeal ,
PublishMsgTipSet : nil ,
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" : {
currentDealInfo : sealing . CurrentDealInfo {
DealID : dealID ,
MarketDeal : unfinishedDeal ,
} ,
currentDealInfoErr2 : errors . New ( "something went wrong" ) ,
2020-11-05 05:11:08 +00:00
matchStates : [ ] matchState {
{
msg : makeMessage ( t , provider , miner . Methods . PreCommitSector , & miner . SectorPreCommitInfo {
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" : {
2021-01-08 15:28:38 +00:00
currentDealInfo : sealing . CurrentDealInfo {
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 )
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 ) {
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 ) ,
Label : "success" ,
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 {
2021-01-08 15:28:38 +00:00
currentDealInfo sealing . CurrentDealInfo
currentDealInfoErr error
currentDealInfo2 sealing . CurrentDealInfo
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" : {
2021-01-08 15:28:38 +00:00
currentDealInfo : sealing . CurrentDealInfo {
DealID : dealID ,
MarketDeal : unfinishedDeal ,
2020-11-05 05:11:08 +00:00
} ,
2021-01-08 15:28:38 +00:00
currentDealInfo2 : sealing . CurrentDealInfo {
DealID : dealID ,
MarketDeal : activeDeal ,
2020-11-05 05:11:08 +00:00
} ,
matchStates : [ ] matchState {
{
msg : makeMessage ( t , provider , miner . Methods . ProveCommitSector , & miner . ProveCommitSectorParams {
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" : {
2021-01-08 15:28:38 +00:00
currentDealInfo : sealing . CurrentDealInfo {
DealID : dealID ,
MarketDeal : unfinishedDeal ,
} ,
currentDealInfo2 : sealing . CurrentDealInfo {
DealID : dealID ,
MarketDeal : activeDeal ,
2020-12-14 11:30:52 +00:00
} ,
matchStates : [ ] matchState {
{
msg : makeMessage ( t , provider , miner . Methods . ProveCommitSector , & miner . ProveCommitSectorParams {
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" : {
currentDealInfo : sealing . CurrentDealInfo {
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" : {
currentDealInfo : sealing . CurrentDealInfo {
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" : {
currentDealInfo : sealing . CurrentDealInfo {
DealID : dealID ,
MarketDeal : unfinishedDeal ,
} ,
currentDealInfoErr2 : errors . New ( "something went wrong" ) ,
2020-11-05 05:11:08 +00:00
matchStates : [ ] matchState {
{
2020-11-20 16:30:17 +00:00
msg : makeMessage ( t , provider , miner . Methods . ProveCommitSector , & miner . 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" : {
2021-01-08 15:28:38 +00:00
currentDealInfo : sealing . CurrentDealInfo {
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" : {
currentDealInfo : sealing . CurrentDealInfo {
DealID : dealID ,
MarketDeal : unfinishedDeal ,
} ,
currentDealInfo2 : sealing . CurrentDealInfo {
DealID : dealID ,
MarketDeal : unfinishedDeal ,
} ,
matchStates : [ ] matchState {
{
msg : makeMessage ( t , provider , miner . Methods . ProveCommitSector , & miner . ProveCommitSectorParams {
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 )
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
}
func ( fe * fakeEvents ) Called ( 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
}
2020-11-05 05:11:08 +00:00
_ , more , err := check ( fe . CheckTs )
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 {
err := rev ( fe . Ctx , matchMessage . ts )
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
CurrentDealInfo sealing . CurrentDealInfo
Err error
CurrentDealInfo2 sealing . CurrentDealInfo
Err2 error
}
func ( m * mockDealInfoAPI ) GetCurrentDealInfo ( ctx context . Context , tok sealing . TipSetToken , proposal * market . DealProposal , publishCid cid . Cid ) ( sealing . CurrentDealInfo , error ) {
m . count ++
if m . count == 2 {
return m . CurrentDealInfo2 , m . Err2
}
return m . CurrentDealInfo , m . Err
}