package sealing_test import ( "bytes" "context" "errors" "testing" "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 TestStateRecoverDealIDsErredDealInfo(t *testing.T) { 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) api.EXPECT().ChainHead(ctx).Times(1).Return(nil, abi.ChainEpoch(10), nil) 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, Return: cborRet(&market.PublishStorageDealsReturn{ IDs: []abi.DealID{dealId}, }), }, }, nil) api.EXPECT().StateMarketStorageDeal(ctx, dealId, nil).Return(nil, errors.New("deal may not have completed sealing or slashed")) } sctx.EXPECT().Send(sealing.SectorRemove{}).Return(nil) err := fakeSealing.HandleRecoverDealIDs(sctx, sealing.SectorInfo{ Pieces: []sealing.Piece{ { DealInfo: &api2.PieceDealInfo{ DealID: dealId, PublishCid: &pc, }, Piece: abi.PieceInfo{ PieceCID: idCid("oldPieceCID"), }, }, }, }) require.NoError(t, err) } func TestStateRecoverDealIDs(t *testing.T) { 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) api.EXPECT().ChainHead(ctx).Times(1).Return(nil, abi.ChainEpoch(10), nil) 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, Return: cborRet(&market.PublishStorageDealsReturn{ IDs: []abi.DealID{dealId}, }), }, }, nil) api.EXPECT().StateMarketStorageDeal(ctx, dealId, nil).Return(&api2.MarketDeal{ Proposal: dealProposal, }, nil) } sctx.EXPECT().Send(sealing.SectorRemove{}).Return(nil) err := fakeSealing.HandleRecoverDealIDs(sctx, sealing.SectorInfo{ 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() }