Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat: remove circular dependencies in merkledag package tests #4704

Merged
merged 5 commits into from
Mar 23, 2018
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 69 additions & 28 deletions merkledag/merkledag_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,11 @@ import (
bserv "github.com/ipfs/go-ipfs/blockservice"
bstest "github.com/ipfs/go-ipfs/blockservice/test"
offline "github.com/ipfs/go-ipfs/exchange/offline"
imp "github.com/ipfs/go-ipfs/importer"
. "github.com/ipfs/go-ipfs/merkledag"
mdpb "github.com/ipfs/go-ipfs/merkledag/pb"
dstest "github.com/ipfs/go-ipfs/merkledag/test"
uio "github.com/ipfs/go-ipfs/unixfs/io"

u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util"
chunker "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker"
cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid"
ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format"
blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format"
Expand Down Expand Up @@ -129,26 +126,80 @@ func TestBatchFetchDupBlock(t *testing.T) {
runBatchFetchTest(t, read)
}

// makeTestDAG creates a simple DAG from the data in a reader.
// First, a node is created from each 512 bytes of data from the reader
// (like a the Size chunker would do). Then all nodes are added as children
// to a root node, which is returned.
func makeTestDAG(t *testing.T, read io.Reader, ds ipld.DAGService) ipld.Node {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be using io.ReadFull (Read isn't guaranteed to fill the buffer). It should probably also handle short reads. It may currently "work" but I'm worried that users will misuse it.

p := make([]byte, 512)
nodes := []*ProtoNode{}

for {
n, err := io.ReadFull(read, p)
if err == io.EOF {
break
}

if err != nil {
t.Fatal(err)
}

if n != len(p) {
t.Fatal("should have read 512 bytes from the reader")
}

protoNode := NodeWithData(p)
nodes = append(nodes, protoNode)
}

ctx := context.Background()
// Add a root referencing all created nodes
root := NodeWithData(nil)
for _, n := range nodes {
root.AddNodeLink(n.Cid().String(), n)
err := ds.Add(ctx, n)
if err != nil {
t.Fatal(err)
}
}
err := ds.Add(ctx, root)
if err != nil {
t.Fatal(err)
}
return root
}

// makeTestDAGReader takes the root node as returned by makeTestDAG and
// provides a reader that reads all the RawData from that node and its children.
func makeTestDAGReader(t *testing.T, root ipld.Node, ds ipld.DAGService) io.Reader {
ctx := context.Background()
buf := new(bytes.Buffer)
buf.Write(root.RawData())
for _, l := range root.Links() {
n, err := ds.Get(ctx, l.Cid)
if err != nil {
t.Fatal(err)
}
_, err = buf.Write(n.RawData())
if err != nil {
t.Fatal(err)
}
}
return buf
}

func runBatchFetchTest(t *testing.T, read io.Reader) {
ctx := context.Background()
var dagservs []ipld.DAGService
for _, bsi := range bstest.Mocks(5) {
dagservs = append(dagservs, NewDAGService(bsi))
}

spl := chunker.NewSizeSplitter(read, 512)

root, err := imp.BuildDagFromReader(dagservs[0], spl)
if err != nil {
t.Fatal(err)
}
root := makeTestDAG(t, read, dagservs[0])

t.Log("finished setup.")

dagr, err := uio.NewDagReader(ctx, root, dagservs[0])
if err != nil {
t.Fatal(err)
}
dagr := makeTestDAGReader(t, root, dagservs[0])

expected, err := ioutil.ReadAll(dagr)
if err != nil {
Expand Down Expand Up @@ -181,11 +232,7 @@ func runBatchFetchTest(t *testing.T, read io.Reader) {
if !ok {
errs <- ErrNotProtobuf
}

read, err := uio.NewDagReader(ctx, firstpb, dagservs[i])
if err != nil {
errs <- err
}
read := makeTestDAGReader(t, firstpb, dagservs[i])
datagot, err := ioutil.ReadAll(read)
if err != nil {
errs <- err
Expand Down Expand Up @@ -228,12 +275,9 @@ func TestFetchGraph(t *testing.T) {
}

read := io.LimitReader(u.NewTimeSeededRand(), 1024*32)
root, err := imp.BuildDagFromReader(dservs[0], chunker.NewSizeSplitter(read, 512))
if err != nil {
t.Fatal(err)
}
root := makeTestDAG(t, read, dservs[0])

err = FetchGraph(context.TODO(), root.Cid(), dservs[1])
err := FetchGraph(context.TODO(), root.Cid(), dservs[1])
if err != nil {
t.Fatal(err)
}
Expand All @@ -254,14 +298,11 @@ func TestEnumerateChildren(t *testing.T) {
ds := NewDAGService(bsi[0])

read := io.LimitReader(u.NewTimeSeededRand(), 1024*1024)
root, err := imp.BuildDagFromReader(ds, chunker.NewSizeSplitter(read, 512))
if err != nil {
t.Fatal(err)
}
root := makeTestDAG(t, read, ds)

set := cid.NewSet()

err = EnumerateChildren(context.Background(), ds.GetLinks, root.Cid(), set.Visit)
err := EnumerateChildren(context.Background(), ds.GetLinks, root.Cid(), set.Visit)
if err != nil {
t.Fatal(err)
}
Expand Down