Skip to content

Commit 3353979

Browse files
authored
Merge pull request ipfs/go-unixfsnode#26 from ipfs/partial-file-test
Partial file test This commit was moved from ipfs/go-unixfsnode@3629b1b
2 parents ab5e7d1 + c08b9d2 commit 3353979

File tree

2 files changed

+112
-0
lines changed

2 files changed

+112
-0
lines changed

unixfs/node/test/doc.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// Package test provides ADL testing of the ipld specification around
2+
// * traversal making use of match subsets
3+
// * largeByteNode readers
4+
package test
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package test
2+
3+
import (
4+
"bytes"
5+
"context"
6+
"io"
7+
"testing"
8+
9+
u "github.com/ipfs/go-ipfs-util"
10+
"github.com/ipfs/go-unixfsnode/data/builder"
11+
"github.com/ipfs/go-unixfsnode/file"
12+
dagpb "github.com/ipld/go-codec-dagpb"
13+
"github.com/ipld/go-ipld-prime"
14+
"github.com/ipld/go-ipld-prime/datamodel"
15+
"github.com/ipld/go-ipld-prime/linking"
16+
cidlink "github.com/ipld/go-ipld-prime/linking/cid"
17+
basicnode "github.com/ipld/go-ipld-prime/node/basic"
18+
"github.com/ipld/go-ipld-prime/traversal"
19+
sb "github.com/ipld/go-ipld-prime/traversal/selector/builder"
20+
)
21+
22+
func TestPartialFileAccess(t *testing.T) {
23+
buf := make([]byte, 10*1024*1024)
24+
u.NewSeededRand(0xdeadbeef).Read(buf)
25+
r := bytes.NewReader(buf)
26+
27+
ls := cidlink.DefaultLinkSystem()
28+
storage := cidlink.Memory{}
29+
ls.StorageReadOpener = storage.OpenRead
30+
ls.StorageWriteOpener = storage.OpenWrite
31+
32+
f, _, err := builder.BuildUnixFSFile(r, "", &ls)
33+
if err != nil {
34+
t.Fatal(err)
35+
}
36+
37+
// get back the root node substrate from the link at the top of the builder.
38+
fr, err := ls.Load(ipld.LinkContext{}, f, dagpb.Type.PBNode)
39+
if err != nil {
40+
t.Fatal(err)
41+
}
42+
43+
ufn, err := file.NewUnixFSFile(context.Background(), fr, &ls)
44+
if err != nil {
45+
t.Fatal(err)
46+
}
47+
48+
openedLinks := []ipld.Link{}
49+
ls.StorageReadOpener = func(lc linking.LinkContext, l datamodel.Link) (io.Reader, error) {
50+
openedLinks = append(openedLinks, l)
51+
return storage.OpenRead(lc, l)
52+
}
53+
54+
// read back out the file.
55+
out, err := ufn.AsBytes()
56+
if err != nil {
57+
t.Fatal(err)
58+
}
59+
if !bytes.Equal(out, buf) {
60+
t.Fatal("Not equal")
61+
}
62+
63+
fullLen := len(openedLinks)
64+
65+
openedLinks = []ipld.Link{}
66+
67+
partial, err := ufn.(datamodel.LargeBytesNode).AsLargeBytes()
68+
if err != nil {
69+
t.Fatal(err)
70+
}
71+
half := make([]byte, len(buf)/2)
72+
if _, err := partial.Read(half); err != nil {
73+
t.Fatal(err)
74+
}
75+
if len(openedLinks) >= fullLen {
76+
t.Fatal("should not have accessed full file on a partial read.")
77+
}
78+
79+
openedLinks = []ipld.Link{}
80+
81+
prog := traversal.Progress{
82+
Cfg: &traversal.Config{
83+
LinkSystem: ls,
84+
},
85+
}
86+
sb := sb.NewSelectorSpecBuilder(basicnode.Prototype.Any)
87+
ss := sb.MatcherSubset(5*1024*1024, 6*1024*1024)
88+
sel, err := ss.Selector()
89+
if err != nil {
90+
t.Fatal(err)
91+
}
92+
93+
if err := prog.WalkMatching(ufn, sel, func(_ traversal.Progress, n datamodel.Node) error {
94+
b, err := n.AsBytes()
95+
if err != nil {
96+
t.Fatal(err)
97+
}
98+
if len(b) != 1024*1024 {
99+
t.Fatalf("wrong length: %d", len(b))
100+
}
101+
return nil
102+
}); err != nil {
103+
t.Fatal(err)
104+
}
105+
if len(openedLinks) >= fullLen {
106+
t.Fatal("should not have accessed full file on a partial traversal.")
107+
}
108+
}

0 commit comments

Comments
 (0)