2022-08-29 14:25:30 +00:00
|
|
|
// stm: #integration
|
2021-07-24 02:06:02 +00:00
|
|
|
package itests
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
2022-06-14 15:00:51 +00:00
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
2021-07-24 02:06:02 +00:00
|
|
|
commcid "github.com/filecoin-project/go-fil-commcid"
|
|
|
|
commp "github.com/filecoin-project/go-fil-commp-hashhash"
|
|
|
|
"github.com/filecoin-project/go-state-types/abi"
|
2022-06-14 15:00:51 +00:00
|
|
|
|
2021-07-24 02:06:02 +00:00
|
|
|
"github.com/filecoin-project/lotus/itests/kit"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestDealPadding(t *testing.T) {
|
2021-12-13 12:41:04 +00:00
|
|
|
//stm: @CHAIN_SYNCER_LOAD_GENESIS_001, @CHAIN_SYNCER_FETCH_TIPSET_001,
|
|
|
|
//stm: @CHAIN_SYNCER_START_001, @CHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_VALUES_01
|
|
|
|
//stm: @CHAIN_SYNCER_COLLECT_CHAIN_001, @CHAIN_SYNCER_COLLECT_HEADERS_001, @CHAIN_SYNCER_VALIDATE_TIPSET_001
|
|
|
|
//stm: @CHAIN_SYNCER_NEW_PEER_HEAD_001, @CHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @CHAIN_SYNCER_STOP_001
|
2021-12-14 10:33:33 +00:00
|
|
|
|
|
|
|
//stm: @CHAIN_INCOMING_HANDLE_INCOMING_BLOCKS_001, @CHAIN_INCOMING_VALIDATE_BLOCK_PUBSUB_001, @CHAIN_INCOMING_VALIDATE_MESSAGE_PUBSUB_001
|
2021-12-16 13:36:02 +00:00
|
|
|
//stm: @CLIENT_DATA_GET_DEAL_PIECE_CID_001
|
2021-07-24 02:06:02 +00:00
|
|
|
kit.QuietMiningLogs()
|
|
|
|
|
|
|
|
var blockTime = 250 * time.Millisecond
|
|
|
|
startEpoch := abi.ChainEpoch(2 << 12)
|
|
|
|
|
|
|
|
client, miner, ens := kit.EnsembleMinimal(t, kit.ThroughRPC(), kit.WithAllSubsystems()) // no mock proofs.
|
|
|
|
ens.InterconnectAll().BeginMining(blockTime)
|
|
|
|
dh := kit.NewDealHarness(t, client, miner, miner)
|
|
|
|
|
|
|
|
ctx := context.Background()
|
2023-01-19 18:25:23 +00:00
|
|
|
client.WaitTillChain(ctx, kit.BlocksMinedByAll(miner.ActorAddr))
|
2021-07-24 02:06:02 +00:00
|
|
|
|
|
|
|
// Create a random file, would originally be a 256-byte sector
|
|
|
|
res, inFile := client.CreateImportFile(ctx, 1, 200)
|
|
|
|
|
|
|
|
// Get the piece size and commP
|
|
|
|
pieceInfo, err := client.ClientDealPieceCID(ctx, res.Root)
|
|
|
|
require.NoError(t, err)
|
|
|
|
t.Log("FILE CID:", res.Root)
|
|
|
|
|
|
|
|
runTest := func(t *testing.T, upscale abi.PaddedPieceSize) {
|
|
|
|
// test whether padding works as intended
|
|
|
|
newRawCp, err := commp.PadCommP(
|
|
|
|
pieceInfo.PieceCID.Hash()[len(pieceInfo.PieceCID.Hash())-32:],
|
|
|
|
uint64(pieceInfo.PieceSize),
|
|
|
|
uint64(upscale),
|
|
|
|
)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
pcid, err := commcid.DataCommitmentV1ToCID(newRawCp)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
dp := dh.DefaultStartDealParams()
|
|
|
|
dp.Data.Root = res.Root
|
|
|
|
dp.Data.PieceCid = &pcid
|
|
|
|
dp.Data.PieceSize = upscale.Unpadded()
|
|
|
|
dp.DealStartEpoch = startEpoch
|
|
|
|
proposalCid := dh.StartDeal(ctx, dp)
|
|
|
|
|
|
|
|
// TODO: this sleep is only necessary because deals don't immediately get logged in the dealstore, we should fix this
|
|
|
|
time.Sleep(time.Second)
|
|
|
|
|
2021-12-16 13:36:02 +00:00
|
|
|
//stm: @CLIENT_STORAGE_DEALS_GET_001
|
2021-07-24 02:06:02 +00:00
|
|
|
di, err := client.ClientGetDealInfo(ctx, *proposalCid)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.True(t, di.PieceCID.Equals(pcid))
|
|
|
|
|
|
|
|
dh.WaitDealSealed(ctx, proposalCid, false, false, nil)
|
|
|
|
|
|
|
|
// Retrieve the deal
|
|
|
|
outFile := dh.PerformRetrieval(ctx, proposalCid, res.Root, false)
|
|
|
|
|
|
|
|
kit.AssertFilesEqual(t, inFile, outFile)
|
|
|
|
}
|
|
|
|
|
|
|
|
t.Run("padQuarterSector", func(t *testing.T) { runTest(t, 512) })
|
|
|
|
t.Run("padHalfSector", func(t *testing.T) { runTest(t, 1024) })
|
|
|
|
t.Run("padFullSector", func(t *testing.T) { runTest(t, 2048) })
|
|
|
|
}
|