Skip to content

Commit 3629b1b

Browse files
authored
Merge pull request #26 from ipfs/partial-file-test
Partial file test
2 parents 54ec979 + 30bbc60 commit 3629b1b

File tree

4 files changed

+119
-5
lines changed

4 files changed

+119
-5
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ require (
1313
github.com/ipfs/go-unixfs v0.3.1
1414
github.com/ipld/go-car/v2 v2.1.1
1515
github.com/ipld/go-codec-dagpb v1.3.0
16-
github.com/ipld/go-ipld-prime v0.14.4
16+
github.com/ipld/go-ipld-prime v0.16.0
1717
github.com/multiformats/go-multicodec v0.3.1-0.20211210143421-a526f306ed2c
1818
github.com/multiformats/go-multihash v0.1.0
1919
github.com/spaolacci/murmur3 v1.1.0

go.sum

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,9 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD
123123
github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
124124
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
125125
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
126-
github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss=
127126
github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og=
127+
github.com/frankban/quicktest v1.14.2 h1:SPb1KFFmM+ybpEjPUhCCkZOM5xlovT5UbrMvWnXyBns=
128+
github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
128129
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
129130
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
130131
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
@@ -184,8 +185,9 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
184185
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
185186
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
186187
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
187-
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
188188
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
189+
github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
190+
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
189191
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
190192
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
191193
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -347,8 +349,8 @@ github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9
347349
github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8=
348350
github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8=
349351
github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM=
350-
github.com/ipld/go-ipld-prime v0.14.4 h1:bqhmume8+nbNsX4/+J6eohktfZHAI8GKrF3rQ0xgOyc=
351-
github.com/ipld/go-ipld-prime v0.14.4/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0=
352+
github.com/ipld/go-ipld-prime v0.16.0 h1:RS5hhjB/mcpeEPJvfyj0qbOj/QL+/j05heZ0qa97dVo=
353+
github.com/ipld/go-ipld-prime v0.16.0/go.mod h1:axSCuOCBPqrH+gvXr2w9uAOulJqBPhHPT2PjoiiU1qA=
352354
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ=
353355
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY=
354356
github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA=

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

test/partial_file_access_test.go

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)