mirror of
https://github.com/ipfs/kubo.git
synced 2025-07-17 18:50:48 +08:00
136 lines
3.5 KiB
Go
136 lines
3.5 KiB
Go
package testu
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"testing"
|
|
|
|
"github.com/ipfs/go-ipfs/importer/chunk"
|
|
h "github.com/ipfs/go-ipfs/importer/helpers"
|
|
trickle "github.com/ipfs/go-ipfs/importer/trickle"
|
|
mdag "github.com/ipfs/go-ipfs/merkledag"
|
|
mdagmock "github.com/ipfs/go-ipfs/merkledag/test"
|
|
ft "github.com/ipfs/go-ipfs/unixfs"
|
|
|
|
u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util"
|
|
mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash"
|
|
cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid"
|
|
ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format"
|
|
)
|
|
|
|
// SizeSplitterGen creates a generator.
|
|
func SizeSplitterGen(size int64) chunk.SplitterGen {
|
|
return func(r io.Reader) chunk.Splitter {
|
|
return chunk.NewSizeSplitter(r, size)
|
|
}
|
|
}
|
|
|
|
// GetDAGServ returns a mock DAGService.
|
|
func GetDAGServ() ipld.DAGService {
|
|
return mdagmock.Mock()
|
|
}
|
|
|
|
// NodeOpts is used by GetNode, GetEmptyNode and GetRandomNode
|
|
type NodeOpts struct {
|
|
Prefix cid.Prefix
|
|
// ForceRawLeaves if true will force the use of raw leaves
|
|
ForceRawLeaves bool
|
|
// RawLeavesUsed is true if raw leaves or either implicitly or explicitly enabled
|
|
RawLeavesUsed bool
|
|
}
|
|
|
|
// Some shorthands for NodeOpts.
|
|
var (
|
|
UseProtoBufLeaves = NodeOpts{Prefix: mdag.V0CidPrefix()}
|
|
UseRawLeaves = NodeOpts{Prefix: mdag.V0CidPrefix(), ForceRawLeaves: true, RawLeavesUsed: true}
|
|
UseCidV1 = NodeOpts{Prefix: mdag.V1CidPrefix(), RawLeavesUsed: true}
|
|
UseBlake2b256 NodeOpts
|
|
)
|
|
|
|
func init() {
|
|
UseBlake2b256 = UseCidV1
|
|
UseBlake2b256.Prefix.MhType = mh.Names["blake2b-256"]
|
|
UseBlake2b256.Prefix.MhLength = -1
|
|
}
|
|
|
|
// GetNode returns a unixfs file node with the specified data.
|
|
func GetNode(t testing.TB, dserv ipld.DAGService, data []byte, opts NodeOpts) ipld.Node {
|
|
in := bytes.NewReader(data)
|
|
|
|
dbp := h.DagBuilderParams{
|
|
Dagserv: dserv,
|
|
Maxlinks: h.DefaultLinksPerBlock,
|
|
Prefix: &opts.Prefix,
|
|
RawLeaves: opts.RawLeavesUsed,
|
|
}
|
|
|
|
node, err := trickle.Layout(dbp.New(SizeSplitterGen(500)(in)))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
return node
|
|
}
|
|
|
|
// GetEmptyNode returns an empty unixfs file node.
|
|
func GetEmptyNode(t testing.TB, dserv ipld.DAGService, opts NodeOpts) ipld.Node {
|
|
return GetNode(t, dserv, []byte{}, opts)
|
|
}
|
|
|
|
// GetRandomNode returns a random unixfs file node.
|
|
func GetRandomNode(t testing.TB, dserv ipld.DAGService, size int64, opts NodeOpts) ([]byte, ipld.Node) {
|
|
in := io.LimitReader(u.NewTimeSeededRand(), size)
|
|
buf, err := ioutil.ReadAll(in)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
node := GetNode(t, dserv, buf, opts)
|
|
return buf, node
|
|
}
|
|
|
|
// ArrComp checks if two byte slices are the same.
|
|
func ArrComp(a, b []byte) error {
|
|
if len(a) != len(b) {
|
|
return fmt.Errorf("Arrays differ in length. %d != %d", len(a), len(b))
|
|
}
|
|
for i, v := range a {
|
|
if v != b[i] {
|
|
return fmt.Errorf("Arrays differ at index: %d", i)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// PrintDag pretty-prints the given dag to stdout.
|
|
func PrintDag(nd *mdag.ProtoNode, ds ipld.DAGService, indent int) {
|
|
pbd, err := ft.FromBytes(nd.Data())
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
for i := 0; i < indent; i++ {
|
|
fmt.Print(" ")
|
|
}
|
|
fmt.Printf("{size = %d, type = %s, children = %d", pbd.GetFilesize(), pbd.GetType().String(), len(pbd.GetBlocksizes()))
|
|
if len(nd.Links()) > 0 {
|
|
fmt.Println()
|
|
}
|
|
for _, lnk := range nd.Links() {
|
|
child, err := lnk.GetNode(context.Background(), ds)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
PrintDag(child.(*mdag.ProtoNode), ds, indent+1)
|
|
}
|
|
if len(nd.Links()) > 0 {
|
|
for i := 0; i < indent; i++ {
|
|
fmt.Print(" ")
|
|
}
|
|
}
|
|
fmt.Println("}")
|
|
}
|