2022-08-29 14:25:30 +00:00
|
|
|
// stm: #integration
|
2021-11-24 14:08:36 +00:00
|
|
|
package itests
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
"io"
|
2022-06-29 17:07:29 +00:00
|
|
|
"os"
|
2021-11-24 14:08:36 +00:00
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
2023-03-25 07:33:05 +00:00
|
|
|
blocks "github.com/ipfs/go-block-format"
|
2021-11-24 14:08:36 +00:00
|
|
|
"github.com/ipfs/go-cid"
|
|
|
|
"github.com/ipld/go-car"
|
|
|
|
textselector "github.com/ipld/go-ipld-selector-text-lite"
|
|
|
|
"github.com/stretchr/testify/require"
|
2022-06-14 15:00:51 +00:00
|
|
|
|
|
|
|
"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/itests/kit"
|
2021-11-24 14:08:36 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// 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
|
2021-11-29 20:14:00 +00:00
|
|
|
dmDagSpec = []api.DagSpec{{DataSelector: &dmSelector, ExportMerkleProof: true}}
|
2021-11-24 14:08:36 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestDMLevelPartialRetrieval(t *testing.T) {
|
feat: Add additional test annotations (#8272)
* 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>
2022-03-16 17:37:34 +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-11-24 14:08:36 +00:00
|
|
|
|
feat: Add additional test annotations (#8272)
* 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>
2022-03-16 17:37:34 +00:00
|
|
|
//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
|
2021-11-24 14:08:36 +00:00
|
|
|
ctx := context.Background()
|
|
|
|
|
|
|
|
kit.QuietMiningLogs()
|
2023-05-19 16:30:16 +00:00
|
|
|
client, miner, ens := kit.EnsembleMinimal(t, kit.ThroughRPC())
|
2021-11-24 14:08:36 +00:00
|
|
|
dh := kit.NewDealHarness(t, client, miner, miner)
|
2023-06-12 23:49:13 +00:00
|
|
|
ens.InterconnectAll().BeginMiningMustPost(50 * time.Millisecond)
|
2021-11-24 14:08:36 +00:00
|
|
|
|
|
|
|
_, 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 {
|
2022-06-29 17:07:29 +00:00
|
|
|
out := tempDir + string(os.PathSeparator) + "exp-test" + expDirective.Root.String()
|
|
|
|
|
|
|
|
fileDest := api.FileRef{
|
|
|
|
Path: out,
|
|
|
|
}
|
|
|
|
err := client.ClientExport(ctx, expDirective, fileDest)
|
2021-11-24 14:08:36 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2022-06-29 17:07:29 +00:00
|
|
|
f, err := os.Open(out)
|
2021-11-24 14:08:36 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2022-06-29 17:07:29 +00:00
|
|
|
|
|
|
|
defer f.Close() //nolint:errcheck
|
|
|
|
|
|
|
|
return validateDMUnixFile(f)
|
2021-11-24 14:08:36 +00:00
|
|
|
}
|
|
|
|
func testV0RetrievalAsFile(ctx context.Context, client *kit.TestFullNode, retOrder api0.RetrievalOrder, tempDir string) error {
|
2022-06-29 17:07:29 +00:00
|
|
|
out := tempDir + string(os.PathSeparator) + "exp-test" + retOrder.Root.String()
|
|
|
|
|
2023-02-17 23:06:58 +00:00
|
|
|
cv0 := &api0.WrapperV1Full{FullNode: client.FullNode}
|
2022-06-29 17:07:29 +00:00
|
|
|
err := cv0.ClientRetrieve(ctx, retOrder, &api.FileRef{
|
|
|
|
Path: out,
|
|
|
|
})
|
2021-11-24 14:08:36 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2022-06-29 17:07:29 +00:00
|
|
|
f, err := os.Open(out)
|
2021-11-24 14:08:36 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2022-06-29 17:07:29 +00:00
|
|
|
|
|
|
|
defer f.Close() //nolint:errcheck
|
|
|
|
|
|
|
|
return validateDMUnixFile(f)
|
2021-11-24 14:08:36 +00:00
|
|
|
}
|
|
|
|
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 {
|
2023-03-29 19:24:07 +00:00
|
|
|
out, err := os.CreateTemp(tempDir, "exp-test")
|
2021-11-24 14:08:36 +00:00
|
|
|
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 {
|
2023-03-29 19:24:07 +00:00
|
|
|
out, err := os.CreateTemp(tempDir, "exp-test")
|
2021-11-24 14:08:36 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer out.Close() //nolint:errcheck
|
|
|
|
|
2023-02-17 23:06:58 +00:00
|
|
|
cv0 := &api0.WrapperV1Full{FullNode: client.FullNode}
|
2021-11-24 14:08:36 +00:00
|
|
|
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
|
|
|
|
}
|