79453663b3
* 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>
260 lines
7.6 KiB
Go
260 lines
7.6 KiB
Go
//stm: #integration
|
|
package itests
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/filecoin-project/go-fil-markets/storagemarket"
|
|
"github.com/filecoin-project/go-state-types/abi"
|
|
"github.com/filecoin-project/lotus/api"
|
|
api0 "github.com/filecoin-project/lotus/api/v0api"
|
|
"github.com/filecoin-project/lotus/chain/actors/policy"
|
|
"github.com/filecoin-project/lotus/itests/kit"
|
|
blocks "github.com/ipfs/go-block-format"
|
|
"github.com/ipfs/go-cid"
|
|
"github.com/ipld/go-car"
|
|
textselector "github.com/ipld/go-ipld-selector-text-lite"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// please talk to @ribasushi or @mikeal before modifying these test: there are
|
|
// downstream dependencies on ADL-less operation
|
|
var (
|
|
adlFixtureCar = "fixtures/adl_test.car"
|
|
adlFixtureRoot, _ = cid.Parse("bafybeiaigxwanoxyeuzyiknhrg6io6kobfbm37ozcips6qdwumub2gaomy")
|
|
adlFixtureCommp, _ = cid.Parse("baga6ea4seaqjnmnrv4qsfz2rnda54mvo5al22dwpguhn2pmep63gl7bbqqqraai")
|
|
adlFixturePieceSize = abi.PaddedPieceSize(1024)
|
|
dmSelector = api.Selector("Links/0/Hash")
|
|
dmTextSelector = textselector.Expression(dmSelector)
|
|
dmExpectedResult = "NO ADL"
|
|
dmExpectedCarBlockCount = 4
|
|
dmDagSpec = []api.DagSpec{{DataSelector: &dmSelector, ExportMerkleProof: true}}
|
|
)
|
|
|
|
func TestDMLevelPartialRetrieval(t *testing.T) {
|
|
//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
|
|
|
|
//stm: @CHAIN_INCOMING_HANDLE_INCOMING_BLOCKS_001, @CHAIN_INCOMING_VALIDATE_BLOCK_PUBSUB_001, @CHAIN_INCOMING_VALIDATE_MESSAGE_PUBSUB_001
|
|
//stm: @CLIENT_RETRIEVAL_RETRIEVE_001, @CLIENT_RETRIEVAL_FIND_001
|
|
ctx := context.Background()
|
|
|
|
policy.SetPreCommitChallengeDelay(2)
|
|
kit.QuietMiningLogs()
|
|
client, miner, ens := kit.EnsembleMinimal(t, kit.ThroughRPC(), kit.MockProofs())
|
|
dh := kit.NewDealHarness(t, client, miner, miner)
|
|
ens.InterconnectAll().BeginMining(50 * time.Millisecond)
|
|
|
|
_, err := client.ClientImport(ctx, api.FileRef{Path: adlFixtureCar, IsCAR: true})
|
|
require.NoError(t, err)
|
|
|
|
caddr, err := client.WalletDefaultAddress(ctx)
|
|
require.NoError(t, err)
|
|
|
|
//
|
|
// test retrieval from local car 1st
|
|
require.NoError(t, testDMExportAsCar(
|
|
ctx, client, api.ExportRef{
|
|
FromLocalCAR: adlFixtureCar,
|
|
Root: adlFixtureRoot,
|
|
DAGs: dmDagSpec,
|
|
}, t.TempDir(),
|
|
))
|
|
require.NoError(t, testDMExportAsFile(
|
|
ctx, client, api.ExportRef{
|
|
FromLocalCAR: adlFixtureCar,
|
|
Root: adlFixtureRoot,
|
|
DAGs: dmDagSpec,
|
|
}, t.TempDir(),
|
|
))
|
|
|
|
//
|
|
// ensure V0 continues functioning as expected
|
|
require.NoError(t, tesV0RetrievalAsCar(
|
|
ctx, client, api0.RetrievalOrder{
|
|
FromLocalCAR: adlFixtureCar,
|
|
Root: adlFixtureRoot,
|
|
DatamodelPathSelector: &dmTextSelector,
|
|
}, t.TempDir(),
|
|
))
|
|
require.NoError(t, testV0RetrievalAsFile(
|
|
ctx, client, api0.RetrievalOrder{
|
|
FromLocalCAR: adlFixtureCar,
|
|
Root: adlFixtureRoot,
|
|
DatamodelPathSelector: &dmTextSelector,
|
|
}, t.TempDir(),
|
|
))
|
|
|
|
//
|
|
// now perform a storage/retrieval deal as well, and retest
|
|
dp := dh.DefaultStartDealParams()
|
|
dp.Data = &storagemarket.DataRef{
|
|
Root: adlFixtureRoot,
|
|
PieceCid: &adlFixtureCommp,
|
|
PieceSize: adlFixturePieceSize.Unpadded(),
|
|
}
|
|
proposalCid := dh.StartDeal(ctx, dp)
|
|
|
|
// Wait for the deal to reach StorageDealCheckForAcceptance on the client
|
|
cd, err := client.ClientGetDealInfo(ctx, *proposalCid)
|
|
require.NoError(t, err)
|
|
require.Eventually(t, func() bool {
|
|
cd, _ := client.ClientGetDealInfo(ctx, *proposalCid)
|
|
return cd.State == storagemarket.StorageDealCheckForAcceptance
|
|
}, 30*time.Second, 1*time.Second, "actual deal status is %s", storagemarket.DealStates[cd.State])
|
|
|
|
dh.WaitDealSealed(ctx, proposalCid, false, false, nil)
|
|
|
|
offers, err := client.ClientFindData(ctx, adlFixtureRoot, nil)
|
|
require.NoError(t, err)
|
|
require.NotEmpty(t, offers, "no offers")
|
|
|
|
retOrder := offers[0].Order(caddr)
|
|
retOrder.DataSelector = &dmSelector
|
|
|
|
rr, err := client.ClientRetrieve(ctx, retOrder)
|
|
require.NoError(t, err)
|
|
|
|
err = client.ClientRetrieveWait(ctx, rr.DealID)
|
|
require.NoError(t, err)
|
|
|
|
require.NoError(t, testDMExportAsCar(
|
|
ctx, client, api.ExportRef{
|
|
DealID: rr.DealID,
|
|
Root: adlFixtureRoot,
|
|
DAGs: dmDagSpec,
|
|
}, t.TempDir(),
|
|
))
|
|
require.NoError(t, testDMExportAsFile(
|
|
ctx, client, api.ExportRef{
|
|
DealID: rr.DealID,
|
|
Root: adlFixtureRoot,
|
|
DAGs: dmDagSpec,
|
|
}, t.TempDir(),
|
|
))
|
|
|
|
}
|
|
|
|
func testDMExportAsFile(ctx context.Context, client *kit.TestFullNode, expDirective api.ExportRef, tempDir string) error {
|
|
out, err := ioutil.TempFile(tempDir, "exp-test")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer out.Close() //nolint:errcheck
|
|
|
|
fileDest := api.FileRef{
|
|
Path: out.Name(),
|
|
}
|
|
err = client.ClientExport(ctx, expDirective, fileDest)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return validateDMUnixFile(out)
|
|
}
|
|
func testV0RetrievalAsFile(ctx context.Context, client *kit.TestFullNode, retOrder api0.RetrievalOrder, tempDir string) error {
|
|
out, err := ioutil.TempFile(tempDir, "exp-test")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer out.Close() //nolint:errcheck
|
|
|
|
cv0 := &api0.WrapperV1Full{client.FullNode} //nolint:govet
|
|
err = cv0.ClientRetrieve(ctx, retOrder, &api.FileRef{
|
|
Path: out.Name(),
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return validateDMUnixFile(out)
|
|
}
|
|
func validateDMUnixFile(r io.Reader) error {
|
|
data, err := io.ReadAll(r)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if string(data) != dmExpectedResult {
|
|
return fmt.Errorf("retrieved data mismatch: expected '%s' got '%s'", dmExpectedResult, data)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func testDMExportAsCar(ctx context.Context, client *kit.TestFullNode, expDirective api.ExportRef, tempDir string) error {
|
|
out, err := ioutil.TempFile(tempDir, "exp-test")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer out.Close() //nolint:errcheck
|
|
|
|
carDest := api.FileRef{
|
|
IsCAR: true,
|
|
Path: out.Name(),
|
|
}
|
|
err = client.ClientExport(ctx, expDirective, carDest)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return validateDMCar(out)
|
|
}
|
|
func tesV0RetrievalAsCar(ctx context.Context, client *kit.TestFullNode, retOrder api0.RetrievalOrder, tempDir string) error {
|
|
out, err := ioutil.TempFile(tempDir, "exp-test")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer out.Close() //nolint:errcheck
|
|
|
|
cv0 := &api0.WrapperV1Full{client.FullNode} //nolint:govet
|
|
err = cv0.ClientRetrieve(ctx, retOrder, &api.FileRef{
|
|
Path: out.Name(),
|
|
IsCAR: true,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return validateDMCar(out)
|
|
}
|
|
func validateDMCar(r io.Reader) error {
|
|
cr, err := car.NewCarReader(r)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if len(cr.Header.Roots) != 1 {
|
|
return fmt.Errorf("expected a single root in result car, got %d", len(cr.Header.Roots))
|
|
} else if cr.Header.Roots[0].String() != adlFixtureRoot.String() {
|
|
return fmt.Errorf("expected root cid '%s', got '%s'", adlFixtureRoot.String(), cr.Header.Roots[0].String())
|
|
}
|
|
|
|
blks := make([]blocks.Block, 0)
|
|
for {
|
|
b, err := cr.Next()
|
|
if err == io.EOF {
|
|
break
|
|
} else if err != nil {
|
|
return err
|
|
}
|
|
|
|
blks = append(blks, b)
|
|
}
|
|
|
|
if len(blks) != dmExpectedCarBlockCount {
|
|
return fmt.Errorf("expected a car file with %d blocks, got one with %d instead", dmExpectedCarBlockCount, len(blks))
|
|
}
|
|
|
|
data := fmt.Sprintf("%s%s", blks[2].RawData(), blks[3].RawData())
|
|
if data != dmExpectedResult {
|
|
return fmt.Errorf("retrieved data mismatch: expected '%s' got '%s'", dmExpectedResult, data)
|
|
}
|
|
|
|
return nil
|
|
}
|