Skip to content
This repository was archived by the owner on Jun 19, 2023. It is now read-only.

Commit 56e7e7a

Browse files
authored
Merge pull request #43 from ipfs/test/read-at
test: test ReadAt if implemented
2 parents 114c623 + ae83868 commit 56e7e7a

File tree

2 files changed

+84
-0
lines changed

2 files changed

+84
-0
lines changed

go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,5 @@ require (
1212
github.com/multiformats/go-multiaddr v0.0.4
1313
github.com/multiformats/go-multihash v0.0.7
1414
)
15+
16+
go 1.12

tests/unixfs.go

+82
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ func (tp *TestSuite) TestUnixfs(t *testing.T) {
4848
t.Run("TestLsNonUnixfs", tp.TestLsNonUnixfs)
4949
t.Run("TestAddCloses", tp.TestAddCloses)
5050
t.Run("TestGetSeek", tp.TestGetSeek)
51+
t.Run("TestGetReadAt", tp.TestGetReadAt)
5152
}
5253

5354
// `echo -n 'hello, world!' | ipfs add`
@@ -996,3 +997,84 @@ func (tp *TestSuite) TestGetSeek(t *testing.T) {
996997
test(dataSize-50, io.SeekStart, 100, 50, true)
997998
test(-5, io.SeekEnd, 100, 5, true)
998999
}
1000+
1001+
func (tp *TestSuite) TestGetReadAt(t *testing.T) {
1002+
ctx, cancel := context.WithCancel(context.Background())
1003+
defer cancel()
1004+
api, err := tp.makeAPI(ctx)
1005+
if err != nil {
1006+
t.Fatal(err)
1007+
}
1008+
1009+
dataSize := int64(100000)
1010+
tf := files.NewReaderFile(io.LimitReader(rand.New(rand.NewSource(1403768328)), dataSize))
1011+
1012+
p, err := api.Unixfs().Add(ctx, tf, options.Unixfs.Chunker("size-100"))
1013+
if err != nil {
1014+
t.Fatal(err)
1015+
}
1016+
1017+
r, err := api.Unixfs().Get(ctx, p)
1018+
if err != nil {
1019+
t.Fatal(err)
1020+
}
1021+
1022+
f, ok := r.(interface {
1023+
files.File
1024+
io.ReaderAt
1025+
})
1026+
if !ok {
1027+
t.Skip("ReaderAt not implemented")
1028+
}
1029+
1030+
orig := make([]byte, dataSize)
1031+
if _, err := io.ReadFull(f, orig); err != nil {
1032+
t.Fatal(err)
1033+
}
1034+
f.Close()
1035+
1036+
origR := bytes.NewReader(orig)
1037+
1038+
r, err = api.Unixfs().Get(ctx, p)
1039+
if err != nil {
1040+
t.Fatal(err)
1041+
}
1042+
1043+
test := func(offset int64, read int, expect int64, shouldEof bool) {
1044+
t.Run(fmt.Sprintf("readat%d-r%d-%d", offset, read, expect), func(t *testing.T) {
1045+
origBuf := make([]byte, read)
1046+
origRead, err := origR.ReadAt(origBuf, offset)
1047+
if err != nil && err != io.EOF {
1048+
t.Fatalf("orig: %s", err)
1049+
}
1050+
buf := make([]byte, read)
1051+
r, err := f.ReadAt(buf, offset)
1052+
if shouldEof {
1053+
if err != io.EOF {
1054+
t.Fatal("expected EOF, got: ", err)
1055+
}
1056+
} else if err != nil {
1057+
t.Fatal("got: ", err)
1058+
}
1059+
1060+
if int64(r) != expect {
1061+
t.Fatal("read wrong amount of data")
1062+
}
1063+
if r != origRead {
1064+
t.Fatal("read different amount of data than bytes.Reader")
1065+
}
1066+
if !bytes.Equal(buf, origBuf) {
1067+
fmt.Fprintf(os.Stderr, "original:\n%s\n", hex.Dump(origBuf))
1068+
fmt.Fprintf(os.Stderr, "got:\n%s\n", hex.Dump(buf))
1069+
t.Fatal("data didn't match")
1070+
}
1071+
})
1072+
}
1073+
1074+
test(3, 10, 10, false)
1075+
test(13, 10, 10, false)
1076+
test(513, 10, 10, false)
1077+
test(350, 100, 100, false)
1078+
test(0, int(dataSize), dataSize, false)
1079+
test(dataSize-50, 100, 50, true)
1080+
}

0 commit comments

Comments
 (0)