2021-08-18 10:43:44 +00:00
package sealing_test
import (
"bytes"
"context"
"testing"
2021-09-30 00:44:27 +00:00
"github.com/filecoin-project/go-state-types/network"
2021-12-08 17:11:19 +00:00
statemachine "github.com/filecoin-project/go-statemachine"
2021-09-30 00:44:27 +00:00
2021-09-29 20:16:19 +00:00
market0 "github.com/filecoin-project/specs-actors/actors/builtin/market"
2021-08-18 10:43:44 +00:00
"github.com/golang/mock/gomock"
"github.com/ipfs/go-cid"
mh "github.com/multiformats/go-multihash"
"github.com/stretchr/testify/require"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/cbor"
"github.com/filecoin-project/go-state-types/exitcode"
api2 "github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/chain/actors/builtin/market"
sealing "github.com/filecoin-project/lotus/extern/storage-sealing"
"github.com/filecoin-project/lotus/extern/storage-sealing/mocks"
)
func TestStateRecoverDealIDs ( t * testing . T ) {
2021-12-08 17:11:19 +00:00
t . Skip ( "Bring this back when we can correctly mock a state machine context: Issue #7867" )
2021-08-18 10:43:44 +00:00
mockCtrl := gomock . NewController ( t )
defer mockCtrl . Finish ( )
ctx := context . Background ( )
api := mocks . NewMockSealingAPI ( mockCtrl )
fakeSealing := & sealing . Sealing {
Api : api ,
DealInfo : & sealing . CurrentDealInfoManager { CDAPI : api } ,
}
sctx := mocks . NewMockContext ( mockCtrl )
sctx . EXPECT ( ) . Context ( ) . AnyTimes ( ) . Return ( ctx )
2021-12-08 17:11:19 +00:00
api . EXPECT ( ) . ChainHead ( ctx ) . Times ( 2 ) . Return ( nil , abi . ChainEpoch ( 10 ) , nil )
2021-08-18 10:43:44 +00:00
var dealId abi . DealID = 12
dealProposal := market . DealProposal {
PieceCID : idCid ( "newPieceCID" ) ,
}
api . EXPECT ( ) . StateMarketStorageDealProposal ( ctx , dealId , nil ) . Return ( dealProposal , nil )
pc := idCid ( "publishCID" )
// expect GetCurrentDealInfo
{
api . EXPECT ( ) . StateSearchMsg ( ctx , pc ) . Return ( & sealing . MsgLookup {
Receipt : sealing . MessageReceipt {
ExitCode : exitcode . Ok ,
2021-09-29 20:16:19 +00:00
Return : cborRet ( & market0 . PublishStorageDealsReturn {
2021-08-18 10:43:44 +00:00
IDs : [ ] abi . DealID { dealId } ,
} ) ,
} ,
} , nil )
2021-09-30 00:44:27 +00:00
api . EXPECT ( ) . StateNetworkVersion ( ctx , nil ) . Return ( network . Version0 , nil )
2021-08-18 10:43:44 +00:00
api . EXPECT ( ) . StateMarketStorageDeal ( ctx , dealId , nil ) . Return ( & api2 . MarketDeal {
Proposal : dealProposal ,
} , nil )
}
sctx . EXPECT ( ) . Send ( sealing . SectorRemove { } ) . Return ( nil )
2021-12-08 17:11:19 +00:00
// TODO sctx should satisfy an interface so it can be useable for mocking. This will fail because we are passing in an empty context now to get this to build.
// https://github.com/filecoin-project/lotus/issues/7867
err := fakeSealing . HandleRecoverDealIDs ( statemachine . Context { } , sealing . SectorInfo {
2021-08-18 10:43:44 +00:00
Pieces : [ ] sealing . Piece {
{
DealInfo : & api2 . PieceDealInfo {
DealID : dealId ,
PublishCid : & pc ,
} ,
Piece : abi . PieceInfo {
PieceCID : idCid ( "oldPieceCID" ) ,
} ,
} ,
} ,
} )
require . NoError ( t , err )
}
func idCid ( str string ) cid . Cid {
builder := cid . V1Builder { Codec : cid . Raw , MhType : mh . IDENTITY }
c , err := builder . Sum ( [ ] byte ( str ) )
if err != nil {
panic ( err )
}
return c
}
func cborRet ( v cbor . Marshaler ) [ ] byte {
var buf bytes . Buffer
if err := v . MarshalCBOR ( & buf ) ; err != nil {
panic ( err )
}
return buf . Bytes ( )
}