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>
137 lines
3.7 KiB
Go
137 lines
3.7 KiB
Go
//stm: #unit
|
|
package client
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"io"
|
|
"io/ioutil"
|
|
"os"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/ipfs/go-blockservice"
|
|
"github.com/ipfs/go-cid"
|
|
offline "github.com/ipfs/go-ipfs-exchange-offline"
|
|
files "github.com/ipfs/go-ipfs-files"
|
|
"github.com/ipfs/go-merkledag"
|
|
unixfile "github.com/ipfs/go-unixfs/file"
|
|
carv2 "github.com/ipld/go-car/v2"
|
|
"github.com/ipld/go-car/v2/blockstore"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/filecoin-project/go-fil-markets/stores"
|
|
|
|
"github.com/filecoin-project/lotus/node/repo/imports"
|
|
)
|
|
|
|
// This test uses a full "dense" CARv2, and not a filestore (positional mapping).
|
|
func TestRoundtripUnixFS_Dense(t *testing.T) {
|
|
//stm: @CLIENT_DATA_IMPORT_002
|
|
ctx := context.Background()
|
|
|
|
inputPath, inputContents := genInputFile(t)
|
|
defer os.Remove(inputPath) //nolint:errcheck
|
|
|
|
carv2File := newTmpFile(t)
|
|
defer os.Remove(carv2File) //nolint:errcheck
|
|
|
|
// import a file to a Unixfs DAG using a CARv2 read/write blockstore.
|
|
bs, err := blockstore.OpenReadWrite(carv2File, nil,
|
|
carv2.ZeroLengthSectionAsEOF(true),
|
|
blockstore.UseWholeCIDs(true))
|
|
require.NoError(t, err)
|
|
|
|
root, err := buildUnixFS(ctx, bytes.NewBuffer(inputContents), bs, false)
|
|
require.NoError(t, err)
|
|
require.NotEqual(t, cid.Undef, root)
|
|
require.NoError(t, bs.Finalize())
|
|
|
|
// reconstruct the file.
|
|
readOnly, err := blockstore.OpenReadOnly(carv2File,
|
|
carv2.ZeroLengthSectionAsEOF(true),
|
|
blockstore.UseWholeCIDs(true))
|
|
require.NoError(t, err)
|
|
defer readOnly.Close() //nolint:errcheck
|
|
|
|
dags := merkledag.NewDAGService(blockservice.New(readOnly, offline.Exchange(readOnly)))
|
|
|
|
nd, err := dags.Get(ctx, root)
|
|
require.NoError(t, err)
|
|
|
|
file, err := unixfile.NewUnixfsFile(ctx, dags, nd)
|
|
require.NoError(t, err)
|
|
|
|
tmpOutput := newTmpFile(t)
|
|
defer os.Remove(tmpOutput) //nolint:errcheck
|
|
require.NoError(t, files.WriteTo(file, tmpOutput))
|
|
|
|
// ensure contents of the initial input file and the output file are identical.
|
|
fo, err := os.Open(tmpOutput)
|
|
require.NoError(t, err)
|
|
bz2, err := ioutil.ReadAll(fo)
|
|
require.NoError(t, err)
|
|
require.NoError(t, fo.Close())
|
|
require.Equal(t, inputContents, bz2)
|
|
}
|
|
|
|
func TestRoundtripUnixFS_Filestore(t *testing.T) {
|
|
//stm: @CLIENT_DATA_IMPORT_001
|
|
ctx := context.Background()
|
|
a := &API{
|
|
Imports: &imports.Manager{},
|
|
}
|
|
|
|
inputPath, inputContents := genInputFile(t)
|
|
defer os.Remove(inputPath) //nolint:errcheck
|
|
|
|
dst := newTmpFile(t)
|
|
defer os.Remove(dst) //nolint:errcheck
|
|
|
|
root, err := a.createUnixFSFilestore(ctx, inputPath, dst)
|
|
require.NoError(t, err)
|
|
require.NotEqual(t, cid.Undef, root)
|
|
|
|
// convert the CARv2 to a normal file again and ensure the contents match
|
|
fs, err := stores.ReadOnlyFilestore(dst)
|
|
require.NoError(t, err)
|
|
defer fs.Close() //nolint:errcheck
|
|
|
|
dags := merkledag.NewDAGService(blockservice.New(fs, offline.Exchange(fs)))
|
|
|
|
nd, err := dags.Get(ctx, root)
|
|
require.NoError(t, err)
|
|
|
|
file, err := unixfile.NewUnixfsFile(ctx, dags, nd)
|
|
require.NoError(t, err)
|
|
|
|
tmpOutput := newTmpFile(t)
|
|
defer os.Remove(tmpOutput) //nolint:errcheck
|
|
require.NoError(t, files.WriteTo(file, tmpOutput))
|
|
|
|
// ensure contents of the initial input file and the output file are identical.
|
|
fo, err := os.Open(tmpOutput)
|
|
require.NoError(t, err)
|
|
bz2, err := ioutil.ReadAll(fo)
|
|
require.NoError(t, err)
|
|
require.NoError(t, fo.Close())
|
|
require.Equal(t, inputContents, bz2)
|
|
}
|
|
|
|
func newTmpFile(t *testing.T) string {
|
|
f, err := os.CreateTemp("", "")
|
|
require.NoError(t, err)
|
|
require.NoError(t, f.Close())
|
|
return f.Name()
|
|
}
|
|
|
|
func genInputFile(t *testing.T) (filepath string, contents []byte) {
|
|
s := strings.Repeat("abcde", 100)
|
|
tmp, err := os.CreateTemp("", "")
|
|
require.NoError(t, err)
|
|
_, err = io.Copy(tmp, strings.NewReader(s))
|
|
require.NoError(t, err)
|
|
require.NoError(t, tmp.Close())
|
|
return tmp.Name(), []byte(s)
|
|
}
|